精华内容
下载资源
问答
  • MATLAB 图像处理工具箱 一种简单的基于图像处理交通信号灯识别算法 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个...


    1 前言
    智能车辆感知层主要有摄像头、雷达等,其中摄像头是视觉识别的重要元件。智能车辆可以通过摄像头进行交通标识识别,配合其它感知元件进行环境感知。交通信号灯是智能车辆在城市环境中行驶的主要指示信号,如交通信号灯等交通标示识别,是智能车辆进行路径规划、车道动态控制的前提因素。本文介绍了在简单工况下,利用MATLAB图像处理工具箱的相关函数在颜色空间中对信号灯颜色进行分割等操作,然后再通过信号灯形状特征等进行进一步的判断从而识别交通信号灯的简便方法。

    2 系统分析
    2.1 交通信号灯
    道路交通信号灯1是指挥交通运行的信号灯,一般由红灯、绿灯、黄灯组成三个无图案圆形单位组成的一组灯,指导机动车通行。绿灯亮时,准许车辆通行,但转弯的车辆不得妨碍被放行的直行车辆、行人通行;黄灯亮时,已越过停止线的车辆可以继续通行;红灯亮时,禁止车辆通行。
    国标GB14887中对道路交通信号灯有明确规定,如发光单元尺寸Φ200mm、Φ300 mm、Φ400 mm三种规格发光单元在信号灯壳体上安装孔的直径分别为Φ200mm、Φ290 mm、Φ390 mm,尺寸允许偏差±2 mm。对于无图案信号灯,出光面直径分别为Φ185mm、Φ275 mm、Φ365 mm,尺寸允许偏差±2 mm;对于有图案信号灯,出光面直径分别为Φ185mm、Φ275 mm、Φ365 mm,尺寸允许偏差±2 mm,图像尺寸符合国标附录。
    发光亮度在各个方向上的平均值不低于表1中的最小亮度值,且不大于15000cd/m2。在可观察信号灯点亮区域内,亮度应均匀,在基准轴上的发光亮度的最大值与最小值之比应不大于2。
    表1 有图案信号灯最低亮度值
    在这里插入图片描述
    发光强度在基准轴上不小于150cd,且不大于400 cd,其它方向上的发光强度应不低于表2规定。
    表2 有图案信号灯轮廓最低光强
    在这里插入图片描述

    2.2 彩色视觉

    彩色视觉(color vision)是一个生物体或机器基于物体所反射,发出或透过的光的波长(或频率) 以区分物体的能力。颜色可以以不同的方式被测量和量化;事实上,人对颜色的感知是一个主观的过程,即,脑响应当进入的光与眼中的若干种视锥细胞作用时所产生的刺激。
    彩色视觉常用颜色空间也称彩色模型(又称彩色空间或彩色系统)描述,它的用途是在某些标准下用通常可接受的方式对彩色加以说明。彩色模型是坐标系统和子空间的阐述。位于系统的每种颜色都有单个点表示。采用的大多数颜色模型都是面向硬件或面向应用的。
    其中RGB颜色空间是依据人眼识别的颜色定义出的空间,可表示大部分颜色。以R(Red红)、G(Green绿)、B(Blue蓝)三种基本色为基础,进行不同程度的叠加,产生丰富而广泛的颜色,所以俗称三基色模式。在大自然中有无穷多种不同的颜色,而人眼只能分辨有限种不同的颜色,RGB模式可表示一千六百多万种不同的颜色,在人眼看来它非常接近大自然的颜色,故又称为自然色彩模式。
    亮度、色调、饱和度三个基本特征来描述;其中亮度是指明暗程度,色调是指光的颜色,饱和度是指颜色的深浅程度。颜色空间2模型如图1所示。
    H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,红、绿、蓝分别相隔120度。
    S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。
    V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。

    图1 颜色空间模型在这里插入图片描述

    2.3 MATLAB图像处理工具箱
    Matlab对图像的处理功能主要集中在它的图像处理工具箱 ( Image Processing Toolbox ) 中,图像处理工具箱是由一系列支持图像处理操作的函数组成,可以进行诸如几何操作、线性滤波和滤波器设计、图像变换、图像分析与图像增强、数学形态学处理等图像处理操作,主要有以下功能模块:
    Image Acquisition Toolbox ( 图像采集工具箱)
    Image Processing Toolbox ( 图像处理工具箱)
    Signal Processing Toolbox(信号处理工具箱)
    Wavelet Toolbox(小波分析工具箱)
    Statistics Toolbox(统计工具箱)
    Bioinformatics Toolbox(生物信息学工具箱)
    Matlab其具有上手容易,开发周期短,见效快;程序代码编写量明显减少;提供多种图像处理工具包等特点,比较适合进行图像识别相关工作。
    2.4 识别系统方案实施
    本文分析了道路交通信号灯色彩特点、图形学特点等特征,结合彩色视觉RGB颜色空间基本特征,并利用Matlab图像处理工具箱进行图像的灰度分割、边缘检测等操作,能够实现多交通信号灯的识别,并制定其系统流程如图2所示:
    在这图2  识别系统流程图里插入图片描述
    图2 识别系统流程图
    其中红色信号灯识别为例,首先将RGB 值转换为相应的色调、饱和度和明度 (HSV) 坐标。rgb 可以是 p×3 颜色图数组或 m×n×3 图像数组。hsv 的大小与 rgb 相同。其次,利用红色色彩特征值,搜索敏感区域识别红色颜色区域;并结合交通信号灯外形特征完成结构元素。再次,对图形结构元素实现二值化图像,填充背景色。
    部分主要代码如下:
    %hsv三元色图像
    hsv=rgb2hsv(a);
    h=hsv(:,:,1);
    s=hsv(:,:,2);
    v=hsv(:,:,3);
    figure(2)
    imshow(hsv);
    title(‘HSV图像’); %转换为hsv图像并显示
    bw1=h>0.9|h<0.05; %0.9,0.05
    bw1=bw1.*(s>0.5); %检测红色区域
    se=strel(‘disk’,3); %创建一个指定半径R的平面结构元素
    bw2=imopen(bw1,se); %用结构元素SE实现二值图像的bw1的形态开运算。
    bw2=bwfill(bw2,‘holes’); %填充二进制图像的背景色
    figure
    imshow(bw2)

       依据以上方案在MATLAB环境中完成了整个算法搭建及实现,算法运行正常,随后分别针对网络资源道路交通信号灯图片、实际路况道路交通信号灯图片进行功能测试。
    

    4 试验效果
    4.1 网络资源验证
    为了验证算法实际效果,首先通过网络资源下载相关交通信号灯图片,利用已完成的算法进行离线交通信号灯识别效果验证,其效果如图3、图4所示;
    在这里插入图片描述
    图3 网络资源红灯识别效果
    在这里插入图片描述
    图4 网络资源黄灯识别效果

    4.2 实际路况验证进行实际效果检验,其效果如图5、图6所示;

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
    图4 实际路口红灯识别效果

    根据验证效果分析,利用道路交通信号灯色彩特点、图形学特点等特征,结合彩色视觉RGB颜色空间基本特征,并利用Matlab图像处理工具箱进行图像的灰度分割、边缘检测等操作,可以实现简单路况道路交通信号的识别。

    5 结论
    本文实现的评估方案是建立在道路交通信号灯色彩和形状特征基础上,利用MATLAB图像处理工具箱相关函数进行识别;相对于基于深度学习的方案,无需进行大量的前期数据采集、标注等工作,可以快速搭建及实现。经过测试可以满足简单路况道路交通信号的识别需求。
    下一步计划对色彩干扰、图形干扰等干扰因素进行剔除,提高识别精度;并图像坐标上半区域敏感区域进行筛选,预计减少50%运算量;其次根据实际车速,选取合理的间隔帧,提高实时,可进一步优化方案。

    参考文献
    1 道路交通信号灯GB14887-2011
    2 陈超. MATLAB应用实例精讲[M]. 北京:电子工业出版社,2011.11.

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G
    查找:Ctrl/Command + F
    替换:Ctrl/Command + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 交通信号灯识别的自主式学习系统

    千次阅读 2018-04-27 17:11:25
    其中算法层面涉及到对交通信号的检测与识别,前期对该模块进行了简单算法的设计,主体的识别框架如下图,主要思想是基于滑动窗思想和机器学习模型。当然为了进一步提升算法的效率,采用了基于信号颜色的特殊先验...

    自动驾驶中一个核心模块的设计。其中算法层面涉及到对交通信号灯的检测与识别,前期对该模块进行了简单算法的设计,主体的识别框架如下图,主要思想是基于滑动窗思想和机器学习模型。当然为了进一步提升算法的效率,采用了基于信号灯颜色的特殊先验知识进行selective search,过滤掉大部分区域实现算法的加速。


    上述框架虽然能达到一定的识别率,但是依然面临两个严峻的挑战:

    • 对视频处理的实时性较差。上述框架对ROI的提取算法涉及到对整个图像的遍历;并且对视频的每一帧进行独立处理,没有考虑帧与帧之间的相关性。
    • 处理不同场景的迁移性较差。上述框架主要基于SVM分类器,而这种传统的机器学习模型的性能主要依赖于训练数据和提取的人工特征。目前的训练数据有限,不能完全表征整个真实数据的分布,导致在其它场景漏检或误检较多;当前的特征主要基于颜色直方图特征,该特征对图像数据较为敏感。比如采用不同的成像传感器或当前采集图像出现极端天气,提取的颜色直方图特征都会给后续的分类器带来误判。

    针对上述挑战,对现有框架进行了改进,设计了交通信号灯识别的自主式学习系统来应对实时性和迁移性差的问题。首先我们考虑交通场景中视频的特点,当信号灯出现在当前视野中时,在接下来的一段采集时间内都会出现该信号灯;并且帧与帧之间的信号灯位置不会出现很大的偏移(主要取决于采集车和CCD)且呈现一定的运动方向,如下图。那么我们完全可以利用这种特性,在下一帧的检测中取当前信号灯位置处一定的窗口范围,使用mean shift算法在特征空间中搜索所谓的模点(局部极值点)找到信号灯位置;甚至可以在该窗口检测范围内,使用颜色分割,根据颜色判定信号灯的位置和颜色。注意上述策略只适用于信号灯在视野范围内连续出现的帧内检测。当信号灯在某个时间点突然出现,则我们必须利用先前框架的单帧处理检测信号灯。因此,先前框架采用的人工特征和SVM分类器也是至关重要的一环。下面我们重点讨论这一部分,以解决迁移性较差的问题。


    在人工特征方面,似乎颜色特征时信号灯最明显的特征。而其它纹理特征比如sift,LBP等在实验中并没有取得好的效果,还包括HoG特征,Gabor变换,角点特征等。另外值得注意的是,交通场景极为复杂,我们会面临极大的干扰。比如,针对颜色直方图特征,采集场景中会出现大量照明灯光区域,从而照成正负样本空间中类内及其相似而线性不可分的情形。鉴于此,我们采用基于sparse coding的策略,利用学习的字典将低层的颜色直方图特征非线性的映射到更加线性可分的高层特征空间中。而在分类器的训练中,我们采用自主式的训练机制,自发主动的学习并不断更新分类器,以适应数据的变化。在新的场景视频检测中,当已经训练的分类器检测不出信号灯区域且出现大量误检的情况下,我们手工干预标定信号灯区域,而在后续的帧检测中,利用前述的帧相关性进行检测与识别;在确定的检测窗口范围内识别处的信号灯区域作为正样本,而先前训练的分类器检测出的区域且出现在确定的检测窗口范围外的区域作为负样本;收集一定的正负样本后,重新训练分类器,达到更新的效果。


    新的框架目前还处于初步构建中,在实验中实时性得到了保障,并且自发式的学习能不断的自适应新的数据,并不断增强分类器的性能,进一步提升方法的场景迁移性处理能力。但是新的框架也存在缺陷,在漏检的情况下,需要人工干预。后续会不断改进算法,充分利用视频帧在时空上的相关性,甚至利用深度卷积神经网络的特征自学习能力。

    展开全文
  • 将灯板区域的彩色图像转换到YCbCr 空间, 分割灯板区域中的红、黄、绿三色区域, 利用交通信号灯的形态特性定位交通灯位置. 用Gabor 小波和2 维独立分量分析提取感兴趣区域的特征, 送入最近邻分类器分类信号灯的类型....
  • 教你从零开始做一个基于深度学习的交通标志识别系统基于Yolo v3的交通...当然交通标志可以是其他比如交通灯、车辆、行人等等。效果图:环境:win10+python3.6 +keras +Tensorflow 1.14.0+Pycharm2019一、环境配置1.1...

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

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

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

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

    效果图:

    9e866056a2580e9fda613952ed49e8c8.png
    985193a0a19c52db7d459177ebbaab70.png
    65557226e9610c920b98579b0e6ae666.png
    e18f66cbfb35d7235a88e7cb10e9ef0e.png

    环境: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文件,进行训练。

    使用教程:

    996f49967ff76b3c00dce6149c811e47.png

    大致步骤

    • 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。

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

    edf4194fe7f043cc9f4dc50c095cae91.png

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

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

    3ef2ec3e6c8c31b0585f2b125457b6fa.png

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

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

    bf61992f326a45dc4fac3c15a44970ee.png

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

    20cc979ae34c296839ffa2a5b3c22d22.png

    3.5、修改参数文件yolo3.cfg

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

    22793710ec70ea01a6afe60e74f13246.png

    参数修改说明:

    • 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()
    4ecd765f99f9cfb90119edaa2c80f1df.png

    3.7、 进行训练——运行mytrain.py代码

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

    7ced23de196b852218863bf840ce6e26.png

    3.8、修改yolo.py文件

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

    0face28f6c9bc32d2e2777e9f986ef3e.png

    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值:

    a99f27ab7d817c9849605fc6992e9558.png

    四、识别

    e0b3a518fa15f0214586d7fdba317166.png

    五、代码整体框架

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

    六、界面设计

    七、资源下载

    全部工程源码:

    训练数据集:

    展开全文
  • 教你从零开始做一个基于深度学习的交通标志识别系统基于Yolo v3的交通...当然交通标志可以是其他比如交通灯、车辆、行人等等。效果图:环境:win10+python3.6 +keras +Tensorflow 1.14.0+Pycharm2019一、环境配置1.1...

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

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

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

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

    效果图:

    fc1bd2b2c9dd08fd1655c951c3bf0568.png
    cb64311ff9ec19f10a01220219add71d.png
    a654bb702ff5b022dccd8836a1e0d107.png
    9fc2c6dad17dfea372f31c59e407b495.png

    环境: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文件,进行训练。

    使用教程:

    bb167fa86e116e908b93ccb7c136ea1f.png

    大致步骤

    • 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。

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

    625aa086c7b9c222c485d17c1e84d6f9.png

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

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

    09cf9da80a6540d219ef2c2e397f7961.png

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

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

    a05d68ac9b76adc0f67a2d6c5c39b3b6.png

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

    044dabe55e5ff4c12c1bfedc679bdba1.png

    3.5、修改参数文件yolo3.cfg

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

    767d6e3436933005322ca45f27e55b28.png

    参数修改说明:

    • 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()
    ede524dcad8206cc9390ef2018b9b71b.png

    3.7、 进行训练——运行mytrain.py代码

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

    bddba3ffde77bad4907c7c80220643c1.png

    3.8、修改yolo.py文件

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

    5c1f5ae706514b6f345bfa7b9e2b533d.png

    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值:

    44fbf30430fa1e0510b8a07efee895e2.png

    四、识别

    ddac15c46b0eb6c0e2a43b50865e8eb7.png

    五、代码整体框架

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

    六、界面设计

    七、资源下载

    全部工程源码:

    训练数据集:

    展开全文
  • 之后,在对车辆行驶环境分析的基础上,建立了基于改进人工势场法的智能车辆主动避撞算法,使用全局规划虚拟引力、智能车辆换道引力、前向交通参与者斥力、侧向交通参与者斥力、交通信号斥力、前方传感器检测盲区...
  • 智能视频监控中目标检测与识别

    热门讨论 2012-07-23 11:19:21
    出 版 社:上海交通大学出版社 出版时间:2010-1-1 本书系统介绍了智能视频监控中目标检测与识别的基本问题及其相关处理技术。主要内容包括智能视频监控的理论、算法和典型应用实例。包括计算机视觉基本理论、运动...
  • 该方法首先将道路交通监控视频拍摄到的的图像,利用时空图转换为时间-空间坐标连续图。然后通过时空图提取到的车灯信息,采用车灯配对的方法来识别车辆,并计算出一定时间内的车流量。本实验所用的监控视频图像由架...
  • 【机器学习】HMM算法

    千次阅读 2014-06-07 10:52:34
    隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价值。... 考虑下面交通灯的例子,一个序
  • 智能交通监控系统 ... 自动识别车道线、斑马线、交通灯等(基于OpenCV和神经网络) 车牌号识别 移动物体检测和轨迹跟踪 视频静态背景提取 帧差分检测移动物体 目标跟踪算法(KCF
  • 隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价值。... 考虑下面交通灯
  • 1. 炫光 & LED闪烁背景 (1)动态范围 汽车成像环境中最关键一个参数是动态...这就导致自动紧急制动、交通标志识别等的前置相机出问题, 如果脉冲LED不能被捕获到一个完整帧图像中,那么算法可能无法做出正...
  • Apollo介绍

    千次阅读 2017-12-09 15:36:08
    感知 Perception:识别障碍物,车道线,交通灯等各种信息的模块 预测 Prediction:基于感知信息进行预测 决策 Decision:无人车系统最高层的决策系统,它的作用是基于现有的信息来判断下一步动作 规划 ...
  • 研究高速、准确的定位与识别算法是当前的主要任务。上述产品中所使用的汽车图像均为灰度图像,而车牌本身是彩色物体,其底色和字符颜色为有限的几种,具有明显的颜色特征,车牌定位及字符的分割和识别没有用到颜色...
  • 深度学习可以解决很多问题,但有时候深度学习和图像处理相结合才能有更好的效果:比如,在进行交通信号检测时,用目标检测模型确定信号位置后,对信号进行颜色分割再识别可大大提高准确率。 机器学习领域中有...
  • 路面裂缝检测识别系统设计 第 22 章 基于 K-means 聚类算法的图像区域分割 第 23 章 基于光流场的交通汽车检测跟踪 第 24 章 基于 Simulink 进行图像和视频处理 第 25 章 基于小波变换的数字水印技术 第 26 章 基于...
  • 在云边缘平台上使用联合视频分析识别交通规则违规 介绍 近年来,许多研究人员研究了摄像机,该摄像机被认为是用于捕获和识别行驶中的车辆的传感器设备。 基于视频的系统可以捕获各种各样的信息,而这些信息的安装和...
  • 然后根据质心所在位置对候选区域进行由低到高的排序,并通过颜色识别作进一步筛选,以排除车灯等区域的干扰;最后采用投影法及谷值分析对截取出的缺损车牌进行补全,从而得到准确的车牌位置。实验结果表明,算法的...
  • 第 19 章 基于语音识别的信号图像模拟控制技术  第 20 章 基于帧间差法进行视频目标检测 第 21 章 路面裂缝检测识别系统设计 第 22 章 基于 K-means 聚类算法的图像区域分割  第 23 章 基于光流场的交通汽车检测...
  • Apollo公开课四:感知

    2020-04-30 21:55:31
    感知: 主要利用深度学习来检测周围的环境,包括分类、检测、跟踪和分割等任务。 Apollo感知方案:   对于三维物体检测,Apollo在高精地图上使用ROI(感兴趣区域)来...  对于交通信号的检测,先在高精度地...
  • 用行业术语来说,问题的关键在于感知,即在行驶过程中,自动驾驶汽车处理和识别道路数据(从街道标识到行人,乃至周围交通环境)的能力。借助AI的强大功能,自动驾驶汽车能够实时识别周围环境并对其做出反应,从而...
  • 自动驾驶汽车有很多技术需要去攻克,比如环境感知、定位、传感器信息融合、模式识别、状态预测、决策规划、以及云和仿真技术。 地图 自动驾驶技术用到的地图是高精地图,和传统的导航地图不一样,高精地图是车道级别...
  • 初识高精度地图

    2021-03-25 17:32:56
    当无人车需要通过路口时,它需要提前感知前方信号的状态,这时高精地图就可以帮助它定位到信号所在的特定区域,从而有效降低了全范围扫描识别的计算量。 除此以外,高精地图将道路及周围的所有静态障碍物进行...
  • 举例:LED交通信号程序;多功能电子密码锁程序; 大佬,程序设计又是什么啊? 1.首先得有一个你需要解决的问题; 2.好好将你的问题解剖分析下(在怎么样的条件下,这个问题有什么内在规律,找出相应的数学模型及...
  • 因此,需要先进的设备,可以自动探测识别车道,动态跟踪车道线,并预算出未来数秒内车辆的运行状态,在判断出车辆在一定时间之后就要偏离出本车道时,如果没有检测到本车转向信号(说明不是驾驶员有意识地要并道或...
  • 包括交通灯、交通指示牌、路沿、路面等等,每个物体品类的检测都是一个细分方向。 9. 动态物体检测(Moving ObjectDetection): 主要涉及通过视觉、激光雷达、毫米波雷达,以及传感器融合的方法去检测一些动态的...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

交通灯识别算法