Home

Awesome

简介

ZQCNN是一款推理框架,可以在windows, linux 和 arm-linux下运行。同时有一些人脸检测、识别相关的demo。

主开发环境 :VS2015 with Update 3

MKL下载地址:此处下载

核心模块支持linux:

如果按照build-with-cmake.md不能完全编译,可以只编译ZQ_GEMM,ZQCNN,和其他你想测试的程序

核心模块支持arm-linux:

如果按照build-with-cmake.md不能完全编译,可以只编译ZQ_GEMM,ZQCNN,和其他你想测试的程序

BUG: cmake .. -DSIMD_ARCH_TYPE=arm64 -DBLAS_TYPE=openblas_zq_gemm

理想情况下会使用openblas和ZQ_GEMM较快的一方来计算卷积(我通过在cortex-A72上测试时间来选择分支)。然而目前这个选项并不能达到预期效果, 需要手工注在ZQ_CNN_CompileConfig.h里定义

#define ZQ_CNN_USE_ZQ_GEMM 1
#define ZQ_CNN_USE_BLAS_GEMM 1

可以注释掉

line 67: #if defined(ZQ_CNN_USE_BOTH_BLAS_ZQ_GEMM)
line 70: #endif

训练相关

pytorch训练SSD: https://github.com/zuoqing1988/pytorch-ssd-for-ZQCNN

训练性别年龄:https://github.com/zuoqing1988/train-GenderAge

训练MTCNN:https://github.com/zuoqing1988/train-mtcnn

训练SSD: https://github.com/zuoqing1988/train-ssd

训练MTCNN用于人头检测:https://github.com/zuoqing1988/train-mtcnn-head

更新日志

2022-08-18日更新: 优化了视频模式下人脸106点pipeline,新加入了一个头部姿态视线模型

demo程序在SampleVideoFaceDetection_Interface.cpp

原始106点pb模型和头部姿态视线pb模型在TensorFlow_to_ZQCNN里

2022-04-20日更新: 支持pytorch-ssd-for-ZQCNN训练的SSD模型

2020-05-08日更新: 添加文字识别示例SampleOCR

暂时还没有文字检测能力,需要输入的图是裁剪好的

模型下载地址

链接:https://pan.baidu.com/s/1O75LRBjXWwPXqAshLMJV3w 提取码:f2q8

2020-03-22日更新: 提供一组可以检测到带口罩的人脸的MTCNN模型

model\det1-dw20-plus.zqparams
model\det1-dw20-plus.nchwbin

model\det2-dw24-p0.zqparams	
model\det2-dw24-p0.nchwbin

model\det3-dw48-p0.zqparams
model\det3-dw48-p0.nchwbin

2019-07-08日更新:ZQCNN模型转MNN模型代码

点此阅读

2019-05-28日更新:开源一个准商用级106点模型

ZQCNN格式:在model文件夹det5-dw112

mxnet格式:链接:https://pan.baidu.com/s/19DTG3rmkct8AiEu0l3DYjw 提取码:qjzk

2019-03-16日更新:达到800星,公布更准的106点landmark模型

ZQCNN格式:det5-dw96-v2smodel文件夹中det5-dw96-v2s.zqparams, det5-dw96-v2s.nchwbin

mxnet格式:Lnet106_96_v2s提取码:r5h2

2019-02-14日更新:达到700星,公布人脸检测精选模型

ZQCNN格式:精选6种Pnet、2种Rnet、2种Onet、2种Lnet

六种Pnet输入尺寸计算量(不计bbox)备注
Pnet20_v00320x2408.5 M对标libfacedetection
Pnet20_v0320x24011.6 M对标libfacedetection
Pnet20_v1320x24014.6 M
Pnet20_v2320x24018.4 M对标原版pnet
Pnet16_v0256x1927.5 Mstride=4
Pnet16_v1256x1929.8 Mstride=4
两种Rnet输入尺寸计算量备注
Rnet_v124x240.5 M对标原版Rnet
Rnet_v224x241.4 M
两种Onet输入尺寸计算量备注
Onet_v148x482.0 M不含landmark
Onet_v248x483.2 M不含landmark
两种Lnet输入尺寸计算量备注
Lnet_v248x483.5 Mlnet_basenum=16
Lnet_v248x4810.8 Mlnet_basenum=32

