首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在图像中查找丢失的物体(S),并对丢失的对象有先验知识(S) (w.r.t .基本图像)

在图像中查找丢失的物体(S),并对丢失的对象有先验知识(S) (w.r.t .基本图像)
EN

Data Science用户
提问于 2020-10-30 14:13:46
回答 2查看 1.8K关注 0票数 10

EN

回答 2

Data Science用户

发布于 2023-04-24 04:04:33

这是多目标跟踪问题

中的一个典型场景

多目标跟踪算法的一般思想如下:

  1. 从这两个图像中找到所有的对象,并使用它们的边界框将它们裁剪成块(小图像);
  2. 定义任意两种作物之间的相似性度量(通常是通过某种特征提取器),并计算它们成对的相似性分数;
  3. 通过查找最大匹配优化相似度总评分

然后,通过匹配结果,您可以知道基图像中的每个对象:如果它存在于查询图像中,如果存在,那么它在哪里。

具有代码

的简单解决方案

0。原始图像

代码语言:javascript
运行
复制
import cv2

base = cv2.imread(PATH_TO_BASE_IMAGE)
query = cv2.imread(PATH_TO_QUERY_IMAGE)

1.基于轮廓

的目标检测

这个例子中的物体很容易被发现findContour from OpenCV是一种非常原始的检测对象的方法,在这里已经足够好了。

代码语言:javascript
运行
复制
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

下面是每个步骤的结果可视化:

2.从作物

中提取特征

使用每个对象在各自的边界框中,您希望找到可以捕获其特征的描述性功能,以便以后在匹配中使用。质量越高,匹配问题就越容易解决。在这里,我从OpenCV - ORB中选择了免费和快速的特性提取器。

代码语言:javascript
运行
复制
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提取器的阈值是为了适应这个问题。在实践中,您希望评估不同的选择,以找到最好的选择。

3.匹配

最简单的二部匹配算法是Hungarian algorithm算法。这里我使用了来自scipy的实现。

代码语言:javascript
运行
复制
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特性不够好(或者太好)不能表示这样简单的几何图形。您可以使用其他特性(如简单的对象颜色)来改进结果。

有了匹配的结果,您就可以很容易地判断哪些对象丢失了:

代码语言:javascript
运行
复制
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)]

具有可视化功能的完整代码可以找到这里

票数 1
EN

Data Science用户

发布于 2023-04-01 11:47:00

要使用任何类型的学习算法,您需要将其转化为学习问题。一种选择是将其转化为分类问题。对于这个问题,可能有更好的学习方法,但对于实验来说,它将提供一些可探索的方向。这将要求您创建一个带有标签的培训集,其中包含图像中的对象的标签。这可以表示为一个多标签问题。例如,一个训练图像可能被标记为:{‘黑暗绿色矩形’:1,‘红场’:1,‘光绿色三角’:2,…},另一个缺少红场{‘暗绿色矩形’:1,‘红场’:0,‘光绿色三角’:2,}。

然后,你可以对图像进行深度学习。神经网络推理将为每个对象的存在提供预测。

对于标签,您可以泛化一些,例如“对象1”、“对象2”、“对象3”.只要训练数据和未来的图像数据是一致的解释。

您的示例显示了背景相同且不重叠的对象。在这种情况下,您可以使用模拟来创建真实的培训数据(就像为自动驾驶车辆训练人工智能一样),因为您拥有每个对象的单独图像,您可以自动创建培训数据(图像和标签集)。例如,创建具有不同尺度、旋转和位置的对象的随机选择的图像,而不是重叠的。

票数 -1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/84709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档