我使用MLKit熟悉customize the classifier模型的制作方法,但是有什么方法可以自定义或重新训练对象检测模型?
我正在研究一个机器人项目,其中一个Android驱动的机器人必须检测其他机器人和充电站。我正在重新训练图像分类器,以对机器人和充电站进行正确分类,考虑到足够大的图像集,这似乎很简单。为了生成此图像集,我与机器人进行了随机行走,每次识别出一个物体时都要拍照,并在所述物体处于视场中时每0.5秒继续拍照。我还将图像裁剪到边界框,并使用分类器将其命名,以便于分组。运行了大约半小时后,我检查了图像,发现在各种分类器下很容易检测到机器人本身,但未发现充电站。我的随机游走产生了约1000张图像,其中100-150张是其他机器人的图像,而我只捕获了约5张充电站图像。
当我尝试在充电站周围手动放置机器人时,我注意到在检测到物体之前,放置位置必须非常明确。这使我想到了我想以某种方式重新训练对象检测模型以更好地识别我的充电站的想法。从文档中,我能找到的是重新训练分类器的方法,而不是对象检测。有什么办法吗?
尽管我已经做了很多修改以进行图像捕获和其他机器人操作,但是我正在使用的基本代码是带有自定义分类器的默认vision-quickstart对象检测模块。
请注意,充电站(右)比机器人上的一个轮子(左)稍大一些,如果可以使它可视化,它也可以安装在机器人之间的轮子之间。
我刚刚试用了MLKit外部的TF Lite对象检测sample app,很明显,这在检测充电站和较小的对象方面做得更好。我尝试在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']
也许我可以重新设计一下以满足model requirements的需求?还是我想将方形钉插入圆孔中?
答案 0 :(得分:3)
当前,我们不提供用于交换MLKIt中ODT的检测器的API。我们有一个使探测器也可以互换的计划。
来自TFLite样本的模型是包含检测器和分类器的单个模型,而MLKit中的模型是两个分离的模型。仅交换检测器模型将是不平凡的。首先,让我们尝试以下解决方法:
当我尝试在充电站周围手动放置机器人时,我注意到在检测到物体之前,放置位置必须非常明确。
为了使充电站更容易被检测到,您可以尝试在充电点上放置比背景更多的“纹理”。例如,充电点边缘上的不同色点。
此外,如果您使用的是单对象模式(主要对象),则要求该对象位于图像框的中心。您也可以尝试多个对象模式,该模式不需要对象位于中心,但是您可能需要过滤掉其他非兴趣检测结果。