老司机用神经网络带您安全驾驶

0 概述

随着今年深度学习的热潮的来临,神经网络已经被应用在越来越多的应用中。而在印象中对于神经网络进行训练的往往需要借助大量的计算资源与数据。其实通过一定的方法,配合预训练好的网络,我们完全可以在自己的pc上训练出一个准确率较高、实用性也非常不错的网络。下面我就以kaggle上的一个竞赛为例,带领各位司机训练一个对驾驶行为进行分类的网络。

首先我们了解一下需要解决的问题: 我们有一位老司机,可惜开车时不太专心,一会儿喝饮料一会儿打电话又或是在玩手机, 并在驾驶过程中不断的变化着自己的姿势。碰到这样的老司机,我们有没有办法提醒他安全驾驶呢?

设想如果我们能在他的汽车上装上一枚摄像头,并通过实时图片采集他的行为。最终通过神经网络分析他的动作行为,善意的提醒他安全驾驶的姿势。

这看起来是不是很酷~~ 装上摄像头的汽车采集到的数据,就像下图这样:

接着这一问题转换成了神经网络,即对10种类型的图片进行分类预测的问题,这10种行为分别是:

'0.正常开车' '1.右手玩手机' '2.右手打电话' '3.左手玩手机' '4.左手打电话' 

'5.操作收音机' '6.喝东西' '7.向后伸手' '8.化妆', '9.说话'

而训练数据所需要用的数据库,大家可以在kaggle网页上自行下载,这里是网址kaggle statefarm

1. 训练准备

1.1 下载训练数据

了解了问题之后,我们开始准备我们的训练数据。 第一份数据可以在kaggle网站上下载到。在下面图中的这个页面中,我们只需要下载images.zip这个4gb的文件即可。

下载完成之后,我们将这个zip包解开,将看到下面这样的目录结构:

└── train

    ├──c0

    │   ├── img_1.jpg

    │   ├── img_2.jpg

    │   ├── ...

    ├──c1

    ├──...

    ├──c9    

└── valid

    ├──c0

    ├──c1

    ├──...

    ├──c9

稍微解释一下, train目录是给我们训练用的目录,里面一共有c0c9十个分类,对应我们刚刚列出的 0.正常开车 1.右手玩手机 2.右手打电话 等十种行为。在这个训练集中一共包含22,286张图片。

valid目录是给我们校验的目录,也同样是c0c9十个分类,但它只有115张图片,主要的作用是用对训练好的神经网络进行校验,稍后我们也会用到它。

1.2 自己拍摄数据

由于训练数据比较少,加上 死磕自己,娱乐大家 的的精神,作为老司机我也上“车”试上一把。:)

纯手工打造一台“汽车”并参与到训练中去并不难,而所需要的东西如下:

就这样不停的变换姿势,一共拍摄了200张不同姿势的开车照片,并依照不同的类别放置在刚刚的的train目录对应的分类中。同时也放少量的照片到valid目录中,注意要保证train和valid目录中的照片不重复。

1.3 产生更多数据

最后,如果数据还觉得不够的话,我们可以对数据再做一次data augmentation,这样可以产生更多的训练数据。

比如对同一张照片做颜色和角度偏移就可以得到多张不同的照片,如下图所示,这些照片对训练也是相当有帮助的。

好啦~万事俱备,各位老司机坐好了,我们马上准备开车了~

2. 开始训练

2.1. 迁移学习

终于到了训练的步骤,问题是我们手头上只有一台普通的开发机器:corei78g内存gtx660。比起各大云服务器上动辄几百g+几十个核心的服务器,需要通过这样一台机器训练一个稍显复杂的网络真的是有点难堪。

所以这里向各位老司机推荐迁移学习中的一个小tricky,名曰 fine-tune。关于fine-tune的更详细的步骤大家可以在这里得到(配有源码):finetuning alexnet with tensorflow

而这里提到的fine-tune如果总结一下的话,主要原理可以理解成如下三步骤:

step1: 首先我们需要获得一个预先训练好的网络,如下图中的vgg16网络。

step2: 我们将网络中的后三个全连接层去掉,只留下前面的卷基层和pooling层。

step3: 加入新的全连接层, 冻结之前所有层,仅仅训练新加入的全链接层。

了解了基本原理之后,我们开始根据自己的实际做 fine-tune。注意,这里我们要处理的是一个十分类问题,也就是说,我们的网络最后要有10个输出。所以我大概做了这样一个包含一个隐藏层的全连接网络,附加到vgg16的末端:

(full) (none, 256)   # 上接vgg16  

(full) (none, 256)   # 一个隐藏层

(full) (none, 10)    # 输出10个分类

2.2. 训练网络

之后我们将vgg16的前面14层冻结,开始训练后面的三层。冻结网络层,其权重值在训练过程中不会发生任何变化。

有了之前的工作,这个训练就变得和普通全连接网络的训练过程完全一样了。

在我的nvidia geforce gtx660 上用了12个小时, 一共跑了30个epoch,每个epoch将我们准备好的2400张照片作为输入。学习速率我这里设置到0.0001这样一个数值,

最终loss函数值稳定在0.0262。看到loss函数呈现如下图中基本上不下降了之后,即可以结束训练了。

3 检验结果

3.1 简单预测

ok~ ,进过漫长的等待。我们终于可以使用这个网络了~ 现在开始使用刚刚数据库中的校验集,也就是valid目录中的图片。先简单的传入10张图片看看网络的预测结果呗。这10张图片的正确类型的动作行为编号分别是[1 1 1 2 0 3 3 0 3 2]。而网络输出的结果是[1 1 1 2 0 3 4 0 3 2]。貌似还不错,只是有点小错误。如下是正确结果和预测结果的比较:

