Как преобразовать произвольный набор данных в формат набора данных сиамской сети в кафе?

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

Я вижу, что для этого мне нужно, чтобы мой набор данных был в формате, требуемом сиамской сетью. Это можно создать с помощью файла create_mnist_siamese.sh, который загружает набор данных mnist в формате idx3-ubyte и создает базу данных набора данных lmdb с двумя изображениями и совпадающей/несовпадающей меткой в ​​каждом месте базы данных lmdb.

Поэтому я решил использовать скрипт create_mnist_siamese.sh, мой набор данных также должен быть в формате idx-ubyte. Я попытался преобразовать свой набор данных в формат idx-ubyte, используя «mnisten». Однако я получаю сообщение об ошибке «ошибка: общее количество изображений меньше, чем num_tests». Я предполагаю, что сценарий не идентифицирует мои изображения. Структура папок набора данных выглядит следующим образом:

parent-directory
  - subfolder
  - subfolder 
  .
  .
  .
  -txt file

имя родительского каталога - 'сгенерированный набор данных'
подпапки - 1 ,2 ,3 ... (подпапки имеют названия 1-30, так как я хочу пометить данные в каждой подпапке по имени подпапки)
txt содержит заголовок изображения в каждой строке с меткой класса.

Как мне работать с моим набором данных в сиамской сети в кафе? Есть ли прямой способ преобразовать мой набор данных в формат lmdb для сиамской сети? Или мне нужно использовать мнистен? Если да, то как мне исправить мою ошибку? Помощь Ану будет высоко оценена. Спасибо.


person Uzair Ahmed    schedule 27.01.2017    source источник


Ответы (2)


Вам не нужно использовать точно такой же формат — это всего лишь учебник... Все, что вам нужно сделать, это предоставить один или несколько слоев данных с тремя верхними BLOB-объектами: data, data_p и sim. Вы можете сделать это любым удобным для вас способом, например. LMDB (как в примере с MNIST), HDF5 или что-то в этом роде.

Общее объяснение

В учебнике они дополнительно показывают и простой способ загрузки пар изображений: вы объединяете два изображения в измерении канала. Для оттенков серого вы берете два входных изображения, каждое из которых имеет, например, размерность [1, 1, 28, 28] (т. е. 1 изображение, 1 канал, разрешение 28x28). Затем вы объединяете их в одно изображение размером [1, 2, 28, 28] и сохраняете их, например. к LMDB.

В сети первым шагом после загрузки данных является слой среза, который берет это изображение и нарезает его (т. е. разделяет) вдоль этой оси, создавая таким образом два верхних блоба, data и data_p.

Как создать файлы данных?

Не существует единственно правильного способа сделать это. код из руководства предназначен только для MNIST. установлен, поэтому, если у вас нет точно такого же формата, вы не сможете использовать его без изменений. У вас есть несколько возможностей:

  1. Преобразуйте свои изображения в формат MNIST. Затем код из учебника Caffe работает «из коробки». Похоже, что вы пытаетесь это сделать - если вам нужна помощь в этом, пожалуйста, будьте конкретны: что такое mnisten, включите свой код и т. д.

  2. Напишите свой собственный скрипт для преобразования изображений. На самом деле это очень просто: все, что вам нужно сделать, это прочитать изображения на вашем любимом языке программирования, выбрать пары, вычислить метки и повторно сохранить как LMDB. Это определенно более гибкий способ.

  3. Создавайте файлы HDF5 с несколькими большими двоичными объектами Top. Это очень просто сделать, но, вероятно, будет немного медленнее, чем при использовании LMDB.

Что вы используете, зависит от вас - я бы, вероятно, выбрал HDF5, так как это простой и очень гибкий способ начать.

Как генерировать пары?

Теперь, это трудный вопрос здесь. Код из учебника просто выбирает случайные пары, что на самом деле не оптимально и делает обучение довольно медленным. Вам нужны не просто случайные пары, вам нужны осмысленные, сложные, но все же решаемые пары. Как это сделать, полностью зависит от вашего набора данных.

Очень сложный пример представлен в (Раденович, 2016): они используют сиамскую сеть для изучения представления для поиска изображений на зданиях. Они используют алгоритм «Структура из движения» (SfM) для создания трехмерной реконструкции здания, а затем выбирают пары изображений из этих реконструкций.

То, как именно вы создаете пары, зависит от ваших данных — возможно, у вас все в порядке со случайными парами — возможно, вам нужен сложный метод.

Литература:

Ф. Раденович, Г. Толиас и О. Чум. Поиск изображений CNN учится на BoW: неконтролируемая точная настройка с трудными примерами. В: Европейская конференция по компьютерному зрению (ECCV), 2016 г. arXiv: 1604.02426.

person hbaderts    schedule 28.01.2017
comment
Большое спасибо за помощь. - person Uzair Ahmed; 29.01.2017

Генерация пар — самый важный шаг в сиамской сети. Однако есть простой способ сделать это с помощью caffe.

Загрузить данные как отдельные lmdb

Создайте 2 lmdb data_1 и data_2 с помощью скрипта create_imagenet.sh или convert_imageset.cpp. Используйте одни и те же данные для обоих наборов, за исключением data_2, содержащего на одно изображение меньше, чем data_1.

Это гарантирует, что в каждую эпоху будет сравниваться другая пара изображений, что позволит нам охватить все nC2 комбинаций (n^2на самом деле)

layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  data_param{
      source: "/home/subho/SSD2/data_1/"
      batch_size: 8
      backend: LMDB
     }
  }
layer {
name: "data_p"
type: "Data"
top: "data_p"
top: "label_p"
data_param {
    source: "/home/subho/SSD2/data_2/"
    batch_size: 8
    backend: LMDB
   }
}

Добавить слой подобия в прототип

layer {
  name: "sim_check"
  type: "Similarity"
  bottom: "label"
  bottom: "label_p"
  top: "sim_check"
  propagate_down: false # for each bottom_blob
  propagate_down: false
  }
layer {
    name: "loss"
    type: "ContrastiveLoss"
    contrastive_loss_param {
    margin: 1.0
    }
    bottom: "feat"
    bottom: "feat_p"
    bottom: "sim_check"
    top: "loss"
  }

Создать файлы для слоя подобия

Загрузить файлы для уровня подобия

Поместите similarity_layer.cpp в caffe/src/caffe/layers/ и similarity_layers.hpp в caffe/include/caffe/layers/ и перестройте кафе.

cd build
cmake ..
make -j12

Примечание. Если ваша сеть не конвергентна с использованием описанного выше метода, вам следует обратить внимание на следующее :

  • Подбор пар изображений с использованием твердых негативов
  • Обеспечение баланса положительных и отрицательных пар (разнородных пар)
person Subhabrata Debnath    schedule 02.04.2017