Tensorflow Lite Android对象检测--移动的SSD型号预计正好有4个输出,但发现有8个

mctunoxg  于 2022-11-16  发布在  Android
关注(0)|答案(2)|浏览(235)
    • 遇到 的 问题 : * *

E/Android 运行 时 :致命 异常 :主要 流程 :org . 张 量 流 . lite . 示例 . 检测 , PID :14719 java . lang . Assert 错误 :初始 化 ObjectDetector 时 出错 :预计 移动 SSD 型号 正好 有 4 个 输出 , 但 发现 有 8 个

    • 问题 描述 * *
  • Android 应用 程序 来源 :来自 Google 的 TensorFlow Lite 对象 检测 示例
  • 启动 示例 应用 程序 时 显示 错误
    • 型号 说明 * *
  • 是否 使用 自 定义 模型 ? * * 是 * *
  • 使用 的 预 训练 模型 :ssd _ 手机 网络 _v2 _ 手机 _640x640_coco17_tpu - 8
  • 推论 类型 :浮动
  • 类别 数目 :4
    • 系统 信息 * *
  • 操作 系统 平台 和 分发 :( Linux Ubuntu 20.14 )
  • TensorFlow 版本 :2.4.1
  • TensorFlow 安装 自 :皮普
    • 使用 的 保存 模型 转换 命令 : * *
    • 1 . Saved _ Model . pb 导出 : * *

导出 器 _ 主 文件 _ v2.py

    • 输入 类型 图像 张 量
    • 管道 配置 路径 ./models/ssd 移动 网络 版本 2 fpnlite_640x640_coco17_tpu - 8/管道 配置
    • 已 培训 的 检查 点 目录/型号/ssd 移动 网络 v2_fpnlite 640x640_coco17_tpu - 8
    • 输出 目录 导出 的 模型/tflite
    • 2 . 将 保存 的 模型 ( . pb ) 转换 为 tflite * *

托 科

    • 保存 的 模型 目录/导出 的 模型/文件/保存 的 模型
    • 发送 选择 tf-ops 真
    • 允许 自 定义 操作
    • 图形 定义 文件 ./导出 模型/tflite/已 保存 模型/已 保存 模型 . pb
    • 输出 文件 ./导出 的 模型/tflite/tflite/检测 . tflite
    • 输入 形状 1,300,300,3
    • 输入 数组 标准 化 输入 图像 张 量
    • 输出 数组 " TFLite 检测 后 处理 " 、 " TFLite 检测 后 处理 : 1 " 、 " TFLite 检测 后 处理 : 2 " 、 " TFLite 检测 后 处理 : 3 "
    • 推理 类型 = 浮点 型
    • 允许 自 定义 操作
    • 备注 * * 我 尝试 在 Google TensorFlow lite 提供 的 示例 中 使用 经过 训练 的 自 定义 模型 。 只是 每次 我 打开 应用 程序 时 , 它 都 返回 这样 的 错误 , 移动 SSD 模型 预计 有 4 个 输出 , 但 找到 了 8 个 。 该 模型 经过 训练 以 识别 4 个 类 , 所有 这些 都 在 labelmap.txt 和 管道 配置 中 声明 。
    • 有人 知道 这个 错误 吗 ? * *
xqkwcwgp

xqkwcwgp1#

经过进一步的研究,我认为上述问题是由于模型有8Tensor输出,但用Java编写的Android应用程序只能支持4Tensor输出而提出的(至少Google提供的示例只支持4Tensor输出)
我不是很确定不同模型上输出的Tensor的数量。据我了解和摆弄不同的模型,fixed_shape_resizer为640 x 640的模型很可能需要4个以上的Tensor输出(通常是8个Tensor输出),这与用Java编写的Android应用不兼容。
对于任何像我这样的业余用户,请找到以下先决条件,以便在Android application
建议设置(假设您使用的是TensorFlow版本〉= 2.3):

  • TensorFlow模型:固态硬盘型号的固定形状大小调整器为320 x 320

(In我的情况下,SSD MobileNet v2 320 x320工作得非常好)(Tensor输出必须为4)

*Colab(非常适合模型培训和转换)

(我尝试过在本地机器上进行Linux和Windows平台的训练和转换,不同工具和包的不兼容性让我很头疼。我使用了Colab进行训练和转换。它的功能更强大,与那些训练工具和脚本有很好的兼容性。)

  • @lu-wang-g编写的元数据编写器库

(In在我的例子中,在将训练好的模型转换为.tflite之后,如果您直接将.tflite模型迁移到Android应用程序,应用程序将报告大量关于.tflite模型配置的问题。假设您正确地训练并转换了模型,你所需要的只是上面的元数据编写器库。2它会自动根据.tflite模型为你配置元数据。然后,您可以直接将模型迁移到应用程序。)
有关详细信息,请访问我的GitHub问题:
https://github.com/tensorflow/tensorflow/issues/47595

ygya80vv

ygya80vv2#

对于那些稍后会遇到这个问题的人:对输出Tensor数量的限制是此处描述的Tensorflow Lite对象检测API规范的一部分我还不知道如何使模型与此要求兼容,但如果我能弄清楚,我会附上我的答案。

更新

Here是Google Colab的官方代码,其中包含一个模型转换的示例。

python models/research/object_detection/export_tflite_graph_tf2.py \
    --trained_checkpoint_dir {'ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8/checkpoint'} \
    --output_directory {'ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8/tflite'} \
    --pipeline_config_path {'ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8/pipeline.config'}

该脚本不会转换您的模型,但会使模型在使用的操作和输入/输出格式方面与TFLite兼容。脚本中的注解声明仅支持SSD元架构(也声明为here)。此外,在该脚本所在的repo的同一目录中,还有其他脚本似乎在做类似的事情,但没有给出明确的描述。

相关问题