yolo系列是目标识别的重头戏,为了更好的理解掌握它,我们必须从源码出发深刻理解代码。下面我们来讲解pytorch实现的yolov3源码。在讲解之前,大家应该具备相应的原理知识yolov1,yolov2,yolov3。
大部分同学在看论文时并不能把所有的知识全部掌握。我们必须结合代码(代码将理论变成实践),它是百分百还原理论的,也只有在掌握代码以及理论后,我们才能推陈出新有所收获,所以大家平时一定多接触代码,这里我们会结合yolov3的理论知识让大家真正在代码中理解思想。
下面我就train过程的代码进行讲解。在理解train过程之前,建议大家先了解inference的代码讲解。
PyTorch实现yolov3代码详细解密
数据读取:
Pytorch读取图片,主要通过Dataset类,Dataset类作为所有的datasets的基类存在,所有的datasets都需要继承它。
class
这里重点看getitem函数,getitem接收一个index,返回图片数据和labels。我们看yolov3的dataset。
dataset
dataset = LoadImagesAndLabels(train_path, img_size=img_size, augment=True),可以看到其中LoadImagesAndLabels类是Dataset的子类,init函数是正常的读取数据,我们主要看getitem,getitem接收一个index,就是img_files的索引,通过letterbox函数进行数据预处理将每幅图resize成418*418,labels里面存放的是ground truth的类别和坐标信息,因为图像resize了,所以labels中的坐标信息也要相对变化。最后返回处理后的img,labels,地址和宽高。
那么读取自己数据的基本流程就是:1:制作存储了图像的路径和标签信息的txt2:将这些信息转化为list,该list每一个元素对应一个样本3:通过getitem函数,读取数据标签,并返回。
在训练代码里是感觉不到这些操作的,只会看到通过DataLoader就可以获取一个batch的数据,其实触发去读取图片这些操作的是DataLoader里的__iter__(self),流程详细描述如下:
1.从dataset类中初始化txt,txt中有图片路径和标签
2.初始化DataLoder时,将dataset传入,从而使DataLoader拥有图片路径
3.在for i, (imgs, targets, _, _) in enumerate(dataloader):中,一个iteration进行时,读取一个batch的数据,enumerate将数据返回到imgs,targets中,imgs就是数据增强后的图像,labels就是处理后的标签。
4.读取过程中需要在class DataLoader()类中调用_DataLoderIter()
5.在 _DataLoderiter()类中跳到 next(self)函数,在该函数中通过indices = next(self.sample_iter)获取一个batch的indices,再通过batch=self.collate_fn()获取一个batch数据。
6.self.collate_fn中调用LoadImagesAndLabels类中的 getitem()函数,再函数中获取图片。
如此,我们第一步数据预处理就完成了,后面我们就可以把数据imgs放到模型里跑了。大家不要忽视这些代码,想真正弄懂,我们就要一步一步刨根问底。
下面一章,我们会根据程序复现训练过程的算法原理,讲解yolov3的loss是如何计算的。