2019-01-31日更新:达到600星,公布MTCNN人头检测模型

hollywoodheads数据训练的,效果一般,凑合用吧

人头检测mtcnn-headmxnet-v0&zqcnn-v0

2019-01-24日更新:核心模块支持linux

如果按照build-with-cmake.md不能完全编译,可以只编译ZQ_GEMM,ZQCNN,和其他你想测试的程序

2019-01-17日更新

更改了ZQ_CNN_MTCNN.h

(1)init时设置thread_num小于1时可以强制Pnet_stage执行多线程,也就是会分块,对于大图找小脸来说可以防止内存爆掉

(2)rnet/onet/lnet的尺寸可以不是24/48/48,但是只支持宽高相等

(3)rnet/onet/lnet分批处理,在脸非常多时可以减小内存占用

2019-01-15日更新:庆祝达到500星,发放106点landmark模型

mxnet格式&zqcnn格式

2019-01-04日更新:庆祝达到400星,发放快速人脸模型

mxnet格式

zqcnn格式

v3版本还不够好,后面还将出v4版本,大概就是下面这个图的意思

MTCNN-v4示意图

2018-12-25日更新:不开源的106点landmark

生活比较拮据,挣点外快。

landmark106-normal-1000.jpg是model\det5-dw48-1000.nchwbin生成的landmark

landmark106-normal.jpg,与landmark106-big.jpg是我训练的两个没开源的模型

其中normal模型2.1M,计算量11.4M,PC单线程耗时0.6-0.7ms,big模型7.56M,计算量36.4M,PC单线程耗时1.5-1.6ms

2018-12-20日更新:添加MTCNN106点landmark模型

在SampleMTCNN里试用(放出来的只是一个不太好的,更好的等着卖钱)

SampleLnet106有计时,单线程约0.6~0.7ms (E5-1650V4, 3.6GHz)

2018-12-03日更新:将模型编译到代码里面

ZQCNN.sln里 model2code 可以将模型编译成代码

model2code.exe param_file model_file code_file prefix

然后在你的工程里面添加

#include"code_file"

使用下面的函数加载模型

LoadFromBuffer(prefix_param, prefix_param_len, prefix_model, prefix_model_len)

2018-11-21日更新

支持mxnet-ssd训练的模型,mean_val需要设成127.5才能在SampleSSD里面正确运行。

但是使用ReLU训练的好像不正确,我用PReLU训练一个,重头训练的,只有mAP=0.48凑合着看吧,点此下载

更改模型之后必须用imagenet先训练分类模型,然后再训练SSD,才能把mAP弄上去。

2018-11-14日更新

(1)优化ZQ_GEMM,3.6GHz的机器上MKL峰值约46GFLOPS, ZQ_GEMM约32GFLOPS。使用ZQ_GEMM人脸模型总体时间约为使用MKL时1.5倍。

注意:使用VS2017编译出来的ZQ_GEMM比VS2015快,但是SampleMTCNN多线程运行是错的(可能OpenMP的支持规则不同?)。

(2)加载模型时可以去掉非常小的权重。当你发现模型比预料中慢很多时,多半是由于权重值太小造成的。

2018-11-06日更新

(1)去掉layers里所有omp多线程的代码,计算量太小,速度比单线程更慢

(2)cblas_gemm可以选择MKL,不过3rdparty带的mkl在我机器上很慢,dll比较大,我没放在3rdparty\bin里,请从此处下载

2018-10-30日更新2:MTCNN大图找小脸建议先用高斯滤波

