yolov5源码解读--数据处理模块
- 加载数据
- 读取图片
- 加载标签
- 马赛克数据增强
- 图片
- 标签
- 其他的数据增强
- 变图像
- 变标签
- __getitem__构建Batch
加载数据
create_dataloader
跳转到datasets.py文件中,可以看到支持输入的文件类型非常丰富。。
回归正题
跳转LoadImagesAndLabels
加载图片和标签的函数
读取图片
f = []存储所有图片的路径
bi给当前数组做batch索引
nb就是所有的batch数目
加载标签
label_files所有标签的路径
cache_path、cache是缓存路径和缓存
cache
labels是按照文件名从cache中取出对应图片的标签,
extract_bounding_boxes 是否把框截取出来
create_datasubset、labels_loaded、extract_bounding_boxes和目标检测后续任务有关
nm, nf, ne, ns, nd = 0, 0, 0, 0, 0 # number missing, found, empty, datasubset, duplicate
这些和读取数据进度条打印的数据有关
一张张读取标签数据,做异常处理。。
进度条打印数据
在一次循环遍历读取标签
马赛克数据增强
完成的数据和标签的初始化操作后,
当训练网络时,执行__getitem__函数向网络传递数据
图片
使用了马赛克数据增强
四合一的拼接
yc, xc = [int(random.uniform(-x, 2 * s + x)) for x in self.mosaic_border]
随机中心点
img4 = np.full((s * 2, s * 2, img.shape[2]), 114, dtype=np.uint8)
1.初始化大图
x1a, y1a, x2a, y2a = max(xc - w, 0), max(yc - h, 0), xc, yc
2.计算当前图片放在大图中什么位置
max是为了防止小图在大图中越界。。
左上角,右上角为(0,0)坐标系原点。。。
x1b, y1b, x2b, y2b = w - (x2a - x1a), h - (y2a - y1a), w, h
3.计算在小图中取哪一部分放到大图中
开始截图
a大图的区域
b小图的部分
padw,padh是当前小图左上角点距离原点的距离
(左上角那俩青色的线条长度)
标签
应为截图拼接了,所以标签位置也需要变化
标签加上padw,padh的原因显而易见。。。
(偏移量)
其他的数据增强
源码是在马赛克数据增强后直接来random_perspective
整合的大图再进行随机旋转、平移、缩放、裁剪
变图像
img是输入图像
M就是图像变换矩阵
M = T @ S @ R @ P @ C
将旋转 平移 缩放等操作 都需要系数矩阵组合到一起。。
cv2.warpPerspective()完成数据增强
变标签
__getitem__构建Batch
做完数据增强,返回到__getitem__
如果batch是16,就调用16次__getitem__,得到一个batch的最终数据。。
1.调整标签格式 2.归一化标签取值范围
在就是最后,
按照一定比例做不做数据增强。。。
数据和标签都得做。。。