SCRFD 是高效率高精度人脸检测算法,2021年5月刚发出来的,速度和精度相比其他算法都有提升,可以同时预测人脸框和关键点。
初始想法就是使用scrfd替换掉我在项目中正在使用的两段式网络,目前项目中基本上是使用yolo或者ssd先检测出对应的目标,然后将这个目标作为输入给另一个小型的网络预测关键点。
从scrfd的文章里的效果来看可以较好的替代现在的实现方式,但是在使用的过程中遇到了一个问题。原文使用的widerface数据集的标注关键点数量为5个,而项目中实际只有四个关键点。因此需要对代码进行修改,经过一段时间的努力已经找到了需要修改的部分,在这里记录一下。
本文所使用的版本如下
https://github.com/deepinsight/insightface
commit:42a241caec2ba137b1900aaaf18ee032a2ff5971
- mmdet/datasets/retinaface.py
# line 31
self.NK = 5 改为
self.NK = 4
# line 52
kps = np.array( values[4:19], dtype=np.float32).reshape((self.NK,3)) 改为
kps = np.array( values[4:16], dtype=np.float32).reshape((self.NK,3))
- mmdet/datasets/pipelines/transforms.py
# line 435 flip函数修改
assert keypointss.shape[1]==5 改为
assert keypointss.shape[1]==4
# line 441
flip_order = [1,0,2,4,3] 改为
flip_order = [1,0,3,2]
- mmdet/models/dense_heads/scrfd_head.py
# line 122
self.NK = 5 改为
self.NK = 4
# line 335
kps_pred = kps_head.permute(2,3,0,1).reshape(-1,10) 改为
kps_pred = kps_head.permute(2,3,0,1).reshape(-1,8)