1. 程式人生 > >yolo v2 之車牌檢測

yolo v2 之車牌檢測

一、前言

二、準備工作

        首先需要下載正確配置好darknet, 使用./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg 命令可得檢測結果。本文主要是為了檢測車牌區域,在darknet下新建一資料夾plate_imgae,其中存放train和val、pic三個資料夾,train資料夾下為1296張訓練圖片,val資料夾下為196張驗證圖片,pic為236張待檢測的圖片,圖片格式均為jpg格式,訓練模型主要用到train和val這兩個資料夾。


三、製作標籤檔案

        yolo v2使用VOC格式的資料集,故這裡首先需要對訓練集及驗證集的圖片進行標註,每張圖片均可得到相應的xml檔案,然後再將xml檔案轉化為txt標籤檔案。參考這裡

http://blog.csdn.net/jesse_mx/article/details/53606897 安裝標註工具LabelImg,安裝完成後,./labelImg.py開啟標註工具,先對train資料夾內的圖片作標註,在plate_image資料夾下新建train_xml資料夾,用於存放生成的xml檔案。所生成的xml檔案如下所示:


同樣的方法,也在在plate_image資料夾下新建val_xml資料夾,儲存驗證集的xml標註檔案。這樣就有VOC格式標記的XML檔案,接下來需要將xml檔案轉換為txt檔案,使用python轉換,將train_xml中的xml檔案,轉換為txt保存於資料夾train_txt下;同理,將val_xml中的xml檔案轉換後保存於val_txt資料夾下

import xml.etree.ElementTree as ET  
import pickle  
import os  
from os import listdir, getcwd  
from os.path import join  

xml_label_Dir = 'train_xml'        #需轉換的xml路徑
txt_label_Dir = 'train_txt/'          #轉換得的txt檔案儲存路徑

def convert(size, box):        #歸一化操作
    dw = 1./size[0]  
    dh = 1./size[1]  
    x = (box[0] + box[1])/2.0  
    y = (box[2] + box[3])/2.0  
    w = box[1] - box[0]  
    h = box[3] - box[2]  
    x = x*dw  
    w = w*dw  
    y = y*dh  
    h = h*dh  
    return (x,y,w,h)  
  
if not os.path.exists(txt_label_Dir):   
    os.makedirs(txt_label_Dir)  
for rootDir,dirs,files in os.walk(xml_label_Dir):  
    for file in files:  
        file_name = file.split('.')[0]  
        out_file = open(txt_label_Dir+'%s.txt'%(file_name),'w')  
        in_file = open("%s/%s"%(rootDir,file))  
        tree = ET.parse(in_file)  
        root = tree.getroot()  
        size = root.find('size')  
        w = int(size.find('width').text)  
        h = int(size.find('height').text)  
          
        for obj in root.iter('object'):  
            xmlbox = obj.find('bndbox')  
            b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))  
            bb = convert((w,h), b)  
            out_file.write("0" + " " + " ".join([str(a) for a in bb]) + '\n')      #only one class,index 0
        out_file.close()    
接著還需要獲得訓練集圖片的絕對路徑train_imgae_path.txt和驗證集的絕對路徑val_image_path.txt,同樣使用以下python程式碼
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

TrainDir = '/home/jyang/darknet/plate_image/train'

out_file = open('train_image_path.txt','w')
for root,dirs,files in os.walk(TrainDir):
    for file in files:
        out_file.write('%s/%s\n'%(root,file))
out_file.close()
YOLO是直接通過替換原圖片絕對路徑的字尾名來找到對應標記檔案的。比如原圖片的絕對路徑為/home/ubuntu/data/train/1.jpg。則YOLO將會直接認為其對應的標記檔案路徑為/home/ubuntu/data/train/1.txt。所以,我們將之前生成的txt檔案都放到相應的圖片路徑下,即將train_txt下txt檔案放到train資料夾下,將val_txt下txt檔案放到val資料夾下

看看plate_image下都有啥。


