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標籤檔案。參考這裡
同樣的方法,也在在plate_image資料夾下新建val_xml資料夾,儲存驗證集的xml標註檔案。這樣就有VOC格式標記的XML檔案,接下來需要將xml檔案轉換為txt檔案,使用python轉換,將train_xml中的xml檔案,轉換為txt保存於資料夾train_txt下;同理,將val_xml中的xml檔案轉換後保存於val_txt資料夾下
接著還需要獲得訓練集圖片的絕對路徑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 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()
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 DNN之YOLO實時對象檢測
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