參考自官網 https://pjreddie.com/darknet/install/
1. 下載darknet 並編譯
git clone https://github.com/pjreddie/darknet.git
注意事項: 如果是使用CPU, 那么就需要設置以下幾個參數
GPU=0
CUDNN=0
OPENCV=1
OPENMP=0
DEBUG=0
如果opencv是使用的自己編譯的庫,那么就需要更改opencv路徑 改這里:
LDFLAGS+= `pkg-config --libs opencv` -lstdc++
COMMON+= `pkg-config --cflags opencv`
2. test
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
3. train the dataset of VOC
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar tar xf VOCtrainval_11-May-2012.tar tar xf VOCtrainval_06-Nov-2007.tar tar xf VOCtest_06-Nov-2007.tar
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
4. yolo 的各種參數,比如batch_size
https://blog.csdn.net/hjxu2016/article/details/80015559
5. 訓練需要的文件
(1) picture files :
/darknet/VOCdevkit/VOC2007/JPEGImages/000001.jpg ... ...
(2) labels such as :
content of the txt is as flow:
11 0.344192634561 0.611 0.416430594901 0.262
14 0.509915014164 0.51 0.974504249292 0.972
explain :
11 is classfied as a dog and (0.34,0.6,0.4, 0.26) is position (center.x , center.y , w , h) of the object .
14 is the dog and its poistion
if the 2 position is draw on the picture , it will dispalys as :
(3) train.txt this files contains all the picture to train . its contents is as folows:
/root/darknet/VOCdevkit/VOC2012/JPEGImages/2009_000001.jpg
... ...
(4) cfg/voc.data
classes= 20
train = ./train.txt
valid = ./2007_test.txt
names = data/voc.names
backup = backup
(5) data/voc.names the names of classes form 0 - 19
aeroplane
bicycle
bird
boat
bottle
bus
car
cat
chair
cow
diningtable
dog
horse
motorbike
person
pottedplant
sheep
sofa
train
tvmonitor
(6) pre-trained convlutional weights :
darknet53.conv.74
綜上所述 如果你要訓練一個模型,你得按以下步驟
1. 獲得你要訓練的圖片,包括 正例 和 反例
2. 給你的正例和反例進行標注, 生成labels
3.將你的數據分成兩撥, 一波是訓練集, 一波是測試集
4. 修改train.txt lables cfg/voc.data ....
4 yolov3 訓練人臉數據集
https://blog.csdn.net/ycdhqzhiai/article/details/81205503
5. GPU版本
5.1 install NVIDA driver
install Nvida cuda
install Nvida cudnn
modify Makefile as flow
你的arch 要根據這個網站來查 算力查詢 : https://developer.nvidia.com/cuda-gpus
5.2 make
5.3 test ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
5.4 modify cfg/yolov3-voc.cfg 使batch=64 , subsions=16
5.5 train start
5.6 after train , you can test your models as flow :
6. yolo 訓練日志解釋
- 每個batch都會有這樣一個輸出:
2706: 1.350835, 1.386559 avg, 0.001000 rate, 3.323842 seconds, 173184 imag
2706:batch是第幾組。
1.350835:總損失
1.386559 avg : 平均損失
0.001000 rate:當前的學習率
3.323842 seconds: 當前batch訓練所花的時間
173184 images : 目前為止參與訓練的圖片總數 = 2706 * 64
Region 82 Avg IOU: 0.798032, Class: 0.559781, Obj: 0.515851, No Obj: 0.006533, .5R: 1.000000, .75R: 1.000000, count: 2
Region Avg IOU: 表示在當前subdivision內的圖片的平均IOU,代表預測的矩形框和真實目標的交集與並集之比.
Class: 標注物體分類的正確率,期望該值趨近於1。
Obj: 越接近1越好。
No Obj: 期望該值越來越小,但不為零。
count: count后的值是所有的當前subdivision圖片(本例中一共4張)中包含正樣本的圖片的數量。
7. 訓練參數 cfg
https://blog.csdn.net/qq_35608277/article/details/79922053
https://github.com/jaskarannagi19/yolov3#when-should-i-stop-training
1.當看到平均損失0.xxxxxx avg在多次迭代時不再減少時,您應該停止訓練,一旦訓練停止,從最后一個文件中darknet\build\darknet\x64\backup
選擇最好的.weights文件.
2. 0.XXX avg < 0.06 時
您在9000次迭代后停止了訓練,但最佳結果可以給出之前的權重之一(7000,8000,9000)。它可能由於過度擬合而發生。
過度擬合 - 例如,您可以從training-dataset檢測圖像上的對象,但無法檢測任何其他圖像上的對象。你應該從早期停止點獲得權重:
9.mAP
基本定義: precision和recall的含義, preicision是在你認為的正樣本中, 有多大比例真的是正樣本, recall則是在真正的正樣本中, 有多少被你找到了。
10 mAP 計算
https://blog.csdn.net/amusi1994/article/details/81564504
11 基於前面的模型繼續訓練
build\darknet\x64\darknet.exe detector train .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg backup\yolov3_pikaqiu_2500.weights
12 yolov3 里的mask的含義
mask = 6,7,8 ### 第一層標記為6 7 8 因為我們需要在第一層預測size較大的物體,同理第二層那個預測小一點的物體
#anchors是可以事先通過cmd指令計算出來的,是和圖片數量,width,height以及cluster(應該就是下面的num的值,即想要使用的anchors的數量)相關的預選框,可以手工挑選,也可以通過kmeans 從訓練樣本中學>出!
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=1 #類別數量 網絡需要識別的物體種類數
num=9 #每個grid cell預測幾個box,和anchors的數量一致。當想要使用更多anchors時需要調大num,且如果調大num后訓練時Obj趨近0的話可以嘗試調大object_scale
jitter=.3 #數據擴充的抖動操作 利用數據抖動產生更多數據,YOLOv2中使用的是crop,filp,以及net層的angle,flip是隨機的,jitter就是crop的參數,tiny-yolo-voc.cfg中jitter=.3,就是>在0~0.3中進行crop
ignore_thresh = .5 #決定是否需要計算IOU誤差的參數,大於thresh,IOU誤差不會夾在cost function中
truth_thresh = 1
random=1 #默認參數1,如果顯存很小,將random設置為0,關閉多尺度訓練;如果為1,每次迭代圖片大小隨機從320到608,步長為32,如果為0,每次訓練大小與輸入大小一致
13 如何提高mAP
https://github.com/AlexeyAB/darknet#how-to-improve-object-detection
14 訓練出來測試的時候有null 怎么解決?? 感覺像是因為模型沒有訓練出來的原因啊??
15: