SSD+pytorch+训练爬过的坑

SSD训练自己的数据集

我是参照他的步骤对Git上pytorch进行改动的

git SSD

这是Git上的网址

具体SSD的原理这个文章就先不做介绍了。

具体就是介绍下训练过程中爬过的坑,我是按照他的要求进行改的,但是比较坑的是他没有具体介绍如果是自己的数据集的话,是应该怎么进行更改数据集的位置,以及路径的问题。

查了网上很多的介绍,但是基本都没有介绍的,所以不得不,自己照着源码进行看。

也是希望可以养成看源码的习惯,毕竟问题是多种多样的,从源码出发一定是可以进行解决的。

因为选择的是VOC的数据集,所以需要把自己标好的VOC数据集放在对应的数据集目录下。

在train.py 中

parser = argparse.ArgumentParser(
    description='Single Shot MultiBox Detector Training With Pytorch')
train_set = parser.add_mutually_exclusive_group()
parser.add_argument('--dataset', default='VOC', choices=['VOC', 'COCO'],
                    type=str, help='VOC or COCO')
parser.add_argument('--dataset_root', default=VOC_ROOT,
                    help='Dataset root directory path')
parser.add_argument('--basenet', default='vgg16_reducedfc.pth',
                    help='Pretrained base model')

可以看到是默认的是使用的是VOC数据集,但是其实是默认的使用的VOC2007 以及 VOC2012的数据集。

我把VOCdevkit放在data文件下

但是一直给我报的是找不到data/coco/coco_labels.txt

我开始不清楚,原来是因为作者是用的coco数据集做的训练所有在初始化的过程中,就要导入这些txt文件。

__init__.py文件下

from .voc0712 import VOCDetection, VOCAnnotationTransform, VOC_CLASSES, VOC_ROOT

from .coco import COCODetection, COCOAnnotationTransform, COCO_CLASSES, COCO_ROOT, get_label_map
from .config import *
import torch
import cv2
import numpy as np

发现他在初始化就引入了 coco.py的文件

接下来我们来看
coco.py文件

from .config import HOME
import os
import os.path as osp
import sys
import torch
import torch.utils.data as data
import torchvision.transforms as transforms
import cv2
import numpy as np

COCO_ROOT = osp.join(HOME, 'data/coco/')
IMAGES = 'images'
ANNOTATIONS = 'annotations'
COCO_API = 'PythonAPI'
INSTANCES_SET = 'instances_{}.json'

这里有个COCO_ROOT写的是相对路径,就是没引到我改引入的地方,我就把这个路径直接写死了

改成我的路径了,读者可以根据自己情况进行修改。
我是直接修改成了 data 文件下了

同理把voc0712.py的文件
路径改为我的路径
/data/VOCdevkit

改好后当执行train的时候发现还是报错

原来是
由于Pytorch版本不同,较新版的代码直接运行会报错,需要修改部分代码,主要是将.data[0]的部分改成.item()

修改train.py
修改源码183.184两行

loc_loss += loss_l.data[0]
conf_loss += loss_c.data[0]

改为:

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

修改源码188行

print('iter ' + repr(iteration) + ' || Loss: %.4f ||' % (loss.data[0]), end=' ')

改为:

print('iter ' + repr(iteration) + ' || Loss: %.4f ||' % (loss.item()), end=' ')

修改源码165行

images, targets = next(batch_iterator)

改为:

try:
    images, targets = next(batch_iterator)
except StopIteration as e:
    batch_iterator = iter(data_loader)
    images, targets = next(batch_iterator)

修改mutibox_loss.py

修改:源码包/layers/modules/mutibox_loss.py 调换第97,98行:

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

修改第114行为:

N = num_pos.data.sum().double()
loss_l /= N
loss_c /= N

改完后总是提示的是我的
train.py 中的 images 以及 targets 错误

把具体错误查了下,说是局部变量不能再全局进行引入

train.py

# load train data
        images, targets = next(batch_iterator)

        if args.cuda:
            images = Variable(images.cuda())
            targets = [Variable(ann.cuda(), volatile=True) for ann in targets]
        else:
            images = Variable(images)
            targets = [Variable(ann, volatile=True) for ann in targets]
        # forward
        t0 = time.time()
        out = net(images)
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, targets)

改为:

# load train data
        images, targets = next(batch_iterator)

        if args.cuda:
            images = Variable(images.cuda())
            targets = [Variable(ann.cuda(), volatile=True) for ann in targets]
        else:
            image = Variable(images)#去掉s
            target = [Variable(ann, volatile=True) for ann in targets] #去掉s
        # forward
        t0 = time.time()
        out = net(image)#去掉s
        # backprop
        optimizer.zero_grad()
        loss_l, loss_c = criterion(out, target)#去掉s

现在就剩一个错误了🤣🤣🤣🤣🤣

执行train.py 时候

RuntimeError: copy_if failed to synchronize: device-side assert triggered

问题描述:

这个问题是我在使用SSD做目标检测时遇到的,我要检测的目标有5种类别,所以我在data/config.py中的num_classes参数写了6,经过多方查找,发现了一个没注意到的细节,类别应该是6+1,那个1应该是背景。

还有一个原因就是标签的标号没有从0开始。

把class改为7后就没事了 哈哈

开始训练了

训练的时候发现他训练时候对GPU的利用也不是连续的,一会很高,一会是0 这很让人琢磨不透,我开始以为是自己没用上cuda呢

终于开始训练了,但是出现了我loss是nan错误,难受啊

下一讲就要开始解决这个问题了 。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容