MTCNN-Tensorflow icon indicating copy to clipboard operation
MTCNN-Tensorflow copied to clipboard

负样本生成的问题

Open webnoise opened this issue 7 years ago • 11 comments

gen_12net_data.py 文件中 “if np.max(Iou) < 0.3:” 就是负样本,但是这个判断某些情况下我认为是有问题的,例如随机生成的crop_box的面积大于最大单个人脸面积的3.3倍时,这个判断条件会满足,我认为这个这个负样本包含有完整的人脸,不是有效的负样本。你怎么看待这种情况?我觉得要解决这个问题,应该限制crop_box的面积大小或者判断overlap部分与人脸box的重合比例也要 < 0.3?

通过如下代码实际测试中包括大量含有完整人脸的负样本

--- a/prepare_data/gen_12net_data.py
+++ b/prepare_data/gen_12net_data.py
@@ -50,7 +50,7 @@ for annotation in annotations:
 
     neg_num = 0
     #1---->50
-    while neg_num < 50:
+    while neg_num < 2:
         #neg_num's size [40,min(width, height) / 2],min_size:40 
         size = npr.randint(12, min(width, height) / 2)
         #top_left
@@ -59,9 +59,16 @@ for annotation in annotations:
         #random crop
         crop_box = np.array([nx, ny, nx + size, ny + size])
         #cal iou
+        print ("boxes:", boxes)
         Iou = IoU(crop_box, boxes)
+        print ("Iou:", Iou)
         
         cropped_im = img[ny : ny + size, nx : nx + size, :]
+        
+        cv2.imshow("true" if max(Iou) < 0.3 else "false",cropped_im)
+        key = cv2.waitKey(0)
+        if key & 0xFF == ord('q'):
+            sys.exit(0)
         resized_im = cv2.resize(cropped_im, (12, 12), interpolation=cv2.INTER_LINEAR)
 
         if np.max(Iou) < 0.3:

webnoise avatar Jan 17 '18 10:01 webnoise

同样part部分似乎也有一些问题,也存在完整人脸的情况

webnoise avatar Jan 17 '18 10:01 webnoise

@webnoise 确实会存在完整人脸,但是完整人脸与crop_box的比例小于0.3。对于负样本的定义,没有说一定不能含有人脸,只要满足背景占大比例,对训练影响不大即可。当然,如果你可以产生完全不含人脸的负样本,也是可以的。

boanz avatar Jan 17 '18 12:01 boanz

@webnoise @boanz 不要意思,回复晚了。在对训练数据采样的过程中,一张图片中有多个人,但只标注了少数几个明显的目标,背景存在密集人群。这样crop的话,可能会采集到一些包含人脸的负样本,这只能靠人眼去筛选了。

AITTSMD avatar Jan 19 '18 01:01 AITTSMD

如果真想快一点剔除掉这些负样本,可以用你训练出来的模型,对负样本resize前的图片批处理做一次人脸检测,然后删除这些含有人脸的负样本,然后再重新用这些负样重新来训练。

webnoise avatar Jan 19 '18 14:01 webnoise

当我做训练的时候,pNet中neg:part:pos:landmark=3:1:1:2,但是RNet和和ONet训练样本比例并没有约束在3:1:1:2,这是否影响到模型训练出来误检率大的原因

homedawn avatar Nov 09 '18 09:11 homedawn

麻烦问一下,为什么生成的RNet训练样本中,负样本占了绝大多数,而正样本和part都非常少?这个问题出现的原因可能在哪里呢?

Baishi03 avatar Mar 23 '20 07:03 Baishi03

生成RNet的训练样本是基于PNet网络检测的,可能PNet网络检测效果不好 

homedawn avatar Mar 23 '20 07:03 homedawn

@homedawn emmmm我neg=75w,pos=69,part=800, 我是用paddlepaddle,然后我也比对过github中的其他pnet代码,感觉和我的也没什么不一样,为啥出来结果就这样了。。。。PNet中要注意哪些地方多一些呢?

Baishi03 avatar Mar 23 '20 07:03 Baishi03

我没用过paddlepaddle,你用不一样的库效果肯定会有差别 

homedawn avatar Mar 23 '20 07:03 homedawn

@webnoise @boanz 不要意思,回复晚了。在对训练数据采样的过程中,一张图片中有多个人,但只标注了少数几个明显的目标,背景存在密集人群。这样crop的话,可能会采集到一些包含人脸的负样本,这只能靠人眼去筛选了。

@AITTSMD 可以通过降低0.3这个阈值来解决问题吗,会有什么别的影响吗,没看到这个问题下面有人讲到降低阈值

LHyang9527 avatar Jun 07 '23 06:06 LHyang9527

@webnoise 确实会存在完整人脸,但是完整人脸与crop_box的比例小于0.3。对于负样本的定义,没有说一定不能含有人脸,只要满足背景占大比例,对训练影响不大即可。当然,如果你可以产生完全不含人脸的负样本,也是可以的。

@boanz 1、如果负样本里可以含有人脸,人脸就是要检测的正样本,你的意思就是负样本里可以包含正样本? 2、那到底完全不含人脸的效果好,还是含人脸有背景的效果好?

LHyang9527 avatar Jun 07 '23 06:06 LHyang9527