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