于瑛瑛
(烟台汽车工程职业学院,机电工程系,山东,烟台 265500)
车辆在带给人们出行便利的同时也引发了各类安全问题,传统的安全技术主要是安全气囊、安全带等被动防护装置,不能从根本上解决问题,随着信息技术的发展,通过算法以及数学模型可以准确识别目标车辆,并且可以利用传感器技术测量车辆间距,对可能产生碰撞的危险距离进行设置提前预警。这样高效实用的防碰撞预警系统可以有效的降低事故概率,确保行车安全,具有极大的实用性。
Android平台基于Linux内核研发,是针对移动智能设备的开源操作平台,采用分层架构,包括丰富的组件库,功能完善且简单易用,其中核心技术如下。
(1) C/C++:Android底层库由C/C++实现,可利用C/C++进行原生代码编写并将库文件嵌入到封装包apk之中。
(2) JNI:在调用C/C++代码时可利用JNI技术将so文件加载到Android程序,可以说JNI是Java和C/C++互相沟通的机制。
(3) OpenCV:OpenCV是开源的视觉库,提供了Python、MATLAB等多种语言接口,在各个领域均有所应用且效果良好[1]。
CCD摄像头属于光学传感器,可将三维空间信息转换为平面信息,对于复杂环境中的环境感知有良好的应用效果。由于车辆行驶速度较高且存在天气因素影响,综合考虑反应距离、开发成本以及抗干扰能力,选用易操作易维护价格更加优惠的CCD摄像头进行图像采集。
由于受到摄像设备、天气、解码转换、压缩及解压过程等因素影响,采集到的初始道路图像会产生干扰信息。为了避免由于信息模糊或关键部分缺失导致车辆识别不准确,需要对初始图像进行优化,提升特征识别质量。
(1) 设置ROI区域:采集ROI(region of interest)区域图像后不断排除无效部分可提升识别准确性,根据车辆防碰撞预警系统的实际需要,可将初始道路图像中的天空、路标、路灯等无效内容剔除。
(2) 灰度处理:CCD采集的是彩色画面,处理时由于信息多导致计算效率降低,因此进行灰度处理,将繁杂的彩色信息剔除只留下亮度信息。采用加权平均法对三原色进行赋权,计算灰度值:Gray(x,y)=0.213R(x,y)+0.715G(x,y)+0.072B(x,y),其中,Gray(x,y)代表在点(x,y)处的灰度值,R、G、B分别是RGB颜色分量,由于人的眼睛的视觉细胞会绿色受体接收更为敏感,因此G项权重较高[2]。
在防碰撞预警过程中,必须先确定目标车辆才能进行进一步的安全距离测量。目前比较常用的检测方法包括利用特征、利用运动特征以及利用模型。由于目标车辆通常处于动态场景而且伴随着道路环境的干扰,因此为了排除这些干扰因素准确识别目标车辆,选择结合Hog特征与Haar特征进行车辆分类器训练。首先,对车辆图像的正负样本进行灰度处理及降噪处理;其次,利用Hog特征与Haar特征分别进行分类器训练;再次,为了提升车辆识别准确率,将分类器进行级联形成强分类器;最后,完成目标车辆识别[3]。整体的目标车辆识别算法流程如图1所示。
图1 目标车辆识别算法
Hog特征也称作方向梯度直方图,提取特征的方法即实现R=G=B,利用γ校正法调整图像对比度,降低噪声、环境等客观因素的影响。先将图像分割为Cell单元获取局部特征向量,将单元格组合为block,在块内进行梯度直方图归一化处理获取Hog特征向量。汽车的外部轮廓大致可看做正方形,可基于此限定像素尺寸。设定block为16×16,window为64×64,cell为4×4,步长在x方向及y方向均设置为8,利用如下公式计算整体Hog特征维度:
提取所有图像特征之后,采用SVM进行训练,将是车辆的正样本标记为1,非车辆的其他类型的负样本标记为-1。
由于只参考Hog特征可能存在漏检情况,因此引入级联检测方法如图2所示。利用Haar特征反应图像的灰度值变化,对于提取到的正样本和负样本提取Haar特征并不断调整权重,最终由多个弱分类器组建为强分类器,通过所有级联的分类器判定之后才输出最终结果[4]。
图2 级联分类器组成
在识别出前方车辆之后,还需测算其与自身车辆的距离,并根据驾驶员反应以及刹车所需距离进行比较,以此判断是否需要预警。距离的测算可以采用深度图中的像素值来表示,最常使用的方法是单目视觉技术,主要包括主动与被动两种类型,两者的区别在于测距时光照是都由车辆自身提供。鉴于车辆防碰撞系统的实际需要,采用被动测距方法,测算模型如图3所示。设l代表三维空间,W代表降维后的二维空间,测距即可看作是利用W={u,v}的数据计算l={x,y,z}中的平面S={(x,y,o)∈W}的数据[5]。
(a)
在驾驶过程中为了避免碰撞需要与前方车辆保持安全距离,即预警系统发出警示的合理阈值,其中包括驾驶员的反应距离以及减速刹车所需距离两个方面[6]。
(1) 反应距离:反应距离与反应时间和行驶速率有关,设dr为反应距离,tr为反应时间,v为速率,则在车速为常数的假设下,dr=tr×v,dr与v存在比例关系dr∝v。
安全距离的计算其实是针对极端情况下的测算,在实际驾驶过程中不能完全接近安全距离才减速,为了确保人车安全,防碰撞预警系统的预警机制应更加灵活,在复杂的行车环境中预留充足的时间与距离[5]。因此设置了多级预警机制。
(1) 一般预警:距离足够驾驶员反应并采取措施,提示一般预警。
(2) 重要预警:距离逐步接近,存在碰撞风险,提示重要预警。
(3) 严重预警:距离已经达到最小碰撞范围,很大可能发生碰撞,提示严重预警[7]。
车辆防碰撞预警系统的核心功能是根据测算的车辆间距离与安全距离进行比较,在不同的危险范围发出不同级别的预警提醒驾驶员采取减速刹车措施。在整体结构上包括图像采集、车辆识别、防碰撞预警3个部分,如图4所示。将各模块的算法移植到Android平台,利用Java代码通过JNI调用C/C++库,合成apk安装包。
图4 系统整体结构
采用Android Camera 2组件,支持对每一帧图像的参数实现手动控制,图片格式更多元,且具备高速连拍功能。利用管道的方式连接App与底层Camera,App发送CaptureRequest,CameraDevices接收后返回到Surface,在ImageReader进行保存,利用JNI调用相关算法,将信息转换后的int[]数组作为参数传递到C/C++层[8]。
在Android系统中,SurfaceView的UI可实现在独立的线程中绘制任务,可确保主线资源完整,因此在车辆识别模块,根据识别区域返回对应坐标后选用SurfaceView类用矩形框标记目标车辆,每隔5~20 ms刷新绘制图像,识别目标车辆为后续测距做准备。
根据SurfaceView标记出跟车距离,结合多级预警机制,与每一级别的安全距离进行比较与计算,达到危险范围,则出发Android中的MediaPlayer类,利用void start()播放对应的预警音频,播放完毕之后利用setOnCompletionListener()实现回调,实时监测是否需要预警[9]。
5.1.1 车辆识别效果
为了验证系统对前方车辆的识别情况,选取UAS数据集中晴天、黄昏、夜间不同天气状况下的5 561张道路图像进行测试与验证,识别结果如表1所示。
表1 不同天气状况下车辆识别结果
由表1可知,整体车辆识别准确率较高,其中黄昏和夜间由于环境因素影响导致图像亮度不高,在处理过程中部分细节比较模糊,因此识别准确率要比晴天时要低[10]。
5.1.2 防碰撞预警效果
实际场景中驾驶员通常会与前车保持较远跟车距离,因此系统针对不同的危险距离设置了多级预警机制。为了验证系统对车辆的防碰撞预警效果,借鉴正常情况下驾驶员反应距离以及刹车距离,基于不同的行驶速度分别设置了多级危险距离划分。通常在城市中车辆行驶速度一般在50~80 km/h之间,因此选择50、60、70 km/h作为实验速度,根据正常刹车情况设置危险距离如表2所示。
表2 多级实验危险距离划定
由表2可知,针对不同危险距离设置不同级别预警可以让系统预警更加灵活,在复杂的实际行车环境中减少不必要的告警。经过测试,系统在3个级别的危险距离内均可以准确播放预警音频。以50 km/h为例,在车辆间距为45 m时,系统发出一般预警;在车辆间距达到30 m时,系统发出重要预警;车辆间距为15 m时,系统发出验证预警。当危险距离在临界值间切换时,由于系统处理耗时需要4 ms左右,因此预警时间会有所延迟,预警距离会出现0.06 m左右的误差但仍在安全距离内。从整体上来讲系统预警效果良好,满足实际车辆防碰撞预警需求。
为了验证系统处理效率,将采集到的道路图像导入系统,记录经过系统计算到最终在界面上显示所需时长,共计导入图像5 700帧,每帧图像处理平均耗时45.72 ms,最长105.12 ms,最短8.64 ms。由此可见,虽然受各种因素影响个别图像处理时长偏长,但整体处理效率很高,系统性能良好。
车辆防碰撞预警系统通过CCD摄像头采集道路图像,经过图像优化后识别处目标车辆,利用单目视觉技术测算间距,并根据安全距离制定多级预警机制,经过测试功能完备,性能良好,具备较高实用性。但也存在不足,由于行车环境、驾驶员反应速度、路面状况、不同车型制动能力等影响因素众多,因此系统模型还需进一步优化,提升鲁棒性。