有关YOLOV5在测试时,图片大小被调整的问题

在这里插入图片描述
执行detect.py文件,在运行栏中出现以下:

detect: weights=yolov5s.pt, source=data\images, data=data\coco128.yaml, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs\detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1
YOLOv5  2023-7-6 Python-3.8.8 torch-2.0.1+cu118 CUDA:0 (NVIDIA GeForce RTX 3090, 24576MiB)

源码追溯:

第一步在detect.py文件中有LoadImages类,函数具体如下:
在这里插入图片描述
第二步打开这个LoadImages类,则转到dataloaders.py文件
在这里插入图片描述
第三步打开 letterbox类 ,则转到augmentations.py文件,定位到letterbox函数
在这里插入图片描述

完整的letterbox代码解析,代码中的备注给出了所有变量的变化过程。

def letterbox(im, new_shape=(640, 640), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True, stride=32):
    # Resize and pad image while meeting stride-multiple constraints
    shape = im.shape[:2]  # current shape [height, width]   --1080 1920
    if isinstance(new_shape, int):       
        new_shape = (new_shape, new_shape)  #                --(640, 640)
 
    # Scale ratio (new / old)
    # 计算缩放因子
    r = min(new_shape[0] / shape[0], new_shape[1] / shape[1]) # --0.33333333
    """
    缩放(resize)到输入大小img_size的时候,如果没有设置上采样的话,则只进行下采样
    因为上采样图片会让图片模糊,对训练不友好影响性能。
    """
    if not scaleup:  # only scale down, do not scale up (for better val mAP)
        r = min(r, 1.0)
 
    # Compute padding
    ratio = r, r  # width, height ratios                      -- 0.333333, 0.333333
    new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))  # -- 640, 360
    # 计算padding
    dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh padding --0, 280
    # 获取最小的矩形填充
    if auto:  # minimum rectangle
        dw, dh = np.mod(dw, stride), np.mod(dh, stride)  # wh padding    --0, 12
    # 如果scaleFill=True,则不进行填充,直接resize成img_size,任由图片进行拉伸和压缩
    elif scaleFill:  # stretch
        dw, dh = 0.0, 0.0
        new_unpad = (new_shape[1], new_shape[0])
        ratio = new_shape[1] / shape[1], new_shape[0] / shape[0]  # width, height ratios
 
    # 计算上下左右填充大小
    dw /= 2  # divide padding into 2 sides  --0
    dh /= 2  #                              --12
 
    if shape[::-1] != new_unpad:  # resize
        im = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR)  # im.shape=640, 360
    top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))  # --12, 12
    left, right = int(round(dw - 0.1)), int(round(dw + 0.1))  # --0, 0
    # 进行填充
    im = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)  # add border,将上下左右需要增加的边界填到图像上
    return im, ratio, (dw, dh)

