NVIDIA Jetson TX2學習筆記(三):執行YOLOv3

Yanwei Liu
18 min readAug 11, 2019

#20210207更新darknet原始碼解析

#20210123更新在aiForge上使用OpenCV編譯版的darknet

# 方法與一般編譯一樣,差別在於使用conda remove libtiff。
# 原因在於libtiff產生了套件衝突,移除後就能make成功了
$ sudo apt-get install libopencv-dev
$ conda remove libtiff
$ nano Makefile
GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
AVX=0
OPENMP=0
LIBSO=1
ZED_CAMERA=0
ZED_CAMERA_v2_8=0
$ make
$ wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights
$ ./darknet detector test cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights data/dog.jpg

#20201124更新如何在darknet訓練ScaledYOLOv4中yolov4-csp.cfg的方法

https://github.com/WongKinYiu/ScaledYOLOv4/issues/42

#20200223更新在Python搭配darknet的API方法

#在編譯Makefile時,將內部的LIBSO=0改成LIBSO=1#編譯成功後,建立新的.py檔案:
import python.darknet as dn
dn.set_gpu(0)
net = dn.load_net(str.encode("cfg/tiny-yolo.cfg"),
str.encode("weights/tiny-yolo.weights"), 0)
meta = dn.load_meta(str.encode("cfg/coco.data"))
res = dn.detect(net, meta, str.encode("data/dog.jpg"))
print(res)
#即可使用Python進行影像辨識

AlexeyAB版本的darknet

#20191025更新使用AlexeyAB/darknet,有多種原版沒有的功能。安裝
$ nano Makefile #依據不同GPU,修改Makefile中的參數
$ sudo make #進行編譯
遇到一個錯誤:
Q:make時出現找不到nvcc該怎麼辦呢?
A:修改Makefile把文件中的NVCC=nvcc改成
NVCC=/usr/local/cuda-10.0/bin/nvcc
#cuda資料夾請針對自己安裝路徑做調整
目前發現如下:
1.內建辨識影片擷取功能,只要在指令最後方加上這個參數即可
"
-out_filename detect-result.mp4"
2.辨識影片時會出現辨識率:除了標記框外,還會出現偵測數字
3.效能比起原版更好,在TX2上同樣cfg設定下,FPS提升 1 FPS

常用偵測指令

如果要辨識影片的話,一定要有OpenCV(Makefile裡面的OPENCV=1)
並且指令要修改
#偵測影片
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights data/bird.mp4
#偵測圖片
$ ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg yolov3.weights data/bird.jpg
YOLOv3辨識成果(FPS:2)
YOLOv3辨識水雉成果-1
YOLOv3辨識水雉成果-2
Python影像辨識筆記(九):分別在Windows和Ubuntu 18.04上安裝並執行YOLOv3(使用GPU)Python影像辨識筆記(九之二):關於YOLOv3的一些心得Python影像辨識筆記(九之三):YOLOv3結合深度學習的Object DetectorPython影像辨識筆記(九之四):可視化YOLOv3訓練過程中的loss、IOU、avg Recall等的曲線圖Python影像辨識筆記(九之五):透過Google Colab在雲端運行YOLOv3Python影像辨識筆記(九之六):將LabelImg標記的xml檔案轉成txt檔案NVIDIA Jetson TX2學習筆記(三):執行YOLOv3The Complete YOLOv3 Reproduce List on GitHubUsing YOLOv3 Model in Python with ImageAI Library

YOLOv3官方網站

強烈建議先依照官網的操作步驟來進行執行和訓練

我個人比較喜歡使用nano編輯器
所以以nano為主
sudo apt-get install nano

在參考本文之前,必須先透過SDK Manager把Target Components的Jetson SDK components打勾進行安裝後,才來執行以下動作。可參考NVIDIA Jetson TX2學習筆記(一)

安裝使用時遇到任何問題可參考下方文章

Python影像辨識筆記(九):分別在Windows和Ubuntu 18.04上安裝並執行YOLOv3(使用GPU)

下載YOLOv3

$ mkdir project
$ cd ~/project
$ git clone https://github.com/pjreddie/darknet yolov3
$ cd yolov3

