Мне нужна помощь, чтобы создать CaffeDB для сиамского CNN из простого каталога с изображениями и текстовым файлом метки. Лучше всего это сделать с помощью python.
Проблема не в том, чтобы пройтись по каталогу и составить пары изображений. Моя проблема заключается в том, чтобы создать CaffeDB из этих пар.
До сих пор я использовал только convert_imageset
для создания CaffeDB. из каталога изображений.
Спасибо за помощь!
Как создать обучающие данные CaffeDB для сиамских сетей из каталога изображений
Ответы (1)
Почему бы вам просто не сделать два набора данных, используя старый добрый convert_imagest
?
layer {
name: "data_a"
top: "data_a"
top: "label_a"
type: "Data"
data_param { source: "/path/to/first/data_lmdb" }
...
}
layer {
name: "data_b"
top: "data_b"
top: "label_b"
type: "Data"
data_param { source: "/path/to/second/data_lmdb" }
...
}
Что касается потери, поскольку каждый пример имеет метку класса, вам нужно преобразовать label_a
и label_b
в same_not_same_label
. Я предлагаю вам сделать это «на лету», используя слой Python. В prototxt
добавьте вызов слоя python:
layer {
name: "a_b_to_same_not_same_label"
type: "Python"
bottom: "label_a"
bottom: "label_b"
top: "same_not_same_label"
python_param {
# the module name -- usually the filename -- that needs to be in $PYTHONPATH
module: "siamese"
# the layer name -- the class name in the module
layer: "SiameseLabels"
}
propagate_down: false
}
Создайте siamese.py
(убедитесь, что он есть в вашем $PYTHONPATH
). В siamese.py
у вас должен быть класс слоя:
import sys, os
sys.path.insert(0,os.environ['CAFFE_ROOT'] + '/python')
import caffe
class SiameseLabels(caffe.Layer):
def setup(self, bottom, top):
if len(bottom) != 2:
raise Exception('must have exactly two inputs')
if len(top) != 1:
raise Exception('must have exactly one output')
def reshape(self,bottom,top):
top[0].reshape( *bottom[0].shape )
def forward(self,bottom,top):
top[0].data[...] = (bottom[0].data == bottom[1].data).astype('f4')
def backward(self,top,propagate_down,bottom):
# no back prop
pass
Убедитесь, что вы перетасовываете примеры в двух наборах по-разному, чтобы получить нетривиальные пары. Более того, если вы построите первый и второй наборы данных с разным количеством примеров, то вы увидите разные пары в каждую эпоху ;)
Убедитесь, что вы построили сеть, чтобы разделить веса дублированных слоев, см. это руководство для получения дополнительной информации.
siamese.py
и убедиться, что он есть в вашем $PYTHONPATH
. этот файл должен содержать код вопроса (вместе с правильными import
, которые необходимы для import caffe
). Если вы включили слой Python в своем Makefile, чем caffe запустит для вас код Python как часть своего файла caffe train
.
- person Shai; 21.01.2016
Check failed: layer_param.propagate_down_size() == layer_param.bottom_size() (1 vs. 2) propagate_down param must be specified either 0 or bottom_size times
, что не имеет смысла, потому что я установил back_propagate: false
. Где еще можно было ошибиться?
- person MoneyBall; 21.05.2017