- リンクを取得
- ×
- メール
- 他のアプリ
OpenCV を使って、写真の顔が誰かを分類してみたいと思います。以下のサイトを参考にしました。(OpenCV で検索してたどり着いただけで、題材は特に関係ありません)
基本的に上記サイトに沿って作業しましたが、今回は子どもたち2人の分類をしたかったので、それにあわせた修正と、以下の2点を追加してみました。
- 分類する際の結果が「0.5」を下回るときは「一致なし」とした
- 画像ファイルだけでなく、Web カメラからの入力を可能とした
1.は、元のコードだとベクトルが最大のものが一致と出力していました。例えば [0.1, 0.2] という結果だったら、0.2 のほうに一致したと出力することになっていましたが、「どちらとも一致しない」という答えがあってもいいと思いました。0.5 という値は適当です。
これは detect.py に
if output.max() < 0.5:
name = "Not Detected"
else:
こんな感じで判定分を追加しました。
2.は、カメラでリアルタイムに検出できるようにすれば、子どもたちに見せて正しく分類できるところを見せると楽しいかと思いました。
こちらも同様に detect.py に
cap = cv2.VideoCapture(args.input_dev)
ret, image = cap.read()
このように cv2.VideoCapture を使って Web カメラからの入力を変数 image にセットしました。元のコードだと画像ファイルを変数 image にセットしていたので、分類する処理はそのままです。
最後に、画像ファイルとして保存しても見るのが大変なので、
cv2.imwrite(SAVE_PATH,Who)
で保存していた箇所を
cv2.imshow("Face Detection", Who)
と表示するようにしました。
XPS 17 だと、さすがにパフォーマンスが高く、Web カメラからでもほぼリアルタイムに処理できているように感じます。
ただ、分類の精度がまだまだのように感じました。学習自体は以下のように、train loss、test loss ともに低く収まっており、test accuracy がほぼ 100 になっているので順調そうです。
これでできたモデルを使って分類してみると、見た感じで半々ぐらいの分類精度といった感じです。顔でもない場所を顔と検出して、それを分類して間違えていることも多いです。
学習用の顔画像が、100枚くらいしか用意できなかったので、学習が不足しているのですかねぇ
この辺のチューニングが必要そうです。
コメント
コメントを投稿