【K210】 NNCase编译MobileNet_v1_1.0即tflite量化为kmodel v3

本文介绍了如何利用K210厂商的NNCase工具,将MobileNet_v1_1.0的tflite模型量化并转换为适用于K210芯片的kmodel v3格式。通过提供编译命令和转换示例,展示了转换过程,并提到了转换过程中遇到的不支持Reshape操作的问题。此外,还讨论了NNCase早期版本(c#编写)和后续kmodel v4版本的研究选择。
摘要由CSDN通过智能技术生成

主控芯片K210厂商的NNCase工具,主要将其他模型转化为适应K210的芯片。目前主要是tftitle、caffe。

下载转换工具:NNCase Converter v0.1.0 RC1
https://github.com/kendryte/nncase/releases
sunnycase released this on 8 Mar 2019 · 292 commits to master since this release
Breaking changes
  Generate kmodel v3
  Drop k210code output, please use k210model instead
Major changes
  Support Add, Concat (resnet, inception-v2)
  Support L2Normalization, Softmax
  Support multiple outputs
  Simplify inference procedure
  Add profiling function

比如下载ncc-win7-x86_64.zip,解压后通过cmd终端运行ncc.exe如下:</

将.tflite模型转换为.kmodel模型的代码如下: ```python import tensorflow as tf import numpy as np from tensorflow.keras import Model from tensorflow.keras.layers import Input # 加载tflite模型 interpreter = tf.lite.Interpreter(model_path="model.tflite") interpreter.allocate_tensors() # 获取输入输出张量的索引 input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # 创建Keras模型 inputs = Input(shape=input_details[0]['shape'][1:]) x = tf.keras.layers.Lambda(lambda x: x / 255.)(inputs) # 对输入进行归一化 for i, layer in enumerate(interpreter.get_tensor_details()): if i < 2: continue op = layer['op'] name = layer['name'] shape = layer['shape'] weights = interpreter.get_tensor(layer['index']) if op == 'CONV_2D': x = tf.keras.layers.Conv2D( filters=shape[-1], kernel_size=shape[1:3], strides=layer['stride'][1:3], padding='same', use_bias=layer['quantization_parameters']['quantized_dimension'] == 3, kernel_initializer=tf.keras.initializers.Constant(weights[0]), bias_initializer=tf.keras.initializers.Constant(weights[1]) )(x) elif op == 'DEPTHWISE_CONV_2D': x = tf.keras.layers.DepthwiseConv2D( kernel_size=shape[1:3], strides=layer['stride'][1:3], padding='same', use_bias=layer['quantization_parameters']['quantized_dimension'] == 3, depthwise_initializer=tf.keras.initializers.Constant(weights[0]), bias_initializer=tf.keras.initializers.Constant(weights[1]) )(x) elif op == 'AVERAGE_POOL_2D': x = tf.keras.layers.AveragePooling2D( pool_size=shape[1:3], strides=layer['stride'][1:3], padding='same' )(x) elif op == 'MAX_POOL_2D': x = tf.keras.layers.MaxPooling2D( pool_size=shape[1:3], strides=layer['stride'][1:3], padding='same' )(x) elif op == 'ADD': x = tf.keras.layers.Add()([x, tf.keras.layers.Lambda(lambda y: y[..., 0])(x)]) elif op == 'RELU': x = tf.keras.layers.ReLU()(x) elif op == 'RESHAPE': x = tf.keras.layers.Reshape(target_shape=shape[1:])(x) elif op == 'FULLY_CONNECTED': x = tf.keras.layers.Dense( units=shape[-1], use_bias=True, kernel_initializer=tf.keras.initializers.Constant(weights[0]), bias_initializer=tf.keras.initializers.Constant(weights[1]) )(x) elif op == 'SOFTMAX': x = tf.keras.layers.Softmax()(x) outputs = x keras_model = Model(inputs, outputs) # 将Keras模型转换为K210的.kmodel模型 import tensorflow.keras.backend as K from tensorflow.keras.models import model_from_json # 保存Keras模型的权重 keras_model.save_weights('weights.h5') # 保存Keras模型的结构 keras_model_json = keras_model.to_json() with open('model.json', 'w') as f: f.write(keras_model_json) # 读取Keras模型的结构 with open('model.json', 'r') as f: keras_model_json = f.read() # 将Keras模型的结构转换为K210的.kmodel模型 k210_model = model_from_json(keras_model_json) k210_model.load_weights('weights.h5') # 保存K210的.kmodel模型 k210_model.save('model.kmodel') ``` 注意:此代码只适用于具有以下操作的.tflite模型:CONV_2D,DEPTHWISE_CONV_2D,AVERAGE_POOL_2D,MAX_POOL_2D,ADD,RELU,RESHAPE,FULLY_CONNECTED和SOFTMAX。如果您的模型包含其他操作,则需要对代码进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jn10010537

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值