AI
face
- 1. 资料
- 2. insightface
- 2.1 环境安装
- 2.2 训练
- 2.2.1 前处理
- 2.2.2 打包
- 2.2.3 训练
- 2.3 运行
- 2.3.1 face detect
- 2.3.1 face detect
1. 资料
- MTCNN 检测人脸
- insightface人脸识别(mainly based on MXNet)
- convert mxnet to caffe
2. insightface
2.1 环境安装
- pip3:sudo apt install python3-pip
- numpy:pip3 install --user numpy scipy matplotlib
- pip install mxnet-cu101
[1] cuda版本是10.1 - pip install opencv-python
- insightface下载
2.2 训练
2.2.1 前处理
- 基于检测网络检测对齐,如MTCNN
- 基于属性网络去除戴墨镜、口罩的
- 删除角度大于60度的
- 删除id文件数小于5的
2.2.2 打包
- mxnet框架中的脚本 im2rec.py
- 生成文件夹内的文件列表 (name.lst)
(1) python im2rec.py --list --recursive name data_dir - 生成二进制文件(name.rec, name.idx)
(1) python im2rec.py name.lst data_dir
2.2.3 训练
- 修改文件配置信息 config.py,最基本的配置,可通过后续设置覆盖
config.bn_mom = 0.9 # 反向传播的momentum
config.workspace = 256 # mxnet需要的缓冲空间
config.emb_size = 512 # 输出特征向量的维度# False 保存fc参数,finetune时需要; True 不保存fc参数,最后阶段训练时可设置true
# False, 模型转换为caffe, 需要删除fc7; True, 不需要删除fc7
config.ckpt_embedding = Falseconfig.net_act = 'prelu' # 'prelu' 加速时可改成relu,精度比prelu差些
config.val_targets = ['lfw', 'cfp_fp', 'agedb_30'] # 验证集,即.bin为后缀的文件, 开始训的时候添加, 稳定时可不加
config.ce_loss = True # Cross-Entropy loss,一种改进的交叉熵损失函数
config.fc7_lr_mult = 1.0 # 学习率的倍数
config.fc7_wd_mult = 1.0 # 权重刷衰减的倍数# BN融合这里不改, 直接在网络修改. 如果有bn层,加不加bias都一样,因为bn运算会把bias减掉
config.fc7_no_bias = True # False
config.data_rand_mirror = True # 数据随机进行镜像翻转
config.data_cutoff = False # 数据进行随机裁剪
config.data_color = 0 # 估计是数据进行彩色增强
config.count_flops = True # 是否计算一个网络占用的浮点数内存# 当 default.dataset = 'emore' 时使用,使用其他数据集对应设置,默认名字 train.rec, train.idx
dataset.emore.dataset_path = '/home/insightface/recognition/alg_test' # 数据打包生成的文件所在的目录, 分辨率必须匹配
dataset.emore.rec_name = 'data_addlist.rec' # 打包生成的二进制文件名
dataset.emore.num_classes = 1193 # 数据集的id(类的个数: ls -l | wc -l)
dataset.emore.image_shape = (64,64,3) # 根据模型输入分辨率修改default.network = 'r100'
default.pretrained = 'models/emore/model' # model是文件前缀, 例如 model-002.json
default.pretrained_epoch = 2 # 如果使用预训练模型, 需匹配预训练模型的 model-002.json default.dataset = 'emore' # default dataset
default.loss = 'arcface' # 外边传进来会覆盖
default.frequent = 20 # 每20个批次打印一次准确率等log
default.verbose = 2000 # 跑2000次迭代跑一次验证集
default.kvstore = 'device' #键值存储default.end_epoch = 10000 # 结束的epoch,1个epoch是所有图片训练完一轮,1 epoch 包含的迭代数是:总图片数/batch_size
default.lr = 0.01 # 初始学习率,从大到小测试,有预训练模型就小点,没有预训练模型就大点
default.wd = 0.0005
default.mom = 0.9
default.per_batch_size = 48 # 跑完所有的ID需要的batch次数(8的倍数 过大会报错:oom, 内存不足)
default.ckpt = 0
default.lr_steps = '100000,160000,220000' # 降低学习率的epoch的地方
default.models_root = './models' # 模型保存的位置
-
模型输入尺寸发生修改,则修改文件symbol_utils.py修改
(1)函数 get_fc1()内 elif fc_type == “GDC”: conv_6_dw = Linear(kernel)
[1] 需要修改GDC的kernel, 保证最后FC层输出和特征值的维度一致
(2)input:128 (88);input:64 (44);input:112 (7*7) -
训练命令
(1)大模型:CUDA_VISIBLE_DEVICES=‘0’ python -u train.py --network r100 --loss arcface --dataset emore
(2)小模型:softmax + arcface
[1] CUDA_VISIBLE_DEVICES=‘0’ python3 -u train.py --network y1 --loss softmax --dataset emore
[2] CUDA_VISIBLE_DEVICES=‘0’ python3 -u train.py --network y1 --loss arcface --dataset emore
[3] 当【1】loss 降得差不多, acc 较高, 达到收敛时训练【2】阶段,将【1】训出的模型作为【2】的预训练模型
(3)备注
[1] 下载开源的预训练模型需注意是否包含fc7层,需判断预训练模型输出的特征维度是否和我们选择的一致,不一致时需不包含fc7层的预训练模型。
(4)BN融合需使用带bias的模型
步骤一 symbol_utils.py 修改(1) line 26 函数 Linear 将 no_bias=True 改为 false注释: Linear 是没有激活函数, 保持线性输入(2) 函数get_fc1()内GDC 小模型的FC层(mobilefacenet), 如果有no_bias 改为falsefc_type=='E' 大模型的FC层(resnet34), 如果有no_bias 改为false步骤二 fmobilefacenet.py 修改(1) Conv 函数, 卷积+BN+active(relu等)把 no_bias=True 改为 false(2) Linear 函数, 卷积+BN, 因为是线性的, 不需加激活函数把 no_bias=True 改为 false(3) ConvOnly 函数, 卷积把 no_bias=True 改为 false步骤三 执行命令
# 生成 bias 的模型, 产生一个模型文件就可以
CUDA_VISIBLE_DEVICES='0' python3 -u train.py --network y1 --loss softmax --dataset emore
- 损失函数
(1)curricularface 损失函数 与 arcface平级
(2)小模型:softmax loss + arcface loss/curricularface loss
(3)大模型:arcface loss/curricularface loss
(4)前提都需要预训练模型
2.3 运行
2.3.1 face detect
- thirdparty 环境安装
pip install onnxruntime -i /
pip install onnx -i /
pip install tqdm
pip install albumentations
pip install cython
- insightface 安装
cd ./insightface/python-package/insightface/thirdparty/face3d/mesh/cython
python setup.py build_ext -i
- 执行脚本
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image# Method-1, use FaceAnalysis
app = FaceAnalysis(allowed_modules=['detection']) # enable detection model only
#app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))# Method-2, load model directly
detector = insightface.model_zoo.get_model('your_detection_model.onnx')
detector.prepare(ctx_id=0, input_size=(640, 640))# t1.jpg,不用加.jpg; 图片path: ./insightface/python-package/insightface/data/images
img = ins_get_image('t1')
faces = app.get(img)
print("faces info:\t", faces)
rimg = app.draw_on(img, faces)
cv2.imwrite("./ldh_output.jpg", rimg)
2.3.1 face detect
- 模型下载
(1) model_zoo下载路径
(2) buffalo_s模型下载
- sample code
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_imageapp = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
img = ins_get_image('t1')
faces = app.get(img)handler = insightface.model_zoo.get_model('./models/w600k_mbf.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
handler.prepare(ctx_id=0)
img = ins_get_image('t1')
feature = handler.get(img, faces[0])
print("size of feature:", len(feature))
print("feature:", feature)
AI
face
- 1. 资料
- 2. insightface
- 2.1 环境安装
- 2.2 训练
- 2.2.1 前处理
- 2.2.2 打包
- 2.2.3 训练
- 2.3 运行
- 2.3.1 face detect
- 2.3.1 face detect
1. 资料
- MTCNN 检测人脸
- insightface人脸识别(mainly based on MXNet)
- convert mxnet to caffe
2. insightface
2.1 环境安装
- pip3:sudo apt install python3-pip
- numpy:pip3 install --user numpy scipy matplotlib
- pip install mxnet-cu101
[1] cuda版本是10.1 - pip install opencv-python
- insightface下载
2.2 训练
2.2.1 前处理
- 基于检测网络检测对齐,如MTCNN
- 基于属性网络去除戴墨镜、口罩的
- 删除角度大于60度的
- 删除id文件数小于5的
2.2.2 打包
- mxnet框架中的脚本 im2rec.py
- 生成文件夹内的文件列表 (name.lst)
(1) python im2rec.py --list --recursive name data_dir - 生成二进制文件(name.rec, name.idx)
(1) python im2rec.py name.lst data_dir
2.2.3 训练
- 修改文件配置信息 config.py,最基本的配置,可通过后续设置覆盖
config.bn_mom = 0.9 # 反向传播的momentum
config.workspace = 256 # mxnet需要的缓冲空间
config.emb_size = 512 # 输出特征向量的维度# False 保存fc参数,finetune时需要; True 不保存fc参数,最后阶段训练时可设置true
# False, 模型转换为caffe, 需要删除fc7; True, 不需要删除fc7
config.ckpt_embedding = Falseconfig.net_act = 'prelu' # 'prelu' 加速时可改成relu,精度比prelu差些
config.val_targets = ['lfw', 'cfp_fp', 'agedb_30'] # 验证集,即.bin为后缀的文件, 开始训的时候添加, 稳定时可不加
config.ce_loss = True # Cross-Entropy loss,一种改进的交叉熵损失函数
config.fc7_lr_mult = 1.0 # 学习率的倍数
config.fc7_wd_mult = 1.0 # 权重刷衰减的倍数# BN融合这里不改, 直接在网络修改. 如果有bn层,加不加bias都一样,因为bn运算会把bias减掉
config.fc7_no_bias = True # False
config.data_rand_mirror = True # 数据随机进行镜像翻转
config.data_cutoff = False # 数据进行随机裁剪
config.data_color = 0 # 估计是数据进行彩色增强
config.count_flops = True # 是否计算一个网络占用的浮点数内存# 当 default.dataset = 'emore' 时使用,使用其他数据集对应设置,默认名字 train.rec, train.idx
dataset.emore.dataset_path = '/home/insightface/recognition/alg_test' # 数据打包生成的文件所在的目录, 分辨率必须匹配
dataset.emore.rec_name = 'data_addlist.rec' # 打包生成的二进制文件名
dataset.emore.num_classes = 1193 # 数据集的id(类的个数: ls -l | wc -l)
dataset.emore.image_shape = (64,64,3) # 根据模型输入分辨率修改default.network = 'r100'
default.pretrained = 'models/emore/model' # model是文件前缀, 例如 model-002.json
default.pretrained_epoch = 2 # 如果使用预训练模型, 需匹配预训练模型的 model-002.json default.dataset = 'emore' # default dataset
default.loss = 'arcface' # 外边传进来会覆盖
default.frequent = 20 # 每20个批次打印一次准确率等log
default.verbose = 2000 # 跑2000次迭代跑一次验证集
default.kvstore = 'device' #键值存储default.end_epoch = 10000 # 结束的epoch,1个epoch是所有图片训练完一轮,1 epoch 包含的迭代数是:总图片数/batch_size
default.lr = 0.01 # 初始学习率,从大到小测试,有预训练模型就小点,没有预训练模型就大点
default.wd = 0.0005
default.mom = 0.9
default.per_batch_size = 48 # 跑完所有的ID需要的batch次数(8的倍数 过大会报错:oom, 内存不足)
default.ckpt = 0
default.lr_steps = '100000,160000,220000' # 降低学习率的epoch的地方
default.models_root = './models' # 模型保存的位置
-
模型输入尺寸发生修改,则修改文件symbol_utils.py修改
(1)函数 get_fc1()内 elif fc_type == “GDC”: conv_6_dw = Linear(kernel)
[1] 需要修改GDC的kernel, 保证最后FC层输出和特征值的维度一致
(2)input:128 (88);input:64 (44);input:112 (7*7) -
训练命令
(1)大模型:CUDA_VISIBLE_DEVICES=‘0’ python -u train.py --network r100 --loss arcface --dataset emore
(2)小模型:softmax + arcface
[1] CUDA_VISIBLE_DEVICES=‘0’ python3 -u train.py --network y1 --loss softmax --dataset emore
[2] CUDA_VISIBLE_DEVICES=‘0’ python3 -u train.py --network y1 --loss arcface --dataset emore
[3] 当【1】loss 降得差不多, acc 较高, 达到收敛时训练【2】阶段,将【1】训出的模型作为【2】的预训练模型
(3)备注
[1] 下载开源的预训练模型需注意是否包含fc7层,需判断预训练模型输出的特征维度是否和我们选择的一致,不一致时需不包含fc7层的预训练模型。
(4)BN融合需使用带bias的模型
步骤一 symbol_utils.py 修改(1) line 26 函数 Linear 将 no_bias=True 改为 false注释: Linear 是没有激活函数, 保持线性输入(2) 函数get_fc1()内GDC 小模型的FC层(mobilefacenet), 如果有no_bias 改为falsefc_type=='E' 大模型的FC层(resnet34), 如果有no_bias 改为false步骤二 fmobilefacenet.py 修改(1) Conv 函数, 卷积+BN+active(relu等)把 no_bias=True 改为 false(2) Linear 函数, 卷积+BN, 因为是线性的, 不需加激活函数把 no_bias=True 改为 false(3) ConvOnly 函数, 卷积把 no_bias=True 改为 false步骤三 执行命令
# 生成 bias 的模型, 产生一个模型文件就可以
CUDA_VISIBLE_DEVICES='0' python3 -u train.py --network y1 --loss softmax --dataset emore
- 损失函数
(1)curricularface 损失函数 与 arcface平级
(2)小模型:softmax loss + arcface loss/curricularface loss
(3)大模型:arcface loss/curricularface loss
(4)前提都需要预训练模型
2.3 运行
2.3.1 face detect
- thirdparty 环境安装
pip install onnxruntime -i /
pip install onnx -i /
pip install tqdm
pip install albumentations
pip install cython
- insightface 安装
cd ./insightface/python-package/insightface/thirdparty/face3d/mesh/cython
python setup.py build_ext -i
- 执行脚本
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_image# Method-1, use FaceAnalysis
app = FaceAnalysis(allowed_modules=['detection']) # enable detection model only
#app = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))# Method-2, load model directly
detector = insightface.model_zoo.get_model('your_detection_model.onnx')
detector.prepare(ctx_id=0, input_size=(640, 640))# t1.jpg,不用加.jpg; 图片path: ./insightface/python-package/insightface/data/images
img = ins_get_image('t1')
faces = app.get(img)
print("faces info:\t", faces)
rimg = app.draw_on(img, faces)
cv2.imwrite("./ldh_output.jpg", rimg)
2.3.1 face detect
- 模型下载
(1) model_zoo下载路径
(2) buffalo_s模型下载
- sample code
import cv2
import numpy as np
import insightface
from insightface.app import FaceAnalysis
from insightface.data import get_image as ins_get_imageapp = FaceAnalysis(providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(640, 640))
img = ins_get_image('t1')
faces = app.get(img)handler = insightface.model_zoo.get_model('./models/w600k_mbf.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
handler.prepare(ctx_id=0)
img = ins_get_image('t1')
feature = handler.get(img, faces[0])
print("size of feature:", len(feature))
print("feature:", feature)