Caffe - мультиклассовая и мультибликовая классификация изображений - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь создать единую многоклассовую и многокомпонентную сетевую конфигурацию в кафе.

Скажем, классификация собак: собака маленькая или большая?(класс) Какого цвета это?(класс) это есть воротник?(этикетка)

Возможно ли это с помощью кофе?Как правильно это сделать?Как правильно создать файл lmdb?

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

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Спасибо Shai ,

Просто пытаюсь понять практический способ ... После создания 2 .text файлов (один для обучения и один для проверки), содержащий все теги изображений,например:

/train/img/1.png 0 4 18
/train/img/2.png 1 7 17 33
/train/img/3.png 0 4 17

Запуск сценария py:

import h5py, os
import caffe
import numpy as np

SIZE = 227 # 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( (len(lines),1), 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
    # for example
    transposed_img = img.transpose((2,0,1))[::-1,:,:] # RGB->BGR
    X[i] = transposed_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

И создание train.h5 и val.h5 (набор данных X содержит изображения, а Y содержат метки?).

Заменить мои сетевые входные слои с:

layers { 
 name: "data" 
 type: DATA 
 top:  "data" 
 top:  "label" 
 data_param { 
   source: "/home/gal/digits/digits/jobs/20181010-191058-21ab/train_db" 
   backend: LMDB 
   batch_size: 64 
 } 
 transform_param { 
    crop_size: 227 
    mean_file: "/home/gal/digits/digits/jobs/20181010-191058-21ab/mean.binaryproto" 
    mirror: true 
  } 
  include: { phase: TRAIN } 
} 
layers { 
 name: "data" 
 type: DATA 
 top:  "data" 
 top:  "label" 
 data_param { 
   source: "/home/gal/digits/digits/jobs/20181010-191058-21ab/val_db"  
   backend: LMDB 
   batch_size: 64
 } 
 transform_param { 
    crop_size: 227 
    mean_file: "/home/gal/digits/digits/jobs/20181010-191058-21ab/mean.binaryproto" 
    mirror: true 
  } 
  include: { phase: TEST } 
} 

на

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 }
}

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

Я думаю, HDF5 не нужен mean.binaryproto?

Далее, как должен измениться выходной слой, чтобы вывести несколько вероятностей меток?Я думаю, мне нужен кросс-энтропийный слой вместо Softmax?Это текущие выходные слои:

layers {
  bottom: "prob"
  bottom: "label"
  top: "loss"
  name: "loss"
  type: SOFTMAX_LOSS
  loss_weight: 1
}
layers {
  name: "accuracy"
  type: ACCURACY
  bottom: "prob"
  bottom: "label"
  top: "accuracy"
  include: { phase: TEST }
}
0 голосов
/ 21 октября 2018

Проблема с интерфейсом LMDB в Caffe заключается в том, что он допускает только одиночную метку int на изображение .
Если вам нужно несколько меток на изображение, вам придется использовать другой входной слой.
Я предлагаю использовать слой "HDF5Data":
Это позволяет более гибко настраивать входные данные, у вас может быть столько "top" с, сколько вы хотите для этого слоя.Вы можете иметь несколько меток на каждое входное изображение и иметь несколько потерь для обучения в своей сети.

См. этот пост о том, как создать hdf5-данные для caffe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...