对于某项目的一点总结

今天看了《深度学习》的第十一章,有点“相见恨晚”的感觉。谁让某老板第一年都几乎不让我们看书呢……

书里面介绍了许多看起来比较有用的方法。下面对照这上一个项目,做一点反思。

确定目标

项目的最终目的是什么?使用什么样的评价指标?是要precision还是recall,还是其他什么指标?这个本应该“贯穿始终”的东西,我们却变来变去了好几次。

一开始,我们只在乎“能出结果”,并没有一个最终的优化“指标”。一星期后,在老师的提醒下,我们唯一的指标是Recall。在能做出来“置信度阈值-Recall”曲线后,我们发现只关注recall是不够的,因为“误检”太多了。于是,一个月后,我们换成了VOC的PR曲线,并把评价指标换成了mAP。但是项目快要结项的时候,我们发现,一个高mAP的模型,拥有很高的recall(例如92),precision可能比较低(例如60),这样的模型可以被接受么。或者,经过一番改动,mAP提升了2%,recall提升了2%,但是precision下降了2%,那么这个模型有没有“更好”呢?于是又尝试计算了各个模型的 F1 Score、F2 Score等指标,最终找到了一个在各个指标上的表现都“还可以”的模型。

另外我觉得,需要找一个能全面反映模型能力的指标。例如mAP受到Recall的影响比受到Precision的影响好像要多一点。

尽快建立一个端到端的工作流

书上的“端到端”应该是Baseline吧。那就先来说说Baseline的事儿。

我是半路进入项目组的。进入项目组的时候,可以说已经有一个前期Baseline了;新数据标注出来,就直接做了预处理、开始训练模型了。6月6日第一个模型跑出来,这个模型顺理成章地成为了Baseline。但是最后我们发现,这个Baseline“不纯”,用到了一些优化方法而不是最裸的模型;到7月份发觉了这个问题,又对一些方法做了屏蔽,补了一个Baseline,但最后检查发现这个Baseline也“不纯”。所以,这个项目少了一个最原始的Baseline做对比。

然后再说“端到端”。

意识到这是一个“项目”,自然而然的就想用“项目”的思路来写,也就是说,将我们的东西完全进行封装,封装成一个黑盒,使用的时候,一张原始图片输入进去,加载网络各种参数,出来的就是直接干干净净的结果和结果可视化图片,中间的所有操作(例如如何预处理,如何做nms之类的)细节完全不用人工干预。于是就这样做了,并经过两次代码重构,搞出了几个自认为很方便的调用接口,不管是用命令行还是做成dll调用都十分方便:需要的原始数据传进去,出来的就是最终结果。同时留了一套数据集制作脚本,按照说明走下来,数据集就制作好了。我承认缺少了一个制作数据集的“一键脚本”,但是写一个这样的脚本也不难。

然后,不知道其他人怎么想的,在项目结束之后,其他成员开始将项目进行分拆:脚本重新实现,拆成更为零散的小脚本,同时各种函数拆开……OMG……可能是由于某些部分需要转译到硬件上去的缘故?如果是这样,为什么不在项目早起就进行说明呢?

搭建系统,并确定性能瓶颈

一直在处理的都是如何解决性能瓶颈(废话)。

在“置信度阈值-recall”阶段,我们在处理的瓶颈是“置信度阈值怎么取,才能达到更好的recall”。

做出“precision-recall曲线”和“预测正确/错误的样本的置信度分布直方图”之后,问题变成了“置信度阈值怎么取,才能达到更好的mAP”。

在手工获取一个可以接受的阈值之后,问题变成了“我们可以用什么方法,来改进网络在某两个物体上的Recall和Precision”。

在解决上一个问题的同时,我们还在考虑“误检大多是因为一个物体上面框了多个框框,怎么将这多个框框尽量合并成一个”,还有“怎样确定一个位置上重叠了多少个框框”,以消除一些多余的框框。

我们将某个表现不好的类拿出来看,发现两个问题:首先,这个类,网络找出来的框框人看起来几乎都正确,但是在标注的时候没有对它们进行标注,导致了大量的“误检”。其次,我们对这些检测出来的物体从原图中抠出来进行人工校对,然后单独训练分类器对其进行分类,训练的分类器在训练集上只有65的精度。说明这个类确实特征不明显。

增量式改动

增量式改动确实做了,而且是在无意识的情况下做的,最后形成了一个“增加了那种方法-指标提高多少”的一个表格。

数据方面,前期使用了1W张标注图片进行训练,之后又增加了5K张,发现确实可以提高指标。

超参数调整做得不多,原因是计算资源不足……训练一次需要至少30小时,而我们只有一张GTX1080,要跑3个晚上才能进行一次训练。调参?不可能的。

总结

上面的准则相见恨晚。这个项目虽然忙了好久,但是总感觉做得没有那么圆满。所以,做事情之前还是要知道一些方法论比较好,避免那么被动。

其次,需求要明确啊……

最后,还是自己太菜,除了写代码啥都不会。啥都不说了加油看书做实验去吧。

发表评论

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