所以我是一个非常有经验的开发人员,试图研究一些机器学习/神经网络代码。
基本上,我需要一个巨大的数据集,所以我的第一个问题是我需要找到一种快速标记大量图像的方法。因此,以this为例。
我当时想我可以在主图像及其下面的图像上使用模板匹配吗?这样一来,我只需要获得使用这些数据的权限,就可以非常快速地对其进行标记。
使用openCV时(从示例中),我得到一些非常时髦的结果,它们在图像中找不到板,它确实绘制了框,但没有在板周围,经过测试,它非常非常接近几次,但代码并不多...
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('./image2.jpg',0)
img2 = img.copy()
template = cv.imread('./Plate2.test.png',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR',
'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
img = img2.copy()
method = eval(meth)
# Apply template Matching
res = cv.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img,top_left, bottom_right, 255, 2)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle(meth)
plt.show()
第一件事是我猜这是行不通的,因为我们要在其上寻找模板的主图像的方向不同。
我要指出的第二件事是我不是Python程序员,所以我也在学习,这是我第一次接触OpenCV,因此我试图将我对对象检测的理解应用于我的东西。不能正确理解。
我想做的是从较小的板中获得MAIN图像中边界框的坐标,这样我可以(获得许可)创建一个像样的数据集来真正快速地进行训练-否则,我必须手动进行操作: -(
任何帮助将不胜感激,我有很多示例在工作,但这是一个有趣的问题,我没有发现任何参考。
在我看来,步骤是:
1)找到板并创建边界框
2)在尽可能多的图像上训练数据集,以便在所述板上检测物体
3)测试板时需要从主图像中提取图像,然后应用透视变换。
4)如果愿意,可以将平板放平后进行文本提取。
更新:
所以我尝试了here中的SIFT,结果如下(请注意,该图片已经在上述网站的公共领域中。)-不太符合目标!
更新2
我已经设法按照评论中建议的JD整理了一篇文章中的解决方案,从本质上讲,它使我可以标记足够的图像来创建神经网络,从而更好地检测它们-我将发布更新很快就会得到答案。