当前位置:   article > 正文

YOLOv5图像数据加载和预处理_yolov5模型加载

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输入模型

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

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

闽ICP备14008679号