Subscripted assignment dimension mismatch.

2 次查看(过去 30 天)
%%Simple Face Recognition Example
% Copyright 2014-2015 The MathWorks, Inc.
%%Load Image Information from ATT Face Database Directory
faceDatabase = imageSet('ATTFaces','recursive');
%%Display Montage of First Face
figure;
% (faceDatabase(1) means pull out all images belong to folder 1
montage(faceDatabase(1).ImageLocation);
title('Images of a Single Face');
Display Query Image and Database Side-Side
personToQuery = 1; % Call the a set of images at position 1
galleryImage = read(faceDatabase(personToQuery),1);
figure;
for i=1:size(faceDatabase,2)
imageList(i) = faceDatabase(i).ImageLocation(5);
end
subplot(1,2,1);
imshow(galleryImage);
subplot(1,2,2);
montage(imageList);
diff = zeros(1,9);
%%Split Database into Training & Test Sets in the ration 80% to 20%
[training,test] = partition(faceDatabase,[0.8 0.2]);
%%Extract and display Histogram of Oriented Gradient Features for single face
person = 1;
[hogFeature, visualization]= ...
extractHOGFeatures(read(training(person),1));
figure;
subplot(2,1,1);imshow(read(training(person),1));title('Input Face');
subplot(2,1,2);plot(visualization);title('HoG Feature');
%%Extract HOG Features for training set
trainingFeatures = zeros(size(training,2)*training(1).Count,4680);
featureCount = 1;
for i=1:size(training,2)
for j = 1:training(i).Count
trainingFeatures(featureCount,:) = extractHOGFeatures(read(training(i),j));
trainingLabel{featureCount} = training(i).Description;
featureCount = featureCount + 1;
end
personIndex{i} = training(i).Description;
end
%%Create 40 class classifier using fitcecoc
faceClassifier = fitcecoc(trainingFeatures,trainingLabel);
%%Test Images from Test Set
person = 2;
queryImage = read(test(person),1);
queryFeatures = extractHOGFeatures(queryImage);
personLabel = predict(faceClassifier,queryFeatures);
% Map back to training set to find identity
booleanIndex = strcmp(personLabel, personIndex);
integerIndex = find(booleanIndex);
subplot(1,2,1);imshow(queryImage);title('Query Face');
subplot(1,2,2);imshow(read(training(integerIndex),1));title('Matched Class');
%%Test First 5 People from Test Set
figure;
figureNum = 1;
for person=1:5
for j = 1:test(person).Count
queryImage = read(test(person),j);
queryFeatures = extractHOGFeatures(queryImage);
personLabel = predict(faceClassifier,queryFeatures);
% Map back to training set to find identity
booleanIndex = strcmp(personLabel, personIndex);
integerIndex = find(booleanIndex);
subplot(2,2,figureNum);imshow(imresize(queryImage,3));title('Query Face');
subplot(2,2,figureNum+1);imshow(imresize(read(training(integerIndex),1),3));title('Matched Class');
figureNum = figureNum+2;
end
figure;
figureNum = 1;
end
Hello guys,
I found this tutorial on youtube that uses hog features for face recognition on MATLAB. I am playing around with it cause i am doing similar things for my dissertation. In this one when i run it as it is with the ATTFaces dataset (contains 10 images for each individual, 40 in total in .pgm format) it works fine. When i try to change the dataset, using the YALE faces, or a custom dataset i have my personal images i get this mismatch error that you can see in the title. The other datasets have images in .jpg by the way and are more that 10 per folder. Can someone help me and tell me why i get this error? I gave you information about the format of the images and thier size. Also the number of them in the folders. Maybe one of these parameters makes it fail. If yes, which one.
Regards to everyone :)
EDIT*** I 've googled the error first obviously but i wasn't able to find the reason why is happening. I suspect one of the things i asked in the end... Yea i forgot to mention the error with different datasets occurs here:
%%Extract HOG Features for training set
trainingFeatures = zeros(size(training,2)*training(1).Count,4680);
and it shows the error you see on the title.
The code as you it, it works using the AT&T dataset. IF i change it to a different dataset shows that error i mentioned in that particular line.
  8 个评论
