运行环境:
1、win10 2、pytorch 1.8.0+cuda 111(1.9.0会报错) 3、pycharm
(一)数据集准备阶段
(资料图)
第一步:新建VOC2007文件夹,然后再在里面新建三个文件ImageSets–>main JPEGImages(存放照片),Annotations(存放xml文件)。 第二步:对自己的照片进行标注,工具为labelimg,这个就不多赘述了
(二)ssd代码准备阶段
第一步:再github下载star最多的ssd源代码https://github.com/amdegroot/ssd.pytorch 第二步:下载权重文件VGG16 https://s3.amazonaws.com/amdegroot-models/vgg16_reducedfc.pth 第三步:解压ssd文件,解压之后在打开SSD/data文件夹,在这之下新建一个VOCdevkit文件夹 第四步:将自己的VOC2007数据集放到VOCdevkit文件夹中 第五步:在根目录下新建一个weights文件夹,将VGG16放进去
(三)sdd代码修改阶段
第一步:将文件导入pycharm中打开 第二步:打开data/init.py: 将第三行的from .coco import COCODetection, COCOAnnotationTransform, COCO_CLASSES, COCO_ROOT, get_label_map 注释掉。因为我们不使用coco数据集,而是使用自己训练的。 第三步:打开data/config.py:第十五行的 num_classes改成自己设定的类别数+1,所以我这里是2 第四步:打开data/voc0712.py:
第二十行的VOC_CLASSES =改成自己的类别名,我的是tree;第二十三行的代码改成VOC_ROOT = ‘./data/VOCdevkit/’;第93行改为image_sets=[(‘2007’, ‘trainval’)]。
第五步:打开layers/modules/multibox_loss.py: 在第97行的loss_c[pos] = 0的上面加上一句loss_c = loss_c.view(num, -1), 在第115行N = num_pos.data.sum()的后面加上.double,继续在下面添加
这两句代码
第六步:打开ssd.py程序:把这里面所有的num_classes的数量都改为类别数+1,我的都是6。 第七步:打开train.py程序:搜索这里面的data[0],把这里面的[0]都删掉,只保留data。 第84行的这两行#if args.dataset_root == COCO_ROOT: # parser.error(‘Must specify dataset if specifying dataset_root’)注释掉,因为我们不用COCO。 第165行的images, targets = next(batch_iterator)改成
try: images, targets = next(batch_iterator) except StopIteration: batch_iterator = iter(data_loader) images, targets = next(batch_iterator)
第198行的5000我改成500;迭代500次保存一次文件,大家可改可不改。第200行权重的名称自己随意,我改的是weights/ssd300_voc_。
**
(四)开始训练
** 第一步:修改train.py中的batch-size,我的是rtx3060(6g),我就修改为24
第二步:开始训练 python train.py (这个loss看着就不正常)
**
(五)测试
(六)遇到的问题
** 训练的时候loss=“nan”, 修改train.py中的这个,修改为1e-4