久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

yolo v2 之車牌檢測(cè)

 Rainbow_Heaven 2017-10-17

一、前言

        本文主要使用yolo v2 訓(xùn)練自己的車牌圖片數(shù)據(jù),,并能夠框出測(cè)試圖片中存在的車牌區(qū)域,,也即車牌檢測(cè)。本文參考了博文http://m.blog.csdn.net/qq_34484472/article/details/73135354http://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文件夾下

  1. import xml.etree.ElementTree as ET    
  2. import pickle    
  3. import os    
  4. from os import listdir, getcwd    
  5. from os.path import join    
  6.   
  7. xml_label_Dir = 'train_xml'        #需轉(zhuǎn)換的xml路徑  
  8. txt_label_Dir = 'train_txt/'          #轉(zhuǎn)換得的txt文件保存路徑  
  9.   
  10. def convert(size, box):        #歸一化操作  
  11.     dw = 1./size[0]    
  12.     dh = 1./size[1]    
  13.     x = (box[0] + box[1])/2.0    
  14.     y = (box[2] + box[3])/2.0    
  15.     w = box[1] - box[0]    
  16.     h = box[3] - box[2]    
  17.     x = x*dw    
  18.     w = w*dw    
  19.     y = y*dh    
  20.     h = h*dh    
  21.     return (x,y,w,h)    
  22.     
  23. if not os.path.exists(txt_label_Dir):     
  24.     os.makedirs(txt_label_Dir)    
  25. for rootDir,dirs,files in os.walk(xml_label_Dir):    
  26.     for file in files:    
  27.         file_name = file.split('.')[0]    
  28.         out_file = open(txt_label_Dir+'%s.txt'%(file_name),'w')    
  29.         in_file = open("%s/%s"%(rootDir,file))    
  30.         tree = ET.parse(in_file)    
  31.         root = tree.getroot()    
  32.         size = root.find('size')    
  33.         w = int(size.find('width').text)    
  34.         h = int(size.find('height').text)    
  35.             
  36.         for obj in root.iter('object'):    
  37.             xmlbox = obj.find('bndbox')    
  38.             b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))    
  39.             bb = convert((w,h), b)    
  40.             out_file.write("0" + " " + " ".join([str(a) for a in bb]) + '\n')      #only one class,index 0  
  41.         out_file.close()      
接著還需要獲得訓(xùn)練集圖片的絕對(duì)路徑train_imgae_path.txt和驗(yàn)證集的絕對(duì)路徑val_image_path.txt,同樣使用以下python代碼
  1. import xml.etree.ElementTree as ET  
  2. import pickle  
  3. import os  
  4. from os import listdir, getcwd  
  5. from os.path import join  
  6.   
  7. TrainDir = '/home/jyang/darknet/plate_image/train'  
  8.   
  9. out_file = open('train_image_path.txt','w')  
  10. for root,dirs,files in os.walk(TrainDir):  
  11.     for file in files:  
  12.         out_file.write('%s/%s\n'%(root,file))  
  13. out_file.close()  
YOLO是直接通過替換原圖片絕對(duì)路徑的后綴名來找到對(duì)應(yīng)標(biāo)記文件的,。比如原圖片的絕對(duì)路徑為/home/ubuntu/data/train/1.jpg,。則YOLO將會(huì)直接認(rèn)為其對(duì)應(yīng)的標(biāo)記文件路徑為/home/ubuntu/data/train/1.txt。所以,,我們將之前生成的txt文件都放到相應(yīng)的圖片路徑下,,即將train_txt下txt文件放到train文件夾下,將val_txt下txt文件放到val文件夾下

看看plate_image下都有啥,。


四,、修改配置文件

(1)創(chuàng)建names文件

      在YOLO主目錄的data文件夾下,創(chuàng)建一個(gè).names文件,文件名任意,,我的是myClass.names,,在該文件中寫入所有類別的名稱,每一類占一行,,我只檢測(cè)車牌,,故只在第一行寫licence.

(2)修改data文件

     修改darknet主目錄下的 cfg/voc.data文件,修改如下:

  1. classes= 1                      #只有一個(gè)類別  
  2. train  = /home/jyang/darknet/plate_image/train_image_path.txt        #訓(xùn)練集的絕對(duì)路徑  
  3. valid  = /home/jyang/darknet/plate_image/val_image_path.txt           #驗(yàn)證集的絕對(duì)路徑  
  4. names = data/myClass.names  
  5. backup = /home/jyang/darknet/plate_image/backup                     #訓(xùn)練得的模型保存路徑  
(3)修改cfg文件

     修改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
        系統(tǒng)默認(rèn)會(huì)迭代45000次batch,,如果需要修改訓(xùn)練次數(shù),進(jìn)入cfg/yolo_voc.cfg修改max_batches的值,。

九,、訓(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行代碼修改為如下:

  1. fprintf(stderr, "Id:%5d Correct:%5d Total%5d\tRPs/Img: %.2f\tIOU: %.2f\tRecall:%.2f%%\tPrecision:%.2f%%\n", i,   
  2.          correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total ,100.*correct/proposals);  
重新make之后,,運(yùn)行結(jié)果為:

可見196張圖片,,準(zhǔn)確率有97%以上。

結(jié)語

        本文只是使用了yolo v2 檢測(cè)了車牌,,后續(xù)對(duì)框下來的車牌圖片作識(shí)別,,請(qǐng)看《yolo v2之車牌檢測(cè)后續(xù)識(shí)別字符(一)》


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多