2018-10-30日更新:BatchNorm的eps问题

(1)BatchNorm、BatchNormScale的默认eps都是0

(2)如果是用mxnet2zqcnn从mxnet转过来模型,转的过程中会把eps加到var上面当做新的var

(3)如果是从其他平台转过来模型,要么手工把eps加到var上面,要么在BatchNorm、BatchNormScale后面加上eps=?(?为该平台这个层的eps值)

注意:为了防止除0错,在除var的时候是这么计算的sqrt(__max(var+eps,1e-32)),也就是说如果var+eps小于1e-32,会与理论值略有不同。 不过今天修改之后下面几个人脸模型的LFW的精度反而与minicaffe的结果一模一样了。

2018-10-26日更新

MTCNN支持多线程,大图找小脸而且脸多的情况下,8线程可以取得单线程4倍以上效果,请用data\test2.jpg来测试

2018-10-15日更新

改进MTCNN的nms策略:1.每个scale的Pnet的nms的局部极大必须覆盖一定数量的非极大,数量在参数中设置; 2.当Pnet的分辨率太大时,nms进行分块处理。

2018-09-25日更新

支持insightface的GNAP,自动转模型使用mxnet2zqcnn,查看mxnet2zqcnn。可以试用MobileFaceNet-GNAP

2018-09-20日更新

(1)更新人脸识别模型tar-far精度的测试方法,可以按照步骤How-to-evaluate-TAR-FAR-on-your-dataset自行构造测试集测试模型精度。

(2)按照(1)我清洗CASIA-Webface构造了两个测试集webface1000X50webface5000X20,并测试了我开源的几个主要人脸识别模型的精度。

2018-09-13日更新

(1)支持从内存加载模型

(2)增加编译配置ZQ_CNN_CompileConfig.h,可以选择是否使用_mm_fmadd_ps, _mm256_fmadd_ps (可以测一下速度看看到底快了还是慢了)。

2018-09-12日更新 利用insightface训练112*96(即sphereface的尺寸)步骤: InsightFace: how to train 112*96

2018-08-15日更新

(1)添加自然场景文本检测,模型从TextBoxes转过来的。我个人觉得速度太慢,而且准确度不高。

注意这个项目里用的PriorBoxLayer与SSD里的PriorBoxLayer是不同的,为了导出ZQCNN格式的权重我修改了deploy.prototxt保存为deploy_tmp.prototxt。 从此处下载模型。

(2)添加图片鉴黄,模型从open_nsfw转过来的,准确度高不高我也没测过。

此处下载模型。

2018-08-10日更新

成功转了mxnet上的GenderAge-r50模型 以及Arcface-LResNet100E-IR,与转MobileFaceNet模型步骤一样。 查看mxnet2zqcnn

下面Model Zoo 有我转好的模型,比自动转出来的应该略快。

打开ZQCNN.sln运行SampleGenderAge查看效果。我E5-1650V4的CPU,单线程时间波动很大,均值约1900-2000ms,四线程400多ms。

2018-08-09日更新

添加mxnet2zqcnn,成功将mxnet上的MobileFaceNet转成ZQCNN格式(不能保证其他模型也能转成功,ZQCNN还不支持很多Layer)。查看mxnet2zqcnn

2018-08-07日更新

BUG修复:之前Convolution, DepthwiseConvolution, InnerProduct, BatchNormScale/Scale默认with_bias=true, 现在改成默认with_bias=false。也就是之前的代码无法加载不带bias的这几个Layer。

示例,如下这样一个Layer,以前会默认为有bias_term,现在默认没有bias_term

Convolution name=conv1 bottom=data top=conv1 num_output=10 kernel_size=3 stride=1

2018-08-06日更新

增加人脸识别在LFW数据库的精度测试。打开ZQlibFaceID.sln可以看到相关Project。

