问题:
使用MLKit,我熟悉如何使用自定义分类器模型,但是有什么方法可以定制或重新训练对象检测模型吗?
背景
我正在从事一个机器人项目,机器人必须探测其他机器人和充电站。我正在对图像分类器进行再培训,以便正确地对机器人和充电站进行分类,这看起来相当直接,给出了足够大的图像集。为了生成这个图像集,我与机器人进行随机行走,每次物体被识别时让它拍摄一张照片,然后继续每0.5秒拍摄一张照片,而所述对象在视图中。我还将图像裁剪到边界框,并使用分类器命名它,以便于分组。在运行了半个多小时后,我检查了图像,发现机器人本身在各种分类器下都很容易被检测到,但是充电站却不是。我的随机行走产生了大约1000张图像,其中100-150张是关于其他机器人的,而我只拍到了大约5张充电站的图像。
当我试图手动定位在充电站周围的机器人时,我注意到在检测到物体之前,位置必须非常具体。这让我产生了这样的想法:我想以某种方式重新训练目标检测模型,以更好地识别我的充电站。从文档中,我能找到的只是重新训练分类器的方法,而不是对象检测。有办法这样做吗?
代码
虽然我已经对它进行了相当多的修改,以完成图像捕获和其他机器人操作,但我所使用的基本代码是默认的带有自定义分类器的视觉-快速启动对象检测模块。
图片


注意,充电站(右)比机器人上的一个轮子(左)要大一点,如果这也有助于视觉化的话,它适合在机器人的车轮之间。
编辑1
我刚刚试用了TF对象检测样本应用程序,它位于MLKit之外,而且很明显,这在检测充电站和一般较小的物体方面做得更好。我尝试在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']也许我可以重做这个来满足模型要求?还是我想把正方形的钉子插进圆孔里?
发布于 2020-10-09 18:39:55
目前,我们没有提供API来替换MLKIt中的ODT检测器。我们有计划让探测器也可以互换。
从TFLite样本中提取的模型是一个包含检测器和分类器的单一模型,而MLKit中的模型是两个分离的模型。只交换检测器模型将是不平凡的。让我们先试试下面的一些解决办法:
当我试图手动定位在充电站周围的机器人时,我注意到在检测到物体之前,位置必须非常具体。
为了使充电站更容易被检测,您可以尝试将更多的纹理在充电点与背景相比。例如,充电点边缘的不同颜色点。
另外,如果您使用的是单一对象模式(主对象),它要求对象位于图像帧的中心。您还可以尝试多个对象模式,该模式不需要中心上的对象,但可能需要筛选出其他非感兴趣的检测结果。
https://stackoverflow.com/questions/64272741
复制相似问题