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

PNet的准确率疑问

Open Kison-Y opened this issue 8 years ago • 36 comments

@AITTSMD 感谢你的代码 我在训练PNet的时候得到的cls的准确率是0.94~0.96之间,cls的loss值在0.22左右徘徊,roi和landmark的还是不错的,对于PNet着重于cls训练的神经层来说,这样的结果是否有些偏低?

Kison-Y avatar Sep 16 '17 01:09 Kison-Y

@yungs2017 您好,PNet只是一个较为简单的网络。目的是快速排除大量容易分类的负样本。它的分类准确率不会很高,94-96很正常。论文中PNet验证准确率也仅为94%多。RNet和ONet的准确率会相对高些,对于PNet和RNet最重要的是召回率而不是准确率~

AITTSMD avatar Sep 16 '17 09:09 AITTSMD

@AITTSMD 明白,非常感谢。另外在caffe中您有训练过PNet吗?我参考mtcnn-caffe 中的PNet进行训练,在这里的PNet中每次都是随机加载cls/roi/pts三种数据的其中一种进行训练,在加载roi进行训练的时候其他两个的acc和loss就是0(cls的默认是0.693147),虽然这种情况除了当前的roi外另外两个都没有后向传输更新权重和偏置,但是cls的准确率却只有78%~86%之间,请问是否每次训练的批次中都加入三类进行训练会比单一类的训练会好点?

Kison-Y avatar Sep 16 '17 11:09 Kison-Y

@yungs2017 我之前也是使用caffe训练过mtcnn,按作者的说明进行实验,准确率大概92%左右,但是召回率很低。我也试过用TensorFlow每次训练一个任务,效果也okay~

AITTSMD avatar Sep 17 '17 06:09 AITTSMD

@AITTSMD 非常感谢您。请问caffe训练的代码可以分享下吗?

Kison-Y avatar Sep 17 '17 15:09 Kison-Y

Hi @AITTSMD ,

I trained PNet with training accuracy converged to 94%. Then I tested it on FDDB, when the recall rate is 97%, the number of false positives is 2M. I also used MTCNN-MXNET before, with the same network, the number of false positives is 800K, which is much smaller than 2M.

Would you mind share the number of false positives for PNet when the recall rate is set to 97% on FDDB?

Thanks.

xingwangsfu avatar Sep 18 '17 23:09 xingwangsfu

@yungs2017 那部分代码没有整理,无法提供,抱歉

AITTSMD avatar Sep 19 '17 02:09 AITTSMD

@xingwangsfu I forget the exact number.Is the threshold used the same as MTCNN-MXNET's.

AITTSMD avatar Sep 19 '17 02:09 AITTSMD

@AITTSMD how to enhance the recall rate when training Pnet?

Cv9527 avatar Sep 20 '17 09:09 Cv9527

@Cv9527 You can change the param in gen_12net_data.py to generate enough training data for PNet.In my experiment,I only generate 100W+ training data.However,the original author generates 800W+ training data for PNet!

AITTSMD avatar Sep 21 '17 03:09 AITTSMD

hi, I am training on some object detect dataset. and trying to find some guideline recall rate to stop tunning for the pnet. Can you guys report the recall of pnet in validation data set? @xingwangsfu how is this 97% recall on FDDB affect the final MTCNN result?

flankechen avatar Dec 01 '17 03:12 flankechen

@xingwangsfu hello , can you teach me to draw the PR curve? I can draw the ROC curve .THX

tzhang2014 avatar Jan 14 '18 08:01 tzhang2014

@AITTSMD @yungs2017 我参考mtcnn-caffe 中的PNet进行训练,在这里的PNet中每次都是随机加载cls/roi/pts三种数据的其中一种进行训练,在加载roi进行训练的时候其他两个的acc和loss就是0, 但是cls_loss=0.693147不变算正常吗

Dawson-huang avatar Feb 22 '18 06:02 Dawson-huang

@yungs2017 请问您在mtcnn-caffe中训练PNet的准确率有提高吗,我训练出来的结果也是跟您的差不多,准确率在75-80%曲线震荡,cls_loss默认为0.693147,如果有提高,可以告诉我您是怎么提高准确率的吗

