一、前言 本文主要使用yolo v2 訓(xùn)練自己的車牌圖片數(shù)據(jù),,并能夠框出測(cè)試圖片中存在的車牌區(qū)域,,也即車牌檢測(cè)。本文參考了博文http://m.blog.csdn.net/qq_34484472/article/details/73135354和http://blog.csdn.net/zhuiqiuk/article/details/72722227 二,、準(zhǔn)備工作 首先需要下載正確配置好darknet,, 使用./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg 命令可得檢測(cè)結(jié)果。本文主要是為了檢測(cè)車牌區(qū)域,在darknet下新建一文件夾plate_imgae,,其中存放train和val,、pic三個(gè)文件夾,train文件夾下為1296張訓(xùn)練圖片,,val文件夾下為196張驗(yàn)證圖片,,pic為236張待檢測(cè)的圖片,圖片格式均為jpg格式,,訓(xùn)練模型主要用到train和val這兩個(gè)文件夾,。
三、制作標(biāo)簽文件 yolo v2使用VOC格式的數(shù)據(jù)集,,故這里首先需要對(duì)訓(xùn)練集及驗(yàn)證集的圖片進(jìn)行標(biāo)注,,每張圖片均可得到相應(yīng)的xml文件,然后再將xml文件轉(zhuǎn)化為txt標(biāo)簽文件,。參考這里http://blog.csdn.net/jesse_mx/article/details/53606897 安裝標(biāo)注工具LabelImg,,安裝完成后,./labelImg.py打開標(biāo)注工具,,先對(duì)train文件夾內(nèi)的圖片作標(biāo)注,,在plate_image文件夾下新建train_xml文件夾,用于存放生成的xml文件,。所生成的xml文件如下所示:
同樣的方法,也在在plate_image文件夾下新建val_xml文件夾,,保存驗(yàn)證集的xml標(biāo)注文件。這樣就有VOC格式標(biāo)記的XML文件,接下來需要將xml文件轉(zhuǎn)換為txt文件,,使用python轉(zhuǎn)換,,將train_xml中的xml文件,轉(zhuǎn)換為txt保存于文件夾train_txt下,;同理,,將val_xml中的xml文件轉(zhuǎn)換后保存于val_txt文件夾下
看看plate_image下都有啥,。
四,、修改配置文件 (1)創(chuàng)建names文件 在YOLO主目錄的data文件夾下,創(chuàng)建一個(gè).names文件,文件名任意,,我的是myClass.names,,在該文件中寫入所有類別的名稱,每一類占一行,,我只檢測(cè)車牌,,故只在第一行寫licence. (2)修改data文件 修改darknet主目錄下的 cfg/voc.data文件,修改如下:
修改darknet主目錄下的cfg/yolo-voc.cfg,。 1.[region]層中classes改為1 2.[region]層上方的[convolution]層中,,filters的數(shù)量改成(classes+coords+1)*NUM。我這里改成了(1+4+1)*5=30. 五,、 修改src/yolo.c文件 1.第13行改成 char *voc_names[] = {"licence"}; //如果你是一類的話,,就改成這樣,如果你有多類,,自己根據(jù)需求改,。 2.第322行draw_detections函數(shù)中,最后一個(gè)參數(shù)由20改成你的類別數(shù),,我這里是1 3.第354行demo函數(shù)中,,倒數(shù)第三個(gè)參數(shù)由20改成你的類別數(shù),我這里是1 4.第17行改成 char *train_images = "<你的路徑>/train_imgae_path"; 5.第18行改成 char *backup_directory = "你的路徑/backup/"; 6.第121行改成 char *base = "results/comp4_det_test_" 7.第123行改成 list *plist = get_paths("<你的路徑>/val_image_path.txt"); 8.第209行改成 char *base = "results/comp4_det_test_" 9.第210行改成 list *plist = get_paths("<你的路徑>/val_image_path.txt"); 10.將src/yolo_kernels.cu文件中,,第62行draw_detections函數(shù)最后一個(gè)參數(shù)由20改成你的類別數(shù),,我這里是1. 11.scripts/voc_label.py 文件中 ,位置第9行改成:classes=[“l(fā)icence”],,因?yàn)槲抑挥幸活?/p> 12.將src/detector.c文件中,,第372行改成 list *plist = get_paths("<你的路徑>/val_image_path.txt");,第542行option_find_int函數(shù)的最后一個(gè)參數(shù)由20改成1. 六,、重新編譯darknet yolo 進(jìn)入darknet主目錄,,make clean后 make -j8 七、下載預(yù)訓(xùn)練文件cfg/darknet19_448.conv.23 為了加快訓(xùn)練速度,,下載官方提供的預(yù)訓(xùn)練模型,,保存至cfg下。下載地址為 http:///media/files/darknet19_448.conv.23 八,、訓(xùn)練 在darknet文件夾路徑下運(yùn)行命令: ./darknet detector train cfg/voc.data cfg/yolo-voc.cfg cfg/darknet19_448.conv.23 九,、訓(xùn)練過程輸出log 參考自這篇文章http://blog.csdn.net/renhanchi/article/details/71077830?locationNum=13&fps=1,以下摘自這篇文章 Region Avg IOU: 這個(gè)是預(yù)測(cè)出的bbox和實(shí)際標(biāo)注的bbox的交集 除以 他們的并集,。顯然,,這個(gè)數(shù)值越大,說明預(yù)測(cè)的結(jié)果越好 Avg Recall: 這個(gè)表示平均召回率, 意思是 檢測(cè)出物體的個(gè)數(shù) 除以 標(biāo)注的所有物體個(gè)數(shù),。 count: 標(biāo)注的所有物體的個(gè)數(shù),。 如果 count = 6, recall = 0.66667,, 就是表示一共有6個(gè)物體(可能包含不同類別,,這個(gè)不管類別),然后我預(yù)測(cè)出來了4個(gè),,所以Recall 就是 4 除以 6 = 0.66667 有一行跟上面不一樣的,,最開始的是iteration次數(shù),然后是train loss,,然后是avg train loss,, 然后是學(xué)習(xí)率, 然后是一batch的處理時(shí)間,, 然后是已經(jīng)一共處理了多少張圖片,。 重點(diǎn)關(guān)注 train loss 和avg train loss,這兩個(gè)值應(yīng)該是隨著iteration增加而逐漸降低的,。如果loss增大到幾百那就是訓(xùn)練發(fā)散了,,如果loss在一段時(shí)間不變,就需要降低learning rate或者改變batch來加強(qiáng)學(xué)習(xí)效果,。當(dāng)然也可能是訓(xùn)練已經(jīng)充分,。這個(gè)需要自己判斷 十、評(píng)估訓(xùn)練得的模型 訓(xùn)練了3天,,得到了迭代30000次的權(quán)值,,在plate_image/backup/下生成了yolo-voc_30000.weights,當(dāng)然還有其他迭代次數(shù)的權(quán)值,,使用以下語句可以測(cè)試單張圖片 ./darknet detector test cfg/voc.data cfg/yolo-voc.cfg plate_image/backup/yolo-voc_30000.weights plate_image/pic/099999.jpg 顯示的檢測(cè)結(jié)果為 訓(xùn)練的時(shí)候只是用到了訓(xùn)練集,,評(píng)估檢測(cè)性能才會(huì)使用到驗(yàn)證集,。使用以下指令評(píng)估 root@computer:/home/jyang/darknet# ./darknet detector recall cfg/voc.data cfg/yolo-voc.cfg plate_image/backup/yolo-voc_30000.weights 根據(jù)參考的第2篇博文,,使用該指令的時(shí)候,會(huì)調(diào)用src/detector.c里的validate_detector_recall函數(shù),,將其中的閾值從0.001修改為0.25,,防止過多框被識(shí)別出,將432行代碼修改為如下:
可見196張圖片,,準(zhǔn)確率有97%以上。 結(jié)語 本文只是使用了yolo v2 檢測(cè)了車牌,,后續(xù)對(duì)框下來的車牌圖片作識(shí)別,,請(qǐng)看《yolo v2之車牌檢測(cè)后續(xù)識(shí)別字符(一)》
|
|