SSD训练数据集流程(学习记录)

这篇具有很好参考价值的文章主要介绍了SSD训练数据集流程(学习记录)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于理论部分我看的是b站“霹雳吧啦Wz”的SSD理论讲解,作为入门小白表示能听懂,需要的同学可以自行观看

目录

1.训练环境

2.训练步骤


1.训练环境

我的环境是win11+anaconda+python3.6.13+pytorch1.10.2+cuda11.6

2.训练步骤

(1)下载SSD源码

可到github进行下载

GitHub - amdegroot/ssd.pytorch: A PyTorch Implementation of Single Shot MultiBox Detector

(2)下载模型文件

VGG16_reducedfc.pth预训练模型下载地址:https://s3.amazonaws.com/amdegroot-models/vgg16_reducedfc.pth

将下载的模型文件放置于ssd源码目录中  wights/vgg16_reducedfc.pth

SSD训练数据集流程(学习记录)

(3)数据集准备

与大多数训练模型一样,ssd支持的训练格式为VOC和coco,这里采用voc2007作为演示,制作自己的数据集以及labimg的使用可自行观看yolo数据集标注软件安装+使用流程_道人兄的博客-CSDN博客_yolo数据集标注工具

voc2007的具体下载方式我也不多赘述,网络上百度也有,或者直接看我之前写的也有提到使用Faster—RCNN训练数据集流程(学习记录)_道人兄的博客-CSDN博客

将下载后的voc2007数据集放置于./data/VOCdevkit/中

SSD训练数据集流程(学习记录)

 然后到ssd.pytorch-master/data/中的voc0712.py进行修改其中的VOC_ROOT = osp.join(HOME, "data/VOCdevkit/"),他这里的HOME老是读取我的C盘位置,所以一直报错,我直接把数据集的绝对路径写上去了就没报错

SSD训练数据集流程(学习记录)

将 voc0712.py文件中VOCDetection类的__init__函数,将image_sets修改为[('2007', 'train'), ('2007', 'val'),('2007','test')],修改后的结果如下。

def __init__(self, root,
             image_sets=[('2007', 'train'), ('2007', 'val'),('2007','test')],
             transform=None, target_transform=VOCAnnotationTransform(),
             dataset_name='VOC0712'):

其中如果是训练自己的数据集,记得修改voc0712.py文件中的VOC_CLASSES 变量。例如,将VOC_CLASSES修改为person类,注意如果只有一类则需要加方括号,修改后的结果如下。

