FCNは自分のデータセットを作って、訓練して、テストします


FCNは自分のデータセットを作ることから、トレーニングまで、テストの中で多くの友达の助けに感謝します!今整理して、もっと多くの人を助けてほしいです.voc_でfcn 8 sを例に、プロセス全体を詳しく説明します.

データセットの作成:


vocのデータフォーマットによって、benchmarkとVOC 201に分けられ、benchmarkは訓練セットである:VOC 201はテストセットであり、benchmarckはfcnである.berkeleyvision.org/data/sbdd VOC 2011はfcn.berkeleyvision.org/data/pascal訓練セットの原図は.jpg/.png、ラベルは.mat. テストセットの原図とラベル図はすべて.png/.jpg.この点、voc_からlayer.pyでのデータの読み出し方から分かるように、VOCSegDataLayer()はテストセットの読み出し方法であり、SBDDSegDataLayer()はトレーニングセットの読み出し方法である.簡単にするために、データセットを作成するときに、トレーニング画像とテスト画像を画像形式に準備し、ラベルもインデックス図です.

作成ラベル:


もし私が2種類あるならば、背景は0で、目標は1で、ラベル図は単一チャネルの階調図です.ここで、背景の階調値が0、目標の階調値が1(0から、背景が0、連続する階調値)のように作成した後、ラベル図は真っ黒(8ビット深さ)に見えます.次に、ラベル図をインデックス図にします.インデックス図とは、簡単に言えば、mapのマッピングを行います.例えば、私が前に設定した階調値が0の背景を、自分で設定した新しい色(r,g,b)にマッピングし、階調値を1とし、新しい色(r,g,b)にマッピングします.インデックスパターン形式のlabelはP形式で、新しい色があり、このときのビット深度はインデックスパターンを作成することにいくつかの色を対応していることに等しい.例えば、私の対応は0,1で、このときのビット深度は1で、0,1,2,3,4であれば、このときのビット深度は4である.次のコードは、[0,1]の出力が正しい場合、画像の情報を表示するのに役立ちます.
import PIL
from PIL import Image
import numpy as np
image = PIL.Image.open('..... ')
print(np.unique(image))

グレースケールマップをインデックスマップに変換するコードは、次のとおりです.
# -*- coding: utf-8 -*-
__author__ = 'cheese'

from random import randint
from PIL import Image
import os

'''
 
'''

path  = "C:\\Users\\Administrator\\Desktop\\Tarim20\\indexplan\\"
os.chdir(path) 
imgList = os.listdir(path) 

for pic in imgList:
    img = Image.open(pic)
    img.putpalette([0,0,0,255,0,0]) # 0 (0,0,0), 1 (255,0,0), , 
    img.save(pic)

print ("done!")

ファイルの変更


sbdd/benchmark/benchmark_RELEASE/dataset/imgの下に訓練原図、clsの下にインデックス図、train.txtにはトレーニング画像名が行ごとに書き込まれており、接尾辞が付いていないことに注意してください.
1511664041284
1511664333882
1511664361617
1511666437817
1511666511922
1511666520225
1511666741161
1511666868122
1511666942753
1511666950786

pascal/VOC 2011/JPEGImagesの下に検証原図、SegmentationClassの下にインデックス図segvalid 11を置く.txtは、/data/pascal/VOC 2011/ImageSets/Segmentation/で、本来はval.txtであり、segvalid 11を生成するようにコピーする.txt.検証セットのファイル名を書いて、接尾辞solveをつけないように注意します.pyもval.txtもこのファイルを指します.
clsにはもともと保管すべきだった.matファイル、インデックスマップを入れて、読み込んだデータのコードを修正してvoc_を模倣する必要がありますlayer.pyにおけるVOCSegDataLayerクラスにおけるlabelの読み出し方法は、SBDDSegDataLayerによるlabelの読み出し方法に変更する.png形式:
def load_label(self, idx):
        """
        Load label image as 1 x height x width integer array of label indices.
        The leading singleton dimension is required by the loss.
        """
        # import scipy.io
        # mat = scipy.io.loadmat('{}/cls/{}.mat'.format(self.sbdd_dir, idx))
        # label = mat['GTcls'][0]['Segmentation'][0].astype(np.uint8)
        # label = label[np.newaxis, ...]
        # return label

        im = Image.open('{}/cls/{}.png'.format(self.sbdd_dir, idx))
        label = np.array(im, dtype=np.uint8)
        label = label[np.newaxis, ...]
        return label

