目录
一、问题分析 3
1.问题描述 3
2. 数据集分析 3
3. 数据集标注 4
二、实验原理 5
论文摘要 5
Loss函数 7
内部网络架构 7
三、实验过程 8
- 实验环境 8
- 训练过程 8
- 实验结果 18
四、分析与总结 20 - 实验分析 20
- 心得体会 20
一、问题分析
##1.问题描述
随着城市道路交通的发展,交通标示作为智能交通系统的重要组成,对交通安全起到至关重要的作用,因此如何快速准确的定位及分类出交通标志被广泛研究。自然场景下的交通标志有着显著的颜色及形状特征,对交通标志的检测及识别提供了有利条件,但因光照多变,相近背景干扰及交通标志在场景图像所占比例较小,特征提取不足等问题,一定程度上影响了交通标志的检测及识别准确率。
如何快速、准确地定位图片或是视频中的交通标志,受到了许多研究人员的关注。
##2. 数据集分析
本次课程实验基于6000余张实景照片,标注其中所有的交通标志,实际
分类为5类。实际训练数据为实际场景下的照片,具备一定的实用性。
其中,照片的尺寸不完全相同,有12801024,也有720576等规格。
##3. 数据集标注
采用标注软件为colabeler。
得到两个文件夹,分别放置图片与标签。
得到6336个对应照片的xml标注文件,其内容如下所示(举例)。
由于后期采用的网络框架为yolo,需要特定的标注格式,后期编写代码进行更改。
二、实验原理
基于论文You Only Look Once:Unified, Real-Time Object Detection.
论文摘要
提出了一种新的目标检测方法YOLO。先前关于对象检测的工作将重新定义分类器来执行检测。相反,我们将对象检测定义为一个回归问题,回归到空间分离的边界框和相关的类概率。在一次评估中,单个神经网络直接从完整图像预测边界盒和类概率。由于整个检测管道是一个单一的网络,可以直接从检测性能上进行端到端优化。我们的统一架构非常快。我们的基本YOLO模型以每秒45帧的速度实时处理图像。一个更小版本的网络,Fast YOLO,处理速度达到惊人的每秒155帧,同时仍然达到其他实时探测器地图的两倍。与最先进的检测系统相比,YOLO会产生更多的定位错误,但不太可能预测背景上的误报。最后,YOLO学习对象的一般表示。当从自然图像推广到艺术作品等其他领域时,它的性能优于其他检测方法,包括DPM和R-CNN。
方法:YOLO将输入图像分成SxS个格子,每个格子负责检测‘落入’该格子的物体。何为之落入?若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。如下图所示,图中物体狗的中心点(红色原点)落入第5行、第2列的格子内,所以这个格子负责预测图像中的物体狗。
每个格子输出B个bounding box(包含物体的矩形区域)信息,以及C个物体属于某种类别的概率信息。Bounding box信息包含5个数据值,分别是x,y,w,h,和confidence。其中x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子中心?位置的偏移值,并且被归一化到[0,1]。confidence反映当前bounding box是否包含物体以及物体位置的准确性,计算方式如下:
confidence = P(object)* IOU
其中,若bounding box包含物体,则P(object) = 1;否则P(object) = 0。
IOU(intersection over union)为预测bounding box与物体真实区域的交集面积(以像素为单位,用真实区域的像素面积归一化到[0,1]区间)。
因此,YOLO网络最终的全连接层的输出维度是 SS(B5 + C)。YOLO论文中,作者训练采用的输入图像分辨率是448x448,S=7,B=2;采用VOC 20类标注物体作为训练数据,C=20。因此输出向量为77*(20 + 25)=1470维。作者开源出的YOLO代码中,全连接层输出特征向量各维度对应内容如下:
Loss函数
YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的SS*(B5 + C)维向量与真实图像的对应SS*(B*5 + C)维向量的均方和误差。如下式所示。
(分别为坐标误差+IOU误差+分类误差求和作为总的loss误差)
内部网络架构
网络的初始卷积层从图像中提取特征,全连通层预测输出概率和坐标。有24层卷积层+2层全连接层。(yolov3有改进)
三、实验过程
- 实验环境
采用darknet(https://github.com/AlexeyAB/darknet)框架,系统为Ubuntu16环境下,gpu训练,python3.6编写脚本进行预数据数据处理以及得到最终结果。 - 训练过程
1.数据预处理:
将所有的训练图片写入图片路径记录文本txt中,一行一个文件路径(绝对路径)。所使用的sh脚本为creatallpng.sh。(creatallpng.sh放在图片相同的路径下)脚本内容如下
#code
ls -R /home/pi/darknet/data/JPEGImages/*.png > allpng.txt
在该路径下运行该脚本,得到所有的图片的绝对路径。如下所示。
得到的txt为:
xml文件转换为txt格式
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=[('2018', 'train6336')]#读取要转换的xml的目录,这里只涉及训练集
#分为5类
classes = ["j", "z","s","l","d"]
#将xmin,ymin,xmax,ymax归一化到0-1之间
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)
#转换xml至txt
def convert_annotation(year, image_id):
in_file = open('/home/wangxutao/darknet/voc/VOC%s/Annotations/%s.xml'%(year, image_id))
#新生成的txt,写入到labels文件夹内
out_file = open('/home/wangxutao/darknet/voc/VOC%s/labels/%s.txt'%(year, image_id),