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]]
相关推荐
星融元asterfusion4 分钟前
基于路径质量的AI负载均衡异常路径检测与恢复策略
人工智能·负载均衡·异常路径
zskj_zhyl9 分钟前
智慧养老丨从依赖式养老到自主式养老:如何重构晚年生活新范式
大数据·人工智能·物联网
创小匠10 分钟前
创客匠人视角下创始人 IP 打造与知识变现的底层逻辑重构
人工智能·tcp/ip·重构
xiangduanjava26 分钟前
关于安装Ollama大语言模型本地部署工具
人工智能·语言模型·自然语言处理
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
超龄超能程序猿1 小时前
(1)机器学习小白入门 YOLOv:从概念到实践
人工智能·机器学习
大熊背1 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
江理不变情1 小时前
图像质量对比感悟
c++·人工智能
张较瘦_3 小时前
[论文阅读] 人工智能 + 软件工程 | 需求获取访谈中LLM生成跟进问题研究:来龙去脉与创新突破
论文阅读·人工智能