Как создать обучающие данные CaffeDB для сиамских сетей из каталога изображений

Мне нужна помощь, чтобы создать CaffeDB для сиамского CNN из простого каталога с изображениями и текстовым файлом метки. Лучше всего это сделать с помощью python.
Проблема не в том, чтобы пройтись по каталогу и составить пары изображений. Моя проблема заключается в том, чтобы создать CaffeDB из этих пар.
До сих пор я использовал только convert_imageset для создания CaffeDB. из каталога изображений.
Спасибо за помощь!


person Feuerteufel    schedule 20.01.2016    source источник
comment
какой слой потерь вы собираетесь использовать?   -  person Shai    schedule 20.01.2016
comment
Я еще не знаю. Для моего варианта использования у меня есть несколько изображений (100 КБ) для каждого класса (4 + класс мусора), и я хочу, чтобы сеть лучше различала классы. С обычным линейным CNN было много ошибок в сети, и я подумал о том, чтобы попробовать сиамский CNN, чтобы сеть лучше изучала различия. Если у вас есть предложения по хорошему слою потерь, сообщите мне.   -  person Feuerteufel    schedule 21.01.2016
comment
Контрастные слои потерь кажутся подходящими для этого варианта использования.   -  person Shai    schedule 21.01.2016
comment
спасибо за это, поэтому проблема с caffeDB остается ...   -  person Feuerteufel    schedule 21.01.2016


Ответы (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

Убедитесь, что вы перетасовываете примеры в двух наборах по-разному, чтобы получить нетривиальные пары. Более того, если вы построите первый и второй наборы данных с разным количеством примеров, то вы увидите разные пары в каждую эпоху ;)


Убедитесь, что вы построили сеть, чтобы разделить веса дублированных слоев, см. это руководство для получения дополнительной информации.

person Shai    schedule 21.01.2016
comment
Я не нашел файла siamese.py ни в caffe/python, ни в установочном каталоге python2.7. Я работаю над Ubuntu 15.04 и получил ветку caffe-master 10/2015. Есть только мнист сиамский пример и я уже спроектировал сеть как в туториале с общим параметром, только начало с вводом данных мне непонятно. Я пока не использую слой python. Я просто определяю сеть и запускаю caffe с командой train для заданного решателя.prototxt. Например: caffe train -solver Solver.prototxt -gpu all. Мой уровень данных относится к каталогу с *.mdb и средним двоичным файлом proto - person Feuerteufel; 21.01.2016
comment
@Feuerteufel, вам нужно создать файл siamese.py и убедиться, что он есть в вашем $PYTHONPATH. этот файл должен содержать код вопроса (вместе с правильными import, которые необходимы для import caffe). Если вы включили слой Python в своем Makefile, чем caffe запустит для вас код Python как часть своего файла caffe train. - person Shai; 21.01.2016
comment
Хорошо, слой Python не был включен, поэтому я перестраиваю его прямо сейчас. Правильные строки для импорта для siamese.py: import sys, sys.path.insert(0, 'path/to/caffe/python') и import caffe или что-то еще? Затем в слое потерь в качестве третьего входа используется та же_не_такая_метка? - person Feuerteufel; 21.01.2016
comment
@Feuerteufel same_not_same_label используется в качестве метки для контрастных потерь. - person Shai; 21.01.2016
comment
Если у меня есть N меток. Как я могу обеспечить, чтобы вектор признаков размера N прямо перед контрастным слоем потерь представлял некоторую вероятность для каждого класса? Или это происходит автоматически с дизайном сиамской сетки? - person Feuerteufel; 22.01.2016
comment
@ Feuerteufel, это большой вопрос. Я не могу ответить на это в комментарии. рассмотрите возможность публикации этого как нового вопроса - person Shai; 22.01.2016
comment
ok, stackoverflow.com/questions/34946937/ - person Feuerteufel; 22.01.2016
comment
@Shai Я следовал вашим инструкциям, но получаю эту ошибку: 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
comment
@MoneyBall это выходит за рамки комментария. пожалуйста, рассмотрите возможность задать новый вопрос - person Shai; 21.05.2017
comment
@ Шай, ты случайно не знаешь, есть ли код C ++ для такого слоя, который я могу подключить и играть? - person MoneyBall; 22.05.2017
comment
@MoneyBall hdf5data может быть довольно универсальным - person Shai; 22.05.2017