利用深度学习进行装备抽查

这个项目产生的原因

 

为了树立良好的点我达骑手形象,在骑手配送订单时,都会身着公司设计的统一装备,公司也会在每天配送的骑手中随机抽选一部分骑手进行装备抽查,确保相关骑手装备配置符合公司要求。随着加入的骑手数量迅猛增加以及抽查范围的扩大,公司在这块投入了大量的人力物力。人工智能中的计算机视觉这几年发展迅速,那幺能不能用计算机代替人工解决这重复的审核工作?

 

技术调研及探索

 

在接下来的叙述中,我尽量不写一些专业性强的语句以及相关算法的流程,当然有一些专业词汇还是避免不了写出的,但这并不影响你对本文总体的理解。

 

本着实际业务中需要对被抽查到的骑手进行装备抽查中需要检查该骑手两个基础点:

是否为本人在配送订单
衣服,箱子或者头盔是否符是公司为了提升品牌形象而设计的款式

人脸对比技术探索

 

有了这两个需求,最初在解决是否是本人配送就需要对比被抽查到时所拍的照片的人脸与骑手在账号审核所上传照片中的人脸是否为同一个人。最初想到的是 支持向量机(SVM)opencv ,利用 opencv 已经训练好的人脸提取模型对照片中的人脸进行定位,定位后进行裁剪最后交给 SVM 进行训练分类。在经过一番组内同事人脸样本采集之后(每人采集了80张),经过SVM训练后得到的模型在实际的测试中发现其有以下缺点:

同一个人戴眼镜后有一定概率识别不出
一个人有一定概率被识别成另外一个人
需要一定数量进行训练拟合不符合业务中实际情况

在这样没有多余环境噪音干扰的情况下其可靠性就这幺低,很难将其用于骑手实际拍照的场景,所以到这里这个方案就已经被淘汰。 随着对人脸这块技术的研究深入,我们读到这篇 论文 ,这是瓦希德·卡奇米(Vahid Kazemi)和约瑟菲娜·沙利文(Josephine Sullivan)在 2014 年发明的方法。其基本思路是找到 68 个人脸上普遍存在的特定点(称为特征点, landmarks)包括每只眼睛的外部轮廓、每条眉毛的内部轮廓下巴的顶部等。接下来可以训练一个机器学习算法,让它能够在任何脸部找到这 68 个特定的点:

 

有了这些特征点,我们需要结合这些特征点来测量一张人脸得出一些值来区别不同的人脸,比如眉毛的长度,鼻子的长度,眼睛的宽度等等。结合深度学习中深度卷积神经网络,我们可以训练出能为一张脸生成一个128维度的测量值来代表这张脸的模型。每次训练我们观察三张不同脸部图片:

加载一张已知的人的面部训练图像
加载同一个人的另一张照片
加载另外一个人的照片

然后,算法查看它自己为这三个图片生成的测量值。再然后,稍微调整神经网络,以确保第一张和第二张生成的测量值接近,而第二张和第三张生成的测量值略有不同。 当然,以上的内容都有诸多国内外大神已经帮我们做了,比如在Github中 dlib 这个项目就为我们提供了具体的 模型 ,我们结合 dlib 以及其训练好的模型来提取一张人脸的128个测量值。

 

有了这些测量值,我们如何比较两个人是否为同一人呢?这就比较简单了。我们可以利用第二范数来得出结果,在python中的 numpy 工具包就可以通过一行代码来得出两张脸的相似度了。

 

distance = np.linalg.norm([128D - 128D], axis=1)

 

当然,对于结果的值是依据经验如果这个 distance 在0.6一下为同一个人,如果想要严格一些可以设置为0.5,反之就是宽松一些。这个还是要依据实际情况来定这个阈值。

 

装备抽查技术探索

 

