1. 图像指标对应
为了明确图像指标上的对应,给出如下图示。
- flir的行人<30pixel的与我们的工程数据<30pixel的不一样
- 同样height都是30pixel,flir的人看着要近一些。应该是flir的分辨率比1280的要小些。
- flir只有<30pixel的数据才有意义,因为对应着300m的行人
- 20pixel height以下的数据就很难识别了,具有轮廓信息还是非常重要的。
- 300m-30pixel, 400m-20pixel, 500m-16pixel 且降低误识别才是最重要的!
- 先做<30pixel height的行人识别,重点在于降低误检率!验证集很重要!
% 行人高度、镜头、距离对应得到的Pixel
height = 1.6;%m
distance = 700;%m
f = 55;%55mm镜头
size_p = 12*0.001;%12um像元尺寸12um*10e-3=0.012mm
pixel = f*height / (size_p * distance);
fprintf("距离=%d m \t pixel_height=%f\n",distance,pixel);
理论计算距离与pixel的对应
2. 正负样本的问题
- 负样本的选取与问题场景有关。不能是所研究问题毫不相关的场景图片,这样的负样本没有意义
- 如果不知道应用环境,那就尽量采集多种环境下的图像。
- 负样本之间不能有太多的相关性
- 负样本的尺寸应该跟正样本对齐
- 如果老对一些负样本误识别,可以将这样的负样本丢进训练集再训练一次
- 负样本的尺寸要一样大。所有的正样本和负样本都要resize到相同的尺寸,resize to exact resolution,same format.
- 负样本每个stage以两倍的数量递增!负样本为:1k,2k,4k,8k,16k,...,512k,这就是10个stage,累计就是1,024k=102.4W的样本。
分类问题中的正负样本问题,如人脸识别中的例子。负样本的选取与问题场景相关,具体而言,如果你要进行教室中学生的人脸识别,那么负样本就是教室的窗子、墙等等,也就是说,不能是与你要研究的问题毫不相关的乱七八糟的场景图片,这样的负样本并没有意义,还有一个比较好的网址是(http://www.doc.ic.ac.uk/~sgc/teaching/pre2012/v231/lecture10.html)
2.1 样本的数量
训练一个检测器时,每个stage应该要有几千张正负样本。通常一个检测器会有10~20个stage。每个stage会依次递减负样本的数量为上个stage的一半。所以你大概需要3k-10k的正样本,5,000,000~100million的负样本(500万-10亿)。
2.2 负样本
负样本与环境相关,如果你要进行教室中学生的人脸识别,那么负样本就是教室的窗子、墙等等,也就是说,不能是与你要研究的问题毫不相关的乱七八糟的场景图片,这样的负样本并没有意义。如果你不知道你对应用环境,那就尽量采取多种可能的不同的环境图像。
2.3 应该把脸部的局部部位作为负样本吗?如眼睛或鼻子
你可以把眼睛和鼻子作为负样本,但是只将这些作为负样本远远不够。一个探测器的real strength真正韧劲will come from negative images which represent the typical background of the faces。一个探测器的真正韧劲来源于负样本,这些负样本代表了人脸的典型背景。
2.4 该怎么收集负样本信息?
你其实并不需要很多负样本,你可以采取1000张图像,然后从中产生10,000,000张负样本。假设你有一张汽车的图片,像素为1k×1k pixels。假设你的人脸识别检测器工作在20×20pixel进行检测,如OpenCV就是这样的。那么你可以将1k×1k的汽车图片剪切成20×20的切片。你也可以获得2500个切片(50×50)。
2.5 在步骤4中。
我必须提醒你注意,负样本之间不能有太多相关性,所以我不建议只从一张图片中截取和产生1百万个负样本。create a library of 1000 images 或从google随机下载数据,确定所有的负样本都不包含人脸。从每个图像中crop截取10,000个负样本,这样得到了大约10million的负样本。训练你的检测器。下一步你可以将每一张图像cut到~50,000张部分重叠的pieces,这样就将负样本扩大到50millions。这样你就会有很好的结果了。
2.6 探测器的最后增强步骤
当你最后已经有一个很好的探测器之后,那么在更多的图像上运行试一下。它会产生误识别。收集所有这些误识别的检测图像,然后将他们加到你的负样本中。然后将检测器再训练一遍。这样的迭代次数越多,你的检测器会更鲁棒。
2.7 real numbers
今天最好的face detectors(如Facebooks)使用了hundreds of millions几百个million(1亿)的正样本,billions10亿负样本。正样本不仅仅是正面的脸,还有各个方向的脸,各种表情的脸,各种年龄的脸,各种性别的脸,各种种族的脸。带着眼镜/帽子/太阳镜/化妆的脸等。你不必要跟最好的比,所以miss掉一些faces时不要get angry。
3. 负样本的concerns
3.1 不同环境下的负样本
- 如何考虑到不同环境下的使用情况?不同对比度下的~
- 还是根据用户场景,定制一套流程,进行负样本收集等?
3.2 不同尺度(距离)下的负样本
<100m,200m,300m,400m下的负样本问题,不同距离的负样本的尺度也是不一样的,比如车?比如误检测?
4、目标检测——降低误检测率:负样本制作、增强、训练
如何从负样本的角度去提高模型的识别精度呢?解释如下:
为什么要训练负样本?
- 训练负样本的目的是为了降低误检测率、误识别率,提高网络模型的泛化能力。通俗地讲就是告诉检测器,这些“不是你要检测的目标”。
- 负样本的核心目的是:增强泛化能力!
如何收集负样本?
可以通过下面两种方式收集负样本:
- 采用本任务场景的不包含目标物体的背景图像,例如你的目标是识别某园区内的行人,那么所有本园区内不包含行人的图片都视作负样本。不要使用不属于本任务场景的负图像,因为其对检测器的性能影响不大。
- 测试图像中被识别错误的目标所在区域。(通常对原图像进行裁剪,使得裁剪下来的图像只包含误识别的物体,而不包含目标)
- 正负样本必须放在一起训练,不能单独训练负样本,否则经过训练,网络会把所有的图像都识别为背景。
- 正负样本的比例最好为1:1到1:2左右,数量差距不能太悬殊,特别是正样本数量本来就不太多的情况下。
怎么消除误检测?
把使用正样本训练好的模型拿来进行测试,此时会得到一些被错误识别的图片。把这些图片收集起来作为负样本加入到正样本集(如果图片中同时包含误识别物体和目标,可以将图像裁剪,裁剪后的图像包含误识别物体而不包含目标并尽量覆盖原图大部分区域,然后再将其分辨率resize回原图大小),组成新的训练集,送入模型进行训练。
如果负样本的来源只有误识别的图片,那么由于误识别的图片往往占少数,可以利用图像增强(如高斯滤波、对比度增强、锐化、平滑等)的方法扩充负图像数量至和正样本数量相同,并组合在一起。将这样得到的训练集送入模型进行训练,经过若干个epoch,当Loss收敛到稳定值时,再次测试原来的出现误识别的图像你会发现误识别现象基本消失了,并且类似原来误识别的场景将会被正确识别。
5、评价指标
虚警概率:false positive / (false positive + true positive),就是1-precision=false alarm。
6、大规模训练结果
- (1)多采集项目的数据,制作样本切片,达到1k-2k
- (2)特别是负样本的制作,为正样本的2倍,考虑环境和其他目标。剔除<10pixel的数据。
- (3)然后再考虑是否进行特征和调参