この記事はリンク情報システムの「2021新春アドベントカレンダー TechConnect」のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
(リンク情報システムのFacebookはこちらから)
2021新春アドベントカレンダー Tech Connect インデックスはこちら
15日の記事を担当しますshinmoです。よろしくお願いします。
あけましておめでとうございます。
私事ですが、最近スマホをiPhone12に買い換えました。
このiPhone12はFaceIDという顔を識別する機能があって、これでロックを解除できるんですね。
そんなわけで、今年は顔認識の勉強(といってもさわりだけですが)をしてみたいと思います。
(去年は文字認識でした)
2019年頃に、AIが存在しない人物の顔を作成してくれるサイトが出来た、というニュースがあったのをご存じでしょうか?
それまでにも似たようなサイトは存在していたのですが、その時に紹介されていたサイトGenerated Photos
はかなり出来がよく、かつてそれまでの他のサイトにあったような不自然さがないという点で話題になっていました。
(実際のサイトの画面)
自分の顔をネットの海に流さなくてもよい、肖像権の侵害もない。
これは顔認識を試すのにちょうどよいのでは…?
というわけで、 Generated Photos を使って顔認識を試してみようと思います。
##準備
今回使う環境とライブラリは下記です。
Python3.7.4
openCV
openCVは次のコマンドでインストールします。
python -m pip install -U opencv-python
次に分類器というものを用意します。
分類器というものを簡単に言うと、これは顔である/でないを振り分けるフィルターに当たるものです。
下記のopencvにデフォルトのものがいくつか用意されていますので、そちらを使います。
https://github.com/opencv/opencv/tree/master/data/haarcascades
今回は haarcascade_frontalface_alt_tree.xml を使用します。
##実行する
使う画像はこれ。(引用:https://generated.photos/)
あとは下記のように実装して、実際に動かしてみます。
import cv2
cascade_path = "./cascade/haarcascade_frontalface_alt_tree.xml"
# 使用ファイルと入出力ディレクトリ
image_file = "generate_1.jpg"
image_path = "./in/" + image_file
output_path = "./out/" + image_file
#ファイル読み込み
image = cv2.imread(image_path)
#グレースケール変換
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#分類器の取得
cascade = cv2.CascadeClassifier(cascade_path)
#検出実行
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=10, minSize=(30, 30))
#枠線の色指定:赤
color = (0, 0, 255)
# 検出した場合
if len(facerect) > 0:
#検出した顔を囲む枠線の作成
for rect in facerect:
cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)
#認識結果の出力
cv2.imwrite(output_path, image)
うまくいったようです。
ちなみに、 Generated Photos には顔の向きとかも指定できるようなので、ちょっと変えてみます。
入力:
(引用:https://generated.photos/)
…ダメ見たいです。あまり正面に向いてないからですかね?
ただ、iPhone12でも斜めすぎるとロックが解除されなかったので、斜めの顔判定は難しいのかもしれないですね。
##終わりに
前回も今回もですが、作るのが大変そうだなあと思ったものが、調べてみると案外お手軽に実装出来たりするので
驚きです。次やるときには、機械学習用のモデルを作るところにも手を付けたりできると面白そうですね。
あとGenerated Photosがすごすぎて小1時間くらい遊んでました。
ここまで読んでいただきありがとうございました。