VOC_CLASSES = [('person')

如果训练自己的数据集,还需要修改config.py文件中的voc字典变量。将其中的num_classes修改为2(以person为例)(背景类+你训练集的种类个数),第一次调试时可以将max_iter调小至1000,修改后的结果如下。

voc = {
    'num_classes': 2,
    'lr_steps': (80000, 100000, 120000),
    'max_iter': 1000,
    'feature_maps': [38, 19, 10, 5, 3, 1],
    'min_dim': 300,
    'steps': [8, 16, 32, 64, 100, 300],
    'min_sizes': [30, 60, 111, 162, 213, 264],
    'max_sizes': [60, 111, 162, 213, 264, 315],
    'aspect_ratios': [[2], [2, 3], [2, 3], [2, 3], [2], [2]],
    'variance': [0.1, 0.2],
    'clip': True,
    'name': 'VOC',
}

最后一步,把coco_labels.txt放在ssd.pytorch-master/data/coco/目录下,也可以通过修改coco.py文件中的COCO_ROOT = osp.join(HOME, 'data/coco/')来指定存放路径。

(4)修改源码

①修改ssd.py文件中SSD类的__init__函数和forward函数,修改后的结果如下。

if phase == 'test':
	self.softmax = nn.Softmax(dim=-1)
    self.detect = Detect(num_classes, 0, 200, 0.01, 0.45)
修改为:
if phase == 'test':
	self.softmax = nn.Softmax()
	self.detect = Detect()
	
if self.phase == "test":
	output = self.detect(
    	loc.view(loc.size(0), -1, 4),                   # loc preds
        self.softmax(conf.view(conf.size(0), -1,
        			 self.num_classes)),                # conf preds
        self.priors.type(type(x.data))                  # default boxes
    )
修改为:
if self.phase == "test":
	output = self.detect.apply(21, 0, 200, 0.01, 0.45,
   		loc.view(loc.size(0), -1, 4),                   # loc preds
        self.softmax(conf.view(-1,21)),                 # conf preds
		self.priors.type(type(x.data))                  # default boxes
	)

②修改train.py中187至189行代码,原因是.data[0]写法适用于低版本Pytorch,否则会出现IndexError:invalid index of a 0-dim tensor...错误,修改后的结果如下。

loc_loss += loss_l.item()
conf_loss += loss_c.item()

if iteration % 10 == 0:
    print('timer: %.4f sec.' % (t1 - t0))
	print('iter ' + repr(iteration) + ' || Loss: %.4f ||' % (loss.item()), end=' ')

③交换layers/modules/multibox_loss.py中97行和98代码位置,否则会出现IndexError: The shape of the mask [14, 8732] at index 0does...错误,修改后的结果如下。

loss_c = loss_c.view(num, -1)
loss_c[pos] = 0  # filter out pos boxes for now

④根据自己的需要对train.py中预训练模型、batch_size、学习率、模型名字和模型保存的次数等参数进行修改。建议学习率修改为1e-4(原因是原版使用1e-3可能会出现loss为nan情况),第一次调试时可以修改为每迭代100次保存,方便调试。

# 加载模型初始参数
parser = argparse.ArgumentParser(
    description='Single Shot MultiBox Detector Training With Pytorch')
train_set = parser.add_mutually_exclusive_group()
# 默认加载VOC数据集
parser.add_argument('--dataset', default='VOC', choices=['VOC', 'COCO'],
                    type=str, help='VOC or COCO')
# 设置VOC数据集根路径
parser.add_argument('--dataset_root', default=VOC_ROOT,
                    help='Dataset root directory path')
# 设置预训练模型vgg16_reducedfc.pth
parser.add_argument('--basenet', default='vgg16_reducedfc.pth',
                    help='Pretrained base model')
# 设置批大小,根据自己显卡能力设置,默认为32,此处我改为16
parser.add_argument('--batch_size', default=16, type=int,
                    help='Batch size for training')
# 是否恢复中断的训练,默认不恢复
parser.add_argument('--resume', default=None, type=str,
                    help='Checkpoint state_dict file to resume training from')
# 恢复训练iter数,默认从第0次迭代开始
parser.add_argument('--start_iter', default=0, type=int,
                    help='Resume training at this iter')
# 数据加载线程数,根据自己CPU个数设置,默认为4
parser.add_argument('--num_workers', default=4, type=int,
                    help='Number of workers used in dataloading')
# 是否使用CUDA加速训练,默认开启,如果没有GPU,可改成False直接用CPU训练
parser.add_argument('--cuda', default=True, type=str2bool,
                    help='Use CUDA to train model')
# 学习率,默认0.001
parser.add_argument('--lr', '--learning-rate', default=1e-3, type=float,
                    help='initial learning rate')
# 最佳动量值,默认0.9(动量是梯度下降法中一种常用的加速技术,用于加速梯度下降,减少收敛耗时)
parser.add_argument('--momentum', default=0.9, type=float,
                    help='Momentum value for optim')
# 权重衰减,即正则化项前面的系数,用于防止过拟合;SGD,即mini-batch梯度下降
parser.add_argument('--weight_decay', default=1e-4, type=float,
                    help='Weight decay for SGD')
# gamma更新,默认值0.1
parser.add_argument('--gamma', default=0.1, type=float,
                    help='Gamma update for SGD')
# 使用visdom将训练过程loss图像可视化
parser.add_argument('--visdom', default=False, type=str2bool,
                    help='Use visdom for loss visualization')
# 权重保存位置,默认存在weights/下
parser.add_argument('--save_folder', default='weights/',
                    help='Directory for saving checkpoint models')
args = parser.parse_args()
if iteration != 0 and iteration % 100 == 0:
	print('Saving state, iter:', iteration)
	torch.save(ssd_net.state_dict(), 'weights/ssd300_VOC_' + repr(iteration) + '.pth')

⑤因为pytorch1.9以上版本在这份源代码中并不适用,一旦运行cuda方面会报错如下:

RuntimeError: Expected a ‘cuda‘ device type for generator but found ‘cpu‘

参考github上的解决方法,有两种方法可成功运行:

第一种是重装pytorch1.8版本,就可以正常运行,但我觉得太麻烦了

第二种是修改源码:

在位于 anaconda 或任何地方的文件“site-packages/torch/utils/data/sampler.py”中。

[修改第 116 行]:generator = torch.Generator()
改成generator = torch.Generator(device='cuda')
[修改第 126 行]:yield from torch.randperm(n, generator=generator).tolist()
改成yield from torch.randperm(n, generator=generator, device='cuda').tolist()

在train.py文件中,data.DataLoader处进行添加generator

data_loader = data.DataLoader(dataset, args.batch_size,
                                  num_workers=args.num_workers,
                                  shuffle=True, collate_fn=detection_collate,
                                  pin_memory=True, generator=torch.Generator(device='cuda'))

(5)运行train.py,如下图

SSD训练数据集流程(学习记录)

参考资料:

SSD训练自己的数据集(pytorch版)_Kellenn的博客-CSDN博客_ssd训练自己的数据集pytorch

【目标检测实战】Pytorch—SSD模型训练(VOC数据集) - 知乎 (zhihu.com)

2.1SSD算法理论_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-407628.html

到了这里,关于SSD训练数据集流程(学习记录)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ceph:关于Ceph 集群中数据分布和容灾理论的一些笔记

    准备考试,整理 Ceph 相关笔记 博文内容涉及,Ceph 集群中数据如何分布以及不同的容灾池介绍 理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理

    2024年02月12日
    浏览(42)
  • 机器学习任务中使用计算图构建和训练模型的流程

    The goal is to encourage the project team to think more long-term and not judge success solely based on tactical results. This requires a shift in mindset to prioritize strategic thinking and understanding the bigger picture. It involves reevaluating the current perspective and approach to ensure that decisions and actions align with long-term goals and obje

    2024年02月10日
    浏览(38)
  • 【自学记录】【Pytorch2.0深度学习从零开始学 王晓华】第四章 深度学习的理论基础

    遇到的疑问: 1、对神经网络前向计算中,关于系数矩阵W的讨论。 上一章讲到了层结构是【out,in】,所以我觉得在计算Y=WX+b的时候,W矩阵也应该是【out,in】的形状。但是该代码(或者正规代码实现流程)不是的,他是一个这样的结构: 所以,W矩阵还是【in,out】结构,a1=X1 W

    2024年04月09日
    浏览(54)
  • 深度学习实战34-基于paddle关键信息抽取模型训练的全流程

    大家好,我是微学AI,今天我给大家介绍一下深度学习实战34-基于paddle关键信息抽取模型训练的全流程,我们在文档应用场景中,存在抽取关键信息的任务,比如身份证里的姓名和地址,快递单里的姓名和联系方式等等。传统的方法需要设计模板,但是这太繁琐了,也不够强

    2024年02月07日
    浏览(48)
  • Pytorch自定义数据集模型完整训练流程

    我们以kaggle竞赛中的猫狗大战数据集为例搭建Pytorch自定义数据集模型训练的完整流程。 Cats vs. Dogs(猫狗大战)数据集是Kaggle大数据竞赛某一年的一道赛题,利用给定的数据集,用算法实现猫和狗的识别。 其中包含了训练集和测试集,训练集中猫和狗的图片数量都是12500张且

    2023年04月24日
    浏览(35)
  • Tensorflow实现训练数据的加载—模型搭建训练保存—模型调用和加载全流程

     将tensorflow的训练数据数组(矩阵)保存为.npy的数据格式。为后续的模型训练提供便捷的方法。例如如下:   加载.npy训练数据和测试数组(矩阵),加载后需要调整数据的形状以满足设计模型的输入输出需求,不然无法训练模型。 这里可以采用自定义层和tensorflow的API搭建

    2024年02月05日
    浏览(34)
  • ROS+Gazebo强化学习从虚拟训练到实车部署全流程分析

    也学ros这个东西学了好长时间了,但是在ROS中进行强化学习并最终部署到实车这个过程一直都出现各种问题,实验室也没什么相关的积累,自己一个人搞就很痛苦。这次看论文时候看到别人公布的源码,于是去学习了一下别人怎么做的这个流程,真的是受益匪浅。 最终也能够

    2024年02月03日
    浏览(34)
  • nerf训练自己的数据,过程记录十分详细

           之前跑很多项目没有记录,后来再弄就不行了。这次特别记录一下,在梳理流程的同时希望给大家带来小小的帮助!我自己是在cuda11.2,windows环境下成功的,过程十分详细,有需要的朋友耐心看完。有问题可以评论区交流         首先,本文nerf是基于pytorch训练的,

    2024年02月03日
    浏览(42)
  • 基于Yolov8与LabelImg训练自己数据的完整流程

    运行过程中,会提示下载coco128.zip,和yolov8n.pt,模型与py文件放在同一目录下,如果网速快的话,自己下载就好,下载慢的话,下面是网盘地址: 测试结果路径:ultralyticsrunsdetectval,里面存储了运行的结果,这样环境就算是配置好了。 结果如下: 首先创建一个文件夹:coc

    2024年02月13日
    浏览(63)
  • [SSD安装3] 联想笔记本如何安装固态硬盘(全流程+装系统)

    一、硬件准备 联想G50-80 东芝固态硬盘:TOSHIBA TR2000 480G(参考价格:379元人民币) 启动U盘(用于装系统,需要事先制作好) 二、详细步骤 1、断电、关机。拔掉电源插头,关机。一定确保电脑断电、关机,严禁开机状态下操作。 2、取下电池。为确保更换过程电脑不会意外开

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包