opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统
教你從零開始做一個基于深度學(xué)習(xí)的交通標志識別系統(tǒng)
基于Yolo v3的交通標志識別系統(tǒng)及源碼
自動駕駛之——交通標志識別
在本文章你可以學(xué)習(xí)到如何訓(xùn)練自己采集的數(shù)據(jù)集,生成模型,并用yolo v3算法實現(xiàn)交通標志識別。當(dāng)然交通標志可以是其他比如交通燈、車輛、行人等等。
效果圖:
環(huán)境:win10+python3.6 +keras +Tensorflow 1.14.0+Pycharm2019
一、環(huán)境配置
1.1 下載anaconda,安裝python環(huán)境
python環(huán)境我建議下載anaconda,anaconda內(nèi)置python 3.6解釋器,其他python版本不用單獨安裝,十分便捷,在安裝
1.2 修改下載源
anaconda的python解釋器自帶的下載源下載東西很慢,因此可以改為國內(nèi)豆瓣或者清華等鏡像源。
這里教大家改為豆瓣源。
可以看我的另外一篇文章:
更改Python pip下載源為國內(nèi)豆瓣源
1.3 安裝其他環(huán)境及包,tensorflow、keras、opencv等等
三、訓(xùn)練數(shù)據(jù)集
3.1 前言:明確讀入的格式以及處理流程
首先明確進行yolov3訓(xùn)練數(shù)據(jù)集的格式,如下:
文件的絕對路徑 left,top,right,bottom,類別編號其實所有模型方法進行訓(xùn)練的時候甚至機器學(xué)習(xí)svm分類等,都是要告訴電腦(以檢測貓來說),你的圖片在計算機存儲的路徑;你的圖片中貓目標的位置,即left,top,right,bottom ;以及貓類別的編號。
實際例子:
/home/matthew/VOC2007/JPEGImages/000000160.jpg 186,192,353,349,0 579,286,850,500,0/home/matthew/VOC2007/JPEGImages/000000162.jpg 403,22,458,60,0 400,245,552,389,0 432,0,459,12,0 926,1,999,15,0/home/matthew/VOC2007/JPEGImages/000000166.jpg 146,246,340,428,0可以看到數(shù)據(jù)中不只有一個目標。
3.1 、制作自己的VOC格式訓(xùn)練集——打標簽(labelImg軟件)
那么這么標準的數(shù)據(jù)如何得到呢,其實可以用一個深度學(xué)習(xí)訓(xùn)練圖片的打標簽工具——labelImg。關(guān)于這個軟件的安裝與使用見鏈接:
圖像識別中標注工具labelImg的安裝和使用——深度學(xué)習(xí)打標簽
這個軟件會使用會生成標準xml文件,然后經(jīng)過下面一系列操作,最后成為txt文件,進行訓(xùn)練。
使用教程:
大致步驟
- 1、圖像(.jpg)進行重命名(00000X.jpg) ,可以用bat命令
- 2、制作圖像的.xml文件 ,生產(chǎn)的 xml文件放入下方的 **Annotation**文件夾
- 3、將.xml文件轉(zhuǎn)換成.txt文件【表述圖像及框的四點坐標信息】
- 4、將.jpg文件轉(zhuǎn)換成.txt文件【訓(xùn)練、測試、驗證數(shù)據(jù)集的路徑】
3.2 :建立VOC2007目錄,把上一步標記的xml文件放入Annotation文件夾內(nèi)
在工程下新建一個文件夾VOC2007,在下面就是新建幾個默認名字的文件夾 Annotation,ImageSet(該目錄還有三個文件需要建立),JPEGImages(把你所有的圖片都復(fù)制到該目錄里面,如下圖),SegmentationClass,SegmentationObject。
--VOC2007 --Annotations --ImageSets --Main --Layout --Segmentation --JPEGImages --SegmentationClass --SegmentationObjectAnnotations 中主要存放xml文件,每一個xml對應(yīng)一張圖像, 并且每個xml中存放的是標記的各個目標的位置和類別信息,命名通常與對應(yīng)的原始圖像一樣JPEGImages 自己的原始圖像放在JPEGImages文件夾ImageSets Layout 存放人體部位的數(shù)據(jù)。(用不上) Main 存放的是目標識別的數(shù)據(jù),主要有test.txt , train.txt, val.txt, trainval.txt四個文件。 Segmentation 存放分割的數(shù)據(jù)。(用不上)有大神寫了個程序,運行一下就直接建好了,如下:
def make_voc_dir(): os.makedirs('VOC2007/Annotations') os.makedirs('VOC2007/ImageSets') os.makedirs('VOC2007/ImageSets/Main') os.makedirs('VOC2007/ImageSets/Layout') os.makedirs('VOC2007/ImageSets/Segmentation') os.makedirs('VOC2007/JPEGImages') os.makedirs('VOC2007/SegmentationClass') os.makedirs('VOC2007/SegmentationObject')if __name__ == '__main__': make_voc_dir()3.3 、生成ImageSet/Main/4個文件。
在VOC2007下新建一個test.py文件,復(fù)制如下代碼
test.py文件:
import osimport random trainval_percent = 0.2train_percent = 0.8xmlfilepath = 'Annotations'txtsavepath = 'ImageSetsMain'total_xml = os.listdir(xmlfilepath) num = len(total_xml)list = range(num)tv = int(num * trainval_percent)tr = int(tv * train_percent)trainval = random.sample(list, tv)train = random.sample(trainval, tr) ftrainval = open('ImageSets/Main/trainval.txt', 'w')ftest = open('ImageSets/Main/test.txt', 'w')ftrain = open('ImageSets/Main/train.txt', 'w')fval = open('ImageSets/Main/val.txt', 'w') for i in list: name = total_xml[i][:-4] + '' if i in trainval: ftrainval.write(name) if i in train: ftest.write(name) else: fval.write(name) else: ftrain.write(name) ftrainval.close()ftrain.close()fval.close()ftest.close()運行test.py代碼之后,生成如下文件,VOC2007數(shù)據(jù)集制作完成
3.4、運行voc_annotation.py——生成yolo3所需的train.txt、val.txt、test.txt文件
生成的數(shù)據(jù)集不能供yolov3直接使用。需要運行voc_annotation.py ,classes以檢測兩個類為例(車和人腿),在voc_annotation.py需改你的數(shù)據(jù)集為。
voc_annotation.py文件
import xml.etree.ElementTree as ETfrom os import getcwd# 注意這里的‘2007’,也許你的就需要修改sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]# 注意類別classes = ["car","leg"]def convert_annotation(year, image_id, list_file): # 注意路徑 in_file = open('VOC%s/Annotations/%s.xml'%(year, image_id)) tree=ET.parse(in_file) root = tree.getroot() for obj in root.iter('object'): difficult = obj.find('difficult').text cls = obj.find('name').text if cls not in classes or int(difficult)==1: continue cls_id = classes.index(cls) xmlbox = obj.find('bndbox') b = (int(xmlbox.find('xmin').text), int(xmlbox.find('ymin').text), int(xmlbox.find('xmax').text), int(xmlbox.find('ymax').text)) list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))wd = getcwd()for year, image_set in sets: # 注意路徑 image_ids = open('VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split() list_file = open('%s_%s.txt'%(year, image_set), 'w') for image_id in image_ids: # 注意路徑 list_file.write('%s/VOC%s/JPEGImages/%s.jpg'%(wd, year, image_id)) convert_annotation(year, image_id, list_file) list_file.write('') list_file.close()運行之后,生成如下三個文件:
如果出現(xiàn)這種解析xml文件出錯的問題,就打開保存的文件,找到最下面,看看后面一張圖片xml文件格式
3.5、修改參數(shù)文件yolo3.cfg
打開yolo3.cfg文件。搜索yolo(共出現(xiàn)三次),每次按下圖都要修改
參數(shù)修改說明:
- filter:3*(5+len(classes))
- classes:你要訓(xùn)練的類別數(shù)(我這里是訓(xùn)練兩類)
- random:原來是1,顯存小改為0
3.6、修改model_data下的voc_classes.txt為自己訓(xùn)練的類別
coco,voc這兩個文件都需要修改。
如果類別比較多,可以用下面程序生成voc_classes.txt
classes = ["SIGN_SPEED_5","SIGN_SPEED_20","SIGN_SPEED_30","SIGN_SPEED_40","SIGN_SPEED_50","SIGN_SPEED_60","SIGN_LOAD_LIMITED_30T","SIGN_LOAD_LIMITED_40T","SIGN_LOAD_LIMITED_55T","SIGN_HEIGHT_2_8M","RM_RIGHT","RM_island","RM_Motorway_lane","RM_Crosswalk_lane","RM_No_vehicle_lane","SIGN_Limit_LEFT","SIGN_Limit_Drive","SIGN_Limit_parking","SIGN_Limit_whistle","SIGN_STOP_TO_YIELD","SIGN_Attention_people","SIGN_Attention_child","SIGN_work_Ahead","SIGN_SLOW","SIGN_Limit_trucks","SIGN_Keep_right_road","SIGN_Stop_sign","SIGN_HEIGHT_2_3M"]num2 = len(classes)# xml文件個數(shù)list_file = open('20200314.txt', 'w')#list_file.write(classes[0])for classe in classes: list_file.write(classe) list_file.write('')list_file.close()3.7、 進行訓(xùn)練——運行mytrain.py代碼
因為程序中有l(wèi)ogs/000/目錄,你需要創(chuàng)建這樣一個目錄,這個目錄的作用就是存放自己的數(shù)據(jù)集訓(xùn)練得到的模型。不然程序運行到最后會因為找不到該路徑而發(fā)生錯誤。生成的模型trained_weights.h5如下
3.8、修改yolo.py文件
如下將self這三行修改為各自對應(yīng)的路徑
3.9、檢測圖片
運行 python yolo_video.py --image,輸入自己要檢測的類的圖片即可查看訓(xùn)練效果了。
3.10、出錯總結(jié)
- 1、如果是cpu訓(xùn)練,大概是70s作于一個Epoch,安裝好gpu后,訓(xùn)練就是100-200ms一個Epoch了。速度提升很多。但是安裝gpu我是搞了兩天,總是提示cudnn版本未初始化啥的,我是cuda10.0 cudnn7.5 ,在經(jīng)歷了各種tensorflow升級降級,以及各種偏方,最后我將cudnn的版本重新下載為cudnn 7.4,重新配置了一下總算成功。我的版本是tensorflow-gpu 14.0.0+cuda10.0 +cudnn7.4。
- 2、訓(xùn)練時提示顯存不夠,我也看了網(wǎng)上很多方法,最后把input_shape從默認的419*419改成了128*128的,就成功了。關(guān)于那個到1/500的時候突然報錯可以看下是不是因為batch_size太大,我的改成4了,然后那個輸入input_shape改成128*128,然后就順利的跑通了。還有報那個找不到路徑的錯誤,我把VOCdevkit放在keras-yolo3文件夾下就可以了。
Loss值:
四、識別
五、代碼整體框架
介紹代碼框架,以及如何運行
六、界面設(shè)計
七、資源下載
全部工程源碼:
訓(xùn)練數(shù)據(jù)集:
總結(jié)
以上是生活随笔為你收集整理的opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑怎样打印手机微信图片
- 下一篇: 五菱宏光 MINIEV 车型新增电池月付