今回はラズパイでYoloを使用して物体検知をしてみたいと思います!!
結構環境構築に手こずったところがあるので、こちらも備忘録として残して置ければと思います。
■環境構築手順
今回下記tensorflow2-yolo-v3を利用して物体検出を実施いたします。
https://github.com/zzh8829/yolov3-tf2.githttps://github.com/cedrickchee/tensorflow2-yolo-v3
こちらを利用するにあたり、tensorflow2.1以上が必要になります。
そこでまずはtensorflow2.1をインストールしていきたいと思います。
念のため必要なファイルをインストール。
sudo apt-get install python3-protobuf python3-termcolor python3-yaml python3-pydot python3-pyasn1 python3-pyasn1-modules python3-rsa python3-markdown python3-cachetools python3-future python3-dill python3-tqdm python3-pil python3-pip python3-wheel python3-setuptools python3-matplotlib python3-h5py python3-scipy python3-grpcio python3-requests-oauthlib python3-werkzeug
そして実際にtensorflow2.1以上をインストールしてみます!!
下記の通りpipを用いてインストール出来ればよかったのですが、、、
上手くインストールできず苦戦しました。。。
まずこちらのコマンドを実行してみたところ、
pip3 install tensorflow==2.3.0
こちらのようなエラーになり、
ERROR: Could not find a version that satisfies the requirement tensorflow==2.3.0 ERROR: No matching distribution found for tensorflow==2.3.0
ということで自分でtensorflowを主導でダウンロード・インストールすることにしました。
手順はこちら。
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 sudo pip3 uninstall tensorflow export PIP_DEFAULT_TIMEOUT=1000 pip3 install tensorflow-2.3.0-cp37-none-linux_armv7l.whl
ここで、tensorflowのインストールに時間がかかってしまいデフォルト設定のままですとタイムアウトエラーが発生してしまいました。
そこで、
export PIP_DEFAULT_TIMEOUT=1000
をインストール前に実行しております。
もし上記でインストール出来ない場合、下記のように管理者権限でインストールを試してみてください。
sudo -H pip3 install tensorflow-2.3.0-cp37-none-linux_armv7l.whl
【補足】
もしかしたらこちらでもインストール出来るかもしれません。
python3 -m pip install tensorflow-hub tensorflow-datasets https://github.com/lhelontra/tensorflow-on-arm/releases/download/v2.3.0/tensorflow-2.3.0-cp37-none-linux_aarch64.whl
pip3 install opencv-python
を実行。
これで環境構築完了です。
■tensorflow2-yolo-v3を利用して物体検知してみる
環境構築も完了したので実際に物体検知していきたいと思います!!
まずは学習データをダウンロード。
wget https://pjreddie.com/media/files/yolov3.weights -O data/yolov3.weights wget https://pjreddie.com/media/files/yolov3-tiny.weights -O data/yolov3-tiny.weights
yolov3とyolov3-tinyという簡易版の両方を使用したかったので両方ダウンロードしてみました。
実際には片方のみで問題ないです。
ではこちらの学習データを適用してみたいと思います。
コマンドはこちら。
【yolov3】
python3 convert.py --weights ./data/yolov3.weights --output ./checkpoints/yolov3.tf
【yolov3-tiny】
python3 convert.py --weights ./data/yolov3-tiny.weights --output ./checkpoints/yolov3-tiny.tf --tiny
少し時間がかかるので、しばし待つ。
下記のようなメッセージが出力されればOKです。
I0516 10:10:52.379993 3069450960 convert.py:28] weights saved
ここまで長った。。。
では、実際に物体検知してみます!!
コマンドはこちら。
【yolov3】
python3 detect.py --image ./data/meme.jpg
【yolov3-tiny】
python3 detect.py --weights ./checkpoints/yolov3-tiny.tf --tiny --image ./data/meme.jpg
もしかしたらスワップ領域を拡張しないと動かない可能性があります。
スワップ領域を拡張するために、/etc/dphys-swapfileファイルを下記の通り変更してみてください。
CONF_SWAPSIZE=1024
■実行結果をまとめてみる
では実行結果についてまとめていきたいと思います。
まずは各動作での物体検知精度です。
各検出結果の画像はこちらの通り。
【yolov3】
【yolov3-tiny】
yolov3-tinyの方が簡易版だけあって少し精度が悪いですね。
ただ、どちらもある程度の物体検出は行えておりますね。
次に実行時間。
【yolov3】
21.9秒
【yolov3-tiny】
4.2秒
圧倒的にyolov3-tinyの方が早いですね。
ただどちらもリアルタイム性はあまりなさそうですね。。。
■最後に
今回はYOLOで物体検知を試してみました。
今度は動画で試してみようかな??
動画になるとある程度速度が求められるので、yolov3-tinyで実施ですね。
yolov3の21秒は、動画にしてはちょっと、、なので。