发布于 2023-04-24 04:04:33
中的一个典型场景
多目标跟踪算法的一般思想如下:
然后,通过匹配结果,您可以知道基图像中的每个对象:如果它存在于查询图像中,如果存在,那么它在哪里。
具有代码
的简单解决方案
import cv2
base = cv2.imread(PATH_TO_BASE_IMAGE)
query = cv2.imread(PATH_TO_QUERY_IMAGE)
的目标检测
这个例子中的物体很容易被发现findContour
from OpenCV是一种非常原始的检测对象的方法,在这里已经足够好了。
def detect_objects_by_contour(raw):
img = raw.max(axis=2) # keep the most intense channel
_, thresh = cv2.threshold(img, 50, 255, cv2.THRESH_BINARY) # binarization
contours, _ = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) # find contour
# calculate bounding boxes
bboxes = []
for points in contours:
ctr = np.vstack(points)
l, t, r, b = ctr[:, 1].min(), ctr[:, 0].min(), ctr[:, 1].max(), ctr[:, 0].max()
bboxes.append((l, t, r, b))
return bboxes
下面是每个步骤的结果可视化:
中提取特征
使用每个对象在各自的边界框中,您希望找到可以捕获其特征的描述性功能,以便以后在匹配中使用。质量越高,匹配问题就越容易解决。在这里,我从OpenCV - ORB
中选择了免费和快速的特性提取器。
def extract_feature_from_bbox(img, bboxes):
ORB = cv2.ORB_create(edgeThreshold=0, fastThreshold=10)
crop_features = []
for b in bboxes:
# add small buffer for edge detection to work
crop = img[b[0] - 1:b[2] + 2, b[1] - 1:b[3] + 2]
crop_features.append(ORB.detectAndCompute(crop, None))
return crop_features
请注意,选择ORB提取器的阈值是为了适应这个问题。在实践中,您希望评估不同的选择,以找到最好的选择。
最简单的二部匹配算法是Hungarian algorithm
算法。这里我使用了来自scipy
的实现。
from scipy.spatial.distance import cdist
from scipy.optimize import linear_sum_assignment
def find_best_match(patch1, patch2):
# distance between two crops is defined as
# mean of pair-wise distance of their key points in feature space
dist_matrix = np.array([[cdist(d1, d2).mean() for _, d1 in patch1] for _, d2 in patch2])
match_idxes = linear_sum_assignment(dist_matrix)
return match_idxes
下面是匹配的结果:
正如您所看到的,除了一个对象之外,所有对象都在图像之间很好地匹配,除了底部的teal正方形与紫色三角形匹配之外。这很可能是因为ORB特性不够好(或者太好)不能表示这样简单的几何图形。您可以使用其他特性(如简单的对象颜色)来改进结果。
有了匹配的结果,您就可以很容易地判断哪些对象丢失了:
missing_idx = set(range(len(base_crops))) - set(match_idxes[1])
print(f"{len(missing_idx)} objects are missing in query image. Their positions are {[find_box_center(bboxes[i]) for i in missing_idx]}")
>>> 3 objects are missing in query image. Their positions are [(45, 281), (209, 112), (173, 44)]
具有可视化功能的完整代码可以找到这里。
发布于 2023-04-01 11:47:00
要使用任何类型的学习算法,您需要将其转化为学习问题。一种选择是将其转化为分类问题。对于这个问题,可能有更好的学习方法,但对于实验来说,它将提供一些可探索的方向。这将要求您创建一个带有标签的培训集,其中包含图像中的对象的标签。这可以表示为一个多标签问题。例如,一个训练图像可能被标记为:{‘黑暗绿色矩形’:1,‘红场’:1,‘光绿色三角’:2,…},另一个缺少红场{‘暗绿色矩形’:1,‘红场’:0,‘光绿色三角’:2,}。
然后,你可以对图像进行深度学习。神经网络推理将为每个对象的存在提供预测。
对于标签,您可以泛化一些,例如“对象1”、“对象2”、“对象3”.只要训练数据和未来的图像数据是一致的解释。
您的示例显示了背景相同且不重叠的对象。在这种情况下,您可以使用模拟来创建真实的培训数据(就像为自动驾驶车辆训练人工智能一样),因为您拥有每个对象的单独图像,您可以自动创建培训数据(图像和标签集)。例如,创建具有不同尺度、旋转和位置的对象的随机选择的图像,而不是重叠的。
https://datascience.stackexchange.com/questions/84709
复制相似问题