変更:1.solver.prototxtのいくつかのスーパーパラメータの設定2.train.prototxt/val.prototxt:a:読み取りファイルパスbを変更:最終出力のカテゴリを変更したので、最後の出力カテゴリを2に変更すればいいと思っていたが、fcnの反ボリューム層が入力と出力のサイズが一致していることを確認した.これで、すべての21を後ろから変えなければなりませんが、fcn 8 s-heavy-pascalも使いたいです.caffemodelプリトレーニングモデルは、そんなにshapeを修正したくないので、最後の反ボリューム層の後にnum_を追加します.output:2のボリューム層.ここではsolveを修正する必要はありません.py中copy_form関数は、トレーニングモデルのパラメータとある私のネットワーク構造がすべてあるので、強引にコピーすることはありません.ここで、copy_formとtransplantの違い:copy_from:
  • 新旧ネットワークでは、名前が同じshapeの同じレイヤ、copy.
  • 新旧ネットワークでは、名前が同じshapeとは異なり、error.
  • 新旧ネットワークでは、名前が異なりdrop.

  • transplant:
  • 新旧ネットワークでは、名前が同じshapeの同じレイヤ、copy.
  • 新旧ネットワークでは,名前が同じshapeではなく,ネットワーク内のパラメータを強制的に新しいネットワークにコピーする.
  • 新旧ネットワークでは、名前が異なりdrop.

  • fcn-16 sを訓練すれば、直接copy_from自身のfcn-32 sのmodelの重みはtransplantを必要とせずfcn-8 sを訓練すれば直接copy_from自身のfcn-16 sのmodelの重みは、transplantを必要としませんvgg-16のトレーニングモデルでfcn-32 sをトレーニングする場合は、transplantが必要です(vgg-16でfc 6、fc 7のネットワーク構造とfcnでfc 6、fc 7のネットワーク構造が異なるため、直接copy_fromがエラーを報告します).
    layer {
      name: "upscore8"
      type: "Deconvolution"
      bottom: "fuse_pool3"
      top: "upscore8"
      param {
        lr_mult: 0
      }
      convolution_param {
        num_output: 21
        bias_term: false
        kernel_size: 16
        stride: 8
      }
    }
    layer {
       name: "end2"
       type: "Convolution"
       bottom: "upscore8"
       top: "end2"
       param {
         lr_mult: 1
         decay_mult: 1
       }
       param {
         lr_mult: 2
         decay_mult: 0
       }
       convolution_param {
         num_output:5
         pad: 0
         kernel_size: 1
       }
     }
    layer {
    name: "score"
      type: "Crop"
      bottom: "end2" #"upscore8"
      bottom: "data"
      top: "score"
      crop_param {
        axis: 2
        offset: 31
      }
    }
    

    トレーニング


    voc-fcn 8 sの下にpython solve.pyと入力すると、トレーニングが開始されます.IndexError: list index out of range*を間違えてpython solve.py 0を実行すれば訓練できる場合、初期のlossは高いが、予備訓練モデルを使わないとlossは収束が遅くなり、

    テスト


    単一テスト:1.修正prototxt[train.prototxtを参照して、ボリューム層を追加]voc-fcn 8 s/inferを変更します.py:
    1. deploy.prototxt
    # load net
    net = caffe.Net('/new/wc/FCN/fcn.berkeleyvision.org/voc-fcn8s/deploy.prototxt', 
    '/new/wc/FCN/fcn.berkeleyvision.org/voc-fcn8s/snapshot/train/_iter_1000.caffemodel', caffe.TEST)

    2.インデックスマップをカラーバックマップに対応し、このコードを後に追加できます.
     palette=[]
     for i in range(256):
         palette.extend((i,i,i))
    
     # , [0,0,0], , [255,0,0]
     palette[:3*2]=np.array([[0, 0, 0],
                             [255,0,0],], dtype='uint8').flatten()
    
     im.putpalette(palette)
     im.show()
     # 
     im.save('/new/wc/FCN/fcn.berkeleyvision.org/voc-fcn8s/testpic/res/'+imgName)