我的CV实习工作总结

两个月不到的实习,总结一下。

洗数据的大路走到了黑

我负责的模块是人脸检测,人脸检测的最终目的,是可以实现视频中人脸实时的关键点检测。对于检测的recall,precision,检测框是否切脸,检测速度都有要求。
需要解决的问题是:无法检测出靠近镜头的大脸图片,易对背景产生误检
解决办法:最好的解决办法就是给高质量的数据集(很无奈哦)
然后开始洗数据
方法:

  1. 首先调用了百度API,这里写了一个调用脚本,然后做了本地可视化,评估了一下几个指标。百度的人脸检测严丝合缝,人脸是歪的,那么检测框就是歪的,我特地让检测框的坐标做了仿射变换,然后按照检测框(w,h)和旋转角度做了一个权重运算,使得检测框可以方方正正,然后又不切脸;
  2. 然后调用本地openpose,也可视化了一下,评估指标。
    骚操作来了!
  3. 把两个label做了融合:取两个label的交集!这样会降低召回,但是大大增加了准确率,降低了切脸率。具体做法是计算IOU,选IOU最大值作为选取的检测框。这里附一下我的代码,但是由于没有openpose的模块,所以大家可以看看流程
    在这里插入图片描述
    从最后的结果来看,交叉验证后的结果还不错,就是recall,毕竟取交集。
    然后就是常规的数据增强,高斯加噪,变色,旋转
    最后生成db,扔进模型训练。
    是不是看着贼简单哈哈哈哈,但是我搞了有三周才把整体流程打通,完成数据的自动化生成。首先用于调研和评估某工具的数据集要选定为同一批,然后在本地可视化,最后交叉验证,也要在本地可视化,评估结果发现还不错,最后写了一整套流程,可以实现数据的全自动生成,才可以送进服务器开始喂模型。

模型篇

为了提高速度,而且学术能力有限哈哈哈,这里并没有用专门针对人脸的检测模型,而是使用了yolov3,一开始我也贼困惑,老哥行不行啊,但后来发现效果还不错,重要的是他很快啊,现在总结原因应该是,人脸比较具有特点,也可以被单独划为一类。在这里,为了降低背景误检率,我们也送进去其他类型的数据,eg(VOC,wild_face)
这里把模型大刀阔斧做剪枝。首先使用了VGG的结构,而且层数更少,然后filter number减半,最后三层的prior box变成两层。
先说一下kmeans,这里只有两层做了prior box的限制,所以只聚类了6个box。
然后说是为了加速,用了简化版的VGG,但是我觉得在相同层数下,可以使用resnet,减少参数而且可以提高特征提取的质量
最后的损失函数还是使用经典的yolo损失函数,这里我觉得可以添加用于人脸检测的损失函数,可以降低误检率。最后我发现,他的学习率设置的比较小,然后在按epoch减小,但yolo本身并不这样,他会维持0.01直到结束,为了加快训练速度同时降低过拟合,但这里并没有出现过拟合,因为检测的真的很单一,就是人脸。这些没有时间改啦,我要离职啦。
最后的模型结果还不错,cpu速度约为30ms,对于最初的bad case也解决了。
在这里插入图片描述
一开始还有一个更疯狂的版本,filter number只有个位数,而且最多是64,我觉得emmm,这版训练出来意外的还能用,cpu速度约为9ms,就是recall和切脸不太理想。
在这里插入图片描述
最后我还苦逼的做了SDK开发,添加了批量检测人脸的模块,可以实现检测结果可视化和输出label。在这里致敬C++开发大佬。
终于离职了,感觉做的非常工程,快两个月时间,几乎没有多少时间看论文,基础知识差不多又快忘光了,而且没有时间刷leetcode,回来只想去举铁和躺着。我的春招好危险。。。
祝大家都能成为offer收割机嘿嘿。
一时离职一时爽,一直离职一直爽。回实验室看论文刷题啦。

你可能感兴趣的:(CV大白菜,实习工作)