无人车马拉松学员笔记(一)


2018年4月23日

无人车马拉松学员笔记(一)

导语:在模型训练中,数据收集往往是一大难题。华中科技大学自动化学院张迪利用了简单可行的工具完成了数据集的收集与标记,让我们来看一下他是怎么做的吧!

文/ 张迪

无人车马拉松学员笔记(一)

大家好,我是张迪,目前就读于华中科技大学自动化学院,研究方向是计算机视觉。开始是在Udacity的公众号中看到了这次活动的宣传。

加入交警识别组

因为我主要的研究方向是计算机视觉,所以在这次的Move-it Hackathon活动中,我加入到了交警手势识别组。我们的任务主要是利用摄像头来检测在汽车运行的过程中前方是否出现了交警,以及交警所做的手势。杨建和申泽邦则主要负责手势识别的数据集和模型训练。

这个任务可以分为两个部分来完成:

  • 找出交警在图片中的位置

  • 识别交警所做出的手势

前期准备

因为Autoware中已经集成了Yolo,所以第一天下午的时候我打算直接训练Yolo来识别交警在图片中的位置(完成第一部分),再利用一个网络来对手势进行识别。这样可以省去一些不必要的计算量。但是由于这次活动的时间比较短,数据集的标注(标注bounding box)需要花大量的时间,于是我就放弃了这个想法。

分解任务

经过和另外三个组员(杨健和申泽邦、印度小哥Kunal)的讨论我们将这个任务分解成了三个部分:

  • 直接使用Autoware中集成的Yolo识别出图片中所有的人(person)

  • 用CNN1(ConvolutionalNeural Networks)判断这些人是否为警察

  • 如果是警察,再用CNN2判断警察做了哪种指挥手势,将识别结果与置信度输出到决策单元

为了减小计算量,我们决定对CNN1和CNN2使用相同的模型。直接对模型在ImageNet上训练好的浅层特征进行复用,后面变成两个不同的branch,这样只需要训练后面的高级特征。

数据获取

明确了目标之后,我们便发现获取大量的训练数据变成了一个困难问题。因为我负责第二部分的任务,所以要收集大量的警察与非警察的数据。

我在百度图片中搜索了“交警”、“行人”关键字。出现了大量的交警与行人的图片。于是我想到可以使用爬虫来将爬取大量的数据,然后使用Yolo将这些图片中所有的人全部识别出来,再对识别出的所有的人进行手工分类。

正在我准备动手爬数据时,不知不觉就到了晚饭的时间。主办方Pix-moving为我们准备了一顿特别丰盛的贵州特色菜(感谢Pix-moving)。吃完晚饭回到工作室之后我便抓紧时间将爬虫的程序跑了起来,等到第二天早晨,就已经爬到了相当多的数据。

接下来的任务就是将这些图片使用Yolo中将所有的人全部截取出来。我利用Yolo提供的Python接口,编写了脚本将Yolo输出的所有属于person类并且置信度大于0.7的目标全部截取了出来,在对所有的数据都处理了一遍之后,得到了21000多张图.。这些图片中都是Yolo截取出的人,含有普通行人和交警。

流程演示:

无人车马拉松学员笔记(一)

(a)爬取到的原始图片

(b)经过Yolo检测后,画出所有属于Person类且置信度大于0.7的boundingbox

(c)根据bounding box的信息将不同的目标截取出来并保存

进行标注

在得到了这些数据之后,需要人工对所有的数据集进行清洗分类。这项工作的工作量十分巨大。我将Pyqt的example中的一个程序进行了修改之后,做成了一个标注的小工具。直接使用快捷键标注,大大加快了标注的速度。

无人车马拉松学员笔记(一)

标注工具界面图

在和Pix-moving的工作人员沟通之后,他们帮我找来了三名志愿者,我们一起标注了这些数据,在此十分感谢这些志愿者。在标注完之后,整个数据集共有19875张图片,交警有9803张图片,行人有10072张图片,这个数据集我们已经公开在了Github上。

训练模型

有了这些标注完成的数据之后,就可以开始训练模型了。在和我们组的其他小伙伴讨论之后,我们决定同时使用两个不同的模型单独训练,最终看测试的效果,选用其中的一个。杨健负责训练 InceptionV4 ,我负责训练Xception。

我们选用这两个模型的原因在于InceptionV4结合了ResNet的residual connetion的特点同时又具备Inception结构,这使得InceptionV4的学习能力比较强大,同时由于InceptionV4模型较大,运行所需要的资源比较多,速度也比较慢。因此,我们同时也选择了模型参数量是InceptionV4参数量一半的Xception。

Inception系列模型的核心思想在于通过将通道相关与空间相关的操作独立起来,以便于减小模型参数,提高模型的效率。Xception使用深度可分离卷积(Depthwise SeparableConvolutions)强化了Inception的这种思想。

深度可分离卷积对feature map的每个通道单独卷积操作,之后对所有的feature map 进行concatenate操作,最后再加入11大小的卷积核对通道间的信息进行融合。如图所示,输入的feature map大小是(WH4),输出的feature map的大小是(WH*6)。

如果选用传统的卷积操作,参数量为3346=216,如果选用深度可分离卷积,参数量变为334+1146=60。可以看出深度可分离卷积大大减少了模型的参数量,节省了大量的计算资源。

深度可分离卷积结构示意图

Xception网络原始的输入大小为299299,通过观察数据集,我发现由于数据集中都是人的全身或半身照,因此图片的形状大多是细长的矩形,长宽比大约为3:1。于是我将网络的输入大小修改为299100。这样减少了由缩放带来的图片变形程度,同时由于网络输入的比原来相比减少了约2/3,网络的训练与测试的速度也大大加快。最终该模型在验证集的Accurancy达到了86%。

在进行手势识别的时候,考虑到计算速度与计算资源问题,我们选用的方式是通过单帧图片来进行分类来识别手势的种类。在训练的过程中发现识别效果并不是特别理想,经过分析数据集我发现用于手势识别的训练集虽然图片数量很多,但是帧间的冗余信息太多,对于直接采用分类模型来说样本多样性太小,因此直接分类的效果并不会很好。

结语

由于这次活动时间的原因,我们在识别交警手势时没有采用序列模型(采用序列模型的识别效果会比分类模型的效果更好),这成为了这次活动的一个遗憾。我们后期会尝试使用序列模型对交警手势识别模块进行优化,欢迎大家通过Github关注或参与我们后期的实验。

在这五天中为了完成目标每天都要工作到深夜一两点,虽然有时会觉得疲惫,但我的内心是无比快乐的,我想这是因为热爱!Hack with love!!!

最后,感谢主办方Pix-moving细心筹划这次活动,同时在活动中为我们提供了大量帮助,也感谢Udacity对这次活动的大力支持,感谢我们团队的每位工程师5天的辛苦付出。希望我们的社区能够不断的壮大,欢迎各位小伙伴们的加入!