DSFD人脸检测算法的tensorflow实现
DSFD
高性能人脸检测算法
这篇文章不会关注文章的细节内容,主要让大家在tensorflow框架下面跑起来,并能够有个结果,并且方便的削减运算进行自己的线上部署,原理介绍应当参考论文会更为妥当。
最近的人脸检测算法有了不小的进展,包括S3FD,SSH,DSFD,retinanetface pyramidbox 等,都算是single stage的检测算法。在我看来都是类ssd的架构,mutibox的方式来实现。然后,再看新的anchor free的方法,也是类似于该架构,只不过检测的bounding box encode的方式改变了,也引入了关键点检测上的一些东西,所以看来CV领域的几个key的问题都在相互学习,互相取长补短,共同进步。
顺便说一个anchor free的人脸检测还没有被充分的挖掘。
另外,这个代码也不是完整的dsfd 的实现,借鉴了很多的文章的方法,也借了别的repo的代码,仅供参考 :
如果有问题可以mailme,[email protected] 或者留言 ????
1 demo
这里有一个训好的模型
https://pan.baidu.com/s/1SRMoJIcqHRoVydl2XIZ3lA (提取码 m3bg)
参考vis.py 用来可视化
首先看一下demo图片吧,检出约700+人脸,没有论文里面多。(此处原图分辨率是1600x898,, 原图输入只能检测出500个脸,放大两倍能检测出750+,没试过resize到更大了, 用的resnet50)
不过实际的部署上不能这么用,注意固定输入尺寸,和nms的输出数量,不能不考虑耗时。
(caution:第二个图,1300+人脸检出,我也不知道是谁的图,我就拿来用了,如果你觉得属于侵权行为,请联系我,我会删除 :))
关键点还没release出来,稍等吧。这个模型是由300W以及300VW训练出来的,大致±90度之内都可以稳定检测。
train
一步步来,看如何训练
step 1
首先clone下代码,git clone https://github.com/610265158/DSFD-tensorflow.git
step 2
下载数据集widerface
把 WIDER_train, WIDER_val and wider_face_split 放到新建的WIDER 下面,
step 3
然后运行,python prepare_wider_data.py
, 然后会产生train.txt 和val.txt
其中 内容每一行是这个样子:./WIDER/WIDER_val/images/0–Parade/0_Parade_Parade_0_913.jpg| 238,146,450,392,1 612,192,818,426,1 28,100,104,214,1。
也就是如果 你要训练你自己的数据就这样: imgpath| xmin,ymin,xmax,ymax,1 …
step 4
下载imagenet 预训练模型,
http://download.tensorflow.org/models/resnet_v1_50_2016_08_28.tar.gz
当然也可以不加载,从头训练
step 5
查看train_config.py 里面是配置文件,包括gpu配置等,默认配置不动的话,如果数据,txt以及预训练模型都弄好,是可以直接跑起来的,
python train.py
就可以看到有log输出了
ps
train_config.py 里面有很多参数,包括多卡训练的配置,BN GN,是否锁住bn层,学习率,batch size 等,如果跑起来都是可以试一下的 ????
demo
如果你训练好了,会在./model 下有模型里面有checkpoint 文件,
里面内容如下,选好你要转换的模型,
model_checkpoint_path: “epoch_17L2_0.00025.ckpt”
all_model_checkpoint_paths: “epoch_**17 **L2_0.00025.ckpt”
然后在根目录下,运行:
python tools/ckpt.py
将会在model下生成一个detector.pb 这个模型就可以用了,
如果你只想跑一下,看看效果,这里有一个训练好的模型,
https://pan.baidu.com/s/1SRMoJIcqHRoVydl2XIZ3lA (提取码 m3bg)
然后 看一下 vis.py 里面
改一下data_dir 到你想检测的那个目录,会递归的查找jpg png结尾的图片,然后检测。
python vis.py
###后记
dsfd是一个检测性能很强的算法,不过要是部署的话肯定不行,计算量比较大,后续会删减一些结构,进行小网络的实验,都会加到里面。然后自己的线上的算法也该更新一下下了。
另外,还有一个人脸关键点的算法,还没有整理好,一个轻量级的网络,效果还不错,抖动也抑制的比较好,后续都会放出来:)