用SSD训练自己的数据集

1构建 数据集

先来看一下我们构建数据集合应该是什么样的,假设总数据为1000张。
为了方便,我们将数据放在/home/bingolwang/data 文件夹下。/home/bingolwang/data/VOCdevkit 这个目录下是VOC2007

VOC2007/
|-- Annotations   #1000个xml文件。
|-- ImageSets
|   `-- Main
|       |-- test.txt      #测试集
|       `-- trainval.txt  #训练集
`-- JPEGImages    #1000个jpg文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

仔细看看 test.txt ,trainval.txt 这两个文件的格式,

test.txt
00002  #其实就是去掉了对应的 .jpg
00003
00100
00012
..... trainval.txt #图片的名字到底有什么要求?不一定是6位码,也不一样定是从00000开始,只要 00000 #区分的开各个图片即可 00001 00004 00005 .....
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

JPEGImages ,Annotations文件夹中的内容

#Annotations  dir 下的内容
00000.xml
00001.xml
00002.xml
00003.xml
......xml
01000.xml
#JPEGImages  dir 下的内容
00000.jpg
00001.jpg
00002.jpg
00003.jpg
......jpg
01000.jpg
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在来看看xml中的内容,这举例00005.xml。

<annotation>
  <folder>images</folder>
  <filename>00005.jpg</filename>
  <source>
    <database>bingolwangDataSet</database>
  </source>
  <size>
    <width>435</width>
    <height>363</height>
    <depth>3</depth>
  </size>
  <object>
    <name>Object</name>
    <difficult>0</difficult>
    <bndbox>
      <xmin>37</xmin>
      <ymin>318</ymin>
      <xmax>428</xmax>
      <ymax>358</ymax>
    </bndbox>
  </object>
</annotation>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

注意:实际上在ssd官方(github:https://github.com/weiliu89/caffe/tree/ssd)的文件中,使用的create_list.sh 创建了生成lmdb所需要的各种文件。这里,我们手动创建,因为根本用不了那么复杂的脚本。

create_data.sh 就是创建训练输入的lmdb。他的输入是 labelmap_voc.prototxt | test.txt | trainval.txt ,这三个文件。
还是得看一下,这三个文件都是什么格式。

# trainval.txt
VOC2007/JPEGImages/105df.jpg VOC2007/Annotations/105df.xml
VOC2007/JPEGImages/ww231.jpg VOC2007/Annotations/ww231.xml
VOC2007/JPEGImages/763005.jpg VOC2007/Annotations/763005.xml

#test.txt
VOC2007/JPEGImages/0b73.jpg VOC2007/Annotations/0b73.xml
VOC2007/JPEGImages/c5ccbe1.jpg VOC2007/Annotations/c5ccbe1.xml
VOC2007/JPEGImages/ec5f0.jpg VOC2007/Annotations/ec5f0.xml
VOC2007/JPEGImages/a0341.jpg VOC2007/Annotations/a0341.xml

#labelmap_voc.prototxt #single object
item {
  name: "none_of_the_above"
  label: 0
  display_name: "background"
}
item {
  name: "Object"
  label: 1
  display_name: "Object"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

准备好了上述文件,就可以git clone https://github.com/weiliu89/caffe/tree/ssd 编译,然后到我们的caffe_root目录下,找到data 下,然后看到 ILSVRC2016 VOC0712 cifar10 coco ilsvrc12 moist 这几个文件夹,然后进入VOC0712 目录下,可以看到 create_data.sh create_list.sh labelmap_voc.prototxt test.txt trainval.txt , 然后执行 create_data.sh 脚本。

附件

–这个xml文件是怎么生成的。这里推荐用python脚本

#coding=utf-8
import os
from lxml import etree
import math

anno_file = "imageInfo.txt"
save_root = "/data1/user/bingolwang/data/VOCdevkit/VOC2007/Annotations/"

f = open(anno_file,'r')

for line in f:
    data = line.strip().split(" ")
    fname = data[0]
    img_width = int(float(data[1]))
    img_height = int(float(data[2]))

    save_file = save_root + fname[:-3] + "xml"
    fout = open(save_file, 'w')

    # creat XML
    root = etree.Element("annotation")

    # folder info
    folder = etree.SubElement(root, "folder")
    folder.text = "GeneraOcr_WeiYun_Det_imgs"

    # file name
    filename = etree.SubElement(root, "filename")
    filename.text = str(fname)

    # source
    source = etree.SubElement(root, "source")
    database = etree.SubElement(source, "database")
    database.text = "GeneraOcr_WeiYun_Det"

    # image size
    size = etree.SubElement(root, "size")
    width = etree.SubElement(size, "width")
    width.text = str(img_width)
    height = etree.SubElement(size, "height")
    height.text = str(img_height)
    depth = etree.SubElement(size, "depth")
    depth.text = "3"

    # object
    object_count = 2
    while object_count < data.__len__():
        object = etree.SubElement(root, "object")
        name = etree.SubElement(object, "name")
        name.text = "text"
        difficult = etree.SubElement(object, "difficult")
        difficult.text = "0"
        bndbox = etree.SubElement(object, "bndbox")

        xminv = max(1,int(float(data[object_count + 1])) + 1)
        yminv = max(1,int(float(data[object_count + 2])) +1)
        xmaxv = min(int(float(data[object_count + 3])) ,img_width-2)
        ymaxv = min(int(float(data[object_count + 4])) ,img_height-2)

        xmin = etree.SubElement(bndbox, "xmin")
        xmin.text = str(xminv)
        ymin = etree.SubElement(bndbox, "ymin")
        ymin.text = str(yminv)
        xmax = etree.SubElement(bndbox, "xmax")
        xmax.text = str(xmaxv)
        ymax = etree.SubElement(bndbox, "ymax")
        ymax.text = str(ymaxv)

        object_count += 5

    ss = etree.tostring(root, encoding='utf8',pretty_print=True)
    fout.write(ss.decode('utf-8'))
    fout.close()

    # source end
    #s = etree.tostring(root, encoding='utf8',pretty_print=True)
    #print(str(s))

f.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

训练自己的数据集时候报错:

Check failed: background_label_id != label (0 vs. 0) “Found background label in the dataset.”

检查失败: background_label_id != label
          但是现在二者相等(0 vs 0)
          主要原因:在dataset的label中,发现了背景类
          也就是某些图片为纯背景,而且 标注为 0
  • 1
  • 2
  • 3
  • 4

编译器出错:

json_parser_read.hpp:257:264: error: ‘type name’ declared as function returning an array escape
// 解决步骤:
// 1- vi /usr/include/boost/property_tree/detail/json_parser_read.hpp
// 2- 注释掉 json_parser_read.hpp:257:264 之间的代码
// 3- 保存。然后重新编译即可。
// 出现这种情况的原因往往是由于: 我们的gcc 与cuda版本不匹配, 可以选择升级gcc 或者降级 cuda,但是很麻烦。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行时出错:

Check failed: error == cudaSuccess (8 vs. 0) invalid device function
// 可能运行时候的cuda lib 与 编译时候的 nvcc 版本对不上
// 或者 直接copy了一个已经在其他平台上已经编译好的cuda 但是本平台与其他平台的 gcc版本不一致。
  • 1
  • 2
  • 3

训练时loss为nan

两种可能: 1 在生成lmdb的时候,没有选择设置尺寸。就是resize选项。 2 在已有的模型上finetune,没有设置好学习率。

相关文章
相关标签/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院