一、项目设计与实现
1.1总体设计简介
交通标志有着显著的颜色和形状特征,主要功能以指示、提示和警示为主。标志的意义:警告标志用于警告车辆、行人注意危险地点;禁令标志用于禁止或限制车辆、行人的交通行为;指示标志用于指示车辆、行人的行进;标志的颜色、形状特点:警告标志均为黄底、黑边、黑色图案;形状都为顶角向上的等边三角形;禁令标志大部为为白底,红圈、红杠、黑色图案,部分存在特例,如解除禁止超车、解除限制速度标志为白底、黑圈、黑杠、黑色图案;形状大部分为圆形(除了让路标志为顶角向下的等边三角形);指示标志颜色为蓝底、白色图案,形状为圆形和矩形。根据交通标志的以上特点,我们将图像中的目标进行颜色和形状的分割,在处理后加以匹配和识别。
项目总体分为三个部分,分别是目标提取、特征提取、识别。下面从这三个方面介绍如何实现。
目标提取:将目标进行颜色分割,分为红、黄、蓝三部分,使用二值去噪去除噪声,之后使用八临点去除杂质等方法实现形态处理,最后实现目标提取。流程图如下。
图1
特征提取:将目标提取出来之后需要进行特征提取,根据一般路标的形态与特征,我们将目标分为红色圆形、黄色三角形、蓝色圆形、蓝色矩形、红色三角形五种,分别进行提取,提取出来之后通过Zernike矩计算,提取八个Zernike不变矩。流程图如下。
图2
识别:提取出不变矩之后,根据前面目标的分类,分别进入红色圆形神经网络、黄色三角形神经网络、蓝色圆形神经网络、蓝色矩形神经网络、红色三角形神经网络等五个神经网络,运用最小欧式距离进行相似度比较,最终实现目标。流程图如下。
图3
1.2相关算法介绍
1.2.1 颜色分割算法
1. 基于RGB空间的分割算法
分析:我国的交通标志基本分为三种(警告标志、禁令标志、指示标志)共有三种颜色(红色表示禁令,黄色表示警告,蓝色表示指示)在RGB模型中,其各分量极易受光照的影响,各个分量间关联性较大,难以较好的分割各个颜色,但RGB空间运算量小,速度快。
(1) 三色差量法:
对于所研究图像的所有像素点:
如果(R-G)>0.08&&(R-B)>0.08那么是红色像素
如果(B-G)>0.01&&(B-R)>0.01那么是蓝色像素
如果(R-B)>0.12&&(G-B)>0.12那么是黄色像素
如果(是其它数值)那么是其它色彩像素。
经测试和实践,我们选择了基于RGB空间的三色差量改进分割算法
具体算法如下:在上述三色差量改进算法中,实践测试下,黄色及蓝色分割并不理想。于是我们提出蓝色和黄色增强分割算法。对于蓝色分割,在RGB分割的初步条件下,确定蓝色目标大概范围,然后在截取该范围进行HSV空间的增强分割。对于黄色部分的分割,目前大多数算法都不够理想,我们提出在黄色部分的基础上在进行黑色的检测。这样对于黄色三角形标志,由于黄色部分所占的比例并不是太大,检测中容易漏检。加上黄色边缘的黑色分割,可以增大标志面积,提高提取率。
1.2.2 目标检测算法
对分割出的图像,进行轮廓提取。然后计算每个轮廓的外接矩形。初步通过矩形的大小、长宽比去掉一些小的目标。
1.2.3 形状分类算法
对于交通标志,一共有五类。即,红色圆形,红色三角形,蓝色圆形,蓝色矩形,黄色三角形。一般形状可以用几何特征、不变矩等方法分割。HU不变矩具有旋转、伸缩不变性。但要耗费一定时间计算HU不变矩。我们采用几何特征分类[5]。
具体算法如下:
对于每个待提取目标,计算出每个目标轮廓的外接矩形或外接圆形、轮廓包含面积、轮廓长度等特征进行区分
对于圆形
rate =PI*radius*radius/(rect.area());
其中radius为目标外接圆形半径
if (rate<0.8||rate>1.4) 判断为非圆形
else 则为圆形
对于矩形
doublerarea=abs(contourArea(contour,true));//轮廓面积
doublerate_l,rate_s;
rate_l =lc/(2*(rect.width+rect.height));
rate_s =rarea/(rect.area());
其中lc为轮廓周长
if(rate_l<1.15&&rate_l>0.85&&rate_s<1.15&&rate_s>0.85)则为矩形
否则进行HSV空间提取,再用同样的条件选取目标。
对于三角形
double rate_s =2*abs(contourArea(contour,true))/(rect.area());
coun为轮廓
通过轮廓面积与外接矩形的比值确定
if (rate_s<0.75||rate_s>1.35) 判断为非三角形
否则为三角形
1.2.4 特征提取算法
图像特征一般有几何特征、不变矩特征通过提取zernike不变矩,考虑到时间,我们提取了8个zernike不变矩特征作为神经网络的输入。
1.2.5 目标识别算法
目前识别算法主要有图片特征匹配、神经网络、支持SVM等
我们选取了应用较为广泛的BP神经网络算法。
根据目标分类,共设计训练了5类BP神经网络
具体特征如下:
/*****************************************
BP ANN NAME: innode hidenode outnode
redcircle 8 12 6
redtri 8 6 2
bluecircle 8 10 5
bluerect 8 8 4
yellowtri 8 12 6
****************************************/
平台为OPENCV CVANN_MLP 神经网络;
1.3各模块设计与实现
1.3.1 图像分割
在image_segmentation.h下
//color division
void colordivision(Mat rgbimage,Mat &redbw,Mat &yellowbw,Mat &bluebw );
void hsvdivision(const Mat &src,Mat &division,int whichcolor);
1.3.2 目标提取
在image_segmentation.h下
//提取圆形、三角形、矩形标志
void findCircleRegion(Mat&image ,Mat&bw,vector< vector<Point>> contours,vector<Rect> &signroi,bool Isdrawrectangle);
void findRectangleRegion(Mat&image ,Mat&bw,vector< vector<Point>> contours,vector<Rect> &signroi,bool Isdrawrectangle);
void findTriangleRegion(Mat&image ,Mat&bw,vector< vector<Point>> contours,vector<Rect> &signroi,bool Isdrawrectangle);
1.3.3 特征提取
在zernike.h目录小
void getZernikeMoment(const Mat &src, double Ze[8]);
1.3.4 神经网络识别
在data目录下5个XML文件通过加载可以直接识别
bpredcircle.load("data/redcircle.xml");
bpredtri.load("data/redtri.xml");
bpbluecircle.load("data/bluecircle.xml");
bpbluerect.load("data/bluerect.xml");
bpyellowtri.load("data/yellowtri.xml");
二、测试与分析
2.1数据来源与真实性
由于并没有找到可靠地数据库资源,为了保证图片来源的广泛性和真实性,我们通过互联网搜集与路标相关的图片,比较具有代表性,且真实的反映出实际环境下的识别和检测效果。
2.2基本分类器实现效果
对于红色:红色比较容易分割,目标提取率较高
对于蓝色:蓝色比较容易受环境的影响,比如天空的颜色,很容易干扰识别效果。
对于黄色:黄色范围比较小,识别较为困难,若增大识别范围,很容易识别多余的目标,比如偏于黄色的树叶等环境物体。在整体光线不强的情况下,黄色也十分难以分割出来。
目标检测测试
类型 | 测试数量 | 正确检测数量 | 正确检测率 |
红色圆形 | 30 | 28 | 93.3% |
红色三角形 | 10 | 8 | 80% |
黄色三角形 | 30 | 26 | 86.7% |
蓝色圆形 | 20 | 18 | 90% |
蓝色矩形 | 20 | 18 | 90% |
2.3识别效果
由于我们训练的数据有限,我们选取了10组红色圆形标志、10组黄色三角形标志、10组蓝色圆形标志、7组蓝色矩形标志、4组红色三角形标志。对于已经训练过的图片,可以正确识别,和训练图片环境接近的图片也可以识别出来。受于训练数据的影响,对于其他受环境影响较大,残缺不完整的交通标志,识别准确率不高,还必须进一步优化和提高。
识别测试
类型 | 测试数量 | 正确识别数量 | 正确识别率 |
红色圆形 | 30 | 25 | 83.3% |
红色三角形 | 10 | 7 | 70% |
黄色三角形 | 30 | 23 | 76.7% |
蓝色圆形 | 20 | 16 | 80% |
蓝色矩形 | 20 | 16 | 80% |
2.4 实时性
由于我们采用的RGB分割图像,减少了HSV浮点数运算的计算量,可以减小检测间,提高实时性。
硬件平台:
软件平台:
VS2010 +OPENCV 2.4.5实时性测试(图片没有归一化为640x480,仅供参考)
类型 | 图片大小 | 图片数量/张 | 平均时间/ms |
红色 | 640x480~320x220 | 20 | 170 |
黄色 | 640x480~320x220 | 20 | 177 |
蓝色 | 640x480~320x220 | 20 | 160 |
混合 | 640x480~320x220 | 20 | 185 |