編輯yolov3資料夾中的Makefile

sudo nano Makefile###參數調整如下所示GPU=1
CUDNN=1
OPENCV=1
......
ARCH= -gencode arch=compute_53,code=[sm_53,compute_53] \
-gencode arch=compute_62,code=[sm_62,compute_62]

編譯程式碼

$ make

執行程式

於TX2上下載此影片,另存檔名car.mp4,並且放在yolov3資料夾中$ sudo nvpmodel -m 0        ### 將TX2設定為最高性能模式
$ sudo jetson_clocks ### 啟動風扇,參考此篇回覆
### 下載pre-trained weights並且執行YOLOv3
$ wget https://pjreddie.com/media/files/yolov3.weights
# 也可從這裡下載https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov3.weights
### 辨識dog.jpg
$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
### 辨識car.mp4影片(car.mp4為前述步驟索下載的影片,辨識用)
$ ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights \ car.mp4
### 沒有輸入圖片路徑時,會產生對話視窗,要求填入路徑位置
$ ./darknet detect cfg/yolov3.cfg yolov3.weights
Enter Image Path:

遇到的問題

(1)###執行程式時,遇到程式killed的問題,此篇討論有提出解決方案將yolov3/cfg/yolov3.cfg的內容進行修改,把Training的參數設定註解掉(#)
也就是說,batch和subdivisions都設定成1
$ sudo nano yolov3/cfg/yolov3.cfg# Testing
batch=1
subdivisions=1

# Training
#batch=64
#subdivisions=16
--------------------------------------------------------------------(2)###darknet: ./src/parser.c:315: parse_yolo: Assertion `l.outputs == params.inputs’ failed
本次訓練是由yolo2升級至yolo3,而yolo2和yolo3的參數filters參數的計算方式不同,v2的filters:5*(classes+5),而v3:3*(classes+5),通過修改以上參數後可以正常訓練。簡單來說v2就是(classes+5)*5;v3則是(classes+5)*3
--------------------------------------------------------------------
(3)###darknet yolov3 訓練時出現 Cannot load image 亂碼問題

訓練模型

