mxnet模型转tflite
今天尝试把insightface
的模型转换到tflite
格式,在此做个记录。
安装依赖
转换工具使用的是微软的mmdnn
,感觉好像有段时间没更新了,还是需要手动修改一些地方才可以正常运行。
pip install mxnet-cu101mkl scikit-learn mmdnn tensorflow==1.15.2 |
修改
np.load
默认参数因为现在的
numpy
默认load
的时候allow_pickle=False
,所以需要进入mmdnn
中全局搜索np.load
,并修改其参数,我这次是mxnet
转tensorflow
,就只要改conversion/common/DataStructure/emitter.py
和conversion/tensorflow/tensorflow_emitter.py
文件就好了。
下载模型
从insightface
的modell zoo
中下载一个模型,我下载的是mobilenet
模型
修改模型
我下载的这个模型可能是因为之前训练的模型构建问题,有一个名为pre_fc1
的层的权重参数却不叫pre_fc1_weight
,会导致转换出错。
需要修改一下模型参数名称。我网上看了下没发现有好的修改param
参数名称的方法,直接替换json
和param
文件中的fc1_weight
为pre_fc1_weight
会导致加载失败,因此我就将mmdnn/conversion/mxnet/mxnet_parser.py
中410行改成如下:
if source_node.name=='pre_fc1':
weight = self.weight_data.get('fc1' + "_weight").asnumpy().transpose((1, 0))
else:
weight = self.weight_data.get(source_node.name + "_weight").asnumpy().transpose((1, 0))
同时,因为insightface
的模型输入时的归一化操作被固定在了模型中,因此需要修改网络,我找了半天也没找到办法。。于是就直接修改json
文件,使用下列程序删除前面两个节点:
s= json.load(open('/home/zqh/workspace/insightface/test/model-symbol.json.bak')) |
NOTE:
上面的代码只是修改节点索引,后面需要手动把模型json
文件不需要的节点删除。
转换模型
运行命令: mmconvert -sf mxnet -in ../models/model-symbol.json -iw ../models/model-0000.params -df tensorflow -om mbv1face --inputShape 3,112,112 --dump_tag SERVING
tensorflow.savemodel
格式的模型,再利用toco
:
toco --saved_model_dir mbv1face/ ----output_format tflite --output_file mbv1face.tflite |