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]の出力が正しい場合、画像の情報を表示するのに役立ちます.
グレースケールマップをインデックスマップに変換するコードは、次のとおりです.
sbdd/benchmark/benchmark_RELEASE/dataset/imgの下に訓練原図、clsの下にインデックス図、train.txtにはトレーニング画像名が行ごとに書き込まれており、接尾辞が付いていないことに注意してください.
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形式:
変更: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がエラーを報告します).
voc-fcn 8 sの下に
単一テスト:1.修正prototxt[train.prototxtを参照して、ボリューム層を追加]voc-fcn 8 s/inferを変更します.py:
2.インデックスマップをカラーバックマップに対応し、このコードを後に追加できます.
データセットの作成:
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:
transplant:
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)