模型文件以及类别文件下载:
链接:https://pan.baidu.com/s/1V2Rjxy8J6TRb9xlp5_rVZQ
提取码:vv91
目录
问题5:ONNX中间表示格式以及ONNX Runtime推理引擎?(重点)
布局ImageView和原图大小以及输入到模型中大小的比例转换
网上不仅仅是文章或者视频都有模型部署的讲解,但是感觉还是并没有更深入的将模型部署概念和实际结合起来,也许概念上已经讲的很好了,但是实际案例方面并没有更多更深入的讲解,导致自己以前学习相关“模型部署”的时候都只是文字或者口头上去说。因此,本文不会更多的讲解概念,第一点是因为自己对模型部署的框架以及相关算子只是了解一部分,第二点是因为模型部署的框架和算子也不是每一点都要熟练的掌握,先掌握其中一点即可。本文会将概念和实际案例应用结合起来,使用flask作为模型部署的框架,在学习的过程当中不仅仅了解和接触到了模型的实际部署,还能学习到很多的知识点。
问题1:什么是模型的部署?
模型的部署是指将训练好的机器学习或深度学习模型放置到生产环境中,使其能够对实际业务需求提供预测、分类或其他类型的服务。在部署后,用户或系统可以通过不同的方式与模型进行交互,获取实时反馈和结果(这是非常官方的定义方式,我们并不需要记住它,简单理解就是根据不同任务训练得到的模型最终要服务于或者应用于具体的场景中,而这个“应用的中间过程”就是部署)。
这里使用一个图来表达自己的意思,我们这里只是列举出了目前主流的深度学习框架(Caffe框架用的比较少了),对于我自己而言,我主要是使用PyTorch > TensorFlow > PaddlePaddle,至于其他的框架大家知道即可或者根据自己的使用情况来决定。我们希望使用深度学习框架训练得到的模型转换为中间的格式之后(这个转换是对模型进行)以至于能很好的部署到其他平台,支持其他框架以及性能优化和加速。最后是模型的部署,可以本地部署和在线部署。
问题2:什么是本地部署和在线部署?(重点)
部署方式 | 定义 | 特点 | 应用场景 |
---|---|---|---|
本地部署 | 本地部署指的是将模型直接部署在用户的本地设备上,如个人计算机、边缘设备、移动设备或嵌入式系统中。 | ①无网络依赖 ②低延迟 ③数据隐私 ④资源限制 | ①移动应用(如图像处理、语音识别) ②边缘计算应用(如智能摄像头、物联网设备) ③离线应用(如桌面软件) |
在线部署 | 在线部署指的是将模型部署在云服务器或远程服务器上,通过网络提供服务。用户通过API或Web界面与模型交互。 | ①高可扩展性 ②集中管理 ③强大的计算能力 ④网络依赖 | ①Web应用(如智能客服、在线推荐系统) ②机器学习作为服务(MLaaS)平台 ③大规模数据分析和处理(如数据挖掘、模型训练) |
注:本文以本地部署为重点。
问题3:模型部署的应用场景?
- 信用评分;欺诈检测;投资预测
- 推荐系统;动态定价
- 疾病预测与诊断;个性化治疗
- 设备控制;异常检测
- 自动驾驶;交通预测
- 聊天机器人;内容推荐与生成
- 故障预测;质量检测;内容过滤与推荐
- 气象模型;灾害预警
- 作物产量预测;病虫害监测
注:这些列举出来的应用场景中,实际自己接触却很少,因此大家只要简单了解即可。
问题4:部署模型的框架和工具?(重点)
框架或者工具 | 描述 | 具体应用场景 |
---|---|---|
Flask | 一个轻量级的 Python Web 框架,可以很快的上手搭建Web服务 | 小型应用、原型开发、模型推理 API |
Django | 一个全功能的 Python Web 框架,提供更多的功能和结构 | 需要复杂的 Web 应用或管理后台的项目 |
FastAPI | 一个现代、快速(高性能)的 Web 框架,基于标准的 Python 类型提示,优化了 API 的开发效率和性能 | 需要高性能和自动生成文档的 API 服务器,特别适合微服务架构 |
TorchServer | 由 PyTorch 团队支持的深度学习模型服务框架,专为 PyTorch 模型设计 | 生产环境中的 PyTorch 模型部署 |
ONNX Runtime | 一个高性能推理引擎,支持 ONNX 格式的模型,适用于多种深度学习框架 | 在不同平台上实现更好的性能和推理速度,非常方便部署,适用于不同的深度学习框架和平台 |
Streamlit | 一个快速构建数据应用的框架,适用于构建数据仪表板和可视化工具 | 需要快速原型和可视化展示的机器学习项目 |
Gradio | 一个创建用户界面以与机器学习模型进行交互的工具 | 需要快速验证和展示模型的 Web 界面 |
注:这里面有一部分并没有使用过,但是感觉有必要列举出来,大家根据自己掌握的框架和工具来使用即可(说实话,讲到这里面对这么多的选择对于初学者是否感觉有点晕)。
问题5:ONNX中间表示格式以及ONNX Runtime推理引擎?(重点)
模式 | 描述以及适用框架 |
---|---|
ONNX | 开放的深度学习模型交换格式,目的在于促进不同深度学习框架之间的互操作性。它由多个公司和组织共同开发,包括 Microsoft、Facebook 和 Amazon 等。 其中支持PyTorch,TensorFlow,Caffe2以及MXNet等框架和不同的平台,由于其应用广泛,因此支持的人也非常的多,ONNX还提供了标准化的算子,用于模型的基本运算。关于pth模型文件转ONNX模型文件 |
ONNX Runtime | 高性能的推理引擎,专为运行 ONNX 格式的模型而设计。它支持多种硬件平台,并且能够在不同的操作系统上运行。ONNX Runtime 提供了高效的推理能力,旨在满足生产环境中的性能和可扩展性需求。 支持多种平台Windows、Linux 和 MacOS,同时也支持多种硬件加速(如 NVIDIA GPU、Intel MKL-DNN、AMD ROCm 等)。 提供了多种语言的API,如Python,C++和JAVA(我个人主要还是使用Python语言API)。 提供了自定义算子,以及优化工具。 |
实战案例1:Flask部署图像分类和目标检测模型
其实在很久之前就已经有关利用Flask框架部署图像分类模型Flask部署图像分类模型 ,但是这篇博文只是给出了案例,并且也没有相关的视频讲解,因此导致部分读者拿到那个代码的时候不知道其中的逻辑实现。现在将目标检测模型使用flask框架部署并且尽可能让部署的前端页面看起来完善和舒服一点。代码讲解请看前面给出的视频链接。
注:后期的代码中还加入的视频设备选择菜单,主要是用于在多个视频设备中选择一个进行实时的检测。
注:演示过程以及视频讲解,请看前面给出的视频链接。以上给出的flask部署只能在当前的本地部署并使用,如果让自己的小伙伴在他们的网络使用你部署的模型,可以查看cpolar工具 。
Flask之模型部署-目标检测
实战案例2:Android部署图像分类和目标检测模型
关于在实现这一部分的时候参考了哪些视频以及博文,将在文章的末尾给出参考链接。
模型文件格式 | 描述 | guild.gradle加入依赖库 |
---|---|---|
.ONNX(本文的重点) | Android Studio支持加载ONNX模型文件(本文主要是加载ONNX模型文件实现相关的图像分类和目标检测)。Android Studio中可选择的onnx runtime版本 (本文选择的版本为1.19.0) | dependencies { |
.pt或.pth | Android Studio也支持加载.pth或者.pt模型文件格式Android Studio模型.pt部署 | dependencies { implementation 'org.pytorch:pytorch_android_lite:1.10.0' implementation 'org.pytorch:pytorch_android_torchvision:1.10.0' } |
.ncnn | Android Studio中部署ncnn模型 | ~ |
图像分类
Android Studio之模型部署-图像分类
目标检测
PyTorch加载预训练目标检测模型实现物体检测,同时将预训练模型转换为ONNX模型文件(过程详解) |
yolov5目标检测和QT 6.6.0 基于OpenCV加载yolov5.onnx模型文件实现目标检测 |
布局ImageView和原图大小以及输入到模型中大小的比例转换
mImgScaleX = (float)mBitmap.getWidth() / objectDetectUtils.mInputWidth;
mImgScaleY = (float)mBitmap.getHeight() / objectDetectUtils.mInputHeight;
原图大小和输入到模型中大小的高宽比例计算,以便于将模型输出的坐标框大小还原回原图大小。
//如果宽度比高度值更大,则水平方向按照宽度的比率进行缩放;否则按照高度的比率进行缩放
mIvScaleX = (mBitmap.getWidth() > mBitmap.getHeight() ? (float)imageView.getWidth() / mBitmap.getWidth() :
(float)imageView.getHeight() / mBitmap.getHeight());
mIvScaleY = (mBitmap.getHeight() > mBitmap.getWidth() ? (float)imageView.getHeight() / mBitmap.getHeight() :
(float)imageView.getWidth() / mBitmap.getWidth());
模拟器中指定的布局大小和原图之间的高宽比例计算,因为第一次将模型输出的坐标框大小还原回原图大小之后,由于原图需要显示到模拟器布局中,因此原图高宽和模拟器布局之间高宽也需要进行比例计算,如下图。
//缩放之后的高宽和指定画布大小之间的差距
mStartX = (imageView.getWidth() - mIvScaleX * mBitmap.getWidth())/2;
mStartY = (imageView.getHeight() - mIvScaleY * mBitmap.getHeight())/2;
虽然根据模拟器布局和原图高宽之间进行比例的计算之后,但是布局和原图边缘之间存在一定的差距还需要弥补。
图像归一化处理(重点)
float r = ((c >> 16) & 0xff) / 255.0f;
float g = ((c >> 8) & 0xff) / 255.0f;
float b = ((c) & 0xff) / 255.0f;
outBuffer.put(outBufferOffset + i, (r - normMeanRGB[0]) / normStdRGB[0]);
outBuffer.put(outBufferOffset + offset_g + i, (g - normMeanRGB[1]) / normStdRGB[1]);
outBuffer.put(outBufferOffset + offset_b + i, (b - normMeanRGB[2]) / normStdRGB[2]);
图像旋转
Matrix matrix = new Matrix();
matrix.postRotate(90.0f);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
在打开摄像头进行图像获取并检测的过程中,需要将图像旋转90度,以便于显示在Android手机上,保证结果的准确性。
NMS中的分数排序(细节)
以下是在真实手机上运行的结果(模拟器上也可以,只不过真机上会更快)
Android studio之模型部署-目标检测
问题1:android studio中加载ONNX模型实现图像分类和在pytorch中加载ONNX模型对相同图像预测,Android studio中加载的ONNX模型预测结果却明显不正确,可能的原因?
- 数据预处理的方式是否相同
- 输入模型中的数据类型和形状是否一致
- 模型权重是否一致:在导出 ONNX 模型时使用了不同版本的 PyTorch 或 ONNX,或者模型结构(例如层的顺序、激活函数等)发生变化,可能导致权重不一致。
- 对预测的结果处理步骤是否一致(比如使用softmax)
问题2:android studio中摄像头打开读取的帧格式和Bitmap图像格式之间的关系?
-
使用摄像头API来捕获视频帧时,通常不会直接得到
Bitmap
对象。相反,得到原始的图像数据,这些数据可能以不同的格式存在,如YUV(如NV21或YV12)或RGB。Bitmap
在Android中主要用于存储和显示图像,它通常是以ARGB_8888(每个像素32位,包括透明度)或RGB_565(每个像素16位,不含透明度)等格式存储的。
注:关于上面两者不同图像格式之间的转换将在程序中展示。