android modelDeployment segmentation onnx
android modelDeployment segmentation pt
目录
方式一:deeplabv3_mobilenet_v3_large.onnx模型部署Android
方式二:best_deeplabv3plus_mobilenet_voc_os16.pt模型部署Android
前面的两篇文章已经讲解了关于图像分类算法和目标检测算法在Android中的部署,并且分别讲解的是采用ONNX和torchscript两种不同的中间表示格式进行部署,同时我们也讲解了在转换为中间表示格式中应该注意哪些点。本文主要是基于前面讲解的两种表示方法将语义分割模型部署到Android中。
其实这里和之前的一样,如果将PyTorch官方所提供的图像分割模型转换为onnx没有太大的问题,但是如果转换为torchscript中间格式并结合optimize_for_mobile用于移动端的部署的话会出现很大的问题。虽然转换为torchscript中间格式没有问题,但是在Android中加载.pt模型的时候始终加载不了,像这种问题几乎很难跟踪中间到底发生了什么,所以这个问题也暂时没有解决。采用PyTorch官方提供的图像分割模型并转换为torchscript中间表示格式和结合optimize_for_mobile使用存在以下问题:
- Android中使用LiteModuleLoader.load加载模型失败;
-
- PyTorch使用torch.jit.load加载保存.pt模型时,预测的图像分割结果全部为背景(难道使用了针对移动端进行优化的optimize_for_mobile加载就有问题了吗?);如果不结合optimize_for_mobile使用保存模型之后,PyTorch中采用torch.jit.load加载模型进行预测结果没有什么问题,即使这样,没有做优化的模型放到Android中加载依然失败。
注:针对以上的问题,从github上面找了一个DeepLapv3Plus的图像分割模型进行模型转换(转换为torchscript,不采用optimize_for_mobile进行优化)以及Android studio中加载,模型加载没有问题,但是最终的预测结果还是只是背景,在PyTorch使用torch.jit.load加载模型进行预测没有问题,虽然使用torchscript没有成功,但是下面还是会讲解思路。
方式一:deeplabv3_mobilenet_v3_large.onnx模型部署Android
- 加载模型(深度学习之模型部署入门 (一))和读取颜色模版.txt文件如下,其中文件中包含21个类别多对应的三通道颜色(110,192,117),读取文件代码如下:
-
- 图像缩放和预处理
- 预测图像:模型输出有最终结果out和aux辅助分类结果,输出维度都是[1,21,512,512],我们这里只需要最终输出结果out即可。
-
- 获得预测结果的掩码mask,也就是对应每一个像素点21个通道的最大类别:维度为[512,512]
-
- 根据预测的结果对原图进行调色
-
注:以上只是给出了核心代码部分,实时检测部分的代码差不多。
深度学习之图像分割模型部署入门 (三),案例实战值得一看
方式二:best_deeplabv3plus_mobilenet_voc_os16.pt模型部署Android
由于PyTorch官方提供的图像分割模型转换torchscript中间格式之后再Android studio中加载有问题,因此github上查找了一个DeepLapv3Plus模型进行图像的预测(未使用optimize_for_mobile优化,主要是因为优化之后预测存在问题):https://github.com/VainF/DeepLabV3Plus-Pytorch
下载模型:DeepLabV3Plus-MobileNet(https://share.weiyun.com/djX6MDwM)
Android studio中预测的结果如下:
注:不管是什么图像都是预测为背景,如果真的是Android studio使用 LiteModuleLoader.load加载模型导致权重参数出现问题,那也不应该是每一张图像都是预测结果为背景。
总结:
从ONNX和torchscript使用的情况来看,对于ONNX中间格式表示进行推理更加的稳定,除了对于pytorch官方提供的一些目标检测模型在转换为ONNX中间格式存在问题以外,其他目前没有太大的问题。但是对于torchscript中间表示格式存在的问题比较大,当模型结构比较复杂的时候,使用torch.jit.trace和optimize_for_mobile会发现保存的模型在推理阶段结果是错误的,如果使用torch.jit.script保存模型的话,中间特别容易出现问题,如果模型比较复杂或者中间的数据格式存在字典之类的就容易出现问题,因此建议还是使用ONNX中间表示格式。