在使用 ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8 训练模型后,进行量化 int8 并修剪我的模型

问题描述 投票:0回答:1

我试图在 Arduino 33BLE 中推断我的模型,为此,我使用 ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8 训练了我的模型,我得到了一个 6.5mb 的模型大小,88%[email protected],这很好,所以我尝试使用 int8 量化模型,但是模型大小增加到 11.5mb,准确性很差,我不知道发生了什么,如果有人能帮助我那就太好了

我的量化模型的代码

import tensorflow as tf
import io
import PIL
import numpy as np
import tensorflow_datasets as tfds

def representative_dataset_gen():
    folder = "/content/dataset/train/images"
    image_size = 320
    raw_test_data = []

    files = glob.glob(folder+'/*.jpeg')
    for file in files:
        image = Image.open(file)
        image = image.convert("RGB")
        image = image.resize((image_size, image_size))
        #Quantizing the image between -1,1;
        image = (2.0 / 255.0) * np.uint8(image) - 1.0
        #image = np.asarray(image).astype(np.float32)
        image = image[np.newaxis,:,:,:]
        raw_test_data.append(image)

    for data in raw_test_data:
        yield [data]

converter = tf.lite.TFLiteConverter.from_saved_model('/content/gdrive/MyDrive/customTF2/data/tflite/saved_model')
converter.representative_dataset = representative_dataset_gen
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.int8  # or tf.uint8
converter.inference_output_type = tf.int8  # or tf.uint8
tflite_model = converter.convert()

with open('/mydrive/customTF2/data/tflite/saved_model/detect8.tflite', 'wb') as f:
  f.write(tflite_model)

此外,如果可以对模型进行修剪,也将有助于将大小减小到 1mb 以下。 我还尝试了 yolov5 并将模型修剪和量化到 1.9mb 但无法进一步,然后尝试将 tflite 模型转换为 .h 模型以在 esp32 中进行推理(相反,因为我的 tflite 模型大于 1mb),但模型大小也增加到11mb。

我尝试对模型进行训练后量化,但模型大小不但没有减小,反而增加了,不仅如此,模型性能还急剧下降。对于修剪部分,我无法使用 movbilenetV2 完成,我希望有人可以提供帮助

tensorflow object-detection quantization mobilenet pruning
1个回答
0
投票

你的帖子以一种奇怪的方式帮助了我,但谢谢你! 你能解决这个问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.