Walter Roberson
Walter Roberson 2020-3-11
The Description field does not have the label information. It is very likely to generate that error.
Walter Roberson
Walter Roberson 2020-3-11
Notice the original code is
trainingLabel{featureCount} = training(i).Description;
which assigns into a cell array, not into a rectangular array.

请先登录,再进行评论。

采纳的回答

Walter Roberson
Walter Roberson 2017-8-23
.jpg files are almost always RGB files, even if they look gray. Code that is expecting grayscale images will often fail on RGB files.
  6 个评论
Dimitrios Kampolis
Dimitrios Kampolis 2017-8-28

Hello Mr Robertson,

Sorry for the late reply. I was very busy with work and just now i came back to this problem. Don't think i forgot or i found my solution and i ignored the website. :)

I changed the Count,4680 to Count, length(hogFeature) as you entioned and the code worked with a differetn dataset. Now i face another error in the end of the code. This is the error http://prntscr.com/gdzcv3 and appears in the last part of the code.

%% Test First 5 People from Test Set
    figure;
    figureNum = 1;
    for person=1:5
        for j = 1:test(person).Count
            queryImage = read(test(person),j);
            queryFeatures = extractHOGFeatures(queryImage);
            personLabel = predict(faceClassifier,queryFeatures);
            % Map back to training set to find identity
            booleanIndex = strcmp(personLabel, personIndex);
            integerIndex = find(booleanIndex);
            subplot(2,2,figureNum);imshow(imresize(queryImage,3));title('Query Face');
            subplot(2,2,figureNum+1);imshow(imresize(read(training(integerIndex),1),3));title('Matched Class');
            figureNum = figureNum+2;
        end
        figure;
        figureNum = 1;
end

It appears when i run this part but there is no error there. The error is in a class called subplot, which is embedded on MATLAB. http://prntscr.com/gdzfc1 When i run that part instead of oppening 5 windows with matched images of the first 5 subjects in the dataset, only the first one is opened and this error is thrown. I played little bit with the numbers in the integerIndex subplot line by changing the 2,2 to other numbers. I did not get a correct result.

Any explanation/help for this issue would be much appreciated. Dimitrios

Walter Roberson
Walter Roberson 2017-8-28
%%Test First 5 People from Test Set
figure;
figureNum = 1;
for person=1:5
ntest = test(person).Count;
for j = 1:ntest
queryImage = read(test(person),j);
queryFeatures = extractHOGFeatures(queryImage);
personLabel = predict(faceClassifier,queryFeatures);
% Map back to training set to find identity
booleanIndex = strcmp(personLabel, personIndex);
integerIndex = find(booleanIndex);
subplot(ntest,2,figureNum);imshow(imresize(queryImage,3));title('Query Face');
subplot(ntest,2,figureNum+1);imshow(imresize(read(training(integerIndex),1),3));title('Matched Class');
figureNum = figureNum+2;
end
figure;
figureNum = 1;
end

请先登录,再进行评论。

更多回答(1 个)

Dimitrios Kampolis
Dimitrios Kampolis 2017-8-28
Hello everyone,
I managed to fix all the issues, by resizing all the photos of all my datasets in the same size. Also by increasing the indexes i was able to open as many as i wanted. I want to specifically thank Walter Roberson as his help with the length(hogFeature) was very important.
  1 个评论
Chidiebere Ike
Chidiebere Ike 2018-4-3
@ Dimitrios Kampolis. Could you please help me on this code ? I am having error message on my Classifier and it's frustrating not achieving testing. You can share your M file on this code to my email chidosky4ril@yahoo.com . Thanks so much

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by