当前位置: 首页 > 科技观察

谈谈基于深度学习的目标检测网络为什么会误检,以及如何优化目标检测的误检问题

时间:2023-03-21 15:25:58 科技观察

对于以人脸检测为代表的目标检测深度学习网络来说,误检是一件很烦人的事情。将狗检测为猫是可以接受的。毕竟,有些狗确实长得像猫,但检测到墙壁、灯泡、拳头、衣服等人脸,显然一点都不像。想了想,感觉应该可以从两个方面来解释误检问题。图像内容问题在训练人脸检测网络时,一般会做数据增强,为图像模拟不同姿势、不同光照等复杂情况,这可能会产生过亮的人脸图像,“过亮”的人脸看起来会像发光的灯泡。..如果灯泡通过网络提取的特征与网络提取的过亮人脸特征相似度达到临界值,那么网络将灯泡检测为人脸也就不足为奇了。同理,如果用于训练网络的人脸数据集中有一些带有口罩和围巾的人脸图像,那么网络很可能会“记住”口罩和围巾的特征。(比如衣服)表现得像口罩和围巾,那么网络可能会将物体检测为人脸。当然,以上讨论具有启发意义,本文暂不将其作为讨论的重点。目标bbox的范围目前在深度学习目标检测网络(SSD、YOLO、RetinaFace等)的训练阶段非常流行,我们需要提供目标在图像中的bbox。所谓bbox其实主要是指目标的外接矩形。在预测阶段,这样训练出来的网络一般会给出目标的边界矩形。问题出在bbox。下面的讨论将以人脸检测为例。请看下图:这是一个典型的目标bbox。bbox本质上是一个矩形,但通常目标(人脸)不是矩形,bbox内部包含一些非人脸内容,我认为这是造成错误检测的部分原因。常用的人脸检测网络一般采用大量的卷积层来提取图像特征,得到的特征图的大小通常比原始输入图像小数倍(取决于卷积步长、padding等参数),每个“像素”的网络用于二进制分类(人脸类,背景类),并且在这个二进制分类过程中产生“错误检测”。featuremap的一个“像素”小了好几倍,对应的是原图的一个小矩形区域中的一个像素。从这个角度来看,featuremap的每一个“像素”都可以看作是一个bbox,但是这些bbox有的属于背景类,有的属于人脸??类。为了简单起见,提取人脸检测网络的二分类分支,设置为p_{\theta},令x代表特征图中的“像素”,q代表像素的标签,然后训练p_{\theta}一种常见的theta}方法是优化以下目标:\underset{\theta}{argmax}{\mathbb{E}_{x\simp_{\theta}(x)}}\frac{p_{\theta}(y|x)}{q(y|x)}其中y是0(背景类)/1(面部类)标签。对于人脸类,理想情况下,我们希望x是人脸数据,但实际上x是一个小矩形区域内的所有图像数据。这个矩形往往包含一些非人脸数据,所以实际优化的目标是:\underset{\theta}{argmax}{\mathbb{E}_{x\simp_{\theta}(x+\Deltax)}}\frac{p_{\theta}(y|x+\Deltax)}{q(y|x+\Deltax)}上式中,x代表人脸数据,\Deltax代表非人脸数据。通常q(y|x+\Deltax)是人工标注的label,所以\Deltax不会影响q的结果,足以优化如下目标:\underset{\theta}{argmax}{\mathbb{E}_{x\simp_{\theta}(x+\Deltax)}}\frac{p_{\theta}(y|x+\Deltax)}{q(y|x)}我们认为训练是p_{\theta}(y|x),但实际得到的是p_{\theta}(y|x+\Deltax),可以认为\Deltax的存在是误检的主要原因之一。优化误检问题由于\Deltax的存在会造成误检,所以优化这个问题的直观方法如下:令\Deltax\rightarrow0令p_{\theta}(y|x+\Deltax)\rightarrowp_{\theta}(y|x)不幸的是,这两种方法在实践中都很难直接实现。虽然我们可以在不考虑人工成本的情况下,将粗糙的人脸bbox换成更精细的多边形,但本身缩放了数倍的卷积特征图也暗含了“矩形框”。另外,人眼认为的“脸”不一定是互联网认为的“脸”。本文不考虑像素级语义分割任务。稍加思索,不难发现,虽然上述理论是将x和\Deltax视为独立的像素集得到的,但我们可以对该理论做一点扩展,即:将x视为pixelinsidethebbox对于所有像素,将\Deltax视为bbox中所有干扰人脸误检的像素差异,那么该理论就更有用了。我们完成了优化人脸检测网络误检问题的理论构建,将指导接下来的网络和相应的损失函数设计。构建深度学习网络的方式有很多种,构建s_w。下面是我在实验时简单搭建的网络关键部分的示意图(这个结构有点粗糙,但是可以在一定程度上验证理论):常规方法得到特征图x_f+\时Deltax_f,直接送入背景/人脸二分类网络分支进行分类。在上图的网络架构中,我们增加了一个额外的分支,从特征图x_f+\Deltax_f中得到一个1通道的相同大小的人脸特征概率图,类似于x_f+\Deltax_f乘以得到x_f+\Deltax'_f,这样可以得到两个分类结果:p_{\theta}(x_f+\Deltax_f)p_{\theta}(x_f+\Deltax'_f)再根据前面的理论分析得到的s_w优化方法,同步优化θ和w,即可完成训练。一些视觉训练效果这里我没有测试太仔细。我只是将上述结构添加到手头的RetinaFace网络中。经过10个epochs的训练,中间生成了一些视觉效果图:左图:原图和bbox标签;中:人脸特征概率图;右图:s_w处理后的地图。可以看出,虽然标签是一个矩形的bbox,但是通过简单的增加一个训练分支,我们得到了类似语义分割的效果。此外,从效果图2可以看出,网络考虑的人脸区域与人眼感知的区域并不完全相同,但总体上保留了关键特征。类似于下图。误检的优化效果还是比较偷懒的,暂时没有太详细的测试,只在一个很小的(1000规模)数据集上做了一个测试,误检降低了5.2%,对比对象是:p_{\theta}(x_f+\Deltax_f)p_{\theta}(x_f+\Deltax'_f)当然,这只是我粗略训练和测试的结果。后面有时间的话,尽量认真构建网络设计和训练,补上公开数据集的测试结果对比。