18

У меня есть набор данных с несколькими ярлыками; В наборе данных есть 100 классов, и каждое изображение имеет от 1 до 5 ярлыков, связанных с ними.caffe with multi-label images

Я следую инструкциям в следующем URL:

https://github.com/BVLC/caffe/issues/550

Он говорит, что мне нужно, чтобы создать текстовый файл со списком изображений и его метки, как в

/home/my_test_dir/picture-foo.jpg 0 
/home/my_test_dir/picture-foo1.jpg 1 

В моем случае, поскольку у меня есть многоэлементные изображения, работает ли это просто, чтобы добавить ярлыки, как в следующем?

/home/my_test_dir/picture-foo.jpg 0 2 5 
/home/my_test_dir/picture-foo1.jpg 1 4 

У меня есть ощущение, что это, вероятно, не будет так просто, и если я прав, на каком этапе и как я должен интегрировать мульти-метки-ность набора данных в процесс создания кофе?

ответ

19

Я считаю, что ответ Шая больше не является актуальным. Caffe supports multi-label/matrix ground truth для форматов HDF5 и LMDB. Фрагмент python в this комментарий github демонстрирует, как построить многозначную наземную истину LMDB (см. Shai's answer для формата HDF5). В отличие от построения однотипных наборов данных изображений для изображений создается lmdb, а для данных с меткой наземной истины построена вторая отдельная lmdb. Фрагмент имеет дело с пространственной многотабличной земной истиной, полезной для пиксельной маркировки изображений.

Порядок, в котором данные записываются в lmdb, имеет решающее значение. Порядок истины должен соответствовать порядку изображений.

Уровни потерь, такие как SOFTMAX_LOSS, EUCLIDEAN_LOSS, SIGMOID_CROSS_ENTROPY_LOSS, также поддерживают данные с несколькими метками. Однако уровень точности по-прежнему ограничен одноточечными данными. Возможно, вы захотите следовать за this github issue, чтобы отслеживать, когда эта функция добавляется в Caffe.

+5

Так как у меня есть 100 классов, и каждое изображение помечено от 1 до 5 классов из тех 100, мне, вероятно, понадобится матрица 1x100 с номером 1, если изображение имеет этот класс в качестве метки и 0, например, в противном случае. Фрагмент Python в вашем коде имеет дело с пиксельной маркировкой, но что делать, если вам нужно несколько ярлыков на каждом изображении в целом? – ytrewq

3

AFAIK, текущая версия Caffe не поддерживает наборы данных lmdb/leveldb для изображений с многоканальными. Однако вы можете (и, вероятно, должны) подготовить свои входы в формате HDF5. Входной уровень Caffe HDF5 намного более гибкий и позволит вам иметь несколько меток на каждый вход.
This answer дает краткое описание того, как создать вход HDF5 для кофе.

Другой вопрос, вы должны обратиться является тот факт, что вы заинтересованы не только в нескольких -label на изображение, но и с различной количество меток на изображении. Как вы определяете свою потерю на изображение, на метку? может быть, вам придется написать свой собственный уровень потерь.
Есть некоторые уровни потерь, которые поддерживают «игнорировать метку»: то есть, если для изображения назначается конкретная метка ввода, для соответствующего изображения не вычисляются потери. См., Например, AccuracyLayer и SoftmaxWithLossLayer.

+2

Возможно, устаревший ответ. [Caffe поддерживает данные с несколькими метками] (https://github.com/BVLC/caffe/issues/1698#issue-53768814) для нескольких форматов. Уровни потерь также поддерживают данные с несколькими метками. Тем не менее, точность все еще ограничена данными с одной меткой. – ypx

+1

@ypx 'convert_imageset' не поддерживает метки с плавающей точкой. См. [Здесь] (https://github.com/BVLC/caffe/blob/master/tools/convert_imageset.cpp#L76). – Shai

+1

Правда это не так. Caffe поддерживает загрузку меток float из lmdb, leveldb, hdf5, сгенерированных с помощью python. Нет необходимости в convert_imageset. – ypx

4

caffe поддерживает multilabel. Вы можете поместить метки в n-горячие векторы, например. [0,1,1,0,0,1, ...].Вам необходимо изменить метки на n * k * 1 * 1 тензоры и использовать сигмовидную кросс-энтропию или эвклидовую, а не softmax (которая заставляет sum (выходы) = 1)

+0

На самом деле переделка на n * k * 1 * 1 является незатейливой, моей плохой. n * k достаточно (метка и чистый вывод должны совпадать в измерении) –