AITTSMD / MTCNN-Tensorflow

Reproduce MTCNN using Tensorflow
1.51k stars 713 forks source link

负样本生成的问题 #60

Open webnoise opened 6 years ago

webnoise commented 6 years ago

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 commented 6 years ago

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

boanz commented 6 years ago

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

AITTSMD commented 6 years ago

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

webnoise commented 6 years ago

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

homedawn commented 5 years ago

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

Baishi03 commented 4 years ago

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

homedawn commented 4 years ago

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

Baishi03 commented 4 years ago

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

homedawn commented 4 years ago

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

LHyang9527 commented 1 year ago

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

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

LHyang9527 commented 1 year ago

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

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