動かざることバグの如し

近づきたいよ 君の理想に

Jetson Nanoを使ってYOLOでリアルタイム物体認識する

Jetson Nanoにカメラを接続して、YOLOでリアルタイム物体認識を行う

用意するもの

  • Jetson Nano (当然)

  • Raspberry Pi Camera V2でないと動かないので注意

あと認証があるらしくパチもんも動かないらしい

カメラ&GPU使うと結構電気消費するらしいので、できればMicroUSB経由ではなくちゃんとした電源経由のほうが安定する。(たまにハングアップする

インストール

YOLOは所詮物体検出アルゴリズムの一種にすぎないので、インターフェイスが必要。が、コードは書きたくないのでYOLO対応のニューラルネットワークフレームワークであるdarknetを使う

pjreddie/darknet: Convolutional Neural Networks

darknetを使うにあたって.bashrcに以下を追記

export PATH=/usr/local/cuda/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH}

git cloneでdarknetを落とす

git clone https://github.com/pjreddie/darknet.git

YOLOのデータファイルをダウンロード デフォルトではyolov3を使うが、Jetson Nanoでは残念ながら力不足なのでTINYバージョンを使う

cd darknet
# wget https://pjreddie.com/media/files/yolov3.weights
wget https://pjreddie.com/media/files/yolov3-tiny.weights

ビルド、の前にMakefileの先頭を修正してGPUを使うようにする。以下のように合わせる

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=1
LIBSO=1
ZED_CAMERA=0

でビルド

make -j4

darknet自体のビルドは軽いが、Jetson Nanoだとやはり時間はかかる。

いざ画像判定

プロジェクトの中にサンプル画像が入っているのでそれを使って判定してみる。

./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg

カメラ経由で物体認識

当然だが、予めカメラが接続できていることが前提

./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights "'nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=(string)NV12, framerate=(fraction)30/1 ! nvtee ! nvvidconv flip-method=2 ! video/x-raw, width=(int)1280, height=(int)720, format=(string)BGRx ! videoconvert ! appsink'"

