显微镜图像处理【部署】- pytorch模型转onnx使用GPU进行推理

文章不涉及具体的算法训练,但是如果你不了解如何用pytorch训练一个最简单的图像预测模型的话,我可以推荐你阅读这篇文章:github.com/open-mmlab/...
在处理显微镜图像时,我们会有各式各样的深度学习或机器学习算法部署需求。你可能需要对显微镜拍摄出来的图像进行对你的业务而言有价值的图像数据分析。如果你是显微镜图像处理特定领域的专业人士的话。
下面以核型分析业务为例,训练一个pytorch的pth模型文件,并将该模型记录静态图,转为onnx模型进行推理调用。并分析onnx模型对于软件项目在windows10操作系统上部署的性能提升。

性能评价指标

对于一个windows系统而言,性能的评价指标应该分为以下多个方面:

  1. 软件构建产物体积:对于附带深度学习或机器学习模块的软件项目而言,部署的体积问题是开发者应该重点关注的部分,应用体积的提升会导致软件推广产生困难,一个附带pyqt或者pytorch功能模块的python软件项目打包之后产生的体积是恐怖的,就算你使用nuitka进行打包,将所有的依赖包构建为C语言模块,也会生成一个至少1.5GB的最终软件产物。如果你将所有的依赖包都复制进最终打包的产物,而不是构建,那么软件体积将达到可怕的5~10GB【单torch模块就要占用3GB】。这显然是不可以接受的
  2. 算法运行效率:一个附带深度学习或者机器学习模块的软件项目而言,算法构建产物的管理是开发者需要去考虑的非常痛苦的一个工作模块,以5000张图用循环神经网络跑10个epoch25个class的实例分割模型为例,最终的pth构建产物会在500MB左右,并且你的项目可能会存在多个深度学习模块,比如图像风格化迁移、图像超分辨率、图像分类、图像打分、图像数据评价模块。这些模块的加载调用和预热非常占用GPU内存。如果你的机器内存只有16GB或者8GB,或者你的显卡显存只有8GB或4GB,同时运行这么多深度学习模块是不现实的,这样就增加了机器的运行成本以及阻碍了软件及时的向你的客户进行推广【我的软件销售风格是:软件下载了就走,走了就用,用了没bug,减少客户心智负担】
  3. 软件架构稳定性:你的作品应该在用户使用的过程中尽可能的没有瑕疵,这个是必须的。要减少用户心智负担,那么就代表着软件的启动速度,算法模块调用合理性,UI界面的交互和操作美观性,都是必须要应用上best practiecs的。

而使用onnx模型替代原始pth文件,是必要的软件架构升级项目,是新时代AI杀手应用的入场券。

onnx打包产物结构分析

首先推荐一个网站:netron.app/ 这个网站能够上传你的onnx模型,并且分析你的onnx模型的graph。你不管是自己烘培的pytorch模型或者是你从网上download下来的其他人的pytorch模型,你都能够通过这个网站查看你的onnx模型的输入和输出【这个可能是starter最关注的部分】

图1【onnx结构分析】

加载onnx模型

python 复制代码
import onnx
model = onnx.load("work_dir/onnx/cascade_rcnn/end2end.onnx")
graph = model.graph
node = graph.node
input = graph.input
output = graph.output
  • node: onnx模型是一个pth模型推理一遍过后记录下来的静态图,node代表神经网络中推理会运行的每一个步骤
  • input: onnx模型的输入参数
  • output: onnx模型的输出参数

根据图1可知,本篇文章调用的onnx模型接受一个叫做input的输入,接受一张tensor图像,图像支持任意尺寸,输出三个参数,分别为det,masks,labels。

调用onnx模型

python 复制代码
def preprocess_input(img_path):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 保持原始分辨率
    img = img.astype(np.float32) / 255.0        # 自动适应任意尺寸
    return img.transpose(2, 0, 1)[None,...]     # HWC -> NCHW
    
input_img = preprocess_input1("img_4.png")

ort_session = onnxruntime.InferenceSession("work_dir/onnx/cascade_rcnn/end2end.onnx")

ort_inputs = {'input': input_img}

labels,masks,dets = ort_session.run(['labels','masks','dets'], ort_inputs)

通过以上代码能够调用onnx对一张图片进行推理,并输出推理结果

onnx推理结果可视化

图2【传入推理的图片】

图3【推理结果可视化】

相关推荐
David爱编程16 分钟前
为什么必须学并发编程?一文带你看懂从单线程到多线程的演进史
java·后端
long31630 分钟前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
rannn_1112 小时前
【Javaweb学习|黑马笔记|Day1】初识,入门网页,HTML-CSS|常见的标签和样式|标题排版和样式、正文排版和样式
css·后端·学习·html·javaweb
柏油2 小时前
Spring @Cacheable 解读
redis·后端·spring
柏油3 小时前
Spring @TransactionalEventListener 解读
spring boot·后端·spring
两码事4 小时前
告别繁琐的飞书表格API调用,让飞书表格操作像操作Java对象一样简单!
java·后端
shark_chili5 小时前
面试官再问synchronized底层原理,这样回答让他眼前一亮!
后端
灵魂猎手5 小时前
2. MyBatis 参数处理机制:从 execute 方法到参数流转全解析
java·后端·源码
易元5 小时前
模式组合应用-桥接模式(一)
后端·设计模式
柑木5 小时前
隐私计算-SecretFlow/SCQL-SCQL的两种部署模式
后端·安全·数据分析