はじめに
最近発売されたJetson Nano 2GBを使ってドローン検知システムを作ってみました。
お好きな物体の画像でデータセットを作れば、オリジナルの検知システムが出来上がりますので是非ご参考ください!
構成
今回はYOLOv4 tinyを Colaboratory で転移学習させ、生成された重みを Jetson に移植しました。
学習に用いたドローンの画像は約100枚。YOLO独特のフォーマットがあるので、こちらのラベリングツールでYOLO用のデータセットを作成し、食べさせました。
推論は Jetsonローカルで行うため、インターネット接続は必要ありません。
ただし、検知 → アラート通知の仕組みも作ったので、そこだけWiFiが必要です。
以下、全体の構成です。
WEBカメラは Logicool C525n を使用しました。

YOLOの推論結果のログを監視して、ドローンを検知したらLINE Notifyの API を叩く構成にしました。
ちなみに、こんな感じで検知します。

モデル作成
Colaboratory を開いたら、GPUモードに変更しましょう。
そして、YOLOv4 (darknet) を git clone します。
コマンドは以下です。
!git clone https://github.com/AlexeyAB/darknet
GPU と OpenCV を使えるように makefile を書き換えます。
%cd darknet
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile
!sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile
そしてmakeします。
!make
これには少し時間がかかります。
できたら次は、学習済みの重みを落とします。
!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29
そして、自分の Google Drive をマウントして、あらかじめアップロードしておいたデータセットを読み込めるようにしましょう。
YOLO の学習にはデータセット以外にもobj.data.txtやyolov4-tiny-custom.cfgなどの設定ファイルが必要です。
用意しましょう。
まずobj.data.txtを作って以下を書き込みます。
classes = 1
train = /path/to/train.txt
valid = /path/to/test.txt
names = /path/to/obj.names
backup = /path/to/backup
今回はドローンを検知するだけなのでclassesは1にします。
obj.namesにはラベル名を記載します。今回はテキストファイルに「drone」とだけ記載すればOKです。
backupディレクトリには学習済みの重みが記録されます。
yolov4-tiny-custom.cfgはニューラルネットのアーキテクチャーを設定するファイルです。こちらを参考に内容を書き換えましょう。
train.txtとtest.txtは各データセットの画像へのパスを記載したテキストファイルです。仮に、親ディレクトリ名がdir、trainデータセットのディレクトリ名がobjの場合、以下のコードで生成できます。
import os
image_files = []
os.chdir(os.path.join("dir", "obj"))
for filename in os.listdir(os.getcwd()):
if filename.endswith(".jpg"):
image_files.append("dir/obj/" + filename)
os.chdir("..")
with open("train.txt", "w") as outfile:
for image in image_files:
outfile.write(image)
outfile.write("\n")
outfile.close()
os.chdir("..")
Colaboratory などで実行すると、train.txtが生成されたはずです。
test.txtも同様に作ります。
最終的に以下のファイル/フォルダが同じ場所にあればOKです。
- backup
- obj
- test
- train.txt
- test.txt
- obj.data.txt
- obj.names
- yolov4-tiny-custom.cfg
- yolov4-tiny.conv.29
backupは学習済みの重みが保存される空ディレクトリ、objとtestは自作したオリジナルの training/test データセットをそれぞれ格納するディレクトリです。
これで準備OKですので、オリジナルデータセットで YOLOv4 (darknet) を訓練しましょう!
!./darknet detector train /path/to/obj.data.txt /path/to/yolov4-tiny-custom.cfg /path/to/yolov4-tiny.conv.29 -dont_show -map
約100枚のドローン画像を用いた学習で約1時間半かかりました。
学習が終わると、backupフォルダにyolov4-tiny-custom_best.weightsが生成されます。
こいつとobj.data.txt obj.names yolov4-tiny-custom.cfgを Jetson Nano に移して推論していきます!
Jetson Nano の環境構築
基本的には Colaboratory と同じ環境を Jetson Nano にも作ってあげます。
初期設定などは以下の動画を参考に進めていけばOKです。
これで必要なモノがだいたい揃うので、この後は足りないものを Jetson のターミナルから都度ダウンロードしていく感じです。
Jetson AI Fundamentals - S1E1 - First Time Setup with JetPack
https://youtu.be/uvU8AXY1170
Jetson AI Fundamentals - S3E1 - Hello AI World Setup
https://youtu.be/QXIwdsyK7Rw
Jetson のターミナルを起動し、YOLOv4 (darknet) を入れたいディレクトリに移動してgit cloneです。
$ git clone https://github.com/AlexeyAB/darknet
次に Colaboratory 同様に makeflie をいじるのですが、少し方法が違います。
こちらの記事を参考に変更しましょう。
できたらmakeコマンドでビルドします。
$ make
これで準備できました。
Jetson Nano + WEBカメラで YOLOv4 のリアルタイム推論を発動させましょう。
$ ./darknet detector demo /path/to/obj.data.txt /path/to/yolov4-tiny-custom.cfg /path/to/yolov4-tiny-custom_best.weights -thresh 0.1 >darknet.log
デフォルトで接続されたWEBカメラを使ってくれるはずです。
- threshで検知の閾値を設定します。推論結果として一種の確度(%)みたいなものを出力するのですが、thresh 0.1なら10%以上の確度を持ってドローンと分類したものだけを表示してくれます。
>darknet.logは次に説明するアラート通知に使うためのログを吐き出すコマンドです。
LINE通知の仕組みを作る
今回はswatchでdarknet.logを監視して「drone」というワードが出てきたら .shファイルを実行させLINE Notifyの API を叩きます。
まずswatchをインストールします。
$ sudo apt-get install swatch
次にvimやnanoでswatch.confファイルを作ります。
※ vim などが入っていない場合はターミナルから落としてください。
※ アクセス権限も適宜変更してください。
$ vim swatch.conf
watchfor /drone/
exec /path/to/LINEnotify.sh
threshold track_by=/drone/,type=both,count=3,seconds=10
type=both,count=3,seconds=10とすると、
「time interval が10秒に設定され、time intervalの間に 3 回ドローンを検知した時点でLINEnotify.shを実行。その後はtime intervalが切れるまで無視される。」
という設定になります。
検知する度にLINEがくるのは嫌なので。。
実行ファイルには以下のように記述します。
curl -g -X POST -H "Authorization: Bearer ACCESS_TOKEN" -F "message=ここにメッセージを書く" https://notify-api.line.me/api/notify
echo
exit 0
ACCESS_TOKENに発行されたトークンを記入します。
トークンの発行方法はこちらを参照ください。
これで完成です!
リアルタイムでドローン検知しているときに以下のように実行すると、
$ swatchdog --config-file=/path/to/swatch.conf --tail-file=/path/to/darknet.log
おわりに
Jetson Nano 2GB でオリジナルデータセットを学習した YOLOv4 tiny を動かしてみました。
この構成でだいたい5 FPSは出ます。
飛行しているトイドローンの横で本をひらひらさせても誤検知しません笑
100枚程度で tiny なのに、なかなか優秀です。
これで部屋にドローンが侵入しても安心ですね!
参考文献
- JETSON AI COURSES AND CERTIFICATION
- LINE Notify
- GitHub - dusty-nv/jetson-inference: Hello AI World guide to deploying deep-learning inference networks and deep vision primitives with TensorRT and NVIDIA Jetson.
- GitHub - AlexeyAB/darknet: YOLOv4v / Scaled-YOLOv4 - Neural Networks for Object Detection (Windows and Linux version of Darknet )
- Train YOLOv4-tiny on Custom Data - Lightning Fast Object Detection

