在SeaShips数据集上训练并测试Yolov3
本文主要记录我在seaships数据集上训练yolov3网络进行船只检测的简单过程
首先,简介一下SeaShips数据集,数据集下载链接
该版本数据集共有7000张图片,图片分辨率均为1920*1080,分为六类船只,主要是一些内河航道中船只的图片。
在pytorch实现的yolov3的基础上进行修改,修改的源代码链接:yolov3-pytorch
全文主要分为一下几个部分
- 对数据集的预处理
- 修改cfg文件
- 修改data文件夹
- 下载初始权重参数
数据集预处理
SeaShips数据集共有四个文件夹,其中Annotations文件夹内是每张图片的标签,每个图片对应一个xml文件来存储标签,所以要将xml文件中的内容转为txt文件,每张照片对应一个txt文件,txt文件命名与照片命名一致,如00xxxx.jpg对应的标签文件为00xxxx.xml,我们要将00xxxx.xml文件转为00xxxx.txt文件。
xml文件给出了每一个目标的类别,以及对应的bounding box的左上角和右下角的坐标,注意对应的均为1920*1080分辨率。
在工程中(修改后的工程链接会在文末给出),xml2txt.py文件是用来完成这个任务的,注意转成txt文件要求是,一张照片对应一个txt文件,一个txt文件每一行对应一个船只目标,每一行五个数,第一个是类别,0~5分别代表六类船只,剩下的四个数依次为bounding box中心点的x和y坐标,然后是框的width和height,所有的数据均为归一化后的数据,x和width要除以1920,y和height要除以1080.
注意一点:所有图片全部放在JPEGImages文件夹下,所有标签全部放在labels文件夹下,然后这两个文件下放在同一个文件夹下。至于train,val,test,则分别建立包含各个集全部图片路径的txt文件。train的时候会根据txt文件每一行图片路径去读取图片,然后会把图片路径的JPEGImages换成labels,把.jpg换为.txt去读取标签,这也是为什么只能这样命名文件夹且图片和标签必须放在同一个文件下的原因。
修改cfg文件
cfg文件里面定义了网络框架,代码中建立模型就是根据cfg文件建立的,cfg文件夹内有3个cfg文件,对应3种网络架构,yolov3,yolov3-spp,yolov3-tiny,复杂度和精确度依次下降,我选的是yolov3-spp,打开yolov3-spp.cfg文件,原始yolo含有255个输出,[4 box coordinates + 1 object confidence + 80 class confidences]*3,乘3是因为yolov3在3个尺度上进行预测。因为这里只有6类船只,因此搜索filters=255,将255改为 33=(4+1+6)*3 即可。
修改data文件夹
打开文件夹可看到有.data .names .txt三种类型文件。.data文件定义了类别数量classes,修改为6。第二行train=,这里改为一个txt文件的路径,这个txt文件里面是训练集所有图片的路径,每一行是一张图片的路径,这个txt文件需要自己写代码生成,代码参照工程里面create_txt.py。第三行,同理,valid=指向含有测试集图片路径的txt文件。第四行names=,指向一个names文件,可新建一个后缀为.names的文件,里面每一行是每一个类别的名字,在这里6行,分别是6个类别的船的名字。第五行和第六行暂不用修改。(这里注意,里面有很多data文件,代码train.py默认使用coco.data,如果不想麻烦可直接修改coco64_img.data即可)
下载初始权重参数
权重链接(谷歌云端硬盘,需要翻墙,网上应该有百度网盘版)
第一次训练下载第一个dark54.conv.74文件。训练完毕后会生成best.pt和latest.pt权重文件。
test.py文件测试默认使用yolov3-spp.weights权重文件,
parser.add_argument('--cfg', type=str, default='cfg/yolov3-spp.cfg', help='cfg file path')
parser.add_argument('--data', type=str, default='data/coco.data', help='coco.data file path')
parser.add_argument('--weights', type=str, default='weights/yolov3-spp.weights', help='path to weights file')
test文件195行左右,注意这里默认使用coco.data, 和train.py不一样,应该改为一致,修改weights那里改为"best. pt"或者“latest. pt",就可以test你训练的参数的效果了。
注:工程里面kmena_anchor文件是用来聚类初始anchor大小,修改初始anchor大小可显著提升训练效果。
还有许多细节没有体到,需要自己多去尝试,debug的过程会让你对整个架构有更清晰的认识。
修改后的工程:yolov3_seahips