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]]
相关推荐
老蒋新思维20 小时前
陈修超入局:解锁 AI 与 IP 融合的创新增长密码
网络·人工智能·网络协议·tcp/ip·企业管理·知识付费·创客匠人
San30.20 小时前
从代码规范到 AI Agent:现代前端开发的智能化演进
javascript·人工智能·代码规范
DO_Community20 小时前
基于AI Agent模板:快速生成 SQL 测试数据
人工智能·python·sql·ai·llm·ai编程
HeteroCat21 小时前
关于No Chatbot的思考
人工智能
咚咚王者21 小时前
人工智能之数据分析 numpy:第一章 学习链路
人工智能·数据分析·numpy
中杯可乐多加冰21 小时前
数据分析案例详解:基于smardaten实现智慧交通运营指标数据分析展示
人工智能·低代码·数据分析·交通物流·智慧交通·无代码·大屏端
算家计算21 小时前
对标ChatGPT!千问App正式上线:AI应用终局之战正在打响
人工智能·资讯
Justinyh21 小时前
1、CUDA 编程基础
c++·人工智能
强盛小灵通专卖员21 小时前
煤矿传送带异物检测:深度学习如何提升煤矿安全?
人工智能·深度学习·sci·小论文·大论文·延毕·研究生辅导