猫か否かを判断する画像認識を作成したい。
画像を集めて作成してもよいが、すでに先人達が開発してくださっているImageNetでできないか試してみた。
やってみたのはVGG16とInception V3
まずはVGG16
VGG16とInception V3のライブラリをインポート
from PIL import Image
import numpy as np
from tensorflow.python.keras.preprocessing.image import img_to_array, load_img
from tensorflow.python.keras.applications.vgg16 import VGG16,preprocess_input,decode_predictions
from keras.applications.inception_v3 import InceptionV3
from keras.applications.inception_v3 import preprocess_input
モデルを設定。結合層はそのまま使うのでTrue
model=VGG16(weights='imagenet', include_top=True)
画像を入力用形式へ変換する。
img = load_img("calico.jpg",target_size=(224,224))
arr_img=img_to_array(img)
arr_img=preprocess_input(arr_img)
arr_input=np.stack([arr_img])
# (x,224,224,3)の4次元でないとmodelで読み込みできない
画像を識別
predict=model.predict(arr_input)
results = decode_predictions(predict,top=5)
results[0]
[('n03788365', 'mosquito_net', 0.096424125),
('n04209239', 'shower_curtain', 0.020692192),
('n15075141', 'toilet_tissue', 0.018790046),
('n03291819', 'envelope', 0.012404914),
('n03924679', 'photocopier', 0.010215216)]
正しく識別できていない。
なのでそのほかのImageNetをやる。
次にInception V3を試してみた。変更点はmodelを変更したことと、データサイズを224224から299299に変更したこと
model=InceptionV3(weights='imagenet', include_top=True)
img = load_img("calico.jpg",target_size=(299,299))
[('n02124075', 'Egyptian_cat', 0.158072),
('n02123045', 'tabby', 0.12637995),
('n02797295', 'barrow', 0.10442561),
('n02123159', 'tiger_cat', 0.08068305),
('n04152593', 'screen', 0.08066112)]
比較的猫の回答が出ており、適正な認識をしている。