一种基于Hadoop和监控视频流的车辆轨迹统计方法
技术领域
本发明涉及云计算、计算机视觉技术领域,具体是一种基于Hadoop和监控视频流的车辆轨迹统计方法。
背景技术
在车辆网、智能交通迅速发展的环境下,交通监控摄像头的普及促使了视频数据量的指数式增长,如果不能充分挖掘视频数据中的有效信息,必然造成资源浪费,而在交通监控视频中,车辆信息作为主要信息在交通监管、智能交通的发展中发挥重要作用,如何从海量监控数据中充分挖掘车辆信息成为研究热点。而传统的集中式视频处理方式面对海量增长的监控视频数据存在处理能力不足和不可扩展的问题。
近年来,机器学习、深度学习技术因为对数据更好的分类能力在图像处理领域得到广泛研究,并通过大量的研究也证明了其相比于传统算法具有更好的分类效果,在复杂环境下具有更好的适应性和鲁棒性。而城市道路和高速公路都是动态变化的环境,易受天气、光照等环境影响,传统的处理算法往往难以适应天气和光线等条件的变化。
由于Hadoop平台底层机制是由Java实现,而图像处理往往属于计算密集型任务,通过Hadoop对图像的分布式处理,传统采用JavaCV、Hadoop Streaming的方式执行效率并不高效,且MapReduce不支持直接从HDFS读取视频数据,由于FFMPEG不支持HDFS 协议,传统采用FFMPEG将视频在本地切分为帧序列再上传到HDFS,往往会导致额外的I/O开销。
发明内容
本发明的目的在于克服现有技术的不足,而提供一种基于Hadoop和监控视频流的车辆轨迹统计方法,该***结构简单,统计速度快,适应性好和准确度高,该统计方法计算量小,能够保证在光线充足环境下的执行效率,而且又能保证在复杂环境下车牌定位的准确性,在复杂环境下的适应性强、准确度高。
实现本发明目的的技术方案是:
一种基于Hadoop和监控视频流的车辆轨迹统计方法,具体包括如下步骤:
1)将各场景下的监控视频上传到HDFS,执行Hadoop任务;
2)Hadoop视频数据处理接口从HDFS上读取视频数据初始化Xuggler解码库,Xuggler解码库解析视频数据,得到一系列<key,value>交由Map处理,其中key为视频名_帧号,value为视频帧元数据;
3)Map函数对传入的<key,value>进行分析,具体是通过JNI与动态链接库交互实现对车辆检测定位和车牌识别,通过车辆检测算法从视频帧图像中定位到车辆区域,通过车牌识别算法对定位到的车辆区域进行车牌识别,未定位到车辆区域直接执行下一次<key,value>,将识别到车牌的帧图像以视频名_车牌号_时间戳形式进行命名写回到HDFS进行存储,Map输出<key1,value1>进入Combiner阶段,其中key1为车牌号,value1为封装了初始化统计次数1、时间戳以及视频名的容器对象;
4)Combiner接收当前视频Split中的Map输出,以相同的key1归并Map输出结果为<key1,list<value1>>形式进行处理,引入时间戳和阈值判别来有效避免相同车辆在连续帧中出现带来的统计偏差,如果满足效验条件,行车频次加1,反之,不对行车频次进行累加,Combiner输出<key1,value2>进入Partition阶段,其中key1为车牌号,value2为封装了累计统计次数、视频名的容器对象,Partition阶段根据value2中的视频名进行分区,每个分区对应一个Reduce处理;
5)Reduce接收Partition分配的多个Combiner结果,以相同的key1归并Combiner分析结果为<key1,list<value2>>形式进行处理,对list<value2>中存在相同视频名的value2中的统计次数进行累加并汇总,对不同视频名的value2中的统计次数进行汇总,最终生成新的<key1,value3>,其中key1为车牌号,value3为包含了该车牌号在不同视频名下分别出现次数,汇总结果以文本形式写入到HDFS;
经过上述步骤,完成车辆轨迹统计。
步骤2中,所述的Hadoop视频数据处理接口,是通过结合开源库Xuggler重写Hadoop的记录读取器和Hadoop支持的数据输入输出类型格式,使MapReduce支持对HDFS中的视频类型格式数据的并行处理,具体方法为:
1)重写Hadoop的记录读取器,设计实现RecordReader类的VideoRecordReader类,重写initialize()方法从HDFS上获取视频文件初始化Xuggler解码库,Xuggler解码库将视频文件解码为一系列帧图像,将帧图像作为value,视频名_帧号作为key,重写getCurrentKey()方法、getCurrentValue()方法、nextKeyValue()方法将一系列帧图像以<key:视频名_帧号,value:帧元数据>形式交由Map处理。value为实现了Writable接口的ImageWritable类型,并需要重写Writable接口中的序列化方法和反序列化方法;
2)重写Hadoop输入输出格式,设计VideoInputFormat类和ResultOutputFormat类,VideoInputFormat类继承自FileInputFormat类,VideoInputFormat类中重写creatRecordReader()方法获支持读取视频数据为一系列<key,value>的VideoRecordReader类对象,重写isSplitable()方法,返回flase,不对Block进行逻辑切分,根据默认大小分配Mapper数量。ResultOutputFormat类继承自FileOutputFormat类,并自定义ResultRecordWrite类,重写write()方法,支持将Reduce执行结果中的车牌号、视频名、累计统计次数以Text形式写出到HDFS,支持将Map执行结果中识别到车牌的视频帧图像以Image形式写出到HDFS。
步骤3)中,所述的车辆检测算法,是基于改进后的卷积神经网络tiny-yolo模型实现,tiny-yolo模型是深度学习目标分类算法中具有实时、多类别目标检测定位能力的YOLOv2框架中的一种,该模型包含9个convolution层、6个max-pooling层和一个region层,网络第1层为输入层,接收大小为416x416的RGB图像;第2层到第16层分别为卷积层C1、池化层P1、卷积层C2、池化层P2、卷积层C3、池化层P3、卷积层C4、池化层P4、卷积层C5、池化层P5、卷积层C6、池化层P6、卷积层C7、卷积层C8、卷积层C9。P1~P5的池大小均为2x2,滑动步长为2, P6的池大小为2x2,滑动步长为1,C1~C8分别包含16、32、64、128、256、512、1024、1024个filter,每个filter中的每个像素点与上一层大小为3x3的“感受野”相连,卷积步长为1且均采用Leaky ReLU函数作为激励函数,C9层包含了125个filter,每个filter中的每个像素点与上一层大小为1x1的“感受野”相连,卷积步长为1,采用Linear函数作为激励函数,最后一层为region层,包含了模型支持检测的类别数以及目标所在区域。tiny-yolo模型默认对20种类别进行检测定位,当该模型应用在交通环境下进行车辆检测时,只需要对车辆一种类别进行检测,需要把tiny-yolo中的多类别检测问题转换为针对交通应用场景下车辆的单一类别检测问题,因此需要对tiny-yolo模型中的卷积层C9和region层做相应修改,将region层中支持检测的类别数修改为1,将C9中的filter个数由125修改为30,修改方法参照公式filter = (classes+coords+1)*(NUM),式中coords值为4,NUM值为5,当classes为1时,filter=(1+4+1)*5=30,将车辆数据集送入修改后的tiny-yolo模型进行训练,训练得到的模型即可用于对视频帧中的车辆的检测定位。
步骤3)中,所述的车牌识别算法,分为车牌定位和字符识别两部分,结合HSV颜色模型、SVM分类器和文字定位技术定位出车牌区域,通过改进后的卷积神经网络LeNet-5模型进行车牌字符识别,车牌定位部分中的文字定位技术由MSER算法、区域生长方法、滑动窗口方法以及改进后的LeNet-5模型训练生成的CNN字符分类器结合实现;
所述的SVM分类器,是将归一化大小的真正车牌区域和候选非车牌区域,标记为是和否两类,提取二值化后的投影特征和HSV空间下的颜色特征,送入SVM分类器中训练,采用RBF核函数将低维特征向量映射到高维来达到更好的分类效果。
所述的卷积神经网络LeNet-5模型,共7层,网络的输入是基于32x32的灰度图,网络层C1是由6个filter组成的卷积层,网络层S2为6个filter组成的池化层,网络层C3是由16个filter组成的卷积层,网络层S4为16个filter组成的池化层,网络层C5是由120个filter组成的卷积层,网络层F6是由84个神经元组成的全连接层。C1、C2、C3中每个filter中的每个像素点与上一层大小为5x5的“感受野”相连,卷积步长为1。S2和S4的池大小均为2x2,滑动步长为2,通过激励函数sigmoid完成下采样操作。最后输出层有10个神经元,每个神经元对应一个字符类别,由径向基函数单元(RBF)组成。LeNet-5模型用于手写数字识别,输出的类别数目为10,中国普遍使用的车牌由31类汉字、24类字母、10类数字组成,因此需要修改输出神经元个数来扩展LeNet-5支持的类别数,本发明使用LeNet-5模型进行车牌字符分类和识别,字符分类主要是判定通过MSER或滑动窗口检测到的区域是否属于汉字/字母/数字中任意一类,识别主要针对车牌字符分割结果进行识别,因此修改输出神经元个数为65用于字符分类,修改神经元为31针对车牌首字符(即汉字)进行识别,修改神经元为34针对车牌数字/字母进行识别。由于在原LeNet-5识别类别数上做了相应的增加,为更充分提取图像特征,增加C5层的filter数目,由120增加到400,来增加整个网络的识别性能。将原模型的池化方式修改为最大值池化,它比原方式能保持更多的纹理信息,将C5层的输出经过激活函数ReLU修正后再送入F6层,将F6层与F7层之间的RBF分类器修改为Softmax回归分类器。
所述的CNN字符分类器,是将车牌字符的灰度图归一化尺寸后送入修改后的LeNet-5模型中进行训练,针对65类汉字/字母/数字、31类汉字、34类字母/数字分别训练三组CNN模型分别标记为CNN65、CNN31、CNN34,训练得到的结果即可用于车牌字符的分类和识别。
步骤4)中,所述的引入时间戳和阈值,阈值根据同一车辆在视频帧中的最大连续帧数n和每帧图像的处理时间t决定,设定为n*t,在Map中针对识别到车牌的视频帧图像赋值一个时间戳并封装在value1中传递给Combiner,Combiner将list<value1>中时间戳进行排序比较相邻两个时间戳之间差值是否大于n*t,如果大于n*t,说明该车辆在同一视频中的非连续帧中出现,对统计结果进行累加,反之,该车辆只是出现在视频中的连续帧中,不对统计结果进行累加。
步骤4)中,所述的在Partition阶段根据value2中的视频名进行分区,具体方法是:按照监控场景所处区域进行划分,如果有X个监控场景都来自A区域,视频名称命名为SceneA_xxx,有Y个监控场景来自B区域,视频名命名为SceneB_xxx,可以把区域A下的X个监控场景下视频流的Combiner结果划分为PartitionA,把区域B下的Y个监控视频流的Combiner结果划分为PartitionB,每个Partition对应一个Reduce去处理,通过分区来增加Reduce的并行性,分担Reduce的计算压力来提高执行效率,且便于针对特定监控区域的视频分析结果进行检索。
有益效果:本发明提供的一种基于Hadoop和监控视频流的车辆轨迹统计方法,基于卷积神经网络tiny-yolo模型,不仅针对复杂环境的适应性强,而且相比于其他卷积神经网络模型具有更快的检测定位速率,将HSV颜色模型定位与文字定位技术相结合并且只针对车辆区域进行车牌定位,有效降低了算法的计算量,不仅能够保证在光线充足环境下的执行效率,而且又能保证在复杂环境下车牌定位的准确性,基于改进后的卷积神经网络LeNet-5模型进行车牌字符识别在复杂环境下的适应性强、准确度高。结合Xuggler开源库扩展MapReduce对视频类型格式的支持,克服了传统采用FFMPEG方式带来的 I/O问题,在Map中通过JNI接口与动态链接库相交互有效保证了Hadoop平台对视频进行分布式计算的执行效率,在Combiner、Partition阶段设计能有效降低Map和Reduce之间的数据传输量,提高集群执行效率。
附图说明
图1为一种基于Hadoop和监控视频流的车辆轨迹统计***示意图;
图2为Hadoop分布式视频处理的执行流程图;
图3为Map阶段车辆检测和车牌识别算法执行流程图。
具体实施方式
下面结合附图和实施例对本发明做进一步阐述,但不是对本发明的限定。
实施例:
如图1所示,一种基于Hadoop和监控视频流的车辆轨迹统计方法,具体包括如下步骤:
1)将各场景下的监控视频上传到HDFS,执行Hadoop任务;
2)Hadoop视频数据处理接口从HDFS上读取视频数据初始化Xuggler解码库,Xuggler解码库解析视频数据,得到一系列<key,value>交由Map处理,其中key为视频名_帧号,value为视频帧元数据;
3)Map函数对传入的<key,value>进行分析,具体是通过JNI与动态链接库交互实现对车辆检测定位和车牌识别,通过车辆检测算法从视频帧图像中定位到车辆区域,通过车牌识别算法对定位到的车辆区域进行车牌识别,未定位到车辆区域直接执行下一次<key,value>,将识别到车牌的帧图像以视频名_车牌号_时间戳形式进行命名写回到HDFS进行存储,Map输出<key1,value1>进入Combiner阶段,其中key1为车牌号,value1为封装了初始化统计次数1、时间戳以及视频名的容器对象;
4)Combiner接收当前视频Split中的Map输出,以相同的key1归并Map输出结果为<key1,list<value1>>形式进行处理,引入时间戳和阈值判别来有效避免相同车辆在连续帧中出现带来的统计偏差,如果满足效验条件,行车频次加1,反之,不对行车频次进行累加,Combiner输出<key1,value2>进入Partition阶段,其中key1为车牌号,value2为封装了累计统计次数、视频名的容器对象,Partition阶段根据value2中的视频名进行分区,每个分区对应一个Reduce处理;
5)Reduce接收Partition分配的多个Combiner结果,以相同的key1归并Combiner分析结果为<key1,list<value2>>形式进行处理,对list<value2>中存在相同视频名的value2中的统计次数进行累加并汇总,对不同视频名的value2中的统计次数进行汇总,最终生成新的<key1,value3>,其中key1为车牌号,value3为包含了该车牌号在不同视频名下分别出现次数,汇总结果以文本形式写入到HDFS。
具体如下,如图2所示,执行步骤S201,从HDFS中获取视频分片作为Hadoop视频数据处理接口中VideoInputFormat的输入;
执行步骤S202,通过调用VideoRecordReader读取输入视频并初始化Xuggler解码库,Xuggler解码库负责将视频数据解析为一系列<key,value>传递给Map,key为视频名_帧号,value为视频帧元数据;
执行步骤S203,Map接收到记录读取器传递的<key,value>,对value中的视频帧元数据通过JNI接口与动态链接库交互进行图像分析,动态链接库包含了车辆检测算法和车牌识别算法,车辆检测算法基于改进后的卷积神经网络tiny-yolo结合车辆数据集训练实现,先通过车辆检测算法对视频帧元数据进行车辆的检测定位,判断视频帧中是否包含车辆,如果定位不到车辆,则直接执行下一次<key,value>,如果定位到车辆区域,则通过车牌识别算法对定位到的车辆区域进行车牌识别,车牌识别算法分为车牌定位和字符识别两部分,车牌定位结合HSV颜色模型、SVM分类器和文字定位技术实现,文字定位技术由MSER算法、区域生长方法、滑动窗口方法以及改进后的LeNet-5模型结合65类汉字/数字/字母字符灰度图数据集训练生成的CNN65字符分类器相结合实现,其中的SVM分类器通过提取真正车牌区域和候选非车牌区域二值化后的投影特征和HSV空间下的颜色特征,采用RBF核函数训练得到。字符识别部分基于改进后的LeNet-5模型结合31类汉字、34类数字/字母字符灰度图数据集分别训练生成的CNN31、CNN34字符分类器进行字符识别。
将识别到车牌的帧图像跳转至步骤S207,通过ResultOutputFormat以Image形式写回到HDFS,命名为视频名_车牌号_时间戳,Map输出<key1,value1>到Combiner阶段,key1为车牌号,value1为封装了初始化统计次数1、时间戳以及视频名的容器对象。
执行步骤S204,Combiner接收单前视频Split中的Map输出,以相同的key1归并Map输出结果为<key1,list<value1>>形式进行处理,由于同一个key可能对应多个value,即相同的车牌号在视频中被识别出多次,针对此情况采用时间戳和阈值判别来避免在连续帧出现带来的统计偏差,阈值根据同一车辆在视频帧中的最大连续帧数n和每帧图像的处理时间t决定,设定为n*t,在Map中针对识别到车牌的视频帧图像赋值一个时间戳并封装在value1中传递给Combiner,Combiner将list<value1>中时间戳进行排序比较相邻两个时间戳之间差值是否大于n*t,如果大于n*t,说明该车辆在同一视频中的非连续帧中出现,对统计结果进行累加,反之,该车辆只是出现在视频中的连续帧中,不对统计结果进行累加。Combiner输出<key1,value2>到Partition阶段,key1为车牌号,value2为封装了累计统计次数、视频名的容器对象。
执行步骤S205,Partition阶段接收所有Split的Combiner结果,Partition阶段根据value2中的视频名进行分区,其方法为:按照监控场景所处区域进行划分,如果有X个监控场景都来自A区域,视频名称命名为SceneA_xxx,有Y个监控场景来自B区域,视频名命名为SceneB_xxx,可以把区域A下的X个监控场景下视频流的Combiner结果划分为PartitionA,把区域B下的Y个监控视频流的Combiner结果划分为PartitionB,每个Partition对应一个Reduce去处理。通过分区来增加Reduce的并行性,分担Reduce的计算压力来提高执行效率,另一方面,便于针对特定监控区域的视频分析结果进行检索。
执行步骤S206,Reduce接收Partition分配的多个Combiner结果,以相同的key1归并Combiner分析结果为<key1,list<value2>>形式进行处理,对list<value2>中存在相同视频名的value2中的统计次数进行累加并汇总,对不同视频名的value2中的统计次数进行汇总,最终生成新的<key1,value3>,key1为车牌号,value3包含了该车牌号在不同视频名下分别出现次数。
执行步骤S207,将各个Reduce的统计结果以文本形式写回到HDFS。
动态链接库中算法执行的具体流程图如图3所示,首先对传入的帧图像基于tiny-yolo模型训练生成的CNNyolo模型进行车辆检测,判断是否定位到车辆区域,未定位到车辆区域则直接结束对该帧图像的处理,如果定位到车辆区域,从帧图像中提取定位到的车辆区域进行车牌识别。首先通过HSV颜色模型先进行车牌定位,将原始图像从RGB空间转为HSV空间,通过遍历每个像素点判断其H/S/V分量是否落入蓝色、黄色等车牌的颜色区间,将落入车牌颜色区间的像素点判定为白色,即设为255,其他像素点判定为黑色,即设为0,从而将车牌区域从车身区域中分离出来。通过膨胀、腐蚀得到车牌连通域,通过取轮廓方式将车牌区域截取出来。结合车牌的几何特征对截取区域进行初步筛选后生成候选车牌。将生成的候选车牌经过仿射变换、偏斜扭转等处理后归一化尺寸送入训练好的SVM分类器中预测是否为真正车牌,通过垂直投影方法对车牌字符进行分割,如果没有预测出真正车牌或者分割字符数不满足标准车牌字符数7个,采用文字定位技术进行车牌定位,通过MSER算法进行初定位,结合字符布局特点和几何特征排除部分噪声干扰,得到候选字符区域,将剩余的MSER区域归一化大小并转为灰度图后送入训练好的CNN65神经网络模型中,得到每个MSER区域的置信度,置信度越高越代表真正车牌字符,针对一个字符可能检测为多个MSER区域,通过非极大值抑制算法消除冗余MSER区域,只保留置信度最高的MSER区域,根据置信度的高低将MSER区域分为弱种子和强种子,根据字符分布比较集中的特点和强种子分布区域初步定位出车牌大致区域,再根据车牌字符基本排列在同一心线上的特点,通过区域生长方法从弱种子中筛选出代表真正字符的区域,判断定位到的所有种子个数,如果小于7说明存在未被MSER定位到的字符区域,结合字符分布特点和字符尺寸确定滑动范围和滑窗尺寸,针对滑动区域结合CNN65字符分类器和非极大值抑制算法定位出未被MSER定位到的真正字符区域。取出字符区域所在区域即为车牌区域。将定位到的车牌区域通过垂直投影方法进行字符分割后,归一化大小并转为灰度图送入CNN31/CNN34字符分类器中进行字符识别。