网站首页 > 技术文章 正文
教你从零开始做一个基于深度学习的交通标志识别系统
基于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解释器自带的下载源下载东西很慢,因此可以改为国内豆瓣或者清华等镜像源。
这里教大家改为豆瓣源。
可以看我的另外一篇文章:
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
--SegmentationObject
Annotations 中主要存放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 os
import random
trainval_percent = 0.2
train_percent = 0.8
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
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] + '\n'
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 ET
from 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('\n')
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('\n')
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值:
四、识别
五、代码整体框架
介绍代码框架,以及如何运行
六、界面设计
七、资源下载
全部工程源码:
训练数据集:
猜你喜欢
- 2024-10-03 物体检测之旅(二)我们能从一阶段的物体检测器中学到了什么?
- 2024-10-03 位置蒸馏:针对目标检测提高定位精度的知识蒸馏
- 2024-10-03 目标检测中的数据增强方法(附详细代码讲解)
- 2024-10-03 「AI实战」手把手教你训练自己的目标检测模型(SSD篇)
- 2024-10-03 【OpenMMLab 教程】目标检测常见数据集格式(COCO、VOC、YOLO)
- 2024-10-03 深度学习之图像目标检测速览 图像检测与目标跟踪技术
- 2024-10-03 【动手学计算机视觉】第一讲:图像预处理之图像去噪
- 2024-10-03 汽车冲压件缺陷预测分析助力产品前期开发应用!
- 2024-10-03 又快又准确,新目标检测器速度可达每秒200帧
- 2024-10-03 在单机上快速、精确的100000类别的检测
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)