最近在写论文,要做一些对比实验,需要以Sphereface为基础。其实实验早该做了,就是一直拖拖拖…唉拖延症患者。今天总算是把github上的代码跑通了,赶紧做下小笔记。因为还要赶论文,就简单写一下,以后再回来改。
本次所使用的源码为:https://github.com/clcarwin/sphereface_pytorch
然而具体的操作步骤说明是有错误的
通过参考: 踩坑并填坑系列
代码中使用的关键点是用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