四、修改配置檔案

(1)建立names檔案

      在YOLO主目錄的data資料夾下,建立一個.names檔案,檔名任意,我的是myClass.names,在該檔案中寫入所有類別的名稱,每一類佔一行,我只檢測車牌,故只在第一行寫licence.

(2)修改data檔案

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

classes= 1                      #只有一個類別
train  = /home/jyang/darknet/plate_image/train_image_path.txt        #訓練集的絕對路徑
valid  = /home/jyang/darknet/plate_image/val_image_path.txt           #驗證集的絕對路徑
names = data/myClass.names
backup = /home/jyang/darknet/plate_image/backup                     #訓練得的模型儲存路徑
(3)修改cfg檔案

     修改darknet主目錄下的cfg/yolo-voc.cfg。

1.[region]層中classes改為1

2.[region]層上方的[convolution]層中,filters的數量改成(classes+coords+1)*NUM。我這裡改成了(1+4+1)*5=30.

五、 修改src/yolo.c檔案

1.第13行改成 char *voc_names[] = {"licence"}; //如果你是一類的話,就改成這樣,如果你有多類,自己根據需求改。

2.第322行draw_detections函式中,最後一個引數由20改成你的類別數,我這裡是1

3.第354行demo函式中,倒數第三個引數由20改成你的類別數,我這裡是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函式最後一個引數由20改成你的類別數,我這裡是1.

11.scripts/voc_label.py 檔案中 ,位置第9行改成:classes=[“licence”],因為我只有一類

12.將src/detector.c檔案中,第372行改成 list *plist = get_paths("<你的路徑>/val_image_path.txt");,第542行option_find_int函式的最後一個引數由20改成1.

六、重新編譯darknet yolo

       進入darknet主目錄,make clean後 make -j8

七、下載預訓練檔案cfg/darknet19_448.conv.23

        為了加快訓練速度,下載官方提供的預訓練模型,儲存至cfg下。下載地址為

八、訓練

        在darknet資料夾路徑下執行命令:

        ./darknet detector train cfg/voc.data cfg/yolo-voc.cfg cfg/darknet19_448.conv.23
        系統預設會迭代45000次batch,如果需要修改訓練次數,進入cfg/yolo_voc.cfg修改max_batches的值。

九、訓練過程輸出log

       Region Avg IOU: 這個是預測出的bbox和實際標註的bbox的交集 除以 他們的並集。顯然,這個數值越大,說明預測的結果越好

       Avg Recall: 這個表示平均召回率, 意思是 檢測出物體的個數 除以 標註的所有物體個數。

       count: 標註的所有物體的個數。 如果 count = 6, recall = 0.66667, 就是表示一共有6個物體(可能包含不同類別,這個不管類別),然後我預測出來了4個,所以Recall 就是 4 除以 6 = 0.66667

       有一行跟上面不一樣的,最開始的是iteration次數,然後是train loss,然後是avg train loss, 然後是學習率, 然後是一batch的處理時間, 然後是已經一共處理了多少張圖片。 重點關注 train loss 和avg train loss,這兩個值應該是隨著iteration增加而逐漸降低的。如果loss增大到幾百那就是訓練發散了,如果loss在一段時間不變,就需要降低learning rate或者改變batch來加強學習效果。當然也可能是訓練已經充分。這個需要自己判斷

十、評估訓練得的模型

       訓練了3天,得到了迭代30000次的權值,在plate_image/backup/下生成了yolo-voc_30000.weights,當然還有其他迭代次數的權值,使用以下語句可以測試單張圖片

./darknet detector test cfg/voc.data cfg/yolo-voc.cfg plate_image/backup/yolo-voc_30000.weights plate_image/pic/099999.jpg

       顯示的檢測結果為

       

      訓練的時候只是用到了訓練集,評估檢測效能才會使用到驗證集。使用以下指令評估

      [email protected]:/home/jyang/darknet# ./darknet detector recall cfg/voc.data cfg/yolo-voc.cfg plate_image/backup/yolo-voc_30000.weights

      根據參考的第2篇博文,使用該指令的時候,會呼叫src/detector.c裡的validate_detector_recall函式,將其中的閾值從0.001修改為0.25,防止過多框被識別出,將432行程式碼修改為如下:

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