[1 1 1 2 0 3 4 0 3 2] # predict

[1 1 1 2 0 3 3 0 3 2] # correct

 如果将结果用matpilot输出出来的话会更加直观。如下图是输入网络的10个照片,每张图片的标题是预测结果`,发现只有红框中的那一张出现了预测错误的问题。

我们再尝试对state farm数据库中的照片做一下分类,10张照片中同样发生了一个错误的预测(红框内为错误的预测):

3.2 结果分析

那是不是我们可以认为网络的准确率在90%呢?网络最容易出现错误的预测是哪几类图片呢?

对于这两个问题,尝试对所有的校验集数据做一个预测,并将最终的结果打印成一个confusion_matrix就会有答案了。在这个矩阵中,用每一行表示神经网络预测的结果,每一列表示正确的结果。输出以后它是这个样子的:

#confusion_matrix

     ([[ 49,   0,   0,   0,   0,   0,   0,   0,   0,   0],

       [  0,  76,   0,   0,   0,   0,   0,   0,   0,   0],

       [  0,   0, 106,   0,   0,   0,   0,   0,   0,   0],

       [  1,   0,   0, 114,   0,   0,   0,   0,   0,   0],

       [  0,   0,   0,   5,  93,   0,   0,   0,   0,   0],

       [ 16,   0,   5,   1,   0,  73,   0,   0,   0,   0],

       [  5,  13,  11,   6,   1,   0,  72,   0,   0,   0],

       [  2,   0,   0,   0,   0,   0,   0, 105,   0,   1],

       [ 13,   1,   5,   0,   1,   0,   0,   0,  84,   6],

       [ 38,   0,   2,   0,   0,   0,   0,   0,   0,  65]])

分析一下, 我们可以将对角线上的所有数据加起来,得到网络的准确率是86.3%

再具体一点,可以看出最难区分清楚的是’ ‘3.左手玩手机’ ‘4.左手打电话’ ,后续如果增加3、4这两个分类的话,那么网络的准确率还有更大的提升。

4 结语

通过整个实验过程,我们发现通过神经网络解决复杂图片的分类问题并不复杂,只需要通过一些小的技巧,训练网络的计算资源也并非很大。86.3%的正确率这一结果也还比较理想~

最后我把本文中用到的一些重要的资料再列举一下,原文、源码、数据都在了,各位老司是不是跃跃欲试了~ :)

finetuning alexnet with tensorflow blog

finetuning alexnet with tensorflow code

kaggle state farm

本文发表于[melonteam](http://km.oa.com/group/25894),转载请联系作者获得授权。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

数据预处理和挖掘究竟该怎么做?硅谷网红告诉你

Siraj Raval 作为深度学习领域的自媒体人在欧美可以说是无人不知、无人不晓。 凭借在 Youtube 上的指导视频,Siraj Raval 在全世界吸...

2975
来自专栏机器之心

百度NLP | 神经网络模型压缩技术

百度NLP专栏 作者:百度NLP 引言 近年来,我们在神经网络模型与 NLP 任务融合方面深耕,在句法分析、语义相似度计算、聊天生成等各类方向上,均取得显著的进...

3525
来自专栏目标检测和深度学习

16岁高中生夺冠Kaggle地标检索挑战赛!而且竟然是个Kaggle老兵

anokas 赢得了谷歌地标检索挑战赛,在 Reddit 上引起了非常多的讨论,大家都非常关心他的年龄以及是否有其他人帮助。不过在 anokas 的 Kaggl...

932
来自专栏AI科技评论

开发 | 无需编程,仅用摄像头,Google最新项目让你3分钟学会机器学习

得益于各种套件,今天的机器学习的门槛已经越来越低。但Google显然并不满足于此,其最新推出了Teachable Machine项目,让用户无需编程就可以用手机...

2768
来自专栏机器之心

学界 | 让黑白影像重获新生:UC Berkeley 提出实时神经网络着色模型

选自arXiv 作者:Richard Zhang等 机器之心编译 参与:李泽南 UC Berkeley 的研究人员近日推出了一种利用深度学习对黑白图像进行实时上...

29211
来自专栏机器之心

超参数搜索不够高效?这几大策略了解一下

当然,并非所有变量对模型的学习过程都一样重要,但是,鉴于这种额外的复杂性,在这样一个高维空间中找到这些变量的最佳配置显然是一个不小的挑战。

741
来自专栏深度学习入门与实践

【深度学习系列】PaddlePaddle垃圾邮件处理实战(一)

2674
来自专栏社区的朋友们

老司机用神经网络带您安全驾驶

通过一定的方法,配合预训练好的网络,我们完全可以在自己的PC上训练出一个准确率较高、实用性也非常不错的网络。下面我就以Kaggle上的一个竞赛为例,带领各位司机...

6831
来自专栏机器之心

TensorFlow发布面向JavaScript开发者的机器学习框架TensorFlow.js

机器之心报道 参与:机器之心编辑部 当时时间 3 月 30 日,谷歌 TenosrFlow 开发者峰会 2018 在美国加州石景山开幕,来自全球的机器学习用户围...

37612
来自专栏机器之心

业界 | 谷歌开源高效的移动端视觉识别模型:MobileNet

选自Google Research 机器之心编译 参与:蒋思源 近日,谷歌开源了 MobileNet,它一个支持多种视觉识别任务的轻量级模型,还能高效地在移动...

2866

扫码关注云+社区