PythonMania

普段はロボットとAIを組み合わせて色々作ってます。Python関係以外も色々投稿していくと思います。

【Python】kerasで学習したモデル・パラメータを読み込んで推論してみる【DeepLearning】

f:id:mizuhiki0111:20190430180019p:plain

アプリに組み込んだりする際に、いちいちモデルを記載して学習して~というのは負担が大きいので通常は学習後にモデル・パラメータを保存しておき、それらを読み込む形でアプリに組み込む



今回は以前ResNet50をfine-tuningしたものを読み込む形で推論を行う、ということをやってみた。





注意しなければいけない点として、予測を行う画像を1枚読み込んで判別結果を返す、というような場合には、画像データを3次元→4次元に変換してmodel.predictに渡してあげないとエラーが出る


以下コードです



import numpy as np
from PIL import Image
import os
from glob import glob
import cv2
from keras.utils import np_utils
from matplotlib import pyplot as plt
import pandas as pd
import tensorflow as tf
from keras.models import model_from_json

ScaleTo = 70

img = "~/4cd2a07dd.png"
# モデルの読み込み
model = model_from_json(open("~/resnet_model.json", 'r').read())

# 重みの読み込み
model.load_weights("~/resnet50_model.h5")

#model.summary()


testImg = cv2.resize(cv2.imread(img), (ScaleTo, ScaleTo))
testImg = np.asarray(testImg)  # Train images set

plt.imshow(testImg)
blurImg = cv2.GaussianBlur(testImg, (5, 5), 0)
plt.imshow(blurImg)
hsvImg = cv2.cvtColor(blurImg, cv2.COLOR_BGR2HSV)
plt.imshow(hsvImg)
lower_green = (25, 40, 50)
upper_green = (75, 255, 255)
mask = cv2.inRange(hsvImg, lower_green, upper_green)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11, 11))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
plt.imshow(mask)
bMask = mask > 0
clear = np.zeros_like(testImg, np.uint8)  # Create empty image
clear[bMask] = testImg[bMask]
clearTestImg = clear
   # Apply boolean mask to the origin image
plt.imshow(clearTestImg)

clearTestImg = np.asarray(clearTestImg)

clearTestImg = clearTestImg / 255

clearTestImg.shape
clearTestImg = np.expand_dims(clearTestImg, axis=0)
pred = model.predict(clearTestImg)


#提出ファイルの作成
predNum = np.argmax(pred, axis=1)
predNum
#predStr = le.classes_[predNum]

#res = {'file': testId, 'species': predStr}
#res = pd.DataFrame(res)
#res.to_csv("res.csv", index=False)