0

lmdb データベースに基づいて複数のラベルを分類しようとしています。2 つの異なるデータベースを作成します。1 つは画像自体用で、もう 1 つはラベル用です。私の意図は、水平方向と垂直方向の角度に 2 つの異なるラベルを付けることです。つまり、label1 [0-360] label2 [0-360] です。

そうするために、私のコードは次のとおりです。

data_name = "val"
data = data_name + '.txt'
lmdb_data_name = data_name + '_images_lmdb'
lmdb_label_name = data_name + '_labels_lmdb'

images = []
labels = []

for line in fileinput.input(data):
    entries = re.split(' ', line.strip())
    # append image
    images.append(entries[0])
    labels.append(entries[1:])

images_db = lmdb.open(lmdb_data_name, map_size=int(1e12))
labels_db = lmdb.open(lmdb_label_name, map_size=int(1e12))

images_txn = images_db.begin(write=True)
labels_txn = labels_db.begin(write=True)

inputs = zip(images, labels)
for in_idx, (image, label) in enumerate(inputs):
    im = cv2.imread(image)
    im = im[:,:,::-1]
    im = im.transpose((2,0,1))

    im_dat = caffe.io.array_to_datum(im)

    images_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString())

    label = np.array(label).astype(int).reshape(1, 1, len(label))
    label_dat = caffe.io.array_to_datum(label)
    labels_txn.put('{:0>10d}'.format(in_idx),label_dat.SerializeToString())

images_txn.commit()
labels_txn.commit()

images_db.close()
labels_db.close()

私は次のようにtrain.txt見えます:とは整数です。/path/to/image label1 label2label1label2

train_val.prototxtはこのように見えます:

layer {
  name: "data"
  type: "Data"
  top: "images"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 256
    mean_file: "/path/mean_train.binaryproto"
  }
  data_param {
    source: "/path/train_images_lmdb"
    batch_size: 10
    backend: LMDB
  }
}
layer {
  name: "data_label"
  type: "Data"
  top: "labels"
  include {
    phase: TRAIN
  }
  data_param {
    source: "/train_labels_lmdb"
    batch_size: 10
    backend: LMDB
  }
}

TEST フェーズの部分は同じです

私の損失レイヤーは次のようになります。

layer {
  name: "loss"
  type: "SigmoidCrossEntropyLoss"
  bottom: "fc8"
  bottom: "labels"
  top: "loss"
}
4

0 に答える 0