(这出来有点长,但它主要是一个很难理解的解释:)
对于我拥有的项目,我需要识别一般形式的对象,如下所示 -
在包含不同形状的更大图像中,比如这个 -
正如你所看到的,我正在寻找的对象是一条红线,两边都有十字(最后一张图片中有 5 个)。我有大约 4,000 张图像库,我需要在其中找到对象,其中一些包含这些对象,而其中一些不包含,就像这张图片 -
在做了一些研究之后,我发现使用 haar 级联和 openCV 是可行的方法,所以我编写了一个脚本,遍历所有上述 4,000 张图像并提取分离的轮廓,就像这个问题中的第一张图像一样。
然后,我遍历了许多轮廓,抓取了大约 150 个(即 150 个仅包含我需要的对象的文件,类似于第一个图像)和大约 180 个不包含我需要的对象的图像(类似于第三张图在这里)。
然后我开始了训练过程,使用了几个教程,但主要是这个。
这样做时,我遇到了一个问题 - 如您所见,所需的双叉对象的图像大小不同,甚至没有相同的比例(因为它们可以以任何角度出现 - 水平,对角, ETC..)。
起初我尝试使用不同尺寸的图像,但这会导致训练过程中出现错误,因此,为了解决这个问题,我将所有正图像的尺寸更改为 350x350(其中一个的最大比例)对象)。为了清楚起见-我没有调整图像的大小-我只是在周围添加了空白以使所有图像都为 350x350 像素。
然后我按照教程中的建议完成了培训过程 - 我创建了样本(宽度 - 24,高度 - 24)并创建了一个级联 xml 文件,结果证明它不是很大(45kb)。
现在,我知道 150 张正面图像和 180 张负面图像并不多,但我想至少在过滤更多图像并投入更多时间之前进行概念验证。
完成 cascade.xml 文件后,我尝试使用它来定位某些图像中的某些对象(使用cv2.CascadeClassifier('cascade.xml')
并且cascade.detectMultiScale(img)
每次尝试都返回零结果。
最后,我什至尝试在其中一张正面图像中定位一个对象(其中只包含一个所需的对象),但它也返回零结果。
我尝试调整参数,cascade.detectMultiScale(img)
目前我正在训练一个具有 36x36 样本的级联文件,但我不相信它会起作用。
由于我对这些东西很陌生,所以我想知道我做错了什么,我想我会在这里问。
进一步来说:
- 您认为在这种情况下使用 haar 是否正确?我应该使用其他物体识别方法吗?
- 正面图像尺寸会成为问题的根源吗?如果是这样,我该怎么做?
如果我没有包含一些重要数据,请让我知道我会发布它。
非常感谢你的帮助,丹