这两天测试了retinaface在fddb数据集上的表现,记录一下。虽然说本文记录的retinaface的表现,但是适用于所有人脸检测算法,只需要将检测结果保留为fddb的格式就可以了。
首先将retianface官方代码进行修改,按照fddb的需求将检测结果保存。因为mxnet框架的原因,在测试过程中一旦输入尺度变化,就会重新选择最优的CUDNN,这个问题我没有解决。为了保持输入图像尺度一直,fdbb的图像我统一设置为了450x450(450是FDDB数据集上图所有图像最长边),图像大小不满足的就通过copyMakeBorder补全。然后将检测结果保存下来。这里代码我就放一些关键点,其他的可以对照retianface的官网代码修改就行了。
def get_boxes(image_path,detector,modelname)://获取检测结果
global imgid
im = cv2.imread(image_path)
im = cv2.copyMakeBorder(im, 0, 450 - im.shape[0], 0, 450 - im.shape[1], borderType=cv2.BORDER_CONSTANT)
faces, landmarks = detector.detect(im, threshold=args.thresh)
return faces
detector = RetinaFace(args.prefix, args.epoch, args.gpu, network=args.network)//网络初始化
with open(os.path.join(args.save_folder, modelname + '_dets.txt'), 'w') as fw://检测过程
for i, img_name in enumerate(test_dataset):
print(img_name)
image_path = os.path.join(testset_folder,img_name + '.jpg')
dets = get_boxes(image_path,detector,modelname)
fw.write('{:s}\n'.format(img_name))
if dets is None:
fw.write('{:.1f}\n'.format(0))
continue
fw.write('{:.1f}\n'.format(dets.shape[0]))
for k in range(dets.shape[0]):
xmin = dets[k, 0]
ymin = dets[k, 1]
xmax = dets[k, 2]
ymax = dets[k, 3]
score = dets[k, 4]
w = xmax - xmin + 1
h = ymax - ymin + 1
fw.write('{:d} {:d} {:d} {:d} {:.10f}\n'.format(int(xmin), int(ymin), int(w), int(h), score))
这里没有什么坑,直接下载fddb官方测试源码(source-code)就可以了
http://vis-www.cs.umass.edu/fddb/results.html
因为都是c/c++代码,我习惯用windows,所以直接建了一个vs工程,配置了opencv,就可以运行了。嗯,配置opencv的时候需要注意,官网代码对应的opencv版本比较早了,我使用的是opencv3,所有需要添加一些头文件,这个编译遇到问题直接查就能知道,非常简单。另外就是我运行的时候使用release程序崩了,使用debug可以正常运行。运行完保存了两个文档,分别是*ContROC.txt和*DiscROC.txt,长这样(如下图)
下载Python源码,计算第二步ROC曲线的AUC。https://bitbucket.org/marcopede/face-eval
把txt放入对应的文件夹,就可以运行处结果了。没有坑。如下图,temp是我的结果。