はじめに
本記事は、Raspberry PiでDarknetを使う方法について記載しています。
以前、Pythonで作る簡単監視カメラ Raspberry Pi + カメラモジュール + 焦電型赤外線センサーを作りました。
今回、焦電型赤外線センサーで人体を検出時に、カメラモジュールで保存した画像ファイルに対して物体検出を行い、人間が検出された場合は通知する仕組みを作ろうと思いました。
結果的にDarknetを使えば、物体検出は簡単にできるのですが、本記事で使用しているRaspberry Pi 3 Model B+では、1回の物体検出で約5分程度かかるため、断念しました。。
備忘録的に、Darknetの使い方を簡潔にまとめます。
Darknet
Darknet(※)は、CおよびCUDAで記述されたオープンソースのニューラルネットワークフレームワークです。高速で簡単にインストールでき、CPUとGPUの計算をサポートしています。また、Darknetはオープンソースでパブリックドメインなため誰でも無料に使用できます。Darknetを使用することで、学習済みのYOLOモデルが使えます。
Joseph Redmonという方が作成していて、TEDにも出ています。
(※)Darknetはプロジェクトの名前でもあります。
YOLO
YOLOは、物体検出のアルゴリズムとして、1つのニューラルネットですべての検出を行うようにトレーニングされています。画像だけでなく映像もリアルタイムで処理できます。
You Only Look Once(一度だけしか見ない)
YOLOの所以です。
現在の最新バージョンは、YOLO v3です。YOLO v2と比べてスピードより、精度向上が行なわれているのが特徴です。YOLO v3の詳細については、YOLOv3: An Incremental Improvementを参照。論文はarXivより閲覧できます。
検証
Raspberry Pi 3 Model B+では、設定ファイルと分類重みファイルにYOLO v3を使用すると、Segmentation faultになるため、設定ファイルと分類重みファイルはYOLO v2を使用しています。
Darknetのインストール
Installing Darknetの通りに実施するだけなので、インストールは簡単です。必要に応じてオプションを選択します。本記事ではオプションを使用しません。
- gitからダウンロード
$ git clone https://github.com/pjreddie/darknet.git
- ディレクトリを移動してmakeの実行
$ cd darknet/
$ make
- モデルのダウンロード(YOLO v2)(※)
$ wget https://pjreddie.com/media/files/yolov2.weights
(※)files以下の分類重みファイル名を指定することで、その他の分類重みファイルもダウンロードできます。YOLO v3の場合は、以下のコマンドを実行します。
- モデルのダウンロード(YOLO v3)
$ wget https://pjreddie.com/media/files/yolov3.weights
Darknetの実行
Darknetコマンドの使い方は、darknet
コマンドの引数にオプション指定します。yolov2を例に説明します。検出する場合は、detector
、設定ファイルにcfg/yolov2.cfg
、分類重みファイルに、yolov2.weights
、検出を行うファイルはサンプルデータのdata/person.jpg
を指定しています。
- Darknetの実行
$ ./darknet detector test cfg/coco.data cfg/yolov2.cfg yolov2.weights data/person.jpg
layer filters size input output
0 conv 32 3 x 3 / 1 608 x 608 x 3 -> 608 x 608 x 32 0.639 BFLOPs
1 max 2 x 2 / 2 608 x 608 x 32 -> 304 x 304 x 32
2 conv 64 3 x 3 / 1 304 x 304 x 32 -> 304 x 304 x 64 3.407 BFLOPs
3 max 2 x 2 / 2 304 x 304 x 64 -> 152 x 152 x 64
4 conv 128 3 x 3 / 1 152 x 152 x 64 -> 152 x 152 x 128 3.407 BFLOPs
5 conv 64 1 x 1 / 1 152 x 152 x 128 -> 152 x 152 x 64 0.379 BFLOPs
6 conv 128 3 x 3 / 1 152 x 152 x 64 -> 152 x 152 x 128 3.407 BFLOPs
7 max 2 x 2 / 2 152 x 152 x 128 -> 76 x 76 x 128
8 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs
9 conv 128 1 x 1 / 1 76 x 76 x 256 -> 76 x 76 x 128 0.379 BFLOPs
10 conv 256 3 x 3 / 1 76 x 76 x 128 -> 76 x 76 x 256 3.407 BFLOPs
11 max 2 x 2 / 2 76 x 76 x 256 -> 38 x 38 x 256
12 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs
13 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs
14 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs
15 conv 256 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 256 0.379 BFLOPs
16 conv 512 3 x 3 / 1 38 x 38 x 256 -> 38 x 38 x 512 3.407 BFLOPs
17 max 2 x 2 / 2 38 x 38 x 512 -> 19 x 19 x 512
18 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs
19 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs
20 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs
21 conv 512 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 512 0.379 BFLOPs
22 conv 1024 3 x 3 / 1 19 x 19 x 512 -> 19 x 19 x1024 3.407 BFLOPs
23 conv 1024 3 x 3 / 1 19 x 19 x1024 -> 19 x 19 x1024 6.814 BFLOPs
24 conv 1024 3 x 3 / 1 19 x 19 x1024 -> 19 x 19 x1024 6.814 BFLOPs
25 route 16
26 conv 64 1 x 1 / 1 38 x 38 x 512 -> 38 x 38 x 64 0.095 BFLOPs
27 reorg / 2 38 x 38 x 64 -> 19 x 19 x 256
28 route 27 24
29 conv 1024 3 x 3 / 1 19 x 19 x1280 -> 19 x 19 x1024 8.517 BFLOPs
30 conv 425 1 x 1 / 1 19 x 19 x1024 -> 19 x 19 x 425 0.314 BFLOPs
31 detection
mask_scale: Using default '1.000000'
Loading weights from yolov2.weights...Done!
data/person.jpg: Predicted in 299.373857 seconds.
horse: 82%
dog: 86%
person: 86%
上記コマンド実行後、 カレントディレクトリに「predictions.jpg」ファイルが生成されます。ファイルを参照すると物体検出が行なわれているのが確認できます。
おわりに
Raspberry Pi 4 Model Bが今年の夏に発表されたので、今後に期待します。
日本では技適取得がまだのため、今のところ(本記事執筆時点)購入することができません。もしくは、Raspberry PiやLinuxなどでAI処理を行なうためのアクセラレータを使うという方法もあるかもしれませんが。。
何れにせよ、Darknetの様なフレームワークが、Raspberry Piの様な小型コンピュータで簡単に試せる時代はもう来ています。