起初没有理解好这个装备抽查的需求点,准备利用TensorFlow基于往期的抽查数据训练出一个分类的模型,也就是判断这个抽查照是否是公司设计的装备。后来与需求方沟通才发现,需要检测出抽查照中有没有配送箱,有没有马甲、T恤、冲锋衣、头盔等。由此可见良好有效的沟通有多重要。 在看一些国外计算机视觉相关的论文中发现了这篇论文 CTPN , 论文主要解决的是文本行的识别。但这怎幺能和我们的项目联系起来,因为该论文的关键idea是:检测一个一个小的,固定宽度的文本段,然后再后处理部分再将这些小的文本段连接起来,得到文本行。

 

我们的需求是识别箱子,衣服这样的装备,如果按照论文的关键idea,衣服箱子微观的看也是有一小部分一小部分组成,相对于文本来说也就没有文本之间的间隙。在Github上找到了作者用Caffe实现的版本,由于我们目前的深度学习框架是用的TensorFlow,Keras以及torch,经过搜索也找到了利用TensorFlow实现的 版本 。当然如果不经过阅读代码和修改相关代码是无法用到我们需要的场景中的。在修改后,我们基于我们的训练集训练出对应的模型,在这里推荐这样的样本标注工具 labelImg ,支持的平台几乎涵盖了不同人的使用场景。在模型训练成功后,我们做了一些简单人工测试,看着结果我们似乎离成功不远了。

 

到这里我们可以识别被抽查照片中对应的箱子,衣服等。接下来要做的就是被识别的物体和其label一一对应以及各自所得的分数,有了这个分数我们可以做一个阈值来作为识别结果宽松的调整。但是这时候问题出现了,由于这篇论文主的初衷是为了识别出文本行,所以在模型输出也就是坐标和得分,也就是只有两类即背景和文本行,但是背景在经过非极大值抑制( NMS )时已经过滤,也就是结果就是一个类,总结为一句话来说, CTPN 的网络设计根本就没有考虑多分类的情况。所以目前摆在面前的有两条路:对网络结构进行修改要幺再寻找其它视觉相关的论文再探索。这两条路对于当时来说,都是要一定的时间的,而且并不是一两天两三天能解决的。在经过快成功到失败的打击后,让我冷静了下来思考接下来如何做。因为对论文和 CTPN 网络的 TensorFlow 版的实现代码阅读,我看它在特征提取和分类那一层是用的 fast rcnn ,换句话说, CTPN 的网络也是基于 fast rcnn ,我于是搜了关于 fast rnn 相关的文章,在此期间也了解了计算机视觉中对于物体侦测的发展史,在对整体情况了解后,我认为比 fast rcnn 更好的 faster rcnn 绝对符合我们的需求以及能带来更好的结果。 在阅读其论文以及其Caffe的实现版本,我在Github中找到了符合我们深度学习环境的TensorFlow版本,主要是方便日后的维护。在阅读TF版本的文档,将其改为符合我们需求的代码,当然过程并不是一帆顺风的,一个CUDA相关的问题和我如期而遇,因为这个问题在当时超出了我理解的范围以及Google后并没有发现有解决的办法,最后无奈写了封邮件给作者。在邮件发出的第二天,我再仔细看代码,居然是自己误删了一行代码导致的。所以,在这些问题解决后,我们基于数据样本集训练了对应的模型。在之后的人工验证测试过程中,都是比较顺利的,也十分符合我们的业务场景。

 

最后的认定

 

我们在利用 faster rcnn 训练出我们想要的模型后,经过性能,稳定性和可靠性以及实际测试所得出的召回率的评估后,认定其能在生产环境部署从而减轻人工的负担,由于是公司使用我们也查看了引用的开源代码的所对应的开源协议。始终遵循开源社区开源代码的开源协议。

 

后续

 

在部署到生产环境后,使用情况以及反馈来看, faster rcnn 在特征提取所使用的 vgg16 模型尽管已经够好但是在特征提取的边边角角上面还是有优化的余地,最近这段时间在阅读 DenseNet 网络模型的相关的文章后计划用其代替 faster rcnn 中的特征提取的 vgg16 模型,看看结果怎幺样。

发表评论

电子邮件地址不会被公开。 必填项已用*标注