论文部分内容阅读
摘 要:大数据,机器学习,人工智能大浪潮下,无人化设备的普及已是大势所趋。目前,无人机技术相对成熟,尤其自动导航技术很完善。但汽车自动驾驶技术尚开始深入,同时自动驾驶技术对机器的图像判断能力更高。掌握自动驾驶技术需要了解汽车制动系统,控制系统的信息通讯方式并熟悉图像识别、图像处理技术。本研究基于便携的比例控制小车搭配Raspberi 3b微机系统尝试实现简单路况下的自动驾驶。
关键词:脉宽调制;鸟瞰变换;Canny边缘检测;霍夫变换
中图分类号:TP242 文献标识码:A 文章编号:1004-7344(2018)36-0244-02
1 实 验
1.1 基本硬件架构
无人车采用有刷比例控制架构,动力系统包括高速有刷电机,电子调速器,高功率动力电池(Li-Po Battery)和固定变速系统,对电子调速器输入标准舵机PWM信号脉冲即可控制电机运行功率进而得到想要的运行速率。小车转向系统主要包含转向驱动舵机,传动杠杆。对舵机输入标准PWM信号即可实现对前方车轮的转向控制。控制系统的标准化通讯方式实质上是实现了“线控”。小车的图像接收器是一个具有500万像素的摄像头。
小车的中央控制系统基于树莓派3b微型计算机,性能较强大,具有基频为1.2GHz的CPU和1Gb运行内存,还有丰富的GPIO接口,A/D、D/A数模转换器以及USB通讯扩展。
1.2 软件算法研究思路
(1)透视变换。在摄像头获取图片之后,由于摄像头是在有一定倾斜视角情况下拍摄的,为了将摄像头的视角转换到与道路平行,先使用透视变化函数getPerspectiveTransform和warpPerspective对图像进行透视变换,又称鸟瞰变化,大致原理是将成像投影到新平面Viewing Plane,实际操作是在原始图中选4个坐标点,在目标图中选4个点,进行一一映射),效果见图1。
(2)二值化。将透视图进行灰度化,使用threshold函数对图像进行二值化操作。原理大致是通过测试选择一个合适的像素阈值,若图像中的一个像素点的像素高于此阈值,则令其为白色(像素255),否则令其为黑色(像素0),以此来将跑道从图片中分割出来。效果见图2。
(3)腐蚀膨胀。使用erode,dilate函数对图像进行腐蚀和膨胀操作。腐蚀算法使图像减小一圈,删除图像中边界的某些像素;膨胀算法使图像扩大一圈,给图像中的边界添加像素。并且膨胀腐蚀算法是针对白色目标区域的(即本项目中的跑道线区域)。通过这两个操作来进行预处理可以消除跑道线以外的噪声点,从而凸显跑道线的形状特征。
(4)边缘检测。使用canny检测处理图像,得到跑道线的边界,这一步十分关键。Canny边缘检测的大致原理是检测出图像中所有灰度值变化较大(通过计算像素的梯度得到)的点,将这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘,而且Canny较其他一些边缘检测算法来说,它首先在x和y方向求一阶导数,然后组合为4个方向的导数,这些方向导数达到局部最大值的点就是组成边缘的候选点,并且其试图将独立边的候选像素拼接成轮廓。轮廓的形成是对这些像素运用滞后性阈值。这意味着有两个阈值,上限和下限。如果一个像素的梯度大于上限阈值,则被认为是边缘像素,如果低于阈值,则被抛弃,如果介于二者之间,只有当其与高于上限阈值的像素点连接时才会被接受。Canny检测推荐的上下阈值比为2:1到3:1之间。效果见图3。可以看到Canny检测只将跑道线的边缘给检测出来了,大大提高了信息提取的准确率。
(5)霍夫变换。使用霍夫变化HoughLinesP来检测直线。它是利用概率来检测直线,通过分析点的子集并估计这些点都属于一条直线的概率。它需要设置几个参数值:最小直线长度minLineLength(更短的直线会被消除)和最大线段间隙maxLineGap(一条线段的间隙长度大于这个值会被视为是两条分开的线段),其本质是把图像映射到它的参数空间上。这一步不是特别必要,因为对我们这个项目来说,使用步骤4中的Canny检测之后,精准度已经很高了。但为了避免在一些情况中道路上出现杂物时被干扰,还是决定使用HoughLineP变换,并且它可以进一步地消除跑道线之外的噪聲,使信息提取地更精确。
(6)特征提取。从图像中提取道路特征信息。经过不断的测试,我们对特征信息的提取方案为:令纵坐标y=240,从横坐标为320处分别向两边搜索红色像素点(即左右跑道线),从而计算出跑道中心的横坐标x1,且图像中心的横坐标x0=320(即小车中心的位置)。利用公式angle=arctan((x1-x0)/240)计算出小车偏移跑道中心的角度,进而调用turn函数实现小车的转弯,从而保持小车位于跑道内部。
(7)问题与改进:
①当小车行驶到跑道边界的时候,假如是左边界,此时右跑道已经不在摄像头的捕捉范围之内了,并且左边的另外一条跑道会进入摄像头的捕捉范围。因此,我们针对这一特殊情形,采用特殊的信息提取方式,还是拿行驶到左边界举例,此时的判断条件为令y=240,当x>320(中心处)时找不到跑道,此时令角度为+20°(正值代表向右,负值代表向左);小车行驶到右跑道的情况类似。这样就解决了小车在道路边界这一特殊情况。
②由于树莓派的处理能力有限,加上我们程序需要控制摄像头的状态、控制小车底层操作的运转以及调用大量库函数,导致程序处理信息速度较慢,小车大概需要1s多才能完成对1帧图像的处理。很明显这样很容易出现小车在获取图像之后已经冲出跑道了才计算出角度值的情况。在咨询了指导老师之后我们决定尝试在单片机上完成对底层操作的程序运行,在树莓派上仅实现调用摄像头和图像数据的处理分析及提取,在得到角度值之后将角度值传给单片机,在通过单片机实现底层操作(行驶和转弯)。这样处理之后,我们的小车信息处理能力达到了4.5帧/s,大大提升了小车对图像数据处理的性能。 1.3 项目拓展
在实现了小车在操场上的自动驾驶之后,我们决定对项目进行功能拓展:人脸检测,创建并训练简单的目标检测器。人脸检测的实现主要依靠OpenCV中的自带的Haarcascades文件夹中提供的脚本,通过创建CascadeClassifier对象,之后调用detectMultiScale函数,传递每次迭代时图像的压缩率和每个人脸矩形保留近邻数目的最小值这两个参数。
构建目标检测器主要使用SVM,词袋(BOW)技术。大致过程是创建两个SIFT实例:一个用来提取关键点,一个用来提取特征;创建一个1基于FLANN匹配器的实例,创建BOW训练器,调用训练器上的cluster函数,该函数执行k-means分类并返回词汇,创建两个数组,分别对应训练数据和标签,创建一个SVM实例,将这些图像传递给训练好的SVM,并得到预测结果。
2 结果与讨论
结果算法优化、对各种图像处理技术的搭配使用,小车控制系统结构的合理改进,最终实现了小车在操场的自动驾驶。且从中学会了图像识别算法,深入了通过机器训练提高图像识别率的技术。在不断改进的过程中提高了小车提取特征曲线的精准率,决策控制的合理性,数据处理的高效性,充分利用了主機的数据处理能力达到目标。
这套小车系统可以作为研究人员学习研究视觉算法,自动控制的标准化平台,我们编写的软件也实现了简单路况下的自动驾驶技术。为深入无人驾驶技术提供了新思路。
3 致 谢
衷心感谢兰州大学信息科学与工程学院赵庆林副教授对本研究的悉心指导与兰州大学信息科学与工程学院无人驾驶研发研究生团队对项目的宝贵意见。我们的研究成果都得益于与他们的深入交流。
参考文献
[1]Eric Matthes.Python编程从入门到实践(第一版)[M].北京:人民邮电出版社.
[2]鸟 哥.鸟哥的Linux私房菜(第二版)[M].北京:人民邮电出版社.
[3]Joe Minichino,Joseph Howse.Learning OpenCv 3 Computer Vision with Python,Second Edition(第二版)[M].北京:机械工业出版社,2016,6(2018,4重印):1~134.
收稿日期:2018-11-14
作者简介:刘安东(1998-),男,土家族,重庆忠县人,本科在读。
陈 威(2001-),男,汉族,湖北监利人,本科在读。
毕郭江南(1997-),男,汉族,山东淄博人,本科在读。
关键词:脉宽调制;鸟瞰变换;Canny边缘检测;霍夫变换
中图分类号:TP242 文献标识码:A 文章编号:1004-7344(2018)36-0244-02
1 实 验
1.1 基本硬件架构
无人车采用有刷比例控制架构,动力系统包括高速有刷电机,电子调速器,高功率动力电池(Li-Po Battery)和固定变速系统,对电子调速器输入标准舵机PWM信号脉冲即可控制电机运行功率进而得到想要的运行速率。小车转向系统主要包含转向驱动舵机,传动杠杆。对舵机输入标准PWM信号即可实现对前方车轮的转向控制。控制系统的标准化通讯方式实质上是实现了“线控”。小车的图像接收器是一个具有500万像素的摄像头。
小车的中央控制系统基于树莓派3b微型计算机,性能较强大,具有基频为1.2GHz的CPU和1Gb运行内存,还有丰富的GPIO接口,A/D、D/A数模转换器以及USB通讯扩展。
1.2 软件算法研究思路
(1)透视变换。在摄像头获取图片之后,由于摄像头是在有一定倾斜视角情况下拍摄的,为了将摄像头的视角转换到与道路平行,先使用透视变化函数getPerspectiveTransform和warpPerspective对图像进行透视变换,又称鸟瞰变化,大致原理是将成像投影到新平面Viewing Plane,实际操作是在原始图中选4个坐标点,在目标图中选4个点,进行一一映射),效果见图1。
(2)二值化。将透视图进行灰度化,使用threshold函数对图像进行二值化操作。原理大致是通过测试选择一个合适的像素阈值,若图像中的一个像素点的像素高于此阈值,则令其为白色(像素255),否则令其为黑色(像素0),以此来将跑道从图片中分割出来。效果见图2。
(3)腐蚀膨胀。使用erode,dilate函数对图像进行腐蚀和膨胀操作。腐蚀算法使图像减小一圈,删除图像中边界的某些像素;膨胀算法使图像扩大一圈,给图像中的边界添加像素。并且膨胀腐蚀算法是针对白色目标区域的(即本项目中的跑道线区域)。通过这两个操作来进行预处理可以消除跑道线以外的噪声点,从而凸显跑道线的形状特征。
(4)边缘检测。使用canny检测处理图像,得到跑道线的边界,这一步十分关键。Canny边缘检测的大致原理是检测出图像中所有灰度值变化较大(通过计算像素的梯度得到)的点,将这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘,而且Canny较其他一些边缘检测算法来说,它首先在x和y方向求一阶导数,然后组合为4个方向的导数,这些方向导数达到局部最大值的点就是组成边缘的候选点,并且其试图将独立边的候选像素拼接成轮廓。轮廓的形成是对这些像素运用滞后性阈值。这意味着有两个阈值,上限和下限。如果一个像素的梯度大于上限阈值,则被认为是边缘像素,如果低于阈值,则被抛弃,如果介于二者之间,只有当其与高于上限阈值的像素点连接时才会被接受。Canny检测推荐的上下阈值比为2:1到3:1之间。效果见图3。可以看到Canny检测只将跑道线的边缘给检测出来了,大大提高了信息提取的准确率。
(5)霍夫变换。使用霍夫变化HoughLinesP来检测直线。它是利用概率来检测直线,通过分析点的子集并估计这些点都属于一条直线的概率。它需要设置几个参数值:最小直线长度minLineLength(更短的直线会被消除)和最大线段间隙maxLineGap(一条线段的间隙长度大于这个值会被视为是两条分开的线段),其本质是把图像映射到它的参数空间上。这一步不是特别必要,因为对我们这个项目来说,使用步骤4中的Canny检测之后,精准度已经很高了。但为了避免在一些情况中道路上出现杂物时被干扰,还是决定使用HoughLineP变换,并且它可以进一步地消除跑道线之外的噪聲,使信息提取地更精确。
(6)特征提取。从图像中提取道路特征信息。经过不断的测试,我们对特征信息的提取方案为:令纵坐标y=240,从横坐标为320处分别向两边搜索红色像素点(即左右跑道线),从而计算出跑道中心的横坐标x1,且图像中心的横坐标x0=320(即小车中心的位置)。利用公式angle=arctan((x1-x0)/240)计算出小车偏移跑道中心的角度,进而调用turn函数实现小车的转弯,从而保持小车位于跑道内部。
(7)问题与改进:
①当小车行驶到跑道边界的时候,假如是左边界,此时右跑道已经不在摄像头的捕捉范围之内了,并且左边的另外一条跑道会进入摄像头的捕捉范围。因此,我们针对这一特殊情形,采用特殊的信息提取方式,还是拿行驶到左边界举例,此时的判断条件为令y=240,当x>320(中心处)时找不到跑道,此时令角度为+20°(正值代表向右,负值代表向左);小车行驶到右跑道的情况类似。这样就解决了小车在道路边界这一特殊情况。
②由于树莓派的处理能力有限,加上我们程序需要控制摄像头的状态、控制小车底层操作的运转以及调用大量库函数,导致程序处理信息速度较慢,小车大概需要1s多才能完成对1帧图像的处理。很明显这样很容易出现小车在获取图像之后已经冲出跑道了才计算出角度值的情况。在咨询了指导老师之后我们决定尝试在单片机上完成对底层操作的程序运行,在树莓派上仅实现调用摄像头和图像数据的处理分析及提取,在得到角度值之后将角度值传给单片机,在通过单片机实现底层操作(行驶和转弯)。这样处理之后,我们的小车信息处理能力达到了4.5帧/s,大大提升了小车对图像数据处理的性能。 1.3 项目拓展
在实现了小车在操场上的自动驾驶之后,我们决定对项目进行功能拓展:人脸检测,创建并训练简单的目标检测器。人脸检测的实现主要依靠OpenCV中的自带的Haarcascades文件夹中提供的脚本,通过创建CascadeClassifier对象,之后调用detectMultiScale函数,传递每次迭代时图像的压缩率和每个人脸矩形保留近邻数目的最小值这两个参数。
构建目标检测器主要使用SVM,词袋(BOW)技术。大致过程是创建两个SIFT实例:一个用来提取关键点,一个用来提取特征;创建一个1基于FLANN匹配器的实例,创建BOW训练器,调用训练器上的cluster函数,该函数执行k-means分类并返回词汇,创建两个数组,分别对应训练数据和标签,创建一个SVM实例,将这些图像传递给训练好的SVM,并得到预测结果。
2 结果与讨论
结果算法优化、对各种图像处理技术的搭配使用,小车控制系统结构的合理改进,最终实现了小车在操场的自动驾驶。且从中学会了图像识别算法,深入了通过机器训练提高图像识别率的技术。在不断改进的过程中提高了小车提取特征曲线的精准率,决策控制的合理性,数据处理的高效性,充分利用了主機的数据处理能力达到目标。
这套小车系统可以作为研究人员学习研究视觉算法,自动控制的标准化平台,我们编写的软件也实现了简单路况下的自动驾驶技术。为深入无人驾驶技术提供了新思路。
3 致 谢
衷心感谢兰州大学信息科学与工程学院赵庆林副教授对本研究的悉心指导与兰州大学信息科学与工程学院无人驾驶研发研究生团队对项目的宝贵意见。我们的研究成果都得益于与他们的深入交流。
参考文献
[1]Eric Matthes.Python编程从入门到实践(第一版)[M].北京:人民邮电出版社.
[2]鸟 哥.鸟哥的Linux私房菜(第二版)[M].北京:人民邮电出版社.
[3]Joe Minichino,Joseph Howse.Learning OpenCv 3 Computer Vision with Python,Second Edition(第二版)[M].北京:机械工业出版社,2016,6(2018,4重印):1~134.
收稿日期:2018-11-14
作者简介:刘安东(1998-),男,土家族,重庆忠县人,本科在读。
陈 威(2001-),男,汉族,湖北监利人,本科在读。
毕郭江南(1997-),男,汉族,山东淄博人,本科在读。