LoginSignup
0
0

More than 3 years have passed since last update.

【You Only Look Drone】Jetson Nano でドローン検知システムを作ってみた

Posted at

はじめに

最近発売されたJetson Nano 2GBを使ってドローン検知システムを作ってみました。
お好きな物体の画像でデータセットを作れば、オリジナルの検知システムが出来上がりますので是非ご参考ください!

構成

今回はYOLOv4 tinyを Colaboratory で転移学習させ、生成された重みを Jetson に移植しました。
学習に用いたドローンの画像は約100枚。YOLO独特のフォーマットがあるので、こちらのラベリングツールでYOLO用のデータセットを作成し、食べさせました。

推論は Jetsonローカルで行うため、インターネット接続は必要ありません。
ただし、検知 → アラート通知の仕組みも作ったので、そこだけWiFiが必要です。

以下、全体の構成です。
WEBカメラは Logicool C525n を使用しました。
image01.png

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

モデル作成

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.txtyolov4-tiny-custom.cfgなどの設定ファイルが必要です。
用意しましょう。

まずobj.data.txtを作って以下を書き込みます。

obj.data.txt
classes = 1
train = /path/to/train.txt
valid = /path/to/test.txt
names = /path/to/obj.names
backup = /path/to/backup

今回はドローンを検知するだけなのでclasses1にします。

obj.namesにはラベル名を記載します。今回はテキストファイルに「drone」とだけ記載すればOKです。

backupディレクトリには学習済みの重みが記録されます。

yolov4-tiny-custom.cfgはニューラルネットのアーキテクチャーを設定するファイルです。こちらを参考に内容を書き換えましょう。

train.txttest.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は学習済みの重みが保存される空ディレクトリ、objtestは自作したオリジナルの 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通知の仕組みを作る

今回はswatchdarknet.logを監視して「drone」というワードが出てきたら .shファイルを実行させLINE Notifyの API を叩きます。

まずswatchをインストールします。

$ sudo apt-get install swatch

次にvimnanoswatch.confファイルを作ります。

※ vim などが入っていない場合はターミナルから落としてください。
※ アクセス権限も適宜変更してください。

$ vim swatch.conf
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がくるのは嫌なので。。

実行ファイルには以下のように記述します。

LINEnotify.sh
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

こんな感じでLINEのメッセージが届きます。
image03.png

おわりに

Jetson Nano 2GB でオリジナルデータセットを学習した YOLOv4 tiny を動かしてみました。
この構成でだいたい5 FPSは出ます。
飛行しているトイドローンの横で本をひらひらさせても誤検知しません笑
100枚程度で tiny なのに、なかなか優秀です。

image04.png

これで部屋にドローンが侵入しても安心ですね!

参考文献


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0