Dawson-huang avatar Feb 24 '18 07:02 Dawson-huang

@yungs2017 我在准确率为77%的PNet网络来生成RNet网络的数据,但是positive的数据一直迟迟没有生成(运行gen_12net_hard_example.py),你有遇到这种情况吗,是因为准确率比较低的情况吗

Dawson-huang avatar Feb 24 '18 07:02 Dawson-huang

@Dawson-huang 由于caffe-mtcnn中是每次随机加载三种数据中的一种进行训练的,当加载的数据没有cls样本的时候cls的准确率就是变成0.693147。我后来没有利用这种方法,我重新编写了代码,每次都加载三种训练数据,没有出现这种情况。我的pnet准确率是94%左右,和论文的一致,召回率也很好,还有caffe-mtcnn中有的代码是有问题的,不修正过来是永远不会正常训练得到模型的(具体原因应该是作者在上传中没有修改正确回来吧)。在python-layer里面后面用于判断三种样本数据的代码中你仔细检查吧

Kison-Y avatar Feb 24 '18 08:02 Kison-Y

@Dawson-huang huan 生成RNet的positive没有生成是因为你的准确率不够吧,也就是证明召回率很低,你可以先统计下PNet的召回率,然后再确定是否进行下一步还是重新训练PNet

Kison-Y avatar Feb 24 '18 08:02 Kison-Y

@yungs2017 可以说一下召回率具体要怎么计算吗,非常感谢

Dawson-huang avatar Feb 24 '18 08:02 Dawson-huang

@yungs2017 我的RNet数据已经生成一半都还没开始生成positive数据,基本确定召回率极低,同时对于caffe-mtcnn的代码我并没有改正,导致我训练出来的模型是错误的(cls_loss=0.693147),下一步是改正python-layer中加载三种训练数据的代码重新训练,非常感谢您的无私解答,当时训练日志报0.693147的错误时我就在猜想训练数据加载是不是错误

Dawson-huang avatar Feb 24 '18 08:02 Dawson-huang

@Dawson-huang 出现cls_loss=0.693147并没有说明错误,只是该次的训练样本输入中没有分类数据而已,不过我记得是在python-layer中有代码存在错误导致模型训练不正确的。并且在生成样本中有没有错误我就忘记了,当时使用caffe-mtcnn这个项目来训练的时候发现有不小的小问题都是代码中存在一些小错误导致的(不知道作者有没有更正),如果你知道原理,参考其代码自己重新写一份是最好的,而且用时不多。召回率计算你谷歌搜索一下就有出来了,计算方法还是挺简单的。

Kison-Y avatar Feb 24 '18 08:02 Kison-Y

@yungs2017 好的,明白,您用的wider数据集在生成训练数据的时候neg:part:pos:landmark的比例是多少,可以告诉一下吗,我用的特征点数据集是 AITTSMD 大神推荐的Facial_Point_Detection,如果按照caffe-mtcnn中gen_12net_imdb.py的方法生成的比例就是600000:300000:all:all,我得到的大致比例是6:3:2:2,这个比例需要调整吗

Dawson-huang avatar Feb 24 '18 08:02 Dawson-huang

我的比例是3:1:1:2

Kison-Y avatar Feb 24 '18 08:02 Kison-Y

@yungs2017 请问您怎么每次同时加载三种数据的,我人脸框数据集值和特征点数据集不一样,所以每次加载一张图片都会缺少某一种标注数据,还是说您只使用Celeba数据集?

Dawson-huang avatar Feb 24 '18 09:02 Dawson-huang

@Dawson-huang 其实道理不复杂,我举个例子:假如只有两种情况,一种是分类,一种是roi校准,那么标签数据就有6个,前面两个是分类(0和1)后面4个是roi校准数值。如果是分类的情况:0 1 -1 -1 -1 -1,如果是校准的 : -1 -1 0.1 0.2 0.3 0.4 ,那么就在python-layer里面进行判断,当标签为-1的时候证明当前样本输入不是该训练类目,比如判断到前面两个为-1,则证明这个样本输入不是用于训练分类的,如果后面的4个值是-1则证明是用于分类的。这也就是说为什么在mtcnn项目中需要使用python-layer(如果不是就是需要编写c++代码来重新编译caffe以支持这种神经层,但是python-layer的方式更为简单),你仔细看项目中的pythonLayer中的代码,就知道里面的判断就是上面我举例的判断了。