1.先使用labelimg標記資料(*.xml或*.txt格式)
#如果存成了(*.xml格式),必須透過script轉檔成(*.txt的格式),才能訓練
#訓練YOLO需要(*.txt)格式,(*.txt格式)中以下列形式排列
<object-class> <x> <y> <width> <height>
#標記完的.txt檔案要注意裡面的object-class為0才對(假設只有1個class的話)
1.1透過split_data.py將標記完的資料拆成訓練集90%測試集10%labelimg標記流程:(1)下載圖片
使用Python批次下載Google圖片
(2)開啟labelimg
選擇Open Dir,開啟圖片資料夾
選擇Change Save Dir,設定.txt檔案存檔的位置
使用快捷鍵進行標記:
W(產生框框,進行標記)
Ctrl+S(存檔)
D(下一張)
#如果無法使用快捷鍵,檢查是否切換到英文鍵盤(而不是注音)
#
無法開啟labelimg或者閃退嗎?
刪除C:\Users\yourUserName\當中的.labelImgSettings.pkl檔案,再重新開labelimg.exe
(3)完成後將原始圖檔和TXT文件重新命名
使用Ant Renamer批量命名,檔名不能有空白或中文或特殊符號,可以用「File001.jpg、File001.txt」來命名。
(4)產生train.txt
快速在Windows中建立目錄中的所有檔案清單
透過上面連結中的方法來產生路徑檔案(list.txt),用Editor存成路徑檔案(train.txt)(不可用記事本存,在Linux上會有錯誤)(參考darknet yolov3 訓練時出現 Cannot load image 亂碼問題)
(5)將檔案傳輸至TX2上
這邊推薦使用Filezilla來進行檔案傳輸,方便目錄檔案管理
#labelimg產生的txt檔案,請在訓練圖片的上一層,產生labels資料夾,擺放txt檔案
例如:我把照片放在yolov3/train/images/中,則我需要建立yolov3/train/labels資料夾,放入txt檔案
--------------------------------------------------------------------2.調整Cfg檔案
(1)開啟
cfg/voc.data,裡面有5行
#classes是訓練的標記數量,如果只有1個就寫1
classes= 20
#train.txt裡面包含了想要拿來「訓練」Model的圖片絕對路徑位置(檔名、路徑位置必須確認是完全正確的,否則會出現無法讀取的問題)
train = <path-to-voc>/train.txt
#test.txt裡面包含了想要拿來「驗證」Model的圖片絕對路徑位置(檔名、路徑位置必須確認是完全正確的,否則會出現無法讀取的問題)
valid = <path-to-voc>test.txt
#voc.names裡面有label的名稱,如果只有一種,就在第一行寫上名稱即可(不可以有多的空白、空行,否則會出現錯誤)
names = data/voc.names
backup = backup
(2)修改cfg/yolov3-voc.cfg檔案
batch=1
subdivisions=1
第605行filters=18(filters改成18)
第689行filters=18(filters改成18)
第773行的filters=18(filters改成18)
第611行的classes=1(classes改成1)
第695行的classes=1(classes改成1)
第779行的classes=1(classes改成1)
yolov3的filters計算方式:
filters=(classes+5)*3
#(1+5)*3=18
3.下載Pretrained Convolutional Weights,並且放在darknet目錄中wget https://pjreddie.com/media/files/darknet53.conv.744.訓練模型#首次訓練
$ ./darknet detector train cfg/voc.data cfg/yolov3.cfg darknet53.conv.74
#上個點繼續train
$ ./darknet detector train cfg/voc.data cfg/yolov3.cfg backup/yolov3.backup
5.1使用訓練好的模型進行預測(須將yolov3.cfg裡面的batch、subvision修改為1)
$ ./darknet detector test cfg/voc.data cfg/yolov3.cfg backup/yolov3.backup data/bird.jpg
重要!!!使用時,必須加入cfg/voc.data,否則會出現錯誤的標記名稱!!!5.2訓練模型,並且保存LOG到TXT文件#首次訓練,並且保存LOG到TXT文件
$ ./darknet detector train cfg/voc.data cfg/yolov3.cfg darknet53.conv.74 -gpus 0 |tee -a trainRecord.txt
#恢復上次訓練,並且保存LOG到TXT文件
$ ./darknet detector train cfg/voc.data cfg/yolov3.cfg backup/yolov3-Final.weights -gpus 0 tee -a trainRecord.txt
6.1計算mAp
$ ./darknet detector map cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_30000.weights -out map.txt
6.2計算recall
$ ./darknet detector recall cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_30000.weights -out recall.txt
6.3進行驗證測試
$ ./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_30000.weights -out valid.txt
6.4將loss和iou進行可視化Python影像辨識筆記(九之四):可視化YOLOv3訓練過程中的loss、IOU、avg Recall等的曲線圖7.該怎麼看訓練的log?
每個batch都會有這樣一個輸出:
2706: 1.350835, 1.386559 avg, 0.001000 rate, 3.323842 seconds, 173184 images2706:batch是第幾組。1.350835:總損失1.386559 avg : 平均損失0.001000 rate:目前的學習率3.323842 seconds: 當前batch訓練所花的時間173184 images : 目前為止參與訓練的圖片總數 = 2706 * 64Region 82 Avg IOU: 0.798032, Class: 0.559781, Obj: 0.515851, No Obj: 0.006533, .5R: 1.000000, .75R: 1.000000, count: 2Region Avg IOU:表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比. Class:標註物體分類的正確率,期望該值趨近於1。 Obj: 越接近1越好。 No Obj: 期望該值越來越小,但不為零。

count: count後的值是所有的當前subdivision圖片(本例中一共4張)中包含正樣本的圖片的數量。
8.影片偵測時,FPS太低https://github.com/pjreddie/darknet/issues/801.使用tiny-yolo模型,訓練出來的FPS會比較高一點2.降低yolov3.cfg的檔案中,width和height數值(降到288時,FPS提升到6.8左右)3.降低影片解析度4.使用更好的顯示卡

如何用自己的數據訓練YOLOv3

https://kknews.cc/tech/mpnq8yz.html

--

--