论文复现——Sphereface-Pytorch

2023-05-16

最近在写论文,要做一些对比实验,需要以Sphereface为基础。其实实验早该做了,就是一直拖拖拖…唉拖延症患者。今天总算是把github上的代码跑通了,赶紧做下小笔记。因为还要赶论文,就简单写一下,以后再回来改。
本次所使用的源码为:https://github.com/clcarwin/sphereface_pytorch
然而具体的操作步骤说明是有错误的
通过参考:https://www.cnblogs.com/lomooo/p/8523232.html 踩坑并填坑系列
代码中使用的关键点是用MTCNN检测的。想要改成其他数据集的人脸验证,只要修改几个txt文件里的数据。
一、下载Github代码

git clone https://github.com/clcarwin/sphereface_pytorch.git

二、解压预训练模型
sphereface_pytorch/model文件夹中有一个sphere20a_20171020.7z文件,预训练模型就保存在这里面,解压出来,还是放在sphereface_pytorch/model文件夹中,像图中这样。
在这里插入图片描述
三、准备测试数据
首先要下载lfw数据集
请注意要下载原始图片
在这里插入图片描述
然后就会得到lfw.tgz文件

原文中是这样操作的

# lfw.tgz to lfw.zip
tar zxf lfw.tgz; cd lfw; zip -r ../lfw.zip *; cd ..

# lfw evaluation
python lfw_eval.py --model model/sphere20a_20171020.pth

然后呢???duangduang的报错,找不到数据文件夹。
所以请忽视原文的步骤。正确操作如下,首先,位于sphereface_pytorch的文件夹下
在这里插入图片描述

cd ../..
mkdir dataset/face/lfw
cd dataset/face/lfw

然后就可以愉快的把lfw.tgz文件放在这个文件夹里,接着才是

# lfw.tgz to lfw.zip
tar zxf lfw.tgz
cd lfw
zip -r ../lfw.zip *

四、修改测试代码
完成上面步骤的基础上,直接runpython lfw_eval.py --model model/sphere20a_20171020.pth是会出错的。如果没有遇到以下问题,应

1. 问题一

from matlab_cp2tform import get_similarity_transform_for_cv2
File "....\sphereface_pytorch\matlab_cp2tform.py", line 167
"""
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 1266-1267: truncated  \UXXXXXXXX escape**

解决办法一:
在这里插入图片描述
是我孤陋寡闻了吗,别说18年了,现在好像pytorch也没有2.0版本吧
解决办法二:
在这里插入图片描述
查看源码, 'X\U'已经改成了 'X \ U',所以要删掉关于matlab的注释。我当时觉得奇怪,matlab代码已经被注释了,为什么还有影响,就死马当活马医…结果成功了…
打开matlab_cp2tform.py可以看到有大量的注释过的matlab代码
在这里插入图片描述
篇幅有限只截图了一小部分,请将这些全部删掉。和matlab有关的一个不留。
2. 问题二

Traceback (most recent call last):
  File "lfw_eval.py", line 121, in <module>
    folds = KFold(n=6000, n_folds=10, shuffle=False)
  File "lfw_eval.py", line 37, in KFold
    test = base[i*n/n_folds:(i+1)*n/n_folds]
TypeError: slice indices must be integers or None or have an __index__ method

解决办法:
百度了一下,网上大概分析这个错误的原因是 数据的格式问题。需要你将除法符号"/"更改成“//”。
所以把代码lfw_eval.py

 test = base[i*n/n_folds:(i+1)*n/n_folds]

改成

 test = base[i*n//n_folds:(i+1)*n//n_folds]

3. 问题三

Traceback (most recent call last):
  File "lfw_eval.py", line 126, in <module>
    best_thresh = find_best_threshold(thresholds, predicts[train])
IndexError: too many indices for array

解决办法:
造成这个问题不是这个代码错了,而是前面的代码有问题

predicts = np.array(map(lambda line:frd.append(line.strip('\n').split()), predicts)) 
#上面这行为原作者code,疑似有误
for idx, (train, test) in enumerate(folds):
     best_thresh = find_best_threshold(thresholds, predicts[train])
     accuracy.append(eval_acc(best_thresh, predicts[test])) 
     thd.append(best_thresh)

改成

predicts = np.array([k.strip('\n').split() for k in predicts])

五、测试代码
完成以上工作就可以

python lfw_eval.py --model model/sphere20a_20171020.pth

结果

LFWACC=0.9917 std=0.0056 thd=0.3000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

论文复现——Sphereface-Pytorch 的相关文章

随机推荐