Neural Compute Application Zoo (NC App Zoo)の学習モデル使って、顔の画像から年齢・性別を推論してみます。
Raspberry-Pi (ラズベリーパイ)3 Model B + ncsdk 1.12.00.01の環境
NC App Zooをクローンしてセットアップしておきます。
$git clone https://github.com/movidius/ncappzoo.git
$ cd ncappzoo
$ make
カメラモジュール(or USBカメラ)から顔検出して、年齢・性別を推論します。
ncappzoo/apps/gender_age_lbpを使ってみます。
何も説明が書いてないのでよく分かりませんが、カメラ画像の感じやファイルの名前からLBP特徴を推論に使っているのか……単に顔検出に使ってるだけなのか。
実行ファイルが使うカスケード:lbpcascade_frontalface_improved.xml
graphはGenderNetとAgeNetのCaffeモデル
USBカメラを使います。
USBではなく、カメラモジュールを使う場合は、以下のコマンドでマウントしておきます。
$sudo modprobe bcm2835-v4l2
初回時、graphバイナリーを取り込み、実行ファイルを作成して環境を作ってから実行。
$cd ~/ncappzoo/apps/gender_age_lbp
性別
$make run_gender
年齢
$make run_age
環境作成後は以下のコマンドで実行。
cppフォルダー内のgender_age_lbp が実行ファイル
フォルダー構造はそのままにしておきます。
性別
$cd ~/ncappzoo/apps/gender_age_lbp
$cd cpp; ./gender_age_lbp gender; cd ..;
年齢
$cd ~/ncappzoo/apps/gender_age_lbp
$cd cpp; ./gender_age_lbp age; cd ..;
ジェンダー(性別)
年齢に関しては、何歳の時の画像かが大事(デイリースポーツ2018.06.04の写真)。
この方の生年月日は1977年9月20日。
’25-32′,’38-43′の間で揺れてました、判断が難しかったようです。
静止画像の人物からその人の年齢を推論してみます。
AgeNetのCaffeモデルを使います。
$cd ~/ncappzoo/caffe/AgeNet
環境はできていますので、後は実行するだけ。
AgeNetの推論範囲:age_list=[‘0-2′,’4-6′,’8-12′,’15-20′,’25-32′,’38-43′,’48-53′,’60-100’]
抜けてる年齢があるのは、何か意味があるのでしょうか?
(集めた学習用データにその年齢の人が含まれていなかった?学習データをアノテーションする際には生年月日も含めるでしょうし……よく分かりませんが。)
この分類だとこういう感じになるのかな?
乳児,幼児,学童,ティーンエイジャ,ヤング,アダルト,シニア,シルバー
デフォルトではこういう画像の人物の年齢を推論しています。
$python3 run.py
この方は25-32歳くらいと推論されています。つまり、ヤングだと。うーむ。
ちなみに写真の方はタリサ・ソトという女優さんなんですが、1967年生まれです。問題はこの写真がいくつの時のものかということ。
閑話休題
学習用画像に俳優さんやスポーツ選手が多いのは生年月日を特定し易いからだそうです。
画像のオリジナルはhttp://vis-www.cs.umass.edu/lfw/images/Talisa_Bratt/Talisa_Bratt_0001.jpg
つまり名前はTalisa Brattさん。この方は2002年にBrattさんという方とご結婚されててそれで名前が違っているのですね。Talisa Bratt名になってからの写真だと推測して調べてみると……….、背景のメルセデスのロゴと服の肩の辺の素材感からどうやらMiramax Pre-Oscar Partyの時のものらしい(2002年3月23日)。
だとしたら2002 – 1967 = 35。大目にみてギリ合っているかもしれませんね。
画像を変えて、この方ならどうでしょう。
60-100歳くらいのようです。つまり、シルバー。納得しますね。
画像を変える場合は、run.pyのコードに手を加える必要があります。
run.pyの画像はVision Labというサイトのデータベースから直接ダウンロードして使うようになってます。
画像は150 x 150 のjpgファイルです。
os.system(‘wget -O image.jpg -N http://vis-www.cs.umass.edu/lfw/images/Talisa_Bratt/Talisa_Bratt_0001.jpg‘)
●
ご自分のWebサイトをお持ちの場合は、http以下を書き換えてDLするようにしてもいいです。
画像はimage.jpgでDLされます。
●
Windowsな方は….
ラズパイはWi-FiでPCと通信できているはずなので、Webサーバーを立ててしまうのもいいかも。
サーバーのローカルIPをipconfigで調べておきます(例えば、192.168.0.23だったとします)。
例えばCドライブにwwwというフォルダーを作っておいて画像(xxx.jpg)を置いときます。
インストール不要で起動します。
例えば8080番のポートを使うとして「追加」をクリックするとルートを聞いてくるので先ほどのC:\wwwをアサインします。
後は、
os.system(‘wget -O image.jpg -N http://192.168.0.23:8080/www/xxx.jpg’)
Mac OSX やLinuxな方は
python -m SimpleHTTPServer 8080
or
python -m http.server 8080
●
ローカルの場合は、USBメモリーから読み込むようにしてみます。単純です。
画像名も引数で指定できるようにします。
import sysの直下に
以下を追加(引数として、拡張子無しの画像の名前を1つだけ指定)
args = sys.argv
if len(args) == 2:
img_name = args[1]
else:
sys.exit()
os.systemを以下のように変更(ラズパイの場合)
target = ‘/media/pi/<USBメモリのラベル名>/’ + img_name + ‘.jpg’
os.system(‘cp ‘ + target + ‘ image.jpg’)
これでUSBメモリーのxxx.jpgという画像を試す場合は
$python3 run.py “xxx”
でいけるはず。
サンプル(USBメモリーのラベル名は変更)
いろいろ試してみましたが、AgeNetはお世辞にも精度が良いとはいえません。
カメラの場合は画像のサイズや距離にも影響されます。
写す条件が必要なのかも。
学習データの質が関係しているのかもしれません。
Leave a Reply