ラズパイ3で静止画やLiveカメラから年齢・性別を推測してみる


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サーバーを立ててしまうのもいいかも。

簡単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はお世辞にも精度が良いとはいえません。

カメラの場合は画像のサイズや距離にも影響されます。

写す条件が必要なのかも。

 

 

学習データの質が関係しているのかもしれません。

 


 

 

 

Be the first to comment

Leave a Reply

Your email address will not be published.


*