前言
距離Nvidia推出Jetson Nano開發板已經有一段時間
在GTC2020上NV再次推出了定價$59的2GB版Nano成為樹莓派有利競爭對手

同樣的價格下自帶128個cuda和免費DLI課程讓新版Jetson Nano非常適合部署邊緣AI項目
在拿到開發板的第一時間我決定做一個小項目對Nano進行體驗
本文將結合機器視覺與AI實現實時火焰檢測,輸出real-time bounding box與概率
網絡選擇
動態目標檢測有很多成熟的網絡可供選擇,如YOLO、SSD、RCNN等
這些網絡效果很好但算力開銷大,不適合在Jetson Nano 2GB上實時運行
通過搜索我發現了一個最近開源的快速目標檢測網絡NanoDet
詳見作者的GitHub - RangiLyu/nanodet: ⚡Super fast and lightweight anchor-free object detection model. 🔥Only 1.8mb and run 97FPS on cellphone🔥
對於320 x 320的輸入FLOPS僅為0.72B非常適合嵌入式部署
環境搭建
參考NanoDet作者給出的依賴,需要的環境為
Cython
termcolor
numpy
torch>=1.3
torchvision
tensorboard
pycocotools
matplotlib
pyaml
opencv-python
tqdm
在Jetson Nano部署主要難點是pytorch安裝,使用Nvidia官方預編譯whl文件,詳見
Nvidia Developer Forums
注意torch和vison版本匹配,我的環境是 PyTorch v1.6 + torchvision v0.7.0
數據標注
火焰檢測不屬於voc標准分類,因此需要自己進行標注訓練
使用圖片搜索引擎爬取火焰圖片,清洗篩選后留下397張構建數據集
數據標注使用開源工具labelImg進行標注,保存為voc格式

按照8:2構建訓練集與測試集,結構如下
fire
├── train
│ ├── ann
│ │ ├── 1.xml
│ │ └── 2.xml
│ └── img
│ ├── 1.jpg
│ └── 2.jpg
└── val
├── ann
│ └── 1.xml
└── img
└── 1.jpg
修改配置
修改網絡的yml配置文件
默認配置為80類目標檢測,
自定義保存位置、識別種類、圖像寬高、訓練集、測試集,修改以下部分:
save_dir: ./fire
num_classes: 1
class_names: &class_names ['fire']
train:
name: xml_dataset
img_path: ./fire/train/img
ann_path: ./fire/train/ann
input_szie: [320,320]
val:
name: xml_dataset
img_path: ./fire/val/img
ann_path: ./fire/val/ann
input_szie: [320,320]
注意:默認數據集為coco格式,需要改為xml_dataset
訓練網絡
這里使用PC端RTX2080進行訓練
python3 train.py fire/nanodet_fire.yml
配置batch_size = 80 total_epochs = 160 耗時2.5小時

結果權重文件保存在./fire/model_last.pth
部署推理
得到權重文件即可在Jetson Nano上進行實時推理
pyhton3 livecam.py
使用ShuffleNetV2作為backbone首次運行需要下載一個預訓練模型
首次部署時確保Jetson Nano連接到網絡,后續可離線使用

實測Jetson Nano 2GB輸入640x480圖像實時檢測可以跑到16FPS
視頻代碼
演示視頻已上傳至B站:https://www.bilibili.com/video/BV1np4y1z7kF/
項目代碼Github地址:https://github.com/azureology/jetson-nano-fire-detection
