Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

ラズパイでのTensorflow2.3インストール手段と人物画像から年齢予測

興味本位で顔検出からの年齢や性別予測してみたいな🤔、
と思い立ち、さっそく実施してみることにしました!!

AWSを用いればS3に保存された画像から顔検出、年齢、性別予測が出来ることは知っているのですが、、、
AWSの無料期間使い切ってしまっているし、どうせだったら無料の方法でやりたいよな。
と思い、さっそく調べてみることに。

そこで、ローカル環境で年齢や性別予測することが出来る方法が見つかったので試しに使ってみることにしました!!



■利用環境

手頃なサーバが見つからなかったので、お試しで
Raspberry Pi 4
を用いてみました。

■ローカルで年齢、性別を予測する方法

こちらの記事にて紹介されておりました。
qiita.com

FacenetのMTCNNにて顔検出を行い、kerasで年齢や性別を予測しているようです。
こちらの方がgithubにて環境一式を用意されているようでしたので、試しにこちらを実行してみました。

そうしたところ、Tensorflowのバージョンが古いために実行できませんでした😥
こちらのログが出力されてしまったのです。。。

ImportError: Keras requires TensorFlow 2.2 or higher. Install TensorFlow via `pip install tensorflow

そこで、Tensorflowのバージョンを上げることに!!
しかしながら、バージョンアップを実施する上で少し躓いたのでまとめておくことにします!!

■対策1

pipにてアップグレードを試みてみました。
コマンドはこちら。

pip3 install --user --upgrade tensorflow

ですが、1.13.1までしかアップグレードされませんでした。
簡単にはいきませんね😥

■対策2

pipでインストールできないのなら、、、
自分でソースからビルドするしかない!!
、と言うことで早速実施してみました。

まず、

wget "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/master/tensorflow-2.3.0-cp37-none-linux_armv7l_download.sh"

にてダウンロードスクリプトを取得。
そして、

sudo chmod +x tensorflow-2.3.0-cp37-none-linux_armv7l_download.sh
./tensorflow-2.3.0-cp37-none-linux_armv7l_download.sh

にてダウンロードスクリプトを実行!!

次に先ほどのダウンロードスクリプトにて取得したtensorflowをインストール!!
の前にすでにインストール済みのtensorflowを削除。

pip3 uninstall tensorflow

最後にtensorflowをインストール!!

pip3 install tensorflow-2.3.0-cp37-none-linux_armv7l.whl

これでインストールは完了。
念のため、インストールされたことを確認するためにこちらを実行。

pip3 list | grep tensorflow
tensorflow                       2.3.0
tensorflow-estimator             2.3.0

が出力されればOKです!!

■その他のエラーについて

tensorflowを2.3にするとこちらのようなエラーが発生。
エラーはこちら。。

'tensorflow._api.v2.nn' has no attribute 'xw_plus_b'

どうやらtensorflowを2.x.xと1.x.xでAPIが異なるようで、使用できなくなってしまうようです。
そこで、

tf.nn.xw_plus_b

のコードをこちらに変更。

tf.compat.v1.nn.xw_plus_b

他にも
・tf.div
・tf.GPUOptions
なども同様にエラーとなってしまうので、
compat.v1
を追記いたします。

ほかにも、kerasやscipyが最新版ではなくてはいけなかったので、

pip3 install モジュール名 --upgrade

を実行してアップグレードを実行。

これで、環境構築完了。
環境を作るだけで一苦労でした。。

■実行

せっかく構築できたので、人のコードですがお試しで実行してみました!!

face_age_gender.py
の106行目あたり、

img = cv2.imread("input.jpg") #入力画像

jpgファイル名を実行したいファイル名に変更。
そして、実行!!
結果はこちら。

【入力画像】
f:id:Elsammit:20210302222358j:plain

【出力画像】
f:id:Elsammit:20210302222421j:plain

※画像はこちらを利用。
https://www.pakutaso.com/20210259056post-33541.html

性別はOK。
年齢も恐らくOKですね!!

他の画像も試してみましたが大体判定出来ていました。

■最後に
今回は有識者が作成したコードをそのまま使ってみました。
ローカル環境でも結構精度が出るんですね。

ちょっと判定結果の表記が小さかったり、動画に対応してみたいとも思ったりしているので、
これから自分アレンジしていきたいと思います!!


■参考
https://qiita.com/oHjm/items/677b57d4714de3cf83ca
https://itnext.io/installing-tensorflow-2-3-0-for-raspberry-pi3-4-debian-buster-11447cb31fc4
https://github.com/keras-team/keras/issues/12649