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

基于Yolo v3的交通标志识别系统及源码

自动驾驶之——交通标志识别

在本文章你可以学习到如何训练自己采集的数据集,生成模型,并用yolo v3算法实现交通标志识别。当然交通标志可以是其他比如交通灯、车辆、行人等等。

效果图:

环境:win10+python3.6 +keras +Tensorflow 1.14.0+Pycharm2019

一、环境配置

1.1 下载anaconda,安装python环境

python环境我建议下载anaconda,anaconda内置python 3.6解释器,其他python版本不用单独安装,十分便捷,在安装

1.2 修改下载源

anaconda的python解释器自带的下载源下载东西很慢,因此可以改为国内豆瓣或者清华等镜像源。

这里教大家改为豆瓣源。

可以看我的另外一篇文章:

更改Python pip下载源为国内豆瓣源

1.3 安装其他环境及包,tensorflow、keras、opencv等等

三、训练数据集

3.1 前言:明确读入的格式以及处理流程

首先明确进行yolov3训练数据集的格式,如下:

文件的绝对路径 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

可以看到数据中不只有一个目标。

3.1 、制作自己的VOC格式训练集——打标签(labelImg软件)

那么这么标准的数据如何得到呢,其实可以用一个深度学习训练图片的打标签工具——labelImg。关于这个软件的安装与使用见链接:

图像识别中标注工具labelImg的安装和使用——深度学习打标签

这个软件会使用会生成标准xml文件,然后经过下面一系列操作,最后成为txt文件,进行训练。

使用教程:

大致步骤

  • 1、图像(.jpg)进行重命名(00000X.jpg) ,可以用bat命令
  • 2、制作图像的.xml文件 ,生产的 xml文件放入下方的 **Annotation**文件夹
  • 3、将.xml文件转换成.txt文件【表述图像及框的四点坐标信息】
  • 4、将.jpg文件转换成.txt文件【训练、测试、验证数据集的路径】

3.2 :建立VOC2007目录,把上一步标记的xml文件放入Annotation文件夹内

在工程下新建一个文件夹VOC2007,在下面就是新建几个默认名字的文件夹 Annotation,ImageSet(该目录还有三个文件需要建立),JPEGImages(把你所有的图片都复制到该目录里面,如下图),SegmentationClass,SegmentationObject。

--VOC2007   --Annotations   --ImageSets     --Main     --Layout     --Segmentation   --JPEGImages   --SegmentationClass   --SegmentationObjectAnnotations  中主要存放xml文件,每一个xml对应一张图像,           并且每个xml中存放的是标记的各个目标的位置和类别信息,命名通常与对应的原始图像一样JPEGImages  自己的原始图像放在JPEGImages文件夹ImageSets           Layout 存放人体部位的数据。(用不上)            Main  存放的是目标识别的数据,主要有test.txt , train.txt, val.txt,                  trainval.txt四个文件。            Segmentation  存放分割的数据。(用不上)

有大神写了个程序,运行一下就直接建好了,如下:

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数据集制作完成

3.4、运行voc_annotation.py——生成yolo3所需的train.txt、val.txt、test.txt文件

生成的数据集不能供yolov3直接使用。需要运行voc_annotation.py ,classes以检测两个类为例(车和人腿),在voc_annotation.py需改你的数据集为。

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()

运行之后,生成如下三个文件:

如果出现这种解析xml文件出错的问题,就打开保存的文件,找到最下面,看看后面一张图片xml文件格式

3.5、修改参数文件yolo3.cfg

打开yolo3.cfg文件。搜索yolo(共出现三次),每次按下图都要修改

参数修改说明:

  • filter:3*(5+len(classes))
  • classes:你要训练的类别数(我这里是训练两类)
  • 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文件个数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代码

因为程序中有logs/000/目录,你需要创建这样一个目录,这个目录的作用就是存放自己的数据集训练得到的模型。不然程序运行到最后会因为找不到该路径而发生错误。生成的模型trained_weights.h5如下

3.8、修改yolo.py文件

如下将self这三行修改为各自对应的路径

3.9、检测图片

运行 python yolo_video.py --image,输入自己要检测的类的图片即可查看训练效果了。

3.10、出错总结

  • 1、如果是cpu训练,大概是70s作于一个Epoch,安装好gpu后,训练就是100-200ms一个Epoch了。速度提升很多。但是安装gpu我是搞了两天,总是提示cudnn版本未初始化啥的,我是cuda10.0 cudnn7.5 ,在经历了各种tensorflow升级降级,以及各种偏方,最后我将cudnn的版本重新下载为cudnn 7.4,重新配置了一下总算成功。我的版本是tensorflow-gpu 14.0.0+cuda10.0 +cudnn7.4。
  • 2、训练时提示显存不够,我也看了网上很多方法,最后把input_shape从默认的419*419改成了128*128的,就成功了。关于那个到1/500的时候突然报错可以看下是不是因为batch_size太大,我的改成4了,然后那个输入input_shape改成128*128,然后就顺利的跑通了。还有报那个找不到路径的错误,我把VOCdevkit放在keras-yolo3文件夹下就可以了。

