2017-02-10 3 views
0

В MATLAB метод splitEachLabel объекта imageDatastore разбивает хранилище данных изображений в пропорции на метку категории. Как можно разбить хранилище данных изображений для обучения с использованием перекрестной проверки и использовать класс trainImageCategoryCalssifier?Как разбить хранилище изображений для перекрестной проверки в MATLAB?

I.e. его легко разбить на N разделов, но тогда вам понадобится какая-то функция _mergeEachLabel_, чтобы иметь возможность обучать классификатор с использованием перекрестной проверки.

Или есть другой способ достижения этого?

С уважением, Елена

ответ

0

я наткнулся на тот же вопрос в последнее время. Не уверен, что кто-то еще ищет возможное решение этого.

В результате я создал функцию для объединения нескольких imds в один (как и ваше предложение _mergeEachLabel_).

В соответствии с MATLAB documentation, A imageDatastore представляет собой структуру с 4 полями

  1. массив ячеек с путями к изображениям
  2. массив ячеек с метками каждого изображения
  3. целое число, определяющее номер изображений для чтения в каждом вызове читателя
  4. функцию, которая считывает данные изображения

Таким образом, эта функция просто создает новый IMDS, который объединяет первое и второе поля из N различных imds в этот новый.

Затем вы можете использовать эту функцию для выполнения проверки перекрестных ссылок. Если у вас 5 сгибов (5 различных изображений), вы можете запустить цикл, вызывающий trainImageCategoryClassifier, который объединяет 4 раза в тренировочный набор и запускает evaluate на оставшихся imds.

Один оговорка: после использования я понял, что это очень неэффективно работать таким образом, потому что вы будете перекодировать изображения в свою сумку функций на каждую итерацию цикла CV. . Было бы более эффективно кодировать весь МВМС один раз в X матрицу, а затем использовать fitsvm непосредственно, где они CV функциональные встроенный в

Во всяком случае, если кто-то еще интересует этот вопрос, вот моя функция:

function [newimds] = combineimds(cell_imds) 
% COMBINEIMDS Merges a set of IMDS together and returns the combined IMDS 
%  CELL_IMDS is a 1xn cell array where each cell is a different IMDS object 
%% 
n = size(cell_imds, 2);  % assumes that cell_imds is 1xn 

%% 
% use function splitEachLabel to copy first fold to new imds 
[newimds dummy] = splitEachLabel(cell_imds{1}, 1); 
a = [newimds.Files; dummy.Files]; 
b = [newimds.Labels; dummy.Labels]; 
newimds.Files = a; 
newimds.Labels = b; 
%% 
% concatenate cells in the new imds 
for i = 2:n 
    a = [newimds.Files; cell_imds{i}.Files]; 
    b = [newimds.Labels; cell_imds{i}.Labels]; 
    newimds.Files = a; 
    newimds.Labels = b; 
end 

end 

Надеюсь, это поможет.

Смежные вопросы