【Jetson nano】DetectNetを使った物体検出

はじめに

前回からだいぶ間が空いてしまいました。

chigrii.hatenablog.com

jetson-inferenceのチュートリアルを舐めるシリーズ第2弾、今回はDetectNetを使った物体検出を試していきたいと思います。

Jetson nanoの環境やセットアップはこちらから

chigrii.hatenablog.com

今回やること

  • 画像・動画からオブジェクト検出デモ
  • ライブカメラからオブジェクト検出デモ
  • オブジェクト検出を実際にコーディングしてみる

画像から検出

以下のコマンドを実行します。

cd jetson-inference/build/aarch64/bin
# C++
./detectnet --network=ssd-mobilenet-v2 images/peds_0.jpg images/test/output.jp
# Python
./detectnet.py --network=ssd-mobilenet-v2 images/peds_0.jpg images/test/output.jp

各オプションについては以下です。

名前 詳細 備考
--network 検出モデルを指定 デフォルト:SSD-Mobilenet-v2
--overlay 画像に表示する項目の指定 デフォルト:box,labels,conf(バウンディングボックス、ラベル、信頼値)
--alpha overlayのアルファ値 デフォルト:120
--threshold 検出の最小しきい値 デフォルト:0.5

出力されたログ(抜粋)

...
[image] loaded '/home/iri/Downloads/Princesses.png'  (1920x1080, 3 channels)
4 objects detected
detected obj 0  class #1 (person)  confidence=0.978219
bounding box 0  (565.865845, 99.381767)  (1335.715698, 990.417725)  w=769.849854  h=891.035950
detected obj 1  class #1 (person)  confidence=0.640411
bounding box 1  (1214.719849, 166.047745)  (1887.613647, 1036.154663)  w=672.893799  h=870.106934
detected obj 2  class #1 (person)  confidence=0.810929
bounding box 2  (6.457014, 203.381561)  (618.595398, 1069.588623)  w=612.138367  h=866.207031
detected obj 3  class #61 (cake)  confidence=0.673406
bounding box 3  (588.501343, 673.810974)  (1133.559082, 1016.538818)  w=545.057739  h=342.727844
[image] saved 'images/test/princesses.png'  (1920x1080, 3 channels)

[TRT]    ------------------------------------------------
[TRT]    Timing Report networks/SSD-Mobilenet-v2/ssd_mobilenet_v2_coco.uff
[TRT]    ------------------------------------------------
[TRT]    Pre-Process   CPU   0.08865ms  CUDA   3.11979ms
[TRT]    Network       CPU 1351.71216ms  CUDA 1347.98914ms
[TRT]    Post-Process  CPU   0.10729ms  CUDA   0.10724ms
[TRT]    Visualize     CPU  61.57435ms  CUDA  62.08073ms
[TRT]    Total         CPU 1413.48242ms  CUDA 1413.29688ms
[TRT]    ------------------------------------------------

[TRT]    note -- when processing a single image, run 'sudo jetson_clocks' before
                to disable DVFS for more accurate profiling/timing measurements

[image] imageLoader -- End of Stream (EOS) has been reached, stream has been closed
detectnet:  shutting down...
detectnet:  shutdown complete.

ログ通り、3人とケーキ1個が検出されました。

動画から検出

画像と同じように実行できます。

Jetson Nanoの/usr/share/visionworks/sources/data/以下にサンプルの動画があるので、それを使って試すこともできます。

# C++
./detectnet /usr/share/visionworks/sources/data/pedestrians.mp4 images/test/pedestrians_ssd.mp4

# Python
./detectnet.py /usr/share/visionworks/sources/data/pedestrians.mp4 images/test/pedestrians_ssd.mp4

13秒くらいの動画ですが、いい感じに検出できています。

USBカメラからの検出

引数にカメラのタイプを指定します。

今回はUSBカメラを使うので/dev/video0になります。

./detectnet /dev/video0

めちゃくちゃ検出速度速いですね。最高です!

コーディング

ライブカメラからの検出を例に見てみます。

import jetson.inference
import jetson.utils

net = jetson.inference.detectNet("ssd-mobilenet-v2", threshold=0.5)
camera = jetson.utils.videoSource("/dev/video0")
display = jetson.utils.videoOutput("display://0")

while display.IsStreaming():
    img = camera.Capture()
    detections = net.Detect(img)
    display.Render(img)
    display.SetStatus("Object Detection | Network {:.0f} FPS".format(net.GetNetworkFPS()))

このくらいのコードでサクッと物体検出できちゃうのはありがたいです…🙏

最後に

Jetson nanoで物体検出を実行する手順を一通り実行してみました(チュートリアルまんまコピペなのはご愛嬌)。

SSD Mobilenetは爆速ですね。今後はこれを色々別のことに応用していきたいと思います。

参考ページ

github.com