Yolov5如何输出其中一个类别的中心点坐标

问题:Yolov5如何输出其中一个类别的中心点坐标
请问如何在多检测目标中,只输出其中三个类的坐标,目前自己只会单检测目标情况输出坐标。

参考GPT和自己的思路:

对于第一个问题,如果你只想输出其中一个类别的中心点坐标,可以通过检测结果的类别信息筛选出相应的结果,然后计算该类别的中心点坐标。具体实现可以在检测结果中添加类别信息,然后对结果进行筛选和计算。

对于第二个问题,如果要在多检测目标中只输出其中三个类的坐标,可以对检测结果进行排序,按照需要输出的三个类别的优先级进行筛选和输出。具体实现可以在检测结果中添加类别信息和置信度信息,然后对结果进行排序和筛选。

参考GPT和自己的思路:

对于这个问题,您可以通过以下步骤来实现Yolov5只输出其中一个类别的中心点坐标:

  1. 修改模型配置文件:打开模型的配置文件,找到“classes”字段,并将其值修改为1,这样模型只会识别一个类别。

  2. 输出中心点坐标:在模型代码中,找到对应的输出函数,并将其输出中心点的坐标改为对应类别的坐标。具体来说,可以在如下代码段中完成:

# 获取检测结果中某个类别的center坐标
class_pred = class_prob[:, cls] * mask
class_boxes = get_region_boxes(
    outputs[..., :4], conf_thresh, num_classes, anchors, 
    len(anchors), stride, only_objectness=False, 
    validation=False)[0]
class_boxes = xywh2xyxy(class_boxes)
class_boxes = torch.Tensor([b.tolist() + [s] for b, s in zip(class_boxes, class_pred) if s > conf_thresh]).to(outputs.device)
if len(class_boxes) > 0:
    x_center = (class_boxes[:, 0] + class_boxes[:, 2]) / 2.0
    y_center = (class_boxes[:, 1] + class_boxes[:, 3]) / 2.0
    return torch.stack((x_center, y_center), dim=1).tolist()
else:
    return []

其中,cls为要输出的类别的类别ID,对应地修改class_pred的获取方式,并在最后计算中心点的时候只取x和y的坐标即可。

  1. 只输出特定类别的坐标:在调用上述输出函数时,将其限制为只输出需要的类别的坐标即可,具体来说,可以如下进行调用:
# 只输出第一个类别的中心点坐标
class_centers = model.detect_one_class(image, 0)
print(class_centers)

其中,“0”即为要输出的类别的类别ID,可以按需更改。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
如果你想在多目标检测中只输出其中某个类别的中心点坐标,可以先根据类别筛选出对应的检测结果,再从中提取中心点坐标。下面是一种实现方式:

1.在使用Yolov5进行目标检测时,检测结果通常以字典形式给出,其中包括每个检测框的坐标、置信度、类别等信息。你可以遍历字典,筛选出对应类别的检测结果,例如:

results = model(img)  # 使用Yolov5进行目标检测
class_idx = 3  # 假设我们想要提取第三个类别的中心点坐标
filtered_results = [r for r in results if r['class'] == class_idx]

2.筛选出对应类别的检测结果后,你可以计算每个检测框的中心点坐标。一般来说,检测框的坐标信息通常以左上角坐标和宽度、高度表示。你可以使用以下代码计算中心点坐标:

for r in filtered_results:
    x, y, w, h = r['bbox']  # bbox表示检测框的左上角坐标和宽度、高度
    cx = x + w / 2  # 计算中心点的x坐标
    cy = y + h / 2  # 计算中心点的y坐标
    print(f"Class {class_idx} center point: ({cx}, {cy})")

这样,你就可以输出其中一个类别的中心点坐标了。如果你想同时输出多个类别的坐标,可以将上述代码封装成一个函数,传入待提取类别的索引列表,遍历筛选后的结果,提取对应的坐标即可。

不知道你这个问题是否已经解决, 如果还没有解决的话:

(太长不看系列)
结论:混淆矩阵的值是检测框和标注框根据一定的IOU计算的,终端指标的输出是找到最大的f1 score所对应的精确率p和召回率r,所以会不一致。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^