人脸识别0-11:insightFace - mxnet 转 caffe模型
以下链接是个人关于insightFace所有见解,如有错误欢迎大家指出,我会第一时间纠正,如有兴趣可以加微信:17575010159 相互讨论技术。
人脸识别0-00:insightFace目录
这是本人项目的源码:https://github.com/944284742/1.FaceRecognition
其中script目录下的文件为本人编写,主要用于适应自己的项目,可以查看该目录下的redeme文件。
前言
本人在实际项目落地的过程中,需要把mxnet训练好的模型,转化为caffe模型,并且在华为设备上跑起来,所以写了这篇博客当作笔记。
资源下载
转换工具: https://github.com/Laulian/MxNet2Caffe-mobilefacenet
下载之后,本人如下:
转换模型:https://github.com/deepinsight/insightface/wiki/Model-Zoo
下载了上面的资源之后,还需要搭建winds caffe(本人在winds10下进行转换)环境:
wind10 + cuda9.0 + cudnn7.1 + caffe(c++与python接口) + anconda2 环境搭建:https://blog.csdn.net/weixin_43013761/article/details/105094390
模型转换
第一步: 下载好上面提供的资源,把任意一个想要转换的 insightFace 模型解压之后放置如下:
第二步: 执行指令如下:
如果没有安装mxnet,先执行下面指令安装:
pip install --pre mxnet-cu90 -i https://pypi.douban.com/simple
下面再执行指令生成模型:
python json2prototxt.py --mx-json mxnet-model/model-symbol.json --cf-prototxt caffe-model/model.prototxt
python mxnet2caffe.py --mx-model mxnet-model/model --mx-epoch 0 --cf-prototxt caffe-model/model.prototxt --cf-model caffe-model/model.caffemodel
执行完成可以可以看到生成的 caffe 模型如下:
模型对比
生成模型之后,我们总需要对比 mxnet 模型和 caffe 模型他们提取的特征是否一致,所以编写代码如下:
#coding=utf-8
import sys, argparse
import numpy as np
import mxnet as mx
import cv2
import caffe
import copy
def get_model(image_size, model_path, epoch, layer):
ctx = mx.gpu(0)
sym, arg_params, aux_params = mx.model.load_checkpoint(model_path, epoch)
all_layers = sym.get_internals()
sym = all_layers[layer + '_output']
model = mx.mod.Module(symbol=sym, context=ctx, label_names=None)
model.bind(data_shapes=[('data', (1, 3, image_size[0], image_size[1]))])
model.set_params(arg_params, aux_params)
return model
def get_feature(model, img):
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # color transform:BGR---RGB
img = np.transpose(img, (2, 0, 1))
input_blob = np.expand_dims(img, axis=0)
data = mx.nd.array(input_blob)
db = mx.io.DataBatch(data=(data,))
model.forward(db, is_train=False)
embedding = model.get_outputs()[0].asnumpy()[0]
l2_norm = cv2.norm(embedding, cv2.NORM_L2)
return embedding / l2_norm
def get_caffe_net(caffemodel, prototxt):
facenet = caffe.Net(prototxt, caffemodel, caffe.TEST)
return facenet
def caffe_get_feature(net, img):
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = img - 127.5
img = img * 0.0078125
tempimg = np.zeros((1, 112, 112, 3))
tempimg[0, :, :, :] = img
tempimg = tempimg.transpose(0, 3, 1, 2)
net.blobs['data'].data[...] = tempimg
net.forward()
features = copy.deepcopy(net.blobs['fc1'].data[...])
feature = np.array(features[0])
l2_norm = cv2.norm(feature, cv2.NORM_L2)
return feature / l2_norm
def cos(v1, v2):
lenth = len(v1)
sum = 0
for i in range(lenth):
sum += v1[i] * v2[i]
return sum
if __name__ == '__main__':
# mxnet init
model_path = './mxnet-model/model'
epoch = 0
image_size = (112,112)
layer = 'fc1'
model = get_model(image_size, model_path, epoch, layer)
#caffe net init
caffemodel = './caffe-model/model.caffemodel'
prototxt = './caffe-model/model.prototxt'
net = get_caffe_net(caffemodel, prototxt)
image_path = './Aaron_Eckhart_0001.jpg'
img = cv2.imread(image_path)
feature_mxnet = get_feature(model, img)
feature_caffe = caffe_get_feature(net, img)
print 'sim: ', cos(feature_mxnet, feature_caffe)
该代码的原理很简单:
- 加载 mxnet 模型,提取特征
- 加载 caffe 模型,提取特征
- 对比两个特征是否一致(获得他们的余弦相似度)
相关文章
- [译文]迭代机器学习:迈向模型准确性的一步
- 实践演练Pytorch Bert模型转ONNX模型及预测
- 只会logistic和cox的决策曲线?来看看适用于一切模型的DCA!
- J Mol Biol|在计算机上构建完整的细胞3D模型
- 符合人类创作过程的AIGC:自动生成长故事的模型出现了
- 浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
- PyTorch + NumPy这么做会降低模型准确率,这是bug还是预期功能?
- 【CSS】盒子模型外边距 ① ( 盒子模型外边距设置 | 外边距属性单独设置 | 外边距属性复合写法 )
- 领英创始人里德·霍夫曼退出OpenAI;微软推出多模态模型 Kosmos-1;谷歌推出PaLM-E
- AI大模型辅助提升研发效能实践
- Zbrush最新版详细安装步骤:如何在Zbrush模型导入Maya
- SQL Server恢复模型之批量日志恢复模式
- 分析Redis网络模型对源码的深入分析(redis网络模型源码)