Python技術でトヨタ車種識別

#はじめに#
Python学んで２ヶ月半の初学者です。一度成果物を作りたいと思い、写真識別を行うプログラムを実装することにしました。自動車業界に従事しており、仕事に関係するプログラムということで車種を識別するプログラムにしました。
初学者ですので、プログラム上至らない点ががあるかもしれませんが、その際はアドバイス頂ければ幸いです。
###環境###
***
・使用言語: Python
・開発環境：Google Colaboratory
・Windows 10
※コードベースは、Aidemy提供「男女識別（深層学習発展）」を使用
※画像入手先：kaggle Toyota cars over 15k labeled car images

###目的###
***
トヨタ車アルファードとカムリの画像を識別し、アルファードでないものを抽出する。

###方法###
***
####1,データーの収集　####
・kaggleのToyota cars over 15k labeled car imagesより画像をダウンロードする。
・Google Colaboに対象画像を集める：アルファードとカムリ　
・Google colaboにダウンロード

####2,データクレンジング####
・画像の読み込みと表示行う。
・画像の縮小の為、cv2を使い画像リサイズ行う。

####3,CNN実装 ####
・CNN(Convolutional Neural Network、畳み込みニューラルネットワーク）呼ばれる画像認識に広く使われるディープニューラルネットワークを用いた深層学習手法使用。
・モデルの定義・運用
・転移学習

####4,精度確認 ####
Kerasでモデルの分類精度

####結果####
***
「no alphard」 として画像抽出されました。
Test accuracy: 0.9675324559211731
分類問題のモデルを評価するときに、一般的な評価指標としては正確度 (Accuracy) が使われますが、96%とまずまずの数字ではないでしょうか。

###苦労した点###
***
入手した画像ファイルに余分が画像があり、プログラムの実行時にエラーが発生,画像取り出しに苦労しました。また、画像ファイルへのパスコードがうまくリンクせず、エラーが発生。その点の修正に時間がかかってしまいました。

###コード###
***
```python:
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from keras.utils.np_utils import to_categorical
from keras.layers import Dense, Dropout, Flatten, Input
from keras.applications.vgg16 import VGG16
from keras.models import Model, Sequential
from keras import optimizers


#フォルダーアップロードからtoyota_carsファイルからalphard選択、path_aphard格納
path_alphard  = [filename for filename in os.listdir('/content/drive/MyDrive/toyota_cars/alphard/') if not filename.startswith('.')]
#フォルダーアップロードからcamry選択し、path_no_alphardへ
path_no_alphard  = [filename for filename in os.listdir('/content/drive/MyDrive/toyota_cars/camry/') if not filename.startswith('.')]
img_alphard = []
img_no_alphard = []
for i in range(len(path_alphard)): 
    img = cv2.imread('/content/drive/MyDrive/toyota_cars/alphard/' + path_alphard[i]) #OpenCVでの読み込み。引数にはパスを指定
    img = cv2.resize(img, (50,50)) #50×50のリサイズにしてみます。引数には画像、次元を指定
    img_alphard.append(img)
for i in range(len(path_no_alphard)):
    print('/content/drive/MyDrive/toyota_cars/camry/' + path_no_alphard[i])
    img = cv2.imread('/content/drive/MyDrive/toyota_cars/camry/' + path_no_alphard[i])
    img = cv2.resize(img, (50,50))
    img_no_alphard.append(img)  
X = np.array(img_alphard + img_no_alphard)
y =  np.array([0]*len(img_alphard) + [1]*len(img_no_alphard))
rand_index = np.random.permutation(np.arange(len(X)))
X = X[rand_index]
y = y[rand_index]
# データの分割
X_train = X[:int(len(X)*0.8)]
y_train = y[:int(len(y)*0.8)]
X_test = X[int(len(X)*0.8):]
y_test = y[int(len(y)*0.8):]
# 正解ラベルをone-hotの形にする
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
# モデルにvggを使います
# VGG16を使い転移学習, VGGのモデルのインスタンスを作成
input_tensor = Input(shape=(50, 50, 3))#input_tersorとして入力の形を与える
vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)

# CNNを使ったモデルの生成、運用
# KerasのSequentialモデルによるモデルの定義
#VGGとは別のモデル（ここではtop_model）を定義
top_model = Sequential()
top_model.add(Flatten(input_shape=vgg16.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(2, activation='softmax'))
# vggと、top_modelを連結します
# keras.Model(inputs=inputs, outputs=outputs)
model = Model(inputs=vgg16.input, outputs=top_model(vgg16.output))
# vggの層の重みを変更不能にし、15層までvggモデル
for layer in model.layers[:15]:
    layer.trainable = False
# モデルを定義後,表示する精度指標を何にするかなどを指定してコンパイル
model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
              metrics=['accuracy'])
# モデルの学習は以下
model.fit(X_train, y_train, batch_size=100,verbose=1, epochs=10, validation_data=(X_test, y_test))

# 重みファイルを保存する save 関数 を実行
model.save('model.h5')
# 画像を一枚受け取り、alphardかalphardでないかを判定するcar関数
def car(img):
    img = cv2.resize(img, (50, 50))
    pred = np.argmax(model.predict(np.array([img])))
    if pred == 0:
        return 'alphard'
    else:
        return 'no alphard'
# 精度の評価
scores = model.evaluate(X_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])
img = cv2.imread('/content/drive/MyDrive/toyota_cars/alphard/' + path_alphard[0])
b,g,r = cv2.split(img) 
img1 = cv2.merge([r,g,b])
plt.imshow(img1)
plt.show()
print(car(img))

```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/973091/5fac183a-8665-4576-d8d8-580224757587.png)