SSDで自分のデータセットを訓練する

13463 ワード

1データセットの構築


まず、総データが1000枚であると仮定して、データセットを構築する方法を見てみましょう.便宜上、/home/bingolwang/dataフォルダの下にデータを置きます./home/bingolwang/data/VOCdevkitこのディレクトリの下はVOC 2007
VOC2007/
|-- Annotations   #1000 xml 。
|-- ImageSets
|   `-- Main
|       |-- test.txt      
|       `-- trainval.txt  
`-- JPEGImages    #1000 jpg 

よく見てtxt ,trainval.txtという2つのファイルのフォーマットは、
test.txt
00002  #  .jpg
00003
00100
00012
.....
trainval.txt  # ? 6 , 00000 , 
00000         # 
00001
00004
00005
.....

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

xmlの内容を見てみましょう.これは00005の例です.xml.
<annotation>
  <folder>imagesfolder>
  <filename>00005.jpgfilename>
  <source>
    <database>bingolwangDataSetdatabase>
  source>
  <size>
    <width>435width>
    <height>363height>
    <depth>3depth>
  size>
  <object>
    <name>Objectname>
    <difficult>0difficult>
    <bndbox>
      <xmin>37xmin>
      <ymin>318ymin>
      <xmax>428xmax>
      <ymax>358ymax>
    bndbox>
  object>
annotation>

注意:実際にssd公式(github:https://github.com/weiliu89/caffe/tree/ssd)のファイルで使用するcreate_list.shはlmdbを生成するために必要な様々なファイルを作成します.ここでは、そんなに複雑なスクリプトは使えないので、手動で作成します.
create_data.shは訓練入力を作成するlmdbである.彼の入力はlabelmapです.voc.prototxt | test.txt | trainval.txt、この3つのファイル.やはり見てみましょう.この3つのファイルはどんなフォーマットですか.
# 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"
}

上記の書類を用意すればgit cloneができますhttps://github.com/weiliu89/caffe/tree/ssdコンパイルしてcaffeにrootディレクトリの下でdataの下を見つけて、それからILSVVRC 2016 VOC 0712 cifar 10 coco ilsvrc 12 moistのこのいくつかのフォルダを見て、それからVOC 0712ディレクトリの下に入って、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()

自分のデータセットを訓練するときにエラーを報告します。


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

コンパイラエラー:

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, 。

実行時エラー:

Check failed: error == cudaSuccess (8 vs. 0) invalid device function
//  cuda lib     nvcc  
//    copy cuda   gcc 。

訓練時lossはnan


2つの可能性:1 lmdbを生成するときに、設定寸法が選択されていません.resizeオプションです.2既存のモデル上でfinetuneは,学習率を設定していない.