运行 Android 上的 GluonCV 对象检测模型
Running GluonCV object detection model on Android
我需要 运行 Android 上的自定义 GluonCV 对象检测模块。
我已经在自定义数据集上对模型 (ssd_512_mobilenet1.0_custom) 进行了微调,我尝试 运行 对其进行推理(加载在培训),一切都在我的电脑上完美运行。现在,我需要将其导出到 Android.
我参考了来弄清楚这个过程,有3个建议的选项:
- 您可以使用 ONNX 将模型转换为其他 运行 次,例如 [...] NNAPI 为 Android
- 您可以使用TVM
- 您可以使用 SageMaker Neo + DLR runtime [...]
关于第一个,我将我的模型转换为 ONNX。
但是,为了将其与 NNAPI 一起使用,需要将其转换为 daq。在存储库中,他们提供了一个 onnx2daq 的预编译 AppImage 来进行转换,但是脚本 returns 出错了。我检查了问题部分,they report“它实际上对所有 onnx 对象检测模型都失败了”。
然后,我尝试了 DLR,因为它被认为是最简单的方法。
据我了解,为了将我的自定义模型与 DLR 一起使用,我首先需要使用 TVM 对其进行编译(这也涵盖了链接 post 中提到的第二点)。在 repo 中,他们提供了一个 Docker 图像,其中包含一些针对不同框架的转换脚本。
我修改了 'compile_gluoncv.py' 脚本,现在我有:
#!/usr/bin/env python3
from tvm import relay
import mxnet as mx
from mxnet.gluon.model_zoo.vision import get_model
from tvm_compiler_utils import tvm_compile
shape_dict = {'data': (1, 3, 300, 300)}
dtype='float32'
ctx = [mx.cpu(0)]
classes_custom = ["CML_mug"]
block = get_model('ssd_512_mobilenet1.0_custom', classes=classes_custom, pretrained_base=False, ctx=ctx)
block.load_parameters("ep_035.params", ctx=ctx) ### this is the file produced by training on the custom dataset
for arch in ["arm64-v8a", "armeabi-v7a", "x86_64", "x86"]:
sym, params = relay.frontend.from_mxnet(block, shape=shape_dict, dtype=dtype)
func = sym["main"]
func = relay.Function(func.params, relay.nn.softmax(func.body), None, func.type_params, func.attrs)
tvm_compile(func, params, arch, dlr_model_name)
但是,当我 运行 脚本时 returns 错误:
ValueError: Model ssd_512_mobilenet1.0_custom is not supported. Available options are
alexnet
densenet121
densenet161
densenet169
densenet201
inceptionv3
mobilenet0.25
mobilenet0.5
mobilenet0.75
mobilenet1.0
mobilenetv2_0.25
mobilenetv2_0.5
mobilenetv2_0.75
mobilenetv2_1.0
resnet101_v1
resnet101_v2
resnet152_v1
resnet152_v2
resnet18_v1
resnet18_v2
resnet34_v1
resnet34_v2
resnet50_v1
resnet50_v2
squeezenet1.0
squeezenet1.1
vgg11
vgg11_bn
vgg13
vgg13_bn
vgg16
vgg16_bn
vgg19
vgg19_bn
我是不是做错了什么?这件事甚至可能吗?
附带说明一下,在此之后我需要在 Android 上部署一个姿势检测模型 (simple_pose_resnet18_v1b) 和一个 activity 识别模型 (i3d_nl10_resnet101_v1_kinetics400 ) 还有。
错误消息不言自明 - mxnet.gluon.model_zoo.vision.get_model
不支持模型“ssd_512_mobilenet1.0_custom”。您将 GluonCV 的 get_model
与 MXNet Gluon 的 get_model
.
混淆了
替换
block = get_model('ssd_512_mobilenet1.0_custom',
classes=classes_custom, pretrained_base=False, ctx=ctx)
和
import gluoncv
block = gluoncv.model_zoo.get_model('ssd_512_mobilenet1.0_custom',
classes=classes_custom, pretrained_base=False, ctx=ctx)
您实际上可以 运行 GluonCV 模型直接在 Android 上使用 Deep Java Library (DJL)
您需要做的是:
- hyridize your GluonCV model and save as MXNet model
- 为 android 构建 MXNet 引擎,MXNET 已经支持 Android 构建
- 将 MXNet 共享库包含到您的 android 项目中
- 在你的android项目中使用DJL,你可以按照这个DJL Android demo for PyTorch
我需要 运行 Android 上的自定义 GluonCV 对象检测模块。
我已经在自定义数据集上对模型 (ssd_512_mobilenet1.0_custom) 进行了微调,我尝试 运行 对其进行推理(加载在培训),一切都在我的电脑上完美运行。现在,我需要将其导出到 Android.
我参考了
- 您可以使用 ONNX 将模型转换为其他 运行 次,例如 [...] NNAPI 为 Android
- 您可以使用TVM
- 您可以使用 SageMaker Neo + DLR runtime [...]
关于第一个,我将我的模型转换为 ONNX。 但是,为了将其与 NNAPI 一起使用,需要将其转换为 daq。在存储库中,他们提供了一个 onnx2daq 的预编译 AppImage 来进行转换,但是脚本 returns 出错了。我检查了问题部分,they report“它实际上对所有 onnx 对象检测模型都失败了”。
然后,我尝试了 DLR,因为它被认为是最简单的方法。 据我了解,为了将我的自定义模型与 DLR 一起使用,我首先需要使用 TVM 对其进行编译(这也涵盖了链接 post 中提到的第二点)。在 repo 中,他们提供了一个 Docker 图像,其中包含一些针对不同框架的转换脚本。 我修改了 'compile_gluoncv.py' 脚本,现在我有:
#!/usr/bin/env python3
from tvm import relay
import mxnet as mx
from mxnet.gluon.model_zoo.vision import get_model
from tvm_compiler_utils import tvm_compile
shape_dict = {'data': (1, 3, 300, 300)}
dtype='float32'
ctx = [mx.cpu(0)]
classes_custom = ["CML_mug"]
block = get_model('ssd_512_mobilenet1.0_custom', classes=classes_custom, pretrained_base=False, ctx=ctx)
block.load_parameters("ep_035.params", ctx=ctx) ### this is the file produced by training on the custom dataset
for arch in ["arm64-v8a", "armeabi-v7a", "x86_64", "x86"]:
sym, params = relay.frontend.from_mxnet(block, shape=shape_dict, dtype=dtype)
func = sym["main"]
func = relay.Function(func.params, relay.nn.softmax(func.body), None, func.type_params, func.attrs)
tvm_compile(func, params, arch, dlr_model_name)
但是,当我 运行 脚本时 returns 错误:
ValueError: Model ssd_512_mobilenet1.0_custom is not supported. Available options are
alexnet
densenet121
densenet161
densenet169
densenet201
inceptionv3
mobilenet0.25
mobilenet0.5
mobilenet0.75
mobilenet1.0
mobilenetv2_0.25
mobilenetv2_0.5
mobilenetv2_0.75
mobilenetv2_1.0
resnet101_v1
resnet101_v2
resnet152_v1
resnet152_v2
resnet18_v1
resnet18_v2
resnet34_v1
resnet34_v2
resnet50_v1
resnet50_v2
squeezenet1.0
squeezenet1.1
vgg11
vgg11_bn
vgg13
vgg13_bn
vgg16
vgg16_bn
vgg19
vgg19_bn
我是不是做错了什么?这件事甚至可能吗?
附带说明一下,在此之后我需要在 Android 上部署一个姿势检测模型 (simple_pose_resnet18_v1b) 和一个 activity 识别模型 (i3d_nl10_resnet101_v1_kinetics400 ) 还有。
错误消息不言自明 - mxnet.gluon.model_zoo.vision.get_model
不支持模型“ssd_512_mobilenet1.0_custom”。您将 GluonCV 的 get_model
与 MXNet Gluon 的 get_model
.
替换
block = get_model('ssd_512_mobilenet1.0_custom',
classes=classes_custom, pretrained_base=False, ctx=ctx)
和
import gluoncv
block = gluoncv.model_zoo.get_model('ssd_512_mobilenet1.0_custom',
classes=classes_custom, pretrained_base=False, ctx=ctx)
您实际上可以 运行 GluonCV 模型直接在 Android 上使用 Deep Java Library (DJL) 您需要做的是:
- hyridize your GluonCV model and save as MXNet model
- 为 android 构建 MXNet 引擎,MXNET 已经支持 Android 构建
- 将 MXNet 共享库包含到您的 android 项目中
- 在你的android项目中使用DJL,你可以按照这个DJL Android demo for PyTorch