由于C++代码的计算精度与matlab略有差距,统计出的精度也有一些差别,但是相差在0.1%以内。

2018-08-03日更新

支持多线程(通过openmp加速)。请注意,目前多线程反而比单线程慢

2018-07-26日更新

支持MobileNet-SSD。caffemodel转我用的模型参考export_mobilenet_SSD_caffemodel_to_nchw_binary.m。需要编译出matcaffe才行。 你可以试试这个版本caffe-ZQ

2018-06-05日更新

跟上时代潮流、发布源码。 忘了说需要依赖openblas,我是直接用的mini-caffe里面的那个版本,自己编译出来的很慢。

Model Zoo

人脸检测

MTCNN-author-versionMTCNN转的格式

MTCNN-ZQ-version

人脸识别(如无说明,模型都是ms1m-refine-v2训练的)

模型LFW精度(ZQCNN)LFW精度(OpenCV3.4.2)LFW精度(minicaffe)耗时 (ZQCNN)备注
MobileFaceNet-res2-6-10-2-dim12899.67%-99.55%(matlab crop), 99.72-99.60%(C++ crop)99.63%-99.65%(matlab crop), 99.68-99.70%(C++ crop)99.62%-99.65%(matlab crop), 99.68-99.60%(C++ crop)时间与dim256接近网络结构与dim256一样,只不过输出维数不同
MobileFaceNet-res2-6-10-2-dim25699.60%-99.60%(matlab crop), 99.62-99.62%(C++ crop)99.73%-99.68%(matlab crop), 99.78-99.68%(C++ crop)99.55%-99.63%(matlab crop), 99.60-99.62%(C++ crop)单线程约21-22ms,四线程约11-12ms, 3.6GHz网络结构在下载链接里,用faces_emore训练的
MobileFaceNet-res2-6-10-2-dim51299.52%-99.60%(matlab crop), 99.63-99.72%(C++ crop)99.70%-99.67%(matlab crop), 99.77-99.77%(C++ crop)99.55%-99.62%(matlab crop), 99.62-99.68%(C++ crop)时间与dim256接近网络结构与dim256一样,只不过输出维数不同。感谢moli训练此模型
模型LFW精度(ZQCNN)LFW精度(OpenCV3.4.2)LFW精度(minicaffe)耗时 (ZQCNN)备注
MobileFaceNet-res4-8-16-4-dim12899.72%-99.72%(matlab crop), 99.72-99.68%(C++ crop)99.82%-99.83%(matlab crop), 99.80-99.78%(C++ crop)99.72%-99.72%(matlab crop), 99.72-99.68%(C++ crop)时间与dim256接近网络结构与dim256一样,只不过输出维数不同
MobileFaceNet-res4-8-16-4-dim25699.78%-99.78%(matlab crop), 99.75-99.75%(C++ crop)99.82%-99.82%(matlab crop), 99.80-99.82%(C++ crop)99.78%-99.78%(matlab crop), 99.73-99.73%(C++ crop)单线程约32-33ms,四线程约16-19ms, 3.6GHz网络结构在下载链接里,用faces_emore训练的
MobileFaceNet-res4-8-16-4-dim51299.80%-99.73%(matlab crop), 99.85-99.83%(C++ crop)99.83%-99.82%(matlab crop), 99.87-99.83%(C++ crop)99.80%-99.73%(matlab crop), 99.85-99.82%(C++ crop)时间与dim256接近网络结构与dim256一样,只不过输出维数不同。感谢moli训练此模型
模型\测试集webface1000X50thresh@ FAR=1e-7TAR@ FAR=1e-7thresh@ FAR=1e-6TAR@ FAR=1e-6thresh@ FAR=1e-5TAR@ FAR=1e-5
MobileFaceNet-res2-6-10-2-dim1280.787859.274%0.6661640.459%0.4585592.716%
MobileFaceNet-res2-6-10-2-dim2560.777087.839%0.6387240.934%0.4318292.605%
MobileFaceNet-res2-6-10-2-dim5120.766998.197%0.6345238.774%0.4157293.000%
MobileFaceNet-res4-8-16-4-dim1280.792689.626%0.6577048.252%0.4543195.576%
MobileFaceNet-res4-8-16-4-dim2560.768589.220%0.6285246.195%0.4001096.929%
MobileFaceNet-res4-8-16-4-dim5120.762879.296%0.6255544.775%0.3904797.347%
模型\测试集webface5000X20thresh@ FAR=1e-7TAR@ FAR=1e-7thresh@ FAR=1e-6TAR@ FAR=1e-6thresh@ FAR=1e-5TAR@ FAR=1e-5
MobileFaceNet-res2-6-10-2-dim1280.7093329.558%0.5173285.160%0.4510894.313%
MobileFaceNet-res2-6-10-2-dim2560.6889728.376%0.4882085.278%0.4238694.244%
MobileFaceNet-res2-6-10-2-dim5120.6812627.708%0.4726085.840%0.4072794.632%
MobileFaceNet-res4-8-16-4-dim1280.7123832.153%0.5139189.525%0.4466796.583%
MobileFaceNet-res4-8-16-4-dim2560.6849030.639%0.4609291.900%0.3919897.696%
MobileFaceNet-res4-8-16-4-dim5120.6730332.404%0.4521692.453%0.3834498.003%
模型\测试集TAO ids:6606,ims:87210thresh@ FAR=1e-7TAR@ FAR=1e-7thresh@ FAR=1e-6TAR@ FAR=1e-6thresh@ FAR=1e-5TAR@ FAR=1e-5
MobileFaceNet-res2-6-10-2-dim1280.9220401.282%0.8810706.837%0.7830241.740%
MobileFaceNet-res2-6-10-2-dim2560.9136101.275%0.8675007.081%0.7609942.188%
MobileFaceNet-res2-6-10-2-dim5120.9065701.448%0.8606107.299%0.7548841.956%
MobileFaceNet-res4-8-16-4-dim1280.9209801.347%0.8823306.795%0.7871141.856%
MobileFaceNet-res4-8-16-4-dim2560.9086201.376%0.8639707.083%0.7597542.430%
MobileFaceNet-res4-8-16-4-dim5120.9071001.353%0.8619006.948%0.7551842.241%
模型\测试集ZQCNN-Face_5000_X_20thresh@ FAR=1e-8TAR@ FAR=1e-8thresh@ FAR=1e-7TAR@ FAR=1e-7thresh@ FAR=1e-6TAR@ FAR=1e-6
MobileFaceNet-GNAP0.7353711.722%0.6990320.110%0.6573433.189%
MobileFaceNet-res2-6-10-2-dim1280.6477240.527%0.6048555.345%0.5557170.986%
MobileFaceNet-res2-6-10-2-dim2560.6164742.046%0.5756155.801%0.5285270.622%
MobileFaceNet-res2-6-10-2-dim5120.5972544.651%0.5569058.220%0.5113472.294%
MobileFaceNet-res4-8-16-4-dim1280.6451947.735%0.6024762.882%0.5534277.777%
MobileFaceNet-res4-8-16-4-dim2560.5822956.977%0.5458269.118%0.4976382.161%
MobileFaceNet-res4-8-16-4-dim5120.5829654.731%0.5421968.613%0.4917482.812%
MobileFaceNet-res8-16-32-8-dim5120.5805861.826%0.5384175.281%0.4909886.554%
模型\测试集ZQCNN-Face_5000_X_20thresh@ FAR=1e-8TAR@ FAR=1e-8thresh@ FAR=1e-7TAR@ FAR=1e-7thresh@ FAR=1e-6TAR@ FAR=1e-6
ArcFace-r34-v2(非本人训练)0.6195347.103%0.5737562.207%0.5222676.758%
ArcFace-r50 (ms1m-refine-v1非本人训练)0.6129950.594%0.5665865.757%0.5163779.207%
ArcFace-r100 (非本人训练)0.5735067.434%0.5313679.944%0.4816490.147%
模型\测试集ZQCNN-Face_12000_X_10-40thresh@ FAR=1e-8TAR@ FAR=1e-8thresh@ FAR=1e-7TAR@ FAR=1e-7thresh@ FAR=1e-6TAR@ FAR=1e-6
MobileFaceNet-res2-6-10-2-dim1280.6450739.100%0.6034753.638%0.5549269.516%
MobileFaceNet-res2-6-10-2-dim2560.6158939.864%0.5740254.179%0.5259669.658%
MobileFaceNet-res2-6-10-2-dim5120.6003041.309%0.5580655.676%0.5098470.979%
MobileFaceNet-res4-8-16-4-dim1280.6444345.764%0.6006061.564%0.5516876.776%
MobileFaceNet-res4-8-16-4-dim2560.5887952.542%0.5449767.597%0.4954781.495%
MobileFaceNet-res4-8-16-4-dim5120.5849251.752%0.5408567.104%0.4901081.836%
MobileFaceNet-res8-16-32-8-dim5120.5811961.412%0.5370075.520%0.4899786.647%
模型\测试集ZQCNN-Face_12000_X_10-40thresh@ FAR=1e-8TAR@ FAR=1e-8thresh@ FAR=1e-7TAR@ FAR=1e-7thresh@ FAR=1e-6TAR@ FAR=1e-6
ArcFace-r34-v2 (非本人训练)0.6190445.072%0.5717360.964%0.5206275.789%
ArcFace-r50(ms1m-refine-v1非本人训练)0.6141248.155%0.5674963.676%0.5153778.138%
ArcFace-r100 (非本人训练)0.5789163.854%0.5333778.129%0.4807989.579%