上述操作具体就是通过计算“设置的宽高”与“原图宽高”的比例,计算出最终dw,dh的值,就能确定上下左右需要padding的像素个数,最后通过cv2.copyMakeBorder完成图像的resizepadding.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: YOLOv5 是目标检测领域的一种新型模型,其使用 mAP50 (mean average precision at IoU=0.50) 作为评价指标。在 YOLOv5 的训练过程中,计算测试集的 mAP50 可以帮助我们评估模型的性能,以寻找最佳的超参数、数据增强等训练策略。 下面是计算 YOLOv5 测试集 mAP50 的一些步骤: 1. 准备测试集数据 首先,您需要准备测试集数据。测试集数据应该包含图像和相应的标注文件。您可以使用现有的数据集,或者根据自己的需求创建测试集数据。 2. 设置测试参数 在计算测试集 mAP50 之前,您需要设置 YOLOv5测试参数,例如模型路径、检测阈值、NMS 阈值等。可以通过命令行或配置文件指定这些参数。 3. 运行测试脚本 使用 YOLOv5 官方提供的测试脚本进行测试,并将输出结果保存在指定文件中。可以使用以下命令进行测试: ``` python test.py --weights /path/to/model/weights.pt --data /path/to/data.yaml --img 640 --conf 0.25 --iou 0.50 --task test --name my_test_results ``` 其中,`--weights` 参数指定模型权重文件路径,`--data` 参数指定数据集配置文件路径,`--img` 参数指定输入图像大小,`--conf` 参数指定检测阈值,`--iou` 参数指定 IoU 阈值,`--task` 参数指定任务类型,可以是 test 或 val,`--name` 参数指定输出结果文件夹的名称。 4. 计算 mAP50 计算 mAP50 可以使用 YOLOv5 官方提供的 `test.py` 脚本输出的结果文件进行。可以使用以下命令计算 mAP50: ``` python -m utils.metrics maps --data /path/to/data.yaml --pred /path/to/predictions.txt --iou 0.50 ``` 其中,`--data` 参数指定数据集配置文件路径,`--pred` 参数指定预测结果文件路径,`--iou` 参数指定 IoU 阈值。 执行完上述命令后,脚本会输出测试集的 mAP50 值。如果需要计算其他 IoU 阈值下的 mAP,可以将 `--iou` 参数设置为相应的值。 ### 回答2: YOLOv5是一种目标检测算法,用于检测图像或视频中的目标物体。其中的MAP(Mean Average Precision)指标用于评估模型的检测性能。MAP@[0.5]即为在IOU阈值为0.5的平均精度。 在进行YOLOv5的计算测试[email protected],首先需要准备一个具有标注框的测试集,在测试集上运行已训练好的YOLOv5模型。然后通过计算每个目标的预测框与标注框之间的IOU(Intersection over Union,交并比)来确定是否为正确的检测结果。 计算[email protected]的步骤如下: 1. 对于每个类别,根据IOU阈值0.5,计算预测框与标注框之间的IOU值。 2. 对于每个类别,按照IOU值的降序排列预测结果。 3. 根据排列后的顺序,计算累计精度和召回率。 4. 根据累计精度和召回率的曲线,计算不同召回率下的平均精度。 5. 对所有类别进行求平均,得到[email protected]作为整个测试集的评估指标。 通过计算测试集的[email protected],可以量化YOLOv5模型在检测物体上的准确性和召回率表现,评估模型的整体性能,以便进一步调整和优化模型。 ### 回答3: YOLOv5是一种先进的目标检测算法,其在计算测试集MAP50可以实现高效准确的定位和识别。MAP50是一种常用的评估指标,表示在召回率为50%的平均准确率。以下是使用YOLOv5计算测试集MAP50的步骤。 首先,我们需要准备测试集数据。测试集是包含了一系列图像和相应标签的数据集,用于评估模型的性能。接下来,我们加载预训练好的YOLOv5模型。 然后,我们对测试集数据进行推理。推理过程就是模型利用已学习到的参数对测试集中的图像进行目标检测和识别。YOLOv5通过一次前向传播即可得到目标的位置和类别信息。 在得到模型的输出后,我们根据其置信度对每个预测框进行筛选。通常,我们会设置一个阈值,只保留置信度高于该阈值的预测框。 接着,我们利用非极大值抑制算法来消除重叠的边界框。该算法会计算预测框之间的IoU(交并比),如果IoU高于设定的阈值,则将其中置信度较低的框删除。 最后,我们根据筛选后的预测框与标签之间的匹配程度计算MAP50。MAP50的计算方法是将测试集中每个类别的AP(平均准确率)计算平均并加权,其中AP是通过计算每个类别在不同召回率下的准确率得到的。 总的来说,YOLOv5计算测试集MAP50的过程包括数据准备、模型推理、筛选预测框、非极大值抑制和最终的MAP50计算。通过这些步骤,我们可以评估YOLOv5模型在测试集上的性能,为进一步的优化和改进提供指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦在黎明破晓时啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值