可見196張圖片,準確率有97%以上。

結語

        本文只是使用了yolo v2 檢測了車牌,後續對框下來的車牌圖片作識別,請看《yolo v2之車牌檢測後續識別字符(一)》

相關推薦

yolo v2車牌檢測後續識別字符(二)

一、前言        這一篇續接前一篇《yolo v2之車牌檢測後續識別字符(一)》,主要是生成模型檔案、配置檔案以及訓練、測試模型。 二、python介面生成配置檔案、模型檔案        車牌圖片端到端識別的模型檔案參考自這裡,模型圖如下所示:         本

yolo v2 車牌檢測

一、前言 二、準備工作         首先需要下載正確配置好darknet, 使用./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg 命令可得檢測結果。本文主要是為了檢測車牌區域,在darknet下新建一資料夾

yolo v2車牌檢測後續識別字符(一)

一、前言        本篇續接前一篇 yolo v2 之車牌檢測 ,前一篇使用yolo v2已經可以很準確地框出車牌圖片了,這裡完成後續的車牌字元號碼的識別,從車牌框框中要識別出車牌字元,筆者能想到3種思路,1種是同樣yolo、SSD等深度學習目標檢測的方法直接對車牌內的

mac下安裝darknet和opencv跑yolo-v2實時目標檢測

參考:  環境: 整個安裝過程用兩個字來形容就是“折騰”。第一步先安裝好opencv,一個強大開源計算機視覺庫。從官網下載了2.4.10的原始碼進行編譯安裝: cd opencv-2.4.10 mkdir build cd build cmake -G

[深度學習]Object detection物體檢測YOLO v2(7)

目錄 綜述 多種方法對原來的v1版本改進 Batch Normalization High Resolution Classifier(高解析度的分類器) Convolutional With Anchor Boxes Dimension Clusters(維度聚類) Di

目標檢測三 Win10 +VS2015+雙gtx Titan X使用YOLO v2訓練VOC資料

Win10 +VS2015+雙gtx Titan X使用YOLO v2訓練VOC資料     本文主要是記錄在win10下,yolo v2訓練資料的一整個過程,網上很多是在linux下的,不得不說這個東西還是linux下方便啊,主要依賴項: VS2015或者VS2013都

OpenCV DNNYOLO實時對象檢測

OpenCV 計算機視覺 YOLO網絡 對象檢測 DNN模塊 OpenCV DNN之YOLO實時對象檢測 OpenCV在3.3.1的版本中開始正式支持Darknet網絡框架並且支持YOLO1與YOLO2以及YOLO Tiny網絡模型的導入與使用。YOLO是一種比SSD還要快的對象檢測網絡模

重溫目標檢測--YOLO v2 -- YOLO9000

YOLO9000:Better, Faster, Stronger CVPR 2017, Best Paper Honorable Mention https://pjreddie.com/darknet/yolo/ 本文是對 YOLO v1 的改進。 2 B

深度學習目標檢測常用演算法原理+實踐精講 YOLO / Faster RCNN / SSD / 文字檢測 / 多工網路

深度學習之目標檢測常用演算法原理+實踐精講 YOLO / Faster RCNN / SSD / 文字檢測 / 多工網路 資源獲取連結:點選這裡 第1章 課程介紹 本章節主要介紹課程的主要內容、核心知識點、課程涉及到的應用案例、深度學習演算法設計通用流程、適應人群、學習本門

深度學習目標檢測常用算法原理+實踐精講 YOLO / Faster RCNN / SSD / 文本檢測 / 多任務網絡

