文章目录
前言
一时兴起和好朋友一起组队参加了Datawhale的OD小项目,索性也算是第一次做CV的项目了,顺便练练pytorch和神经网络的内容。
一、关于环境
环境准备实在是深度学习的一道坎,不得不说为了在实验室的电脑上装对版本真的是煞费苦心。自己的电脑确实不带英伟达的显卡(希望有人资助我换电脑),也不想去实验室跑(可能会真香),这次就使用了谷歌的colab作为主要的编译环境。
colab是google的一款在线jupyter notebook,主要有两大好处
- 不用配置环境,内部大部分都已经集成好了,也不用自己安装cuda
- 可以白嫖一下免费的GPU
当然也有一些缺点
- google懂的都懂,需要技术,且容易断线
- 毕竟是白嫖的,和实验室的1080ti还是有很大差距
- 需要和Google drive配合,解压什么的速度还是感人的
二、Colab环境和数据集导入
1. 挂载Google Drive
其实也可以直接在colab里面上传文件,但每次退出后都要重新导入,而且如果需要使用GPU的话还是需要做挂载的,挂载的命令网上也有很多了。
from google.colab import drive
drive.mount('/content/drive/')
这样我们就把Google Drive的文件挂载到了/content/drive
目录下。我在Google Drive内新建了一个colab文件夹,这样就可以进入到该目录下
% cd drive/MyDrive/colab
注意%
不可以省略。在Colab中可以使用!+shell
的方式来使用Ubuntu Linux的命令,类似于一个终端。例如查看当前目录下的文件
! ls
如果要使用GPU的话,可以选择编辑->笔记本设置
然后选择GPU
可以用
! nvidia-smi
查看使用的显卡版本。因为是第一次使用,所以Google分配了Tesla t4.
2. 导入数据集
首先使用git clone
命令将开源代码加载到drive中,也可以先本地下载完成以后上传至drive,个人感觉前者的速度更快一些。
本项目所使用的数据集为Yolo的VOC数据集。该数据集是目标检测领域最常用的标准数据之一,几乎所有检测方向上的论文都会给出该数据集上的效果。具体的说,我们使用VOC2007和VOC2012作为训练和测试的数据。
教程里提供了图形界面的方法,这里我们直接在colab调用命令行。首先切换到dataset
目录下
% cd dive-into-cv-pytorch-master/dataset
然后下载数据集
! wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
! wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
! wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
之后进行解压
! tar xf VOCtrainval_11-May-2012.tar
! tar xf VOCtrainval_06-Nov-2007.tar
! tar xf VOCtest_06-Nov-2007.tar
这样数据集就导入成功啦!
3. 数据集预处理
本部分我们需要将VOC数据进行一些预处理。首先可以看一看有哪些数据。
其中,后两个是用作数据分割的。我们主要看前三个数据集。
-
JPEGImages:
这个文件夹中存放所有的图片,包括训练验证测试用到的所有图片。
-
ImageSets
这个文件夹中包含三个子文件夹,Layout、Main、Segmentation
- Layout文件夹中存放的是train,valid,test和train+valid数据集的文件名
- Segmentation文件夹中存放的是分割所用train,valid,test和train+valid数据集的文件名
- Main文件夹中存放的是各个类别所在图片的文件名,比如cow_val,表示valid数据集中,包含有cow类别目标的图片名称。
-
Annotations
Annotation文件夹中存放着每张图片相关的标注信息,以xml格式的文件存储,可以通过记事本或者浏览器打开。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YduckZlJ-1608111332385)(image-20201216105847868.png)]
我们需要使用的,是filename,size以及object的类别和坐标。下面我们需要构建DataLoader,首先是预处理数据集,主要是提前将记录标注信息的xml文件(Annotations)进行解析,并将信息整理到json文件之中,这样在运行训练脚本时,只需简单的从json文件中读取已经按想要的格式存储好的标签信息即可。
from utils import create_data_lists if __name__ == '__main__': create_data_lists(voc07_path='../../../dataset/VOCdevkit/VOC2007', voc12_path='../../../dataset/VOCdevkit/VOC2012', output_folder='../../../dataset/VOCdevkit')
然后就需要定义
DataLoader
train_dataset = PascalVOCDataset(data_folder, split='train', keep_difficult=keep_difficult) 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)
那究竟什么是Dataloader呢?pytorch中,所有的数据集都继承自一个类
torch.utils.data.Dataset
,这个类实现了__getitem__
和__len__
两个接口,做任何一个数据集都需要实现这两个方法。当然,在pytorch中,torchvision.datasets
这个api以及给了我们很多现成的数据集,使用这个API的好处在于我们不需要再重写上述两个方法。数据集定义完成以后,我们还需要进行数据加载,也就是使用Dataloader
来完成数据加载。总结一下,pytorch对数据的预处理并构建加载数据集的步骤如下