はじめに
-
TensorFlow
のMNIST CNN
のチュートリアルを改造して、顔画像の学習と推論を実施しました。 - 今回は、
Flask
から推論を実施して、結果を表示してみます。 - ソース一式は ここ です。
概要
- 設定ファイルで指定しているクラス毎に、テスト画像による推論を実施しています。
- 各画像の結果は、青は正解、赤は間違いという意味です。
- それぞれ、どのクラスに分類されたかが、分かる様にしました。
Flask
学習モデルのインポート
- 前回作成した
face_deep.py
をインポートします。
import face_deep
推論
- 学習画像とテスト画像で推論を出来る様にしています。
- フォルダ内の
.jpeg
全てを推論対象にしています。
@app.route('/predict/<folder>/<item>')
def predict(folder, item):
"""画像の推論."""
if folder not in ['train', 'test']:
abort(404)
filename_list = sorted(glob.glob(os.path.join(DATA_PATH, folder, item, '*.jpeg')))
- 各画像は、
Pillow
で読み込み、リサイズ、グレースケール、値を0-255
から0-1
に変更します。
image_list = []
for filename in filename_list:
face = Image.open(filename)
face = face.resize((IMG_ROWS, IMG_COLS), Image.LANCZOS)
face = face.convert('L')
face = np.array(face, dtype=np.float32) / 255.0
face = np.ravel(face)
image_list.append(face)
- 各画像をまとめて、
face_deep.py
のpredict
に入力します。 - 推論結果は、
[ 99 0 0 0 0 0 0 0 0 0]
の様な確率を含む配列が画像分返却されます。
percent_list = face_deep.predict(image_list, dtype='int')
- テンプレート用の修正を実施します。
-
color
は、対象の画像の推論結果が、正しければ、True
間違っていればFalse
で与えられます。 -
filename
で、テンプレートからは、画像のリンクを作成出来る様にしています。 -
percent
で、テンプレートで、画像のクラス別確率が表示される様にしています。
rows = []
for filename, percent in zip(filename_list, percent_list):
color = CLASSES.index(item) in [index for index, value in enumerate(percent) if value == max(percent)]
row = {'filename': os.path.basename(filename), 'percent': percent, 'color': color}
rows.append(row)
return render_template('predict.html', folder=folder, item=item, headers=CLASSES, rows=rows)
テンプレート
- 上記の
color
によって、正解の場合は青色のtable-primary
間違いの場合は赤色のtable-danger
を設定しています。
{% if row.color %}
<tr class="table-primary">
{% else %}
<tr class="table-danger">
{% endif %}
- ファイル名等を元に、顔画像のリンクを作成しています。
- 保存されている画像は、大小様々なので、
size
で動的に変更しています。
<td>
<figure class="figure">
<img src="/data/{{ folder }}/{{ item }}/{{ row.filename }}?size=100" />
<figcaption class="figure-caption">{{ row.filename }}</figcaption>
</figure>
</td>
- 各画像のクラス毎の確率を表示しています。
{% for percent in row.percent %}
<td scope="row">{{ percent }}%</td>
おわりに
-
Flask
を利用して、顔画像の推論結果を表示しました。 - 推論結果の一覧、クラス毎の確率が表示できるので、不適切な画像などの確認などがしやすくなりました。
- 次回は、様々な画像をアップロード出来るWebアプリケーションを作成したいと思います。