資源 測試 -h 轉換 條件 評價 框架 檢測方法 結果 深度學習之目標檢測常用算法原理+實踐精講 YOLO / Faster RCNN / SSD / 文本檢測 / 多任務網絡 資源獲取鏈接:點擊這裏 第1章 課程介紹 本章節主要介紹課程的主要內容、核心知識點、課程

基於深度學習的視訊檢測(四) yolo-v2和darkflow

yolo-v1 核心思想:從R-CNN到Fast R-CNN一直採用的思路是proposal+分類 (proposal 提供位置資訊, 分類提供類別資訊)精度已經很高,但是速度還不行。 YOLO提供了另一種更為直接的思路: 直接在輸出層迴歸bounding b

深度學習物體檢測——YOLO(二)_用作者提供的YOLO實現進行檢測

使用訓練好的YOLO進行檢測 首先安裝Darknet git clone https://github.com/pjreddie/darknet cd darknet make 下載預訓練得到的權重檔案 YOLO的配置檔案在./cfg/資料夾

深度學習物體檢測——YOLO(三)_PyTorch實現

過程 構建26層網路 作者採用GoogLeNet作為網路結構,但是並不使用inception模組,而是採用1x1和3x3大小的濾波器進行替代。具體的網路結構請參考部落格:深度學習之物體檢測——YOLO(一)_介紹。 計算損失 YOLO模型的損失函

深度學習物體檢測——YOLO(一)_介紹

##YOLO網路結構 YOLO把檢測問題看成是端到端的迴歸問題。把輸入圖片劃分成一個個的小格子,讓物體中心點所在的格子負責檢測到該物體。 YOLO採用的是GoogLeNet結構,但是用1*1和3*3的卷積層來替代GoogLeNet的inception層。網路

YOLO系列YOLO-Lite:實時執行在CPU上的目標檢測演算法

實時目標檢測一直是yolo系列的追求之一,從yolo v1開始,作者就在論文中強調real-time。在後期的v2和v3的發展過程中,慢慢在P&R(尤其是recall rate)上下不少功夫。同時,計算量的增大也犧牲了yolo的實時性。 tiny-yolo是輕量級的

YOLO v2 人臉檢測——加入Wider_face資料集進行fine tuning[by zhangzexuan]

一、資料準備 Wider_face官方網站下載Wider_face資料集以及標籤,按照【http://www.cnblogs.com/linyuanzhou/p/6043436.html】提供的wider_face轉VOC資料集python程式進行資料格式轉換。 二、

深度學習目標檢測 caffe下 yolo-v1 yolo-v2 vgg16-ssd squeezenet-ssd mobilenet-v1-ssd mobilenet-v12-ssd

1、caffe下yolo系列的實現1.1 caffe-yolo-v1我的github程式碼 點選開啟連結yolo-v1 darknet主頁 點選開啟連結上面的caffe版本較老。對新版的cudnn支援不好,可能編譯出錯,需要修改 cudnn.hpp標頭檔案在次進行編譯,修改後

目標檢測YOLO進化史yolov1

yolov3在目標檢測領域可以算得上是state-of-art級別的了,在實時性和準確性上都有很好的保證.yolo也不是一開始就達到了這麼好的效果,本身也是經歷了不斷地演進的. yolov1 測試圖片 yolov1有個基本的思想,就是將圖片劃分為S*S個小格grid,每個grid負責一個目標.上圖裡的黃色

《opencv實戰》 車牌定位

apt cnblogs blog ges simple mes class waitkey opencv2 目標:  提取車牌所在的區域      PS:現在還沒學習文字檢測,以後再來補充~~ 思路:     1.利用形態學+梯度+輪廓檢測,但是這個形態學要求比較高,

OpenCV學習路——車牌識別車牌定位

pla sim srand oval 模糊 fault .html swa ide 去年七月份因為學校項目需要開始接觸圖像處理,但那時候只是到網上找車牌識別代碼,然後加入到自己的項目中,不清楚細節原理。 現在自己重新一步步實現車牌識別。 高斯模糊: 1 Mat Ga