更多人脸模型请查看Model-Zoo-for-Face-Recognition

表情识别

FacialEmotion 七类表情用Fer2013训练

性别年龄识别

GenderAge-ZQ 使用train-GenderAge训练出来的模型

目标检测

MobileNetSSDMobileNet-SSD转的格式

MobileNetSSD-Mouth 用于SampleDetectMouth

文字检测

TextBoxesTextBoxes转的格式

图片鉴黄

NSFWopen_nsfw转的格式

相关文章

(1)人脸特征向量用整数存储精度损失多少?

(2)千万张脸的特征向量,计算相似度提速?

(3)打造一款比mini-caffe更快的Forward库

(4)向量点积的精度问题

(5)ZQCNN支持Depthwise Convolution并用mobilenet改了一把SphereFaceNet-10

(6)跟上时代潮流,发布一些源码

(7)ZQCNN支持SSD,比mini-caffe快大概30%

(8)ZQCNN的SSD支持同一个模型随意改分辨率

(9)ZQCNN格式的99.78%精度的人脸识别模型

(10)ZQCNN增加人脸识别在LFW数据集上的测试代码

(11)抱紧mxnet的大腿,着手写mxnet2zqcnn

(12)大规模人脸测试集,及如何打造自己的人脸测试集

(13)普通卷积、mobilenet卷积、全局平均池化的矩阵描述

(14)ZQ_FastFaceDetector更快更准的人脸检测库

Android编译说明

  1. 修改build.sh中的ndk路径和opencv安卓sdk的路径
  2. 修改CMakeLists.txt 从原来的 #add_definitions(-march=native) add_definitions(-mfpu=neon) add_definitions(-mfloat-abi=hard) 改为 #add_definitions(-march=native) add_definitions(-mfpu=neon) add_definitions(-mfloat-abi=softfp)
  3. 这样应该可以编译两个库ZQ_GEMM和ZQCNN了.如果要编译SampleMTCNN可以按照错误提示修改不能编译的部分,主要是openmp和计时函数.