я наткнулся на тот же вопрос в последнее время. Не уверен, что кто-то еще ищет возможное решение этого.
В результате я создал функцию для объединения нескольких imds в один (как и ваше предложение _mergeEachLabel_
).
В соответствии с MATLAB documentation, A imageDatastore
представляет собой структуру с 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
Надеюсь, это поможет.