Matlab Assertion Failed ошибка, поскольку parfor продолжается?

У меня есть сегмент кода

display('Descriptor Extraction...');

DESCRIPTORS = {};
descriptor_for_each_class = {};
num_classes = length(imgs_dir);
IMAGES = {};
for i = 1:num_classes
    class_name = classes{i};
    fprintf('Feature Extraction for CLASS %s\n',class_name);
    full_path = fullfile(imgs_path,class_name);

    class_dir = dir(full_path);
    image_names = {class_dir(3:length(class_dir)).name};
    num_imgs = length(image_names);

    descriptors = {};
    parfor j = 1:num_imgs
        image_name = image_names{j};
        %fprintf('Feature Extraction for IMAGE %d/%d\n',j,num_imgs);
        img_path = fullfile(full_path,image_name);
        I = imread(img_path(:,:));
        I = standarizeImage(I);
        I = rgb2gray(I) ;
        IMAGES{i,j}.I = I;
        IMAGES{i,j}.class_name = class_name;
        IMAGES{i,j}.name = image_name;
        [f, d] = vl_dsift(I, 'size', binSize) ;
        descriptors{j}=d;
    end
    DESCRIPTORS = [DESCRIPTORS descriptors];
end

и когда раздел parfor завершил одну эпоху, в самом начале второй эпохи Matlab выдает следующую ошибку:

Error using parallel_function (line 589)
Assertion failed.

Error in feat_extraction (line 34)
    parfor j = 1:num_imgs  

Я не мог найти ошибку в коде. Есть ли идея?


person erogol    schedule 05.03.2013    source источник
comment
Можете ли вы минимизировать код в обоих циклах и при этом иметь возможность воспроизвести ошибку?   -  person Eitan T    schedule 05.03.2013


Ответы (1)


Я решаю проблему, изменив раздел parfor, как показано ниже.

descriptors = {};
    images = {};
    parfor j = 1:num_imgs
        image_name = image_names{j};
        %fprintf('Feature Extraction for IMAGE %d/%d\n',j,num_imgs);
        img_path = fullfile(full_path,image_name);
        I = imread(img_path(:,:));
        images{j}.I = I;
        images{j}.class_name = class_name;
        images{j}.image_name = image_name;
        I = standarizeImage(I);
        I = rgb2gray(I) ;
        %IMAGES{i,j}.name = image_name;
        [f, d] = vl_dsift(I, 'size', binSize) ;
        descriptors{j}=d;
    end
    ALL_DATA{i}=images;
    DESCRIPTORS = [DESCRIPTORS descriptors];
end
person erogol    schedule 05.03.2013
comment
В чем причина проблемы? - person Eitan T; 05.03.2013
comment
Я использовал индекс, исходящий из внешнего цикла for i, поэтому, когда значение i изменяется, у других экземпляров Matlab возникают проблемы с индексацией IMAGES внутри parfoor. - person erogol; 05.03.2013
comment
Я получил эту ошибку в parfor, потому что я забыл предварительно инициализировать один из моих выходных массивов, поэтому, если один рабочий процесс завершил итерацию n+1 до того, как другой завершил итерацию n, он не мог правильно динамически изменить размер массива. Preinit, конечно, исправил это, и этот ответ дал мне подсказку - совершенно другое проблемное пространство, но похожая структура. - person xenoclast; 25.03.2015
comment
объяснение xenoclast решило мою проблему. - person Andrew D. King; 09.07.2015
comment
Кто-нибудь еще находит это очень плохим сообщением об ошибке для Matlab, чтобы выдать его в этой ситуации? Его точно надо доработать? - person Sanjay Manohar; 29.11.2015