0

我正在尝试基于 lmdb 数据库进行多标签分类。我创建了两个不同的数据库。一个用于图像本身,一个用于标签。我的意图是为水平和垂直方向的角度设置 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 label2wherelabel1label2是整数。

我的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
  }
}

测试阶段的部分是相同的

我的损失层如下所示:

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

0 回答 0