YOLOv5图像数据加载和预处理

假设输入一张图像形状是(1080,1920,3),设定输入模型的参数为stride=32 img_size=512 new_shape(512,512)
1、进行数据加载 img0=cv2.imread(“输入图像地址”)
加载数据为BGR格式,得到img0.shape为(1080, 1920, 3) #[height, width,3]
2、为了保证图像数据不失真,进行图像填充Padded resize,填充信息color=(114, 114, 114)
1)计算图像填充前的缩放比
r=min(512/img0.shape[0],512/img0.shape[1]) 即 r=min(512/1080,512/1920)
ratio (0.26666666666666666, 0.26666666666666666)(本例的缩放比例)
2)获得新的形状,计算方式为:
img0.shape[1]*r =>对结果进行四舍五入=>浮点型转为int型
img0.shape[0]*r =>对结果进行四舍五入=>浮点型转为int型
新形状:new_unpad(512,288)(本例数据)
3)在图像的height, width两个维度分别填充多少的计算
dw= new_shape[1] - new_unpad[0] 即dw=512-512
dh= new_shape[0] - new_unpad[1] 即dw=512-288
4)填充采用minimum rectangle最小范围填充
dw = dw % stride= dw - (dw // stride) * stride
dh= dh% stride= dh- (dh// stride) * stride
#其中a//b为a/b向下取整
5)填充数据:
把填充分成两边:dw=dw/2 ; dh=dh/2 (本例填充为(0.0,0.0))
6)如果 shape[::-1] != new_unpad 重新resize
img = cv2.resize(img0, new_unpad, interpolation=cv2.INTER_LINEAR)
默认代码中采用双线性插值进行填充,获得img形状为 (288, 512, 3)
7)获得最终的填充数据:
Top:dh - 0.1=>对结果进行四舍五入=>浮点型转为int型
Bottom :dh - 0.1=>对结果进行四舍五入=>浮点型转为int型
Left: dw - 0.1=>对结果进行四舍五入=>浮点型转为int型
Right: dw - 0.1=>对结果进行四舍五入=>浮点型转为int型
8)获得padded后的img
img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)
####至此padded结束,img.shape:(288, 512, 3)
ratio (0.26666666666666666, 0.26666666666666666),(dw,dh)(0.0,0.0)(本例的数据)

3、将img从BGR转化为RGB并再次赋值给img =>shape(3, 288, 512)
4、将一个内存不连续存储的数组img转换为内存连续存储的数组:img = np.ascontiguousarray(img) =>shape(3, 288, 512)
5、img 由numpy转化为torch型
img由dtype=torch.uint8转为float型
6、进行归一化
Img=img/255.0 #从0-255转为0-1 (3, 288, 512)
7、如果len(img.shape) == 3,则给img增加一个维度 //即(1,3, 288, 512)
最后将预处理好的数据img输入模型

个人对代码的理解,如有误区还请多多指教,私信必回

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值