konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

ラズパイで物体認識シリーズ YOLO v5のセットアップ

OpenCV の次は物体検出 & 認識で有名どころの YOLO に挑戦です

f:id:konchangakita:20200801234426p:plain

【ラズパイで物体認識シリーズ】
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=10 にしたら進んだり。。。。。)
いろいろ試してみたつもりですが、結局 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 による物体検出を行うことができます

f:id:konchangakita:20200803211617p:plain


引数無しで実行すると、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のデモ画像と同様な感じで検出できているようです
f:id:konchangakita:20200803213535p:plain


6秒かかるとなるとビデオ動画ではなかなか厳しそうなヨカンがします