Pythonを用いた顔照合への逍遥
文責:KKsk
・前書き
受験生諸君、京都大学二次試験お疲れ様。そして、この吉田寮入寮パンフを手にしてくれたことをうれしく思う。諸君らが見事入寮資格を得られんことを願うばかりである。
・動機
私は興味のない人物の顔と名前を覚えるのが、すこぶる苦手である。それは歴史上の人物を筆頭に、高校時のクラスの諸氏にまで渡る。そこまで言うと私が人非人のごとくように思われるかもしれないが、ちゃんと3次元空間における友人が存在するぐらいには情は備えているつもりである
さて、浪人生活を終えて数か月後の或る日、高校のクラスへの同窓会への話が持ち上がった。とはいえ、誰が誰だか分らぬでは行ったところで話すこともない。これを解決するため、私は浪人中にかじっていたpythonを用いて顔照合システムを作ることにした。そして、私はPythonについては経験があるとはいえ、ズブの素人同然であるので、この記事に関しても寛容な心をもって見ていただければ嬉しい。
・目指す仕様と方法の概要
仕様としては、写真を取り込みデータベースと照合させ、名前を返すといったものを目指す。
段階としては
⓪ 顔の特徴量データベースの準備
- 添付画像の読み込み
- 読み込んだ画像に対する顔特徴量の検出
- 顔特徴量のデータベースへの照合
- 合致する人物の名前を取得
といった具合に分けられよう。Pythonにおけるメール送受信についてはなぜかうまくいっていない。
Pythonはパッケージ(多様な目的に特化した関数集のようなもの)が実に充実しており、探してみると顔照合に特化したface recognitionというパッケージが存在した。face recognitionは機械学習パッケージdlibをベースに作られた、高性能な顔認証パッケージである。このパッケージはコマンドプロンプト上で
pip install face_recognition
でインストールすることができる。そのほかパッケージがない場合には同様のコマンドでインストールすることができる。
・具体的スクリプト
何はともあれ、必要なパッケージを引っ張って来なければならない。ふつうはimportを用いる。asは略号を割り当てるときに用いる。これで使いやすくなった。
どこでどんな風にパッケージを使うかは順次説明する。
⓪ 顔の特徴量データベースの準備
顔照合は、顔の各部分における明暗をもとに取り出されるベクトルの比較をもって行われる。よって特徴量のデータはベクトルの集まり、つまり行列のような形式で保存・利用される。
face_recognition.load_image_file(画像ファイルのパス)によって画像を行列形式で取得し、順番にリストとして保存してゆく。次に行列形式の画像データからface_recognition.face_locations((画像データ, model=”hog”(←検出精度))で顔の領域の座標を取り出し、face_recognition.face_encodings(画像データ,顔領域データ)で特徴量のリストを取得する。これを別の空リストに追加してゆくことで、複数の画像に対する、いわゆるリストのリストが出来上がる。
- 添付画像の読み込み
glob.glob(“画像ファイルパス”)で読み込みできる。
- 読み込んだ画像に対する顔特徴量の検出
⓪の場合と同様にすればよい。検査する画像が一つだけならfor関数を省くといい。
- 顔特徴量のデータベースへの照合
face_recognition.compare_faces(データベースの顔特徴量のリスト,検査する画像の顔特徴量のリスト,tolerance=(0から1の実数))によって、検査する顔とデータベースのそれぞれの顔との距離が閾値を下回っているか(True)、下回っていないか(False)を示すリストを返す。
- 合致する人物の名前を取得
(リスト名)[n]でn+1番目の要素を取得する。また(リスト名).index(探す要素)で対象の要素が何番目にあるかを返す。データベースの画像ファイルの名前を人名にしておけばfilesは人名のリストとなるので、名前が返される。