在 detectorron2 中,如何将关键点名称放在图像上?

问题描述 投票:0回答:1

首先,我将解释问题陈述。我正在使用 Detectron2 为我的自定义数据集进行关键点检测。我使用下面的代码来可视化边界框和关键点。

outputs = predictor(im[..., ::-1])
v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
plt.figure(figsize=(60,30))
plt.imshow(out.get_image()[..., ::-1][..., ::-1])

我得到的输出如下图所示。

enter image description here

如您所见,类标签和两个关键点是由 detectorron2 可视化工具绘制在图像上的。两个关键点名称为 [keypoint_up, keypoint_down]。

我也想打印图像上两个关键点的名称。像下面的例子。

enter image description here

我知道 detectorron 提供了一个名为 draw_text 的函数。如果有人知道我如何使用它来将关键点名称放在图像上,那将是一个很大的帮助。编码示例将非常有用。除了draw_text函数之外的任何其他解决方案也受到欢迎。谢谢您的宝贵时间

python computer-vision object-detection detectron keypoint
1个回答
0
投票

您在检测到的关键点旁边显示关键点名称的方法非常合理。让我们一步步实现来完成解决方案:

  1. 迭代预测的关键点:
  2. 提取 x 和 y 坐标:
  3. 将关键点映射到他们的名字:
  4. 在图像上绘制文字:

这是我用来可视化图像上关键点标签的方法:

outputs = predictor(im[..., ::-1])
v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
out = v.draw_instance_predictions(outputs["instances"].to("cpu"))
# Iterate over each detected instance and its keypoints
instances = outputs["instances"].to("cpu")

for i in range(len(instances)):
    keypoints = instances.pred_keypoints[i]  # Get keypoints for the i-th instance
      for j, predicted_keypoint in enumerate(keypoints):
        x, y, prob = predicted_keypoint
        if prob > 0.5:  # Adjust the probability threshold if necessary
           position = (x.item(), y.item())
           text = MetadataCatalog.get(cfg.DATASETS.TRAIN[0]).keypoint_names[j]  # Get the corresponding keypoint name
           keypoints_positions.append((text, position))

# Draw all keypoints names on the image at once
for text, position in keypoints_positions:
    v.draw_text(text, position, font_size=12, color="g", horizontal_alignment="center")

# Visualize the result
plt.figure(figsize=(60, 30))
plt.imshow(out.get_image())
plt.show() 

在此解决方案中:

  • 我们迭代每个检测到的实例及其关键点。
  • 对于每个关键点,我们提取其坐标和概率。
  • 我们将每个关键点映射到 keypoint_names 列表中对应的名称。
  • 我们使用 v.draw_text 将关键点名称放置在图像上。

这应该会生成一个将关键点显示为点及其相应名称的图像。希望这可以帮助您实现所需的可视化! 🛠️希望有帮助。如果您对我建议的解决方案有疑问,请不要犹豫。

© www.soinside.com 2019 - 2024. All rights reserved.