デフォルトのnvarguscamerasrcから得られるカメラ画像は上下逆なので補正する必要がある。(それに合わせてOpenCVを自前ビルドすればいいのかもしれないが未確認

試しにペットボトルかざしたら「bottle」と出た。おおよそ15FPSなので若干モッサリ感は否めない。

Jetson NanoのWifiが不安定問題

Jetson Nano自身にはWIFIは搭載されてないので、自分でUSBのWifiアダプタを購入して接続する必要があるのだが、いかんせん不安定だったのでメモ

環境

状況

pingですらたまに落ちる。が、調子いいときは普通に接続できる

解決策

Linuxが読み込んでいるドライバがよろしくない

おそらく、lsmodすると「rtl8192cu」というドライバがロードされているはず。

root@nano:~# lsmod|grep rtl8192cu
rtl8192cu              85379  0
rtl_usb                14074  1 rtl8192cu
rtl8192c_common        54245  1 rtl8192cu
rtlwifi                88873  3 rtl_usb,rtl8192c_common,rtl8192cu
mac80211              719792  4 rtl_usb,rtlwifi,rtl8192cu,rtl8xxxu

が、残念なことに「rtl8192cu」はもともと不安定らしい

Realtek RTL8192CU無線LANのバグ対策 | 見よう見まねのブログ

のでこれをロードしないように /etc/modprobe.d/blacklist.confに以下を追加

blacklist rtl8192cu

で、再起動する。これで再度lsmodしてrtl8192cuがなければおk

Wifiも安定するようになるはずである

参考リンク

Jetson NanoにTensorFlowとKerasをインストール

Jetson Nanoとは1万円弱で買えるRaspberry Pi大きさ並みのGPU付きシングルボードコンピュータである。

で、GPUがあるということは当然機械学習用なわけで、早速ライブラリのインストールをした

環境

  • Ubuntu 18.04
  • CUDA 10 最初から入ってる
  • python 3.6 pyenv経由でインストールした

ビルドが必須なので先に以下のパッケージは入れておくこと

# apt install build-essential cmake g++

TensorFlowのインストール

公式がイメージを出しているのでそれを使うのが吉

依存ライブラリのインストール

# apt install  libhdf5-serial-dev hdf5-tools

GPU版をインストールしたいのでtensorflow-gpu

pip install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu

結構時間かかるので注意

kerasのインストール

インストール自体は pip install keras だけなのだが、scipyのインストールにコケる。

先に依存ライブラリのインストール

# apt install libatlas-base-dev gfortran

でcythonをインストールしておく必要がある。(すでにインストールされてあれば問題ない)

pip install -U cython

ffmpegでRTSPのストリーミング映像から1画像として保存する

環境

ffmpeg version git-2019-03-08-147ef1d Copyright (c) 2000-2019 the FFmpeg developers

やりたいこと

RTSPのデータから画像としてJPEG画像として保存したい

だめだったパターン

ffmpeg -y -i rtsp://192.168.1.202:554 -f image2 out.jpg

[image2 @ 0x7f85bf800600] Could not get frame filename number 2 from pattern 'out.jpg'. Use '-frames:v 1' for a single image, or '-update' option, or use a pattern such as %03d within the filename.
av_interleaved_write_frame(): Invalid argument

なんかエラーになる。言われたとおりオプションつけてみる

うまくいったパターン

ffmpeg -y -i rtsp://192.168.1.202:554 -f image2 -frames:v 1 out.jpg

ドンキのWiFiカメラで遊ぶ

ドンキのWiFiカメラ

ドンキホーテプライベートブランドとして「スマモッチャー」というIP監視カメラを発売した。

これがとある個人ブログが発端で話題になり、それはそれで面白いのだが、見ている感じ、素のLinuxを積んでいるだけなので楽しそうだった(?

ので、買おうとドンキに行ったが、売り切れていた

店員いわく、全国のドンキで初回は1000台仕入れており、注文をした店舗のみに在庫を置くようにしたらしい。だからそもそも入荷してない店舗もけっこうあったのとこと。(で次回入荷は未定

ということでジェネリック同じ型のIPカメラをAmazonで見つけたので勢いでポチった。

本来だとYCC365とかいう中華アプリを経由しないと閲覧できないが、ちょっと怖い

ノーガード戦法WIFIカメラ

そのブログいわく最初からtelnetがパスワードなしでアクセスできるとのこと。早速やってみたらアクセスできた

面白いのでnmapを試す

~ $nmap -Pn 192.168.1.202

Starting Nmap 7.12 ( https://nmap.org ) at 2019-05-12 15:50 JST
Nmap scan report for 192.168.1.202
Host is up (0.11s latency).
Not shown: 993 closed ports
PORT     STATE SERVICE
23/tcp   open  telnet
80/tcp   open  http
554/tcp  open  rtsp
843/tcp  open  unknown
5050/tcp open  mmcc
7103/tcp open  unknown
8001/tcp open  vcom-tunnel

telnetとrtspが美味しそう。httpは何も表示されなかった。。。

telnet

古のtelnetがroot権限で可能

  • ユーザー名root
  • パスワードc@linux(@がx)

ストリーミング配信

RTSPプロトコルによるリアルタイム配信

「rtsp://192.168.1.202:554/」をVLCメディアプレーヤー等で開くとリアルタイムの映像が表示される

ONVIFカメラとしてストリーム再生、PTZ操作

ONVIFというIPカメラ専用の規格があり、このIPカメラもその規格に準じているのでサードパーティのアプリで操作が可能

Androidだと以下のアプリ(無料)で閲覧できた

このアプリだとリアルタイムビューもカメラ操作もできた。ただスナップショットの撮影はなぜかできなかった。。

さらに使いやすくする

残念ながら一部の機能は制限されてしまっているので、有志の方が作ってくださった非公式のmodをインストールする

インストール

まずはファームウェアのバージョンを確認。IPカメラにtelnetでログインして以下を実行

# ls /tmp | grep -F 3.
3.4.1.0114

3.1.1.0908までならzsgx1hacks-v0.4.zipが使えるが、それ以降はREAD-Onlyのreadonlyhack-v0.1.zipでないとだめ 今回は3.4とかなり新しめなのでreadonlyhack-v0.1.zipにした

ここからreadonlyhack-v0.1.zipをダウンロードして解凍 中のhackディレクトリとdebug_cmd.shをSDカードの直下に置く

でSDカードを入れて起動する。仕様上、debug_cmd.shは起動時に実行されるらしく、このmodはそれを利用している。

以下、拡張される機能

ssh

telnetの時代は終わった。今はsshの時代

  • ユーザー名: root
  • パスワード: なし

でログイン可能になる ヤバい

Web UI

ブラウザからカメラの操作が可能になる。ポート番号は8080で

http://192.168.x.xxx:8080/cgi-bin/webui でアクセス可能

f:id:thr3a:20190512190839p:plain

ここから撮影はできないっぽい(´・ω・`)

中華サーバーへのブロック

hostsファイルを書き換えることによって中華サーバーへリクエストが飛ばないようになっている

mod入れたバージョンでもう一度nmapしてみる

音付きのストリーミング配信

デフォルトのポート番号554では無音だったが、カスタムされたバージョンだとサウンド付きになる

  • 高音質 rtsp://192.168.x.x:8001/0/av0
  • 低音質 rtsp://192.168.x.x:8001/0/av1

まとめ

カメラの性能は高いほうだと思っていて、結構きれい。あと暗闇でもしっかりと映ってるのにはビビった。個人的にやりたい定期的にカメラの画像を撮ってサーバーに保存の部分がまだできてないのでもう少し触ってみる。

f:id:thr3a:20190512185116j:plain

あとカスタム作ってくれてた方に感謝