プログラミング未経験の新人がMTCNNを使って顔認証を開発してみた!

  • 2021年6月4日

こんにちは。
2020年入社、プログラミング歴12ヶ月のmenoです。

以前 、プログラミング未経験の新人がラズパイを使って非接触体温計を作ってみた!でお知らせした顔認証と検温機能を合体させたシステム「けんおんくん」の作成過程をお届けします。今回のタイトルは「プログラミング未経験の新人が顔認証機能の追加をしてみた!」です。

セカンドセレクションではコロナ対策のため、出勤する人は毎日、朝夕2回検温結果を記入することにしています。この記入を毎日チェックしている人が管理部門にいて、日々、記入漏れを記入していない人に要請しています。

これって大変だな、記入チェックの自動化をできないかな・・・という思いから今回ご紹介する「けんおんくん」の開発を思いつきました。検温装置にAI技術を活用した顔認証による本人特定の仕組みを合体し、検温と同時に本人特定して結果を自動記録しようという試みです。

今回の内容はPythonを勉強し始めたばかりの私が「けんおんくん」を作り上げる過程においての成功や苦労・失敗について、お話ししていきたいと思っています!!

けんおんくんの全体像

けんおんくんの開発では前回の「非接触体温計(検温したものをデータとして出力する)」に加えて、「顔認証機能」を追加しました。

一枚にすると簡単ですが、Pythonでプログラムを組むのは私にとって非常に大変でした💦

顔認証の一般的な方法

顔認証技術は画像処理の中でも一番難しい技術と言われています。

簡単に説明すると一般的な顔認証方法は下記になるようです。

  1. まずカメラでキャプチャした画像から顔部分を抽出し、顔のみ画像を抽出
  2. そのあとに画像から目や鼻などの特徴(ランドマーク)の抽出
  3. そして最後にノイズ(マスク、メガネ、髪型、帽子など)の除去し、できるだけ特徴に影響しないようにする
  4. 上記の方法でキャプチャした顔画像をディープラーニングで機械学習させ、画像認識判定を実施

今回の「けんおんくん」では、下記の方法をすべて試しましたが、結果的に判別精度が悪かったので、方法②と③を組み合わせることにより顔認証機能を作成しました!

方法①顔の一部分(眼)ディープラーニングを活用して学習、顔の特徴量を画像情報として取得
方法②顔の中の目や鼻などの位置関係から相互の距離などを算出
方法③顔全体をディープラーニングを活用して学習、顔の特徴量を画像情報として取得

けんおんくんの顔認証方法

① 顔検出はMTCNNライブラリで実装

画像抽出にはOpenCV、dlib、MTCNNなどがありますが、今回はMTCNNを採用しました。Pythonライブラリであり、実績もあってそこそこ処理速度も速いです。またマスク着用時でもMTCNNであれば顔画像を正確に抽出できました。
※調査の結果、dlibではマスク着用時の抽出が上手くいきませんでした。

② マスク判定エンジンの作成

今回のけんおんくんではマスクの有り・無しを判定する「マスク判定学習エンジン」を実施しました。マスク無し、マスク有りの判定はうまくいきましたが、マスク有りの場合、顔認証はある条件で上手くいかないことがわかりました。

③ 顔判定エンジンの作成

顔判定は、目や鼻などの位置関係の距離(前述方法②)と顔全体画像のディープラーニング(前述方法③)で得られた結果に重みをつけて総合判定するアンサンブル判別法を採用しました。。

※残念ながら、現時点では認識精度が十分ではなく課題が残りました。

顔認証で取り入れた工夫

  • 判定にはフリーで使えるGoogle Collaboratory(無料版)を使用し、計算負荷を下げる為に、高解像度(HD以上)画像の分割を行い、一つの画像あたり、128x128になるように調整しました。(例えば眼だけを抽出して128x128の画像に変換)
  • CNN(ディープラーニング)に学習させるために必要なオリジナル画像枚数は60枚ですが、その60枚を水増しで2000枚くらいにして学習しました。CNN(ディープラーニング)のフレームはTensorflowを使い、転移学習(少ない情報から学習し、判定の精度をあげること)のファインチューニングを行い、学習エンジンを作りました。転移学習はVGG16を転移学習のフレームとして使用しました。学習枚数は多いほうが有利ですが、今回は単純で安定した画像なので60枚で問題なかったと思われます。

課題点としては、高解像度の学習をさせると、メモリ不足で計算停止が時々発生したり、顔の輪郭画像では、マスクやメガネ、さらには帽子などの影響で上手く取れない場合がありました。

一般的に大手企業が発表されている顔認証技術はCNNを使わず、顔輪郭の数値で判定していると予想されます。しかし、マスク・メガネや帽子で顔が隠れている情報をどうやって補完しているのか非常に興味があります。

検温機能紹介

検温機能に関しての詳しい作成過程は、プログラミング未経験の新人がラズパイを使って非接触体温計を作ってみた!をご覧ください。

けんおんくんの基本機能

今回、検温装置との合体した「けんおんくん」の基本機能は以下の通りです。

本記事の取り組みで2の顔認証機能を無事に追加することができました✨

  1. 非接触体温センサーで体温測定を行う
  2. カメラを用いた顔認証技術による本人特定する
  3. 体温と本人特定の結果を「名前、検温結果、日時」として自動記録する

今回の顔認証は予め本人の写真を撮り、判定エンジンに学習させて名前と紐付けたテーブルを用意しておく必要があります。

取り組んだこの技術はいろいろと応用できると思いました。例えば、初めて来られたお客様の画像をカメラでキャプチャしAIで学習させ、次回お見えになったときには顔認証ができるシステムです。こういった顔認証技術にちょっとしたアイデアを組み込めばいろいろなことができる商品になるかもしれませんね!

 

最後までお読みいただきありがとうございました。

下記のコメント欄に感想・応援メッセージなど頂けるととても嬉しいです。

2021年よりSSブログSSコラムに取り組んでいます。もしよろしければ他の記事もご覧ください。

プログラミング初心者がソフトウェア開発をする際に知っておくべきポイント

最新情報をチェックしよう!