日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统

發(fā)布時間:2023/12/19 windows 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

教你從零開始做一個基于深度學習的交通標志識別系統(tǒng)

基于Yolo v3的交通標志識別系統(tǒng)及源碼

自動駕駛之——交通標志識別

在本文章你可以學習到如何訓練自己采集的數(shù)據(jù)集,生成模型,并用yolo v3算法實現(xiàn)交通標志識別。當然交通標志可以是其他比如交通燈、車輛、行人等等。

效果圖:

環(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等等

三、訓練數(shù)據(jù)集

3.1 前言:明確讀入的格式以及處理流程

首先明確進行yolov3訓練數(shù)據(jù)集的格式,如下:

文件的絕對路徑 left,top,right,bottom,類別編號

其實所有模型方法進行訓練的時候甚至機器學習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格式訓練集——打標簽(labelImg軟件)

那么這么標準的數(shù)據(jù)如何得到呢,其實可以用一個深度學習訓練圖片的打標簽工具——labelImg。關(guān)于這個軟件的安裝與使用見鏈接:

圖像識別中標注工具labelImg的安裝和使用——深度學習打標簽

這個軟件會使用會生成標準xml文件,然后經(jīng)過下面一系列操作,最后成為txt文件,進行訓練。

使用教程:

大致步驟

  • 1、圖像(.jpg)進行重命名(00000X.jpg) ,可以用bat命令
  • 2、制作圖像的.xml文件 ,生產(chǎn)的 xml文件放入下方的 **Annotation**文件夾
  • 3、將.xml文件轉(zhuǎn)換成.txt文件【表述圖像及框的四點坐標信息】
  • 4、將.jpg文件轉(zhuǎn)換成.txt文件【訓練、測試、驗證數(shù)據(jù)集的路徑】

3.2 :建立VOC2007目錄,把上一步標記的xml文件放入Annotation文件夾內(nèi)

在工程下新建一個文件夾VOC2007,在下面就是新建幾個默認名字的文件夾 Annotation,ImageSet(該目錄還有三個文件需要建立),JPEGImages(把你所有的圖片都復制到該目錄里面,如下圖),SegmentationClass,SegmentationObject。

--VOC2007 --Annotations --ImageSets --Main --Layout --Segmentation --JPEGImages --SegmentationClass --SegmentationObjectAnnotations 中主要存放xml文件,每一個xml對應一張圖像, 并且每個xml中存放的是標記的各個目標的位置和類別信息,命名通常與對應的原始圖像一樣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文件,復制如下代碼

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:你要訓練的類別數(shù)(我這里是訓練兩類)
  • random:原來是1,顯存小改為0

3.6、修改model_data下的voc_classes.txt為自己訓練的類別

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、 進行訓練——運行mytrain.py代碼

因為程序中有l(wèi)ogs/000/目錄,你需要創(chuàng)建這樣一個目錄,這個目錄的作用就是存放自己的數(shù)據(jù)集訓練得到的模型。不然程序運行到最后會因為找不到該路徑而發(fā)生錯誤。生成的模型trained_weights.h5如下

3.8、修改yolo.py文件

如下將self這三行修改為各自對應的路徑

3.9、檢測圖片

運行 python yolo_video.py --image,輸入自己要檢測的類的圖片即可查看訓練效果了。

3.10、出錯總結(jié)

  • 1、如果是cpu訓練,大概是70s作于一個Epoch,安裝好gpu后,訓練就是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、訓練時提示顯存不夠,我也看了網(wǎng)上很多方法,最后把input_shape從默認的419*419改成了128*128的,就成功了。關(guān)于那個到1/500的時候突然報錯可以看下是不是因為batch_size太大,我的改成4了,然后那個輸入input_shape改成128*128,然后就順利的跑通了。還有報那個找不到路徑的錯誤,我把VOCdevkit放在keras-yolo3文件夾下就可以了。

Loss值:

四、識別

五、代碼整體框架

介紹代碼框架,以及如何運行

六、界面設(shè)計

七、資源下載

全部工程源碼:

訓練數(shù)據(jù)集:

總結(jié)

以上是生活随笔為你收集整理的opencv交通标志识别_教你从零开始做一个基于深度学习的交通标志识别系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。