Loss值:

四、识别

五、代码整体框架

介绍代码框架,以及如何运行

六、界面设计

七、资源下载

全部工程源码:

训练数据集:

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

  1. DeepEye:一个基于深度学习的程序化交易识别与分类方法

    DeepEye:一个基于深度学习的程序化交易识别与分类方法 徐广斌,张伟 上海证券交易所资本市场研究所,上海 200120  上海证券交易所产品创新中心,上海 200120    摘要:基于沪市A股交 ...

  2. 基于深度学习的声纹识别

    一.选题 1.1 题目: 基于深度学习的声纹识别 1.2 研究内容: ① 研究用于声纹识别的语音参数以及这些参数对声纹识别性能的影响. ② 研究声纹识别的传统方法及性能. ③ 在研究声纹识别的传统方法 ...

  3. FANUC机器人_通过ROBOGUIDE从零开始做一个离线仿真项目(1)

    FANUC机器人_通过ROBOGUIDE从零开始做一个离线仿真项目(1) 打开ROBOGUIDE软件,如下图所示,然后点击新建工作单元, 如下图所示,选择"HandlingPRO" ...

  4. Python基于深度学习yolov5的扑克牌识别

    Python基于深度学习yolov5的扑克牌识别(附带源码) 源程序来源于本人参与开发的一个网络扑克牌小游戏的图像识别.AI分析,AI出牌的小项目,做完后和大家分享一下扑克牌自动识别模块制作的过程. ...

  5. 基于深度学习的中文车牌识别与管理系统(含UI界面,Python代码)

    摘要:本文详细介绍基于深度学习的中文车牌识别与管理系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中既可以选择需要识别的车牌视频.图片文件.批量图片进行检测识别,也 ...

  6. 《基于深度学习的加密流量识别研究》-2022毕设笔记

    参考文献: 基于深度学习的网络流量分类及异常检测方法研究_王伟 基于深度学习的加密流量分类技术研究与实现_马梦叠 基于深度学习的加密流量识别研究综述及展望_郭宇斌 基于深度学习的加密流量算法识别研究_ ...

  7. 毕业设计之 --- 基于深度学习的行人重识别(person reid)

    文章目录 0 前言 1 技术背景 2 技术介绍 3 重识别技术实现 3.1 数据集 3.2 行人检测 3.2 Person REID 3.2.1 算法原理 3.2.2 算法流程图 4 实现效果 5 部 ...

  8. 一种基于深度学习的增值税发票影像识别系统

    一种基于深度学习的增值税发票影像识别系统-专利技术交底书 缩略语和关键术语定义 1.卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构 ...

  9. 基于深度学习的人脸性别识别系统(含UI界面,Python代码)

    摘要:人脸性别识别是人脸识别领域的一个热门方向,本文详细介绍基于深度学习的人脸性别识别系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面.在界面中可以选择人脸图片.视频进行检 ...

最新文章

  1. 使用String()解决utf-8字符转GB2312的问题
  2. extlinux安装livecd到USB
  3. keil 器件是空的,Keil的Device为空,不能选择器件
  4. [待总结]高频率vim命令
  5. 迷你HTM在线L编辑器—xhEditor
  6. malloc 不能返回动态内存
  7. 线性代数及其应用(part4)--特征向量与线性变换
  8. html js脚本限制 正则,简单谈谈JS中的正则表达式
  9. Sql Server 中存储过程的output return的区别
  10. Java并发编程之堵塞队列介绍以及SkipList(跳表)
  11. lua正则替换_Lua 语言如何替换多个可选字符串
  12. Unity 2D工具:工作流介绍
  13. php fpm高并发,php-fpm 高并发、502解决方案
  14. 设计模式之中介者模式
  15. 癌症/肿瘤免疫治疗最新进展(2022年3月)
  16. 「hdu6638」Snowy Smile【稀疏矩阵最大子矩阵和】
  17. 英语情景对话计算机专业,英语情景对话 寒假生活 5人
  18. 人脸识别门禁的那些“坑”,你中招了吗?
  19. js实现表单及时验证功能 用户信息立即验证
  20. Ctrl+shift+k会调出搜狗输入法软键盘,与VSCode行删除快捷键冲突

热门文章

  1. 数学狂想曲(七)——莱洛三角形
  2. 引用一个项目作为library的操作步骤---开发中遇到的问题(二)
  3. 方程的解_NOI导刊2010提高(01) 组合数
  4. P359 usestock2.cpp
  5. Spark-core(核心)的基本介绍
  6. pip安装lxml报错
  7. OpenBSD如何挂载USB闪存盘
  8. Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web
  9. 6 交换机-topic类型
  10. (转发)一个通用的C++ 消息总线框架