一、基础知识
- resize操作
如果想对tensor进行类似resize/reshape的操作,可以使用torch.view
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
print(x.size(), y.size(), z.size())
- 对输入参数进行裁剪
通常我们在需要控制张量的取值范围不越界时,需要用到torch.clamp函数,它可 以对输入参数按照自定义的范围进行裁剪,最后将参数裁剪的结果作为输出。
import torch
a = torch.randn(2, 3)
print(a)
b = torch.clamp(a, -0.5, 0.5)
print(b)
输出内容如下:
tensor([[-0.1076, 1.4202, 1.5780],
[-1.3722, -1.7166, -1.0581]])
tensor([[-0.1076, 0.5000, 0.5000],
[-0.5000, -0.5000, -0.5000]])
这 是 分 隔 线- - - - - - - - - - - - - - - - - - - - (基础知识后续再更,先完成课程内容)
一、目标框
用来表达bbox的格式通常有两种,(x1,y1,x2,y2)和(c_x,c_y,w,h),如图所示:
这两种格式分别在后续不同场景下便于计算,两种格式可以互相转换。
二、交并比
iou的全称是交并比,表示两个目标框的交集占其并集的比例。如图:
黄色区域为红bbox和绿bbox的交集,分母中黄+绿+红区域为红bbox和绿bbox的并集,两者之比为iou。
计算流程为:
1.首先获取两个框的坐标,红框坐标: 左上(red_x1, red_y1), 右下(red_x2, red_y2),绿框坐标: 左上(green_x1, green_y1),右下(green_x2, green_y2)
2.计算两个框左上点的坐标最大值:(max(red_x1, green_x1), max(red_y1, green_y1)), 和右下点坐标最小值:(min(red_x2, green_x2), min(red_y2, green_y2))
3.利用2算出的信息计算黄框面积:yellow_area
4.计算红绿框的面积:red_area 和 green_area
5.iou = yellow_area / (red_area + green_area - yellow_area)
def find_intersection(set_1, set_2):
# 输入的两个张量:
# set_1: (x_min,y_min,x_max,y_max)
# set_2:(x_min,y_min,x_max,y_max)
# 输出:IOU
# 对于图片来说,左上角是0,X轴朝右是正方向,Y轴朝下是正方向
"""
Find the intersection of every box combination between two sets of boxes that are in boundary coordinates.
:param set_1: set 1, a tensor of dimensions (n1, 4)
:param set_2: set 2, a tensor of dimensions (n2, 4)
:return: intersection of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2)
"""
# PyTorch auto-broadcasts singleton dimensions
lower_bounds = torch.max(set_1[:, :2].unsqueeze(1), set_2[:, :2].unsqueeze(0)) # (n1, n2, 2)
upper_bounds = torch.min(set_1[:, 2:].unsqueeze(1), set_2[:, 2:].unsqueeze(0)) # (n1, n2, 2)
intersection_dims = torch.clamp(upper_bounds - lower_bounds, min=0) # (n1, n2, 2)
return intersection_dims[:, :, 0] * intersection_dims[:, :, 1] # (n1, n2)
三、数据集
本次练习使用VOC2007和VOC2012作为训练和测试的数据,VOC数据集目标类别如图所示:
三、数据处理
数据处理包括将记录标注信息的xml文件进行解析,并将信息整理到json文件中,如图所示:
四、构建dataloader
1.首先需要实例化pascalVOCDataset类得到train_dataset,然后将train_dataset传入torch.utils.data.DataLoader,进而得到train_loader。
2.PascalVOCDataset继承了torch.utils.data.Dataset,然后重写了__init__,getitem,__len__和collate_fn四个方法
- 数据增强
在TRAIN时进行的transform有:
1.以随机顺序改变图片亮度,对比度,饱和度和色相,每种都有50%的概率被执行。photometric_distort
2.扩大目标,expand
3.随机裁剪图片,random_crop
4.0.5的概率进行图片翻转,flip
*注意:a. 第一种transform属于像素级别的图像增强,目标相对于图片的位置没有改变,因此bbox坐标不需要变化。
但是2,3,4,5都属于图片的几何变化,目标相对于图片的位置被改变,因此bbox坐标要进行相应变化。
在TRAIN和TEST时都要进行的transform有:
1.统一图像大小到(224,224),resize
2.PIL to Tensor
3.归一化,FT.normalize()
3.构建DataLoader
"""python
DataLoader
"""
#参数说明:
#在train时一般设置shufle=True打乱数据顺序,增强模型的鲁棒性
#num_worker表示读取数据时的线程数,一般根据自己设备配置确定(如果是windows系统,建议设默认值0,防止出错)
#pin_memory,在计算机内存充足的时候设置为True可以加快内存中的tensor转换到GPU的速度,具体原因可以百度哈~
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True,
collate_fn=train_dataset.collate_fn, num_workers=workers,
pin_memory=True) # note that we're passing the collate function here