SoftwareGift / FeatherNets_Face-Anti-spoofing-Attack-Detection-Challenge-CVPR2019

Code for 3rd Place Solution in Face Anti-spoofing Attack Detection Challenge @ CVPR2019,model only 0.35M!!! 1.88ms(CPU)
Other
933 stars 281 forks source link

Is the test data successful? The model training shows good results, but the single picture test is bad. Can someone help me? #75

Open S130111 opened 5 years ago

S130111 commented 5 years ago

Thank you very much.

lihuikenny commented 5 years ago

你是怎么训练和测试的?我在用rgb图训练(color_train_list.txt),然后在color_test_list.txt上测试,效果一般,我试过作者的pytorch源码,也拿作者训练好的模型在color_test_list.txt上测试过,一开始平均平均的accuracy还不错,慢慢的测试到后面的正样本,效果就很差,整体的TPR@fpr也很差。完全不是paper中的效果(有可能paper中,不是这么测试的?)。后面我自己用caffe复现了他的featherNet,发现如果直接是最后的特征flatten乘1024向量,不接fc,然后做二分类,效果很差,如果接fc变成2维,效果会好很多,如果再fc前加上relu+dropout,accuracy效果会达到92%,tpr@fpr0.15=91%.

不知道作者怎么训练的,有没有作者或者大佬解释一下?欢迎交流

wangzhen6309271 commented 5 years ago

我用作者源码训练的,用训练的模型测试,输出结果一直在变,切换train和eval模式也没用,而且输出结果都是几百,不知道哪里出了问题。用作者训练的模型测试,输出结果倒是0和1,但是切换到eval模式之后,所有的输出都是0,就是无论输入,预测都是0.在train模式下预测结果反而好一点。大佬知道这是什么情况吗? @lihuikenny

zhishao commented 4 years ago

可能是overfitting吧

ckcraig01 commented 4 years ago

@lihuikenny 您好, 有人说feathernetB这样做 (我是使用RGB input):

output1 = net(image1) soft_output = torch.softmax(output1, dim=-1) preds = softoutput.to('cpu').detach().numpy() , predicted = torch.max(soft_output.data, 1) predicted = predicted.to('cpu').detach().numpy() print(predicted)

我总感觉怪怪的, 因为feature有1024, 但是结果只看是index0 or 1. 所以不太懂作者后面接BCEloss (focal loss) 是否真只看这两个index, 谢谢!

lihuikenny commented 4 years ago

@lihuikenny 您好, 有人说feathernetB这样做 (我是使用RGB input):

output1 = net(image1) soft_output = torch.softmax(output1, dim=-1) preds = softoutput.to('cpu').detach().numpy() , predicted = torch.max(soft_output.data, 1) predicted = predicted.to('cpu').detach().numpy() print(predicted)

我总感觉怪怪的, 因为feature有1024, 但是结果只看是index0 or 1. 所以不太懂作者后面接BCEloss (focal loss) 是否真只看这两个index, 谢谢!

@ckcraig01 我很早之前调试过作者pytorch源码,确实只能看到0和1的index。理论上说,虽然是对1024维的向量做二分类,但是最大的logits不可能总是出现在前两维。然而我调试的时候都发现只有0,1的索引。所以我caffe复现的时候,都是额外添加一个fc,将向量变成2维在分类

lihuikenny commented 4 years ago

我用作者源码训练的,用训练的模型测试,输出结果一直在变,切换train和eval模式也没用,而且输出结果都是几百,不知道哪里出了问题。用作者训练的模型测试,输出结果倒是0和1,但是切换到eval模式之后,所有的输出都是0,就是无论输入,预测都是0.在train模式下预测结果反而好一点。大佬知道这是什么情况吗? @lihuikenny

输出的结果在变,是因为作者的源码是每个batch就进行一次测试,而不是整个数据集(即一个epoch)全部读入进行一次测试。

ckcraig01 commented 4 years ago

@lihuikenny 了解了, 看了loss, 也许作者在训练的时候就是对前两维做BCEloss, 从作者的回复看来也是这样, 但这样后面stream mudule产生的其他维度就消失了, 有些可惜所以我本来估计不是这样. 加了FC layer 1024->2 的做法合理, 但作者论文中有提到儘量不想要用 FC就是为了省cost, 所以我一直想不通. 不过目前的input应该是深度图, 我可能还是得单单考虑 RGB, 所以可能找别的work研究看看, 谢谢您

riskeverything commented 4 years ago

你是怎么训练和测试的?我在用rgb图训练(color_train_list.txt),然后在color_test_list.txt上测试,效果一般,我试过作者的pytorch源码,也拿作者训练好的模型在color_test_list.txt上测试过,一开始平均平均的accuracy还不错,慢慢的测试到后面的正样本,效果就很差,整体的TPR@fpr也很差。完全不是paper中的效果(有可能paper中,不是这么测试的?)。后面我自己用caffe复现了他的featherNet,发现如果直接是最后的特征flatten乘1024向量,不接fc,然后做二分类,效果很差,如果接fc变成2维,效果会好很多,如果再fc前加上relu+dropout,accuracy效果会达到92%,tpr@fpr0.15=91%.

不知道作者怎么训练的,有没有作者或者大佬解释一下?欢迎交流

你好,我想问下,你接fc时候是多少层,我看了作者的代码,确实是只用前两个神经元输出做loss,但是我觉得不是很合理,这样子相当于后面的神经元完全没有用到。

riskeverything commented 4 years ago

你是怎么训练和测试的?我在用rgb图训练(color_train_list.txt),然后在color_test_list.txt上测试,效果一般,我试过作者的pytorch源码,也拿作者训练好的模型在color_test_list.txt上测试过,一开始平均平均的accuracy还不错,慢慢的测试到后面的正样本,效果就很差,整体的TPR@fpr也很差。完全不是paper中的效果(有可能paper中,不是这么测试的?)。后面我自己用caffe复现了他的featherNet,发现如果直接是最后的特征flatten乘1024向量,不接fc,然后做二分类,效果很差,如果接fc变成2维,效果会好很多,如果再fc前加上relu+dropout,accuracy效果会达到92%,tpr@fpr0.15=91%.

不知道作者怎么训练的,有没有作者或者大佬解释一下?欢迎交流

而且,我接了fc和dropout,非常容易过拟合。训练精度到了98,验证集只有30-40,不知道问题出在哪里。