最基本的结论:
只要处于检测器检测范围的目标物,不论它在哪种分辨率的图像中(当然目标物尺寸一定是要小于图像尺寸的),检测器都是可以对它进行检测的。
那么接下来再深入一些
1.检测范围如何确定? 如果不考虑任务本身,通常的理想检测范围是训练时输入图像大小决定的。这个很好理解,因为目标物不可能大于图像的尺寸。训练时,输入图像越大,最后测试时能检测的目标范围越大,性能越高,训练时间越长,推理速度越慢。关于这一点我曾有这样一个疑问,即特征图上的感受野如果比输入图像的尺寸大,那不就能检测比输入图像更大的目标物了吗?其实是不对的,因为虽然感受野的尺寸有这么大,但网络的检测范围应该仅仅依赖于在训练时见过的目标物尺寸。举个生活中的例子,如果你变成了绿巨人,虽然你仍能在我的视线范围内,但我从来没见过这么大的你,那我就不知道这个绿巨人到底是不是你了。
2.不过在实际应用中,一个成功检测器的构建需要考虑很多别的因素,首先一点就是要知道检测目标物的范围,这个通常是根据检测需求来确定的,定好了检测目标的范围,然后去设置检测器的相关参数。举个简单的例子,我们实现监控摄像头下的人脸检测,要求在3米-10米范围内的人脸都需要检测出来,经过观察发现,这个距离范围内的人脸尺寸(通常以长边为准),大概在50像素到300像素之间。最终我们可能把检测范围定位32 pixels到320 pixels之间,训练时的输入图像大小可能定为480像素。这里要多说一句,定义好了检测范围,那么训练数据的准备一定要按照这个范围内的数据分布去准备,否则实际检测效果会出很大问题。
3.接着,一般来说很小的目标物和很大的目标物不建议同时检测。因为一方面太小的目标物(比如小于10像素的)本身的特征判别能力有限,因为可利用的像素少,容易出误检。另一方面,太大的物体会导致太大的图像输入,使得训练不可行。那么要检测很大的物体怎么办? 比如我们要检测1000像素到2000像素的目标物,这时候我们需要知道的是上界比下界的倍数,这里就是2000/1000=2,这意味着只要你的检测器的检测范围也满足这个倍数即可,比如说让检测器可以检测50 pixels到100 pixels之间的范围。记得在训练和测试的时候要将原图像缩小到原来的1/20即可,这样的话原来1000像素到2000像素的目标物就变成了20像素到100像素之间了。
4.测试阶段到底能适应多大的分辨率?(仅仅推断一次) 这个就和网络本身的复杂度、芯片能够使用的内存大小有关系了,只要一个检测器训练好了,它是可以在任何分辨率上进行使用的,只要你的硬件足够强大。实在不行就只能切图了
|