Python 如何从自定义对象的landmark detector开始?

Python 如何从自定义对象的landmark detector开始?,python,computer-vision,keypoint,Python,Computer Vision,Keypoint,我正在尝试为自定义对象制作地标探测器,此面板: 我正在经历多种方法:使用热图和基于回归的方法 我试过动手操作,发现它很有用,但有灰度数据,可能无法正常工作,因为面板本身是黑色的 是否有一种记录良好的方法可以做到这一点?如果您的目的是检测角点的坐标,那么您提出的方法就太过分了。你可以简单地为每个角落做些什么。请参阅下面的代码以获取粗略的示例 import numpy as np import cv2 as cv import matplotlib.pyplot as plt #%% src =

我正在尝试为自定义对象制作地标探测器,此面板:

我正在经历多种方法:使用热图和基于回归的方法

我试过动手操作,发现它很有用,但有灰度数据,可能无法正常工作,因为面板本身是黑色的


是否有一种记录良好的方法可以做到这一点?

如果您的目的是检测角点的坐标,那么您提出的方法就太过分了。你可以简单地为每个角落做些什么。请参阅下面的代码以获取粗略的示例

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#%%
src = cv.imread('airMH.jpg')

gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
blur=cv.GaussianBlur(gray,(3, 3),1)
templateRightBot = blur[170:205,110:135];
templateLeftBot = blur[150:185,15:50];
templateRightTop = blur[35:75,135:160];
templateLeftTop = blur[30:50,80:105];

#%%
img=src.copy()
w, h = templateLeftTop .shape[::-1]
res = cv.matchTemplate(gray, templateLeftTop, cv.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateLeftTop = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img,top_left, templateLeftTop, 255, 2)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('LeftTop'), plt.xticks([]), plt.yticks([])

img=src.copy()
w, h = templateRightTop .shape[::-1]
res = cv.matchTemplate(gray, templateRightTop, cv.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateRightTop = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img,top_left, templateRightTop, 255, 2)
plt.subplot(2,2,2),plt.imshow(img,cmap = 'gray')
plt.title('RightTop'), plt.xticks([]), plt.yticks([])

img=src.copy()
w, h = templateLeftBot .shape[::-1]
res = cv.matchTemplate(gray, templateLeftBot, cv.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateLeftBot = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img,top_left, templateLeftBot, 255, 2)
plt.subplot(2,2,3),plt.imshow(img,cmap = 'gray')
plt.title('LeftBot'), plt.xticks([]), plt.yticks([])

img=src.copy()
w, h = templateRightBot .shape[::-1]
res = cv.matchTemplate(gray, templateRightBot, cv.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc
templateRightBot = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img,top_left, templateRightBot, 255, 2)
plt.subplot(2,2,4),plt.imshow(img,cmap = 'gray')
plt.title('RightBot'), plt.xticks([]), plt.yticks([])
以下是输出:


关于将图像转换为灰度,由于您的图像是在室外拍摄的,因此需要对其进行规格化以消除阳光等的影响。。。因此,将图像转换为灰度类型作为标准化。因此,它利大于弊。

您有多少数据?地标探测器的用途是什么?是为了定位,姿势估计吗?我从谷歌图片中获取数据。它们是RGB。我正在尝试进行地标检测,检测四个角的坐标:
左上角
右上角
右下角
左下角
。我用kaggle笔记本对它进行了培训,但没有取得好的效果(感谢@burak,但不幸的是,该图像并不代表相机将看到的所有图像/场景。模板匹配用于检测图像中的相同对象。然后,您可以尝试筛选特征,如下所述提取特征,然后训练4个分类器(使用svm)可能是一个很好的解决方案。您还可以使用预训练vgg16来提取特征。