Kison-Y avatar Feb 24 '18 09:02 Kison-Y

@yungs2017 您说的方法和mtcnn-caffe做的是一样的,如在做cls分类的时候: if loss_task == 0: if self.cls_cur == len(self.cls_list): self.cls_cur = 0 random.shuffle(self.cls_list) cur_data = self.cls_list[self.cls_cur] # Get the image index im = cur_data[0] label = cur_data[1] roi = [-1,-1,-1,-1] pts = [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1] if random.choice([0,1])==1: im = cv2.flip(im,random.choice([-1,0,1])) self.cls_cur += 1 return im, label, roi, pts 同样是加载三种训练数据,把roi和pts数据置为-1,那为何还会出现cls_loss=0.693147 现在我有点懵了,您说的同时加载三种数据集是怎么操作的,前辈,求教!

Dawson-huang avatar Feb 24 '18 11:02 Dawson-huang

@AITTSMD 请问你说的准确率为92%是在WIDER的validation set 上的结果吗? 另外我想问 对于P-net,一般Accuracy precision 和 recall 一般来说大概应该是多少比较好呢?谢谢

zezepi avatar Feb 28 '18 10:02 zezepi

accuracy 94%左右 precision 98%左右

AITTSMD avatar Mar 03 '18 02:03 AITTSMD

@AITTSMD @yungs2017 请问你验证网络时候用的数据集是WIDER的验证集嘛?另外我想问一下测试R-Net,O-Net的准确率的时候,是不是从前往后一次测试?这样的话R-Net和O-Net的性能结果是否和PNet效果好坏关系很大?最后一个问题,准确率的计算是产生的正确bb/产生的所有bb吗,感觉和precision没啥区别?

zzzzzz0407 avatar Mar 05 '18 12:03 zzzzzz0407

我怎么觉得得找个每张图片只有一个人头的数据集去测分类准确率?而WIDER-FACE只能算召回率和查准率?

zzzzzz0407 avatar Mar 06 '18 07:03 zzzzzz0407

@zHanami 训练的时候就是统计召回率

Kison-Y avatar Mar 06 '18 07:03 Kison-Y

请问,你mtcnn-caffe的工程中,只是修改了每次都对三个数据进行训练,就达到了精确率94%吗?

shwanliu avatar Apr 19 '18 04:04 shwanliu

@AITTSMD @yungs2017 @Dawson-huang 请问一下mtcnn-caffe中是不是这一句有问题,self.valid_index = np.where(label != -1)[0],应该改成self.valid_index = np.where(label[:,0] != -1)[0]; 改之后loss一直还是nan,卷积输出送入到欧式距离是不是需要归一化处理?采用归一化处理之后,loss正常,请大神实践过的给点指点

BigcowPeking avatar May 25 '18 08:05 BigcowPeking

请问我训练Pnet网络大概到什么时候可以停止比较好

victoriachen08 avatar Jul 06 '18 11:07 victoriachen08

@yungs2017 你好,我训练的p、r、o、三个模型训练时显示的acc分别是0.94,0.98,0.98,但我用one_image_test.py测试时,根本检测不出人脸,我把三个阈值调到0.5以下,会有很多错误的人脸框,请问这是我训练的不正确吗,但我是按作者的步骤一步步来的啊

songyy137222 avatar Jul 16 '18 02:07 songyy137222

@victoriachen08 Pnet recall比较重要,建议建一个validation集,在validation集下recall到97%左右就可以了

flankechen avatar Jul 16 '18 03:07 flankechen

@yungs2017 n你好,请问loss这块你后面是用什么方法

WuFengKeDuo avatar Aug 09 '18 03:08 WuFengKeDuo

@songyy137222 请问您的问题解决了嘛?能否告知是怎么解决的嘛?

Shenkaixuan678 avatar Mar 01 '20 08:03 Shenkaixuan678