ラズパイで物体認識シリーズ YOLO v5のセットアップ
OpenCV の次は物体検出 & 認識で有名どころの YOLO に挑戦です
【ラズパイで物体認識シリーズ】
・OpenCV の準備
・HaarCascades を使った物体検出
・YOLO v5のセットアップ ←イマココ
・Xi IoTへの組み込み ちょっと延期
==環境====
raspberry Pi 4 model-B RAM 4GB
$ cat /proc/version
Linux version 5.4.51-v7l+ (dom@buildbot) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1327 SMP Thu Jul 23 11:04:39 BST 2020
$ cat /etc/debian_version
10.4
========
YOLOの歴史
YOLO [You Only Look Once、一度だけ見る] は 2016 年に J. Redmon らにより提案された手法ですが、YOLO v3がYOLO初代を作った人たちかかわった最後のバージョンらしいので、YOLO v4以降は命名に論争があるそうです
【YOLOリリースの歴史】
YOLOv1 2016年5月
YOLOv2 2017年12月
YOLOv3 2018年4月
YOLOv4 2020年4月
YOLOv5 2020年6月9日
初代の論文
You Only Look Once: Unified, Real-Time Object Detection
物体検出に CNN (畳み込みニューラルネットワーク) の考え方を応用した手法みたいですね
ラズパイ4にYOLOの導入
まずは Github からソースをゲットします
GitHub - ultralytics/yolov5: YOLOv5 in PyTorch > ONNX > CoreML > iOS
$ git clone https://github.com/ultralytics/yolov5.git
ダウンロードしてきた "requirements.txt" の中身を確認します
# pip install -U -r requirements.txt Cython numpy>=1.18.5 opencv-python torch>=1.6 matplotlib pillow tensorboard PyYAML>=5.3 torchvision>=0.6 scipy tqdm # pycocotools>=2.0 # Conda commands (in place of pip) --------------------------------------------- # conda update -yn base -c defaults conda # conda install -yc anaconda numpy opencv matplotlib tqdm pillow ipython # conda install -yc conda-forge scikit-image pycocotools tensorboard # conda install -yc spyder-ide spyder-line-profiler # conda install -yc pytorch pytorch torchvision # conda install -yc conda-forge protobuf numpy && pip install onnx==1.6.0 # https://github.com/onnx/onnx#linux-and-macos
ラズパイでなければ ”pip install -U -r requirements.txt” で必要なモジュールをインストールしたいところですが、ちょっと工夫が必要でした
ラズパイに PyTorch をインストール
"pip3 install torch" とかでは、いろいろ怒られてインストールできないようです
まずはPyTorchだけをインストールするところからはじめます
このあたりとかを参考に、ソースからビルドすることになるのですが、
Install pyTorch in Raspberry Pi 4 (or any other) · GitHub
一回試すごとに4-5時間かかるうえになかなかうまくいきません
ビルドの段階(sudo -E python3 setup.py build) で、こんな感じのエラーがでつつ
$ sudo -E python3 setup.py build ・ ・ ・ /home/pi/pytorch/pytorch/third_party/onnx/onnx/onnx_pb.h:52:10: fatal error: onnx/onnx.pb.h: そのようなファイルやディレクトリはありません #include "onnx/onnx.pb.h" ^~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [caffe2/CMakeFiles/caffe2_pybind11_state.dir/build.make:63: caffe2/CMakeFiles/caffe2_pybind11_state.dir/python/pybind_state.cc.o] エラー 1 make[1]: *** [CMakeFiles/Makefile2:1977: caffe2/CMakeFiles/caffe2_pybind11_state.dir/all] エラー 2 make[1]: *** 未完了のジョブを待っています.... [ 73%] Linking CXX executable ../bin/conv_to_nnpack_transform_test [ 73%] Built target conv_to_nnpack_transform_test [ 73%] Linking CXX executable ../bin/depthwise3x3_conv_op_test [ 73%] Built target depthwise3x3_conv_op_test [ 73%] Linking CXX executable ../bin/pattern_net_transform_test [ 73%] Built target pattern_net_transform_test make: *** [Makefile:141: all] エラー 2 Failed to run 'bash ../tools/build_pytorch_libs.sh caffe2'
(caffeよく分かってないけど、これも必要?Install | Caffe2)
(export ONNX_ML=1 を 0 にしたら進んだり。。。。。)
いろいろ試してみたつもりですが、結局 PyTorch 最新バージョン(1.6.0)のビルドできず、心が折れました
結局ググりまくって、ラズパイ4用の wheel ファイル(ひとつ前のtorch1.5, torchvision 0.6)を、公開されているのを見つけてこちらを拝借
GitHub - Ben-Faessler/Python3-Wheels: Wheels for Python 3
・torch-1.5.0a0+4ff3872-cp37-cp37m-linux_armv7l.whl
・torchvision-0.6.0a0+b68adcf-cp37-cp37m-linux_armv7l.whl
wheel ファイルがあれば、pipコマンドでインストールしてやるだけです
$ sudo pip3 install ./torch-1.5.0a0+4ff3872-cp37-cp37m-linux_armv7l.whl $ sudo pip3 install ./torchvision-0.6.0a0+b68adcf-cp37-cp37m-linux_armv7l.whl
PyTorch がインストールできたら、Python で import できるか確認します
ライブラリが足りていないと怒られますが、PyTorch自体はインストールできていそうなので、落ち着いてインストール作業を続きます
$ python3 Python 3.7.3 (default, Dec 20 2019, 18:57:59) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import torch Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.7/dist-packages/torch/__init__.py", line 135, in <module> _load_global_deps() File "/usr/local/lib/python3.7/dist-packages/torch/__init__.py", line 93, in _load_global_deps ctypes.CDLL(lib_path, mode=ctypes.RTLD_GLOBAL) File "/usr/lib/python3.7/ctypes/__init__.py", line 356, in __init__ self._handle = _dlopen(self._name, mode) OSError: libmpi_cxx.so.40: cannot open shared object file: No such file or directory
"libmpi_cxx.so.40" の場合は下記でいけました
$ sudo apt install libopenmpi3
YOLOに必要なその他のモジュールインストール
基本的にはそれぞれのモジュールを、"pip3 install -U モジュール名"などでインストールしていきます
が、
scipy はサイズがでかいせいか、インストール失敗したので、直接 wheel ファイルをダウンロードしてやります
とりあえず、一番新しそうなファイルのリンクをコピーします
https://www.piwheels.org/simple/scipy/
wget して、pip3 install します。これラズパイでは結構重要なテクニックのようです
$ wget https://www.piwheels.org/simple/scipy/scipy-1.5.1-cp37-cp37m-linux_armv7l.whl#sha256=a03df78474a6fefd3322b9fe44fe1e38b26cb2737c2bba0f96233cc02dde04a9 $ sudo pip3 install ./scipy-1.5.1-cp37-cp37m-linux_armv7l.whl
YOLOを動かしてみる
前提条件となるモジュールが揃ったので、YOLO v5 の github で入手した "detect.py" を実行することでYOLO v5 による物体検出を行うことができます
引数無しで実行すると、6秒ほどで処理が終わりました
$ python3 detect.py Unable to init server: Could not connect: Connection refused Unable to init server: Could not connect: Connection refused (detect.py:1652): Gdk-CRITICAL **: 21:31:16.623: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed (detect.py:1652): Gdk-CRITICAL **: 21:31:16.627: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed Namespace(agnostic_nms=False, augment=False, classes=None, conf_thres=0.4, device='', img_size=640, iou_thres=0.5, output='inference/output', save_txt=False, source='inference/images', update=False, view_img=False, weights='yolov5s.pt') Using CPU Fusing layers... Model Summary: 140 layers, 7.45958e+06 parameters, 6.61683e+06 gradients image 1/2 /home/pi/yolo/yolov5/inference/images/bus.jpg: 640x512 4 persons, 1 buss, Done. (3.625s) image 2/2 /home/pi/yolo/yolov5/inference/images/zidane.jpg: 384x640 2 persons, 2 ties, Done. (2.696s) Results saved to /home/pi/yolo/yolov5/inference/output Done. (6.652s)
TOPのデモ画像と同様な感じで検出できているようです
6秒かかるとなるとビデオ動画ではなかなか厳しそうなヨカンがします