当前位置:   article > 正文

关于Yolov5在测试时,图像大小被调整的问题_yolov5 imgsz

yolov5 imgsz

原数据大小为:1920*1080

detect.py中的imgsz设置为640,按照正常图像宽高的缩放,原数据缩放后应为:640*360

而detect.py的控制台输出却为:640*384,如下所示:

这是为何呢?具体可以从头仔细阅读detect.py的代码,在LoadImages类中有一个letterbox函数,函数具体如下:

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

 代码中的备注给出了所有变量的变化过程。

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/373507
推荐阅读
相关标签
  

闽ICP备14008679号