Поиск…


Подготовьте набор данных изображений для задачи классификации изображений

Caffe имеет встроенный входной уровень, предназначенный для задач классификации изображений (т. Е. Одно целочисленная метка на входное изображение). Этот входной слой "Data" построен на структуре данных или . Чтобы использовать слой "Data" , нужно построить структуру данных со всеми данными обучения.

Краткое руководство по convert_imageset Caffe's convert_imageset

строить

Первое, что вам нужно сделать - это создать инструменты convert_imageset ( convert_imageset - один из этих инструментов).
После установки кофе и make убедитесь, что вы запустили make tools .
Убедитесь, что бинарный файл convert_imageset создан в $CAFFE_ROOT/build/tools .

Подготовьте свои данные

Изображения: поместите все изображения в папку (я буду называть это здесь /path/to/jpegs/ ).
Ярлыки: создайте текстовый файл (например, /path/to/labels/train.txt ) с линией на входное изображение <путь / в / файл>. Например:

img_0000.jpeg 1
img_0001.jpeg 0
img_0002.jpeg 0

В этом примере первое изображение помечено как 1 а два других - 0 .

Преобразование набора данных

Запустить двоичный файл в оболочке

~$ GLOG_logtostderr=1 $CAFFE_ROOT/build/tools/convert_imageset \
    --resize_height=200 --resize_width=200 --shuffle  \
    /path/to/jpegs/ \
    /path/to/labels/train.txt \
    /path/to/lmdb/train_lmdb

Командная строка объясняется:

  • Флаг GLOG_logtostderr установлен в 1 перед вызовом convert_imageset указывает механизм регистрации для перенаправления сообщений журнала на stderr.
  • --resize_height и --resize_width изменяет размер всех входных изображений того же размера 200x200 .
  • --shuffle случайным образом изменяет порядок изображений и не сохраняет порядок в файле /path/to/labels/train.txt .
  • Ниже приведен путь к папке с изображениями, текстовому файлу меток и имени вывода. Обратите внимание, что имя выхода не должно существовать до вызова convert_imageset иначе вы получите сообщение об ошибке.

Другие флаги, которые могут быть полезны:

  • --backend - позволяет выбирать между lmdb данных levelDB или levelDB .
  • --gray - преобразовать все изображения в шкалу серого.
  • --encoded и --encoded_type - сохранять данные изображения в сжатой форме (jpg / png) в базе данных.
  • --help - показывает некоторую помощь, см. все соответствующие флаги в разделе Флаги из инструментов / convert_imageset.cpp

Вы можете проверить $CAFFE_ROOT/examples/imagenet/convert_imagenet.sh для примера, как использовать convert_imageset .

см. эту тему для получения дополнительной информации.

Подготовьте произвольные данные в формате HDF5

Помимо наборов данных классификации изображений , Caffe также имеет слой "HDF5Data" для произвольных входных данных. Этот слой требует, чтобы все данные обучения / валидации были сохранены в формата .
В этом примере показано, как использовать модуль python h5py для создания такого файла hdf5 и как настроить слой "HDF5Data" для чтения этого файла.

Создайте двоичный файл hdf5

Предположим, что у вас есть текстовый файл 'train.txt' с каждой строкой с именем файла изображения и одним числом с плавающей запятой, которое будет использоваться в качестве цели регрессии.

import h5py, os
import caffe
import numpy as np

SIZE = 224 # fixed size to all images
with open( 'train.txt', 'r' ) as T :
    lines = T.readlines()
# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
X = np.zeros( (len(lines), 3, SIZE, SIZE), dtype='f4' ) 
y = np.zeros( (1,len(lines)), dtype='f4' )
for i,l in enumerate(lines):
    sp = l.split(' ')
    img = caffe.io.load_image( sp[0] )
    img = caffe.io.resize( img, (SIZE, SIZE, 3) ) # resize to fixed size
    # you may apply other input transformations here...
    # Note that the transformation should take img from size-by-size-by-3 and transpose it to 3-by-size-by-size
    X[i] = img
    y[i] = float(sp[1])
with h5py.File('train.h5','w') as H:
    H.create_dataset( 'X', data=X ) # note the name X given to the dataset!
    H.create_dataset( 'y', data=y ) # note the name y given to the dataset!
with open('train_h5_list.txt','w') as L:
    L.write( 'train.h5' ) # list all h5 files you are going to use

Настройка слоя "HDF5Data"

Как только у вас есть все файлы h5 и соответствующие им тестовые файлы, вы можете добавить входной слой HDF5 к вашему train_val.prototxt :

 layer {
   type: "HDF5Data"
   top: "X" # same name as given in create_dataset!
   top: "y"
   hdf5_data_param {
     source: "train_h5_list.txt" # do not give the h5 files directly, but the list.
     batch_size: 32
   }
   include { phase:TRAIN }
 }

Вы можете найти более подробную информацию здесь и здесь .


Как показано выше, мы переходим в Caffe список файлов HDF5. Это связано с тем, что в текущей версии существует ограничение на размер 2 ГБ для одного файла данных HDF5. Поэтому, если данные обучения превышают 2 ГБ, нам нужно разделить их на отдельные файлы.

Если один файл данных HDF5 превышает 2 ГБ, мы получим сообщение об ошибке, например

Check failed: shape[i] <= 2147483647 / count_ (100 vs. 71) blob size exceeds INT_MAX

Если общий объем данных составляет менее 2 ГБ, разделим ли мы данные на отдельные файлы или нет?

Согласно замечанию в исходном коде Caffe , один файл будет лучше,

Если shuffle == true, порядок файлов HDF5 перетасовывается, а упорядочение данных в любом файле HDF5 перетасовывается, но данные между разными файлами не чередуются.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow