首页 > 解决方案 > 改进 MLKit 对象检测

问题描述

问题:

使用 MLKit,我熟悉如何自定义分类器模型,但是有没有办法自定义或重新训练对象检测模型?

背景

我正在从事一个机器人项目,其中一个由 Android 驱动的机器人必须检测其他机器人和充电站。我正在重新训练图像分类器以正确分类机器人和充电站,这似乎相当简单,因为图像集足够大。为了生成这个图像集,我和机器人一起随机行走,每次识别到物体时让它拍照,并在所述物体在视野中​​时每 0.5 秒继续拍照。我还将图像裁剪到边界框并使用分类器为其命名以便于分组。运行半小时左右后,我检查了图像,发现机器人本身很容易在各种分类器下被检测到,但充电站却没有。我的随机游走生成了大约 1000 张图像,

当我尝试在充电站周围手动定位机器人时,我注意到在检测到物体之前,放置必须非常具体。这让我想到我想以某种方式重新训练对象检测模型以更好地识别我的充电站。从文档中,我只能找到重新训练分类器的方法,而不是对象检测。有没有办法做到这一点?

代码

尽管我已经对其进行了相当多的修改以进行图像捕获和其他机器人操作,但我正在使用的基本代码是带有自定义分类器的默认视觉快速启动对象检测模块。

图片

机器人 充电站

请注意,充电站(右)比机器人(左)上的一个轮子要大一些,如果这也有助于可视化,它可以安装在轮子之间的机器人下方。

编辑 1

我刚刚试用了位于 MLKit 之外的 TF Lite 对象检测示例应用程序,很明显,它在检测充电站和一般较小的对象方面做得更好。我尝试在 mlkit 中使用此示例中使用的检测模型,但看起来它们不兼容。我收到错误:

E/native: calculator_graph.cc:772 INVALID_ARGUMENT: CalculatorGraph::Run() failed in Run: 
    Calculator::Open() for node "[BoxClassifierCalculator, BoxClassifierCalculator with output stream: detection_results0]" failed: #vk Unexpected number of dimensions for output index 0: got 3D, expected either 2D (BxN with B=1) or 4D (BxHxWxN with B=1, W=1, H=1). [type.googleapis.com/mediapipe.StatusList='\n\xb7\x02\x08\x03\x12\x85\x02\x43\x61lculator::Open() for node \"[BoxClassifierCalculator, BoxClassifierCalculator with output stream: detection_results0]\" failed: #vk Unexpected number of dimensions for output index 0: got 3D, expected either 2D (BxN with B=1) or 4D (BxHxWxN with B=1, W=1, H=1).\x1a+\n$tflite::support::TfLiteSupportStatus\x12\x03\x34\x30\x30']

也许我可以修改它以满足模型要求?还是我想把一个方形钉子装进一个圆孔里?

标签: google-mlkit

解决方案


目前,我们不提供 API 来将检测器替换为 MLKIt 中的 ODT。我们计划使探测器也可更换。

TFLite 样本中的模型是包含检测器和分类器的单一模型,而 MLKit 中的模型是两个独立的模型。仅交换检测器模型并非易事。让我们首先尝试以下一些解决方法:

当我尝试在充电站周围手动定位机器人时,我注意到在检测到物体之前,放置必须非常具体。

为了使充电站更容易被检测到,您可以尝试在充电点上与背景相比添加更多“纹理”。例如,充电点边缘的不同颜色的圆点。

此外,如果您使用单对象模式(主要对象),则要求对象位于图像帧的中心。您也可以尝试不要求对象位于中心的多对象模式,但您可能需要过滤掉其他非兴趣检测结果。


推荐阅读