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]]
相关推荐
从孑开始5 分钟前
ManySpeech.MoonshineAsr 使用指南
人工智能·ai·c#·.net·私有化部署·语音识别·onnx·asr·moonshine
涛涛讲AI9 分钟前
一段音频多段字幕,让音频能够流畅自然对应字幕 AI生成视频,扣子生成剪映视频草稿
人工智能·音视频·语音识别
可触的未来,发芽的智生23 分钟前
新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
javascript·人工智能·python·神经网络·架构
WWZZ20251 小时前
快速上手大模型:机器学习2(一元线性回归、代价函数、梯度下降法)
人工智能·算法·机器学习·计算机视觉·机器人·大模型·slam
AKAMAI1 小时前
数据孤岛破局之战 :跨业务分析的难题攻坚
运维·人工智能·云计算
Chicheng_MA1 小时前
算能 CV184 智能相机整体方案介绍
人工智能·数码相机·算能
Element_南笙1 小时前
吴恩达新课程:Agentic AI(笔记2)
数据库·人工智能·笔记·python·深度学习·ui·自然语言处理
倔强青铜三1 小时前
苦练Python第69天:subprocess模块从入门到上瘾,手把手教你驯服系统命令!
人工智能·python·面试
Antonio9151 小时前
【图像处理】rgb和srgb
图像处理·人工智能·数码相机
倔强青铜三1 小时前
苦练 Python 第 68 天:并发狂飙!concurrent 模块让你 CPU 原地起飞
人工智能·python·面试