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]]
相关推荐
Java后端的Ai之路32 分钟前
【RAG技术】- RAG系统调优手段之高效召回(通俗易懂附案例)
人工智能·rag·rag系统·召回·rag调优
草莓熊Lotso34 分钟前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能
Cx330❀38 分钟前
从零实现Shell命令行解释器:原理与实战(附源码)
大数据·linux·数据库·人工智能·科技·elasticsearch·搜索引擎
Niuguangshuo7 小时前
深入解析Stable Diffusion基石——潜在扩散模型(LDMs)
人工智能·计算机视觉·stable diffusion
迈火7 小时前
SD - Latent - Interposer:解锁Stable Diffusion潜在空间的创意工具
人工智能·gpt·计算机视觉·stable diffusion·aigc·语音识别·midjourney
wfeqhfxz25887827 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
芝士爱知识a7 小时前
2026年AI面试软件推荐
人工智能·面试·职场和发展·大模型·ai教育·考公·智蛙面试
Li emily8 小时前
解决港股实时行情数据 API 接入难题
人工智能·python·fastapi
Aaron15888 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
J_Xiong01178 小时前
【Agents篇】04:Agent 的推理能力——思维链与自我反思
人工智能·ai agent·推理