keras转onnx,TensorFlow转tf.keras.models.load_model,onnx精度转换

参考:

https://blog.csdn.net/Deaohst/article/details/126864267

转onnx

别直接转onnx。

先转PB:

clike 复制代码
import tensorflow as tf

model_path = './models/model.h5'                    # 模型文件
model = tf.keras.models.load_model(model_path)
model.save('tfmodel', save_format='tf')

再转onnx:

clike 复制代码
 python -m tf2onnx.convert --saved-model ./tfmodel/ --output ./models/model.onnx --opset 12 --verbose

转化成功:

将原结果和onnx推理结果比对:

原结果:

{'drawings': 0.00619311910122633, 'hentai': 0.00011550176714081317, 'neutral': 0.992009162902832, 'porn': 0.0008918801322579384, 'sexy': 0.0007902580546215177}}

onnx推理代码和推理结果:

clike 复制代码
import cv2
import numpy as np
import onnxruntime

IMAGE_DIM = 299  # required/default image dimensionality


def load_single_image(image_path, image_size, verbose=True):
    try:
        if verbose:
            print(image_path, "size:", image_size)

        # Load image using OpenCV
        image = cv2.imread(image_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # Convert to RGB
        image = cv2.resize(image, (image_size, image_size))

        # Preprocess the image
        image = image.astype(np.float32) / 255.0

        return np.expand_dims(image, axis=0), image_path

    except Exception as ex:
        print("Image Load Failure: ", image_path, ex)
        return None, None


# Load ONNX model
onnx_model_path = './models/model.onnx'
ort_session = onnxruntime.InferenceSession(onnx_model_path)

# Example usage:
image_path_to_load = "images/20230903000800.jpg"
loaded_image, loaded_image_path = load_single_image(image_path_to_load, IMAGE_DIM)

if loaded_image is not None:
    # Perform inference
    input_name = ort_session.get_inputs()[0].name
    output_name = ort_session.get_outputs()[0].name
    input_data = loaded_image

    # Run the ONNX model
    result = ort_session.run([output_name], {input_name: input_data})

    print(result[0].tolist())

images/20230903000800.jpg size: 299

\[0.004163397941738367, 0.00018479839491192251, 0.9918997287750244, 0.0020591376814991236, 0.0016930525889620185\]

结果不是很吻合,但也大差不差了。

转fp16 onnx

安装:

clike 复制代码
pip install onnxmltools

执行脚本:

clike 复制代码
import onnxmltools
# 加载float16_converter转换器
from onnxmltools.utils.float16_converter import convert_float_to_float16
# 使用onnxmltools.load_model()函数来加载现有的onnx模型
# 但是请确保这个模型是一个fp32的原始模型
onnx_model = onnxmltools.load_model('./models/model.onnx')
# 使用convert_float_to_float16()函数将fp32模型转换成半精度fp16
onnx_model_fp16 = convert_float_to_float16(onnx_model)
# 使用onnx.utils.save_model()函数来保存,
onnxmltools.utils.save_model(onnx_model_fp16, './models/model_fp16.onnx')

推理结果:

clike 复制代码
images/20230903000800.jpg size: 299
[[0.004119873046875, 0.00018489360809326172, 0.99169921875, 0.002071380615234375, 0.001697540283203125]]
相关推荐
AI_小站3 小时前
6个GitHub爆火的免费大模型教程,助你快速进阶AI编程
人工智能·langchain·github·知识图谱·agent·llama·rag
xindoo3 小时前
GitHub Trending霸榜!深度解析AI Coding辅助神器 Superpowers
人工智能·github
时间之里3 小时前
【深度学习】:RF-DETR与yolo对比
人工智能·深度学习·yolo
北京阿法龙科技有限公司3 小时前
数智化升级:AR 智能眼镜驱动工业运维效能革新
人工智能
风落无尘3 小时前
《智能重生:从垃圾堆到AI工程师》——第二章 概率与生存
大数据·人工智能
j_xxx404_3 小时前
Linux:静态链接与动态链接深度解析
linux·运维·服务器·c++·人工智能
收获不止数据库3 小时前
达梦9发布会归来:AI 时代,我们需要一款什么样的数据库?
数据库·人工智能·ai·语言模型·数据分析
hhb_6183 小时前
AI全栈编程生存指南
人工智能
AI-Frontiers3 小时前
transformer进阶之路:#2 工作原理详解
人工智能·深度学习·transformer
科研前沿3 小时前
2026 数字孪生前沿科技:全景迭代报告 —— 镜像视界生成式孪生(Generative DT)技术白皮书
大数据·人工智能·科技·算法·音视频·空间计算