【问题标题】:Running GluonCV object detection model on Android在 Android 上运行 GluonCV 对象检测模型
【发布时间】:2021-03-02 12:19:02
【问题描述】:

我需要在 Android 上运行一个自定义的 GluonCV 对象检测模块。

我已经在自定义数据集上微调了模型 (ssd_512_mobilenet1.0_custom),我尝试使用它运行推理(加载训练期间生成的 .params 文件),一切都在我的计算机上运行良好。现在,我需要将其导出到 Android。

我指的是this answer来弄清楚程序,有3个建议选项:

  1. 您可以使用 ONNX 将模型转换为其他运行时,例如 [...] NNAPI for Android
  2. 您可以使用TVM
  3. 您可以使用 SageMaker Neo + DLR runtime [...]

关于第一个,我将模型转换为 ONNX。 但是,为了与 NNAPI 一起使用,需要将其转换为 daq。在存储库中,他们提供了 onnx2daq 的预编译 AppImage 来进行转换,但脚本返回错误。我检查了问题部分,they report 说“它实际上对所有 onnx 对象检测模型都失败了”。

然后,我尝试了 DLR,因为建议它是最简单的方法。 据我了解,为了将我的自定义模型与 DLR 一起使用,我首先需要使用 TVM 编译它(这也涵盖了链接帖子中提到的第二点)。在 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)

但是,当我运行脚本时,它会返回错误:

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) 和活动识别模型 (i3d_nl10_resnet101_v1_kinetics400)。

【问题讨论】:

    标签: mxnet mxnet-gluon


    【解决方案1】:

    您实际上可以使用Deep Java Library (DJL) 在 Android 上直接运行 GluonCV 模型 你需要做的是:

    1. hyridize your GluonCV model and save as MXNet model
    2. 为android构建MXNet引擎,MXNET已经支持Android构建
    3. 将 MXNet 共享库包含到您的 android 项目中
    4. 在你的android项目中使用DJL,你可以关注这个DJL Android demo for PyTorch

    【讨论】:

    • 您好,非常感谢您的回答!看来这正是我所需要的,因为 - 据我了解 - 它允许直接从 GluonCV 模型 ZOO 转换模型。但是,您能否详细说明您描述的程序?我使用了您提供的链接(第 2 点),并运行了“./build.py -p armv7”,它在我的计算机上构建了一个 docker 映像,其中(我猜)一个与 Android 兼容的 MXNet 安装。我应该...以某种方式导出它,并按照您在第 3 点中的建议在 Android 项目中使用它吗?我查看了 Android 教程,但没有提供太多解释。
    【解决方案2】:

    错误消息一目了然 - 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 2021-02-18
      • 2018-05-20
      • 2021-04-21
      • 2020-09-19
      • 2019-11-09
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多