2013-05-24 74 views
5

Tôi đang sử dụng chức năng SVM của Matlab để phân loại hình ảnh được đọc từ một thư mục. Những gì tôi muốn làm là lần đầu tiên đọc 20 hình ảnh từ thư mục, sau đó sử dụng chúng để đào tạo SVM, và sau đó cung cấp một hình ảnh mới làm đầu vào để quyết định xem hình ảnh đầu vào này có nằm trong cùng một danh mục của 20 hình ảnh đào tạo này hay không. Nếu có, kết quả phân loại sẽ cho tôi 1, nếu không, thì tôi mong nhận được -1.Matlab SVM để phân loại hình ảnh

Đến nay, mã bằng văn bản của tôi là như sau:

imagefiles = dir('*.jpg'); 
nfiles = 20; 

for i = 1:nfiles 
    currentfilename = imagefiles(i).name; 
    currentimage = imread(currentfilename); 
    images{i} = currentimage; 
    images{i} = im2double(images{i}); 
    images{i} = rgb2gray(images{i}); 
    images{i} = imresize(images{i},[200 200]); 
    images{i} = reshape(images{i}', 1, size(images{i},1)*size(images{i},2)); 
end 

trainData = zeros(nfiles, 40000); 

for ii=1:nfiles 
    trainData(ii,:) = images{ii}; 
end 

class = [1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1]; 
SVMStruct = svmtrain (trainData, class); 

inputImg = imread('testImg.jpg'); 
inputImg = im2double(inputImg); 
inputImg = rgb2gray(inputImg); 
inputImg = imresize(inputImg, [200 200]); 
inputImg = reshape (inputImg', 1, size(inputImg,1)*size(inputImg,2)); 
result = svmclassify(SVMStruct, inputImg); 

Kể từ khi hình ảnh được đọc bởi hàng loạt từ thư mục, vì vậy camethe tế bào images. Sau đó, tôi chuyển đổi chúng thành màu xám như được hiển thị trong mã, và thay đổi kích thước chúng, vì những hình ảnh đó KHÔNG có cùng kích thước. Vì vậy, sau bước này, tôi có 20 hình ảnh, tất cả đều có kích thước 200x200. Và cuối cùng, tôi đã cung cấp các dữ liệu này để làm bộ dữ liệu đào tạo của mình, với các cột 20200x200. Tôi đã kiểm tra tất cả các kết quả kích thước này, và chúng dường như hoạt động tốt. Nhưng ngay bây giờ vấn đề duy nhất là, không có vấn đề gì loại hình ảnh đầu vào tôi cung cấp cho nó để dự đoán, nó luôn mang lại cho tôi một kết quả như 1, ngay cả đối với những hình ảnh rất khác nhau. Có vẻ như nó không hoạt động chính xác. Ai đó có thể giúp tôi kiểm tra nơi có vấn đề ở đây? Tôi không thể tìm thấy bất kỳ lời giải thích nào từ các nguồn hiện có trên internet. Cảm ơn trước.

+1

'hình ảnh {i} = im2double (hình ảnh {ii}); 'Tại sao' ii'? – chenaren

+1

Liệu nó có trả về 1 trên hình ảnh từ tập huấn luyện có lớp -1 không? – Photon

+0

xin lỗi, vì {ii}, tôi đã nhập sai câu hỏi của tôi ở đây. Tôi đã chỉnh sửa nó. –

Trả lời

3

Đây là một chức năng để đọc tất cả các hình ảnh có thể giúp bạn

function X = ReadImgs(Folder,ImgType) 
Imgs = dir(fullfile(Folder, ImgType)); 
NumImgs = size(Imgs,1); 
image = double(imread(fullfile(Folder, Imgs(1).name))); 
X = zeros([NumImgs size(image)]); 
for i=1:NumImgs, 
    img = double(imread(fullfile(Folder, Imgs(i).name))); 
    if (size(image,3) == 1) 
    X(i,:,:) = img; 
    else 
    X(i,:,:,:) = img; 
end 
end 

Nguồn: http://computervisionblog.wordpress.com/2011/04/13/matlab-read-all-images-from-a-folder-everything-starts-here/

0

này là nên công trình trong MATLAB

clear all; 
clc; 

folder = 'gambar 1'; 
dirImage = dir(folder); 

numData = size(dirImage,1); 

M ={} ; 

% read image 
for i=1:numData 
    nama = dirImage(i).name; 
    if regexp(nama, '(lion|tiger)-[0-9]{1,2}.jpg') 
     B = cell(1,2); 
     if regexp(nama, 'lion-[0-9]{1,2}.jpg') 
      B{1,1} = double(imread([folder, '/', nama])); 
      B{1,2} = 1; 
     elseif regexp(nama, 'tiger-[0-9]{1,2}.jpg') 
      B{1,1} = double(imread([folder, '/', nama])); 
      B{1,2} = -1; 
     end 
     M = cat(1,M,B); 
    end 
end 

% convert image holder from cell to array 
numDataTrain = size(M,1); 
class = zeros(numDataTrain,1); 
arrayImage = zeros(numDataTrain, 300 * 300); 

for i=1:numDataTrain 
    im = M{i,1} ; 
    im = rgb2gray(im); 
    im = imresize(im, [300 300]); 
    im = reshape(im', 1, 300*300); 
    arrayImage(i,:) = im; 
    class(i) = M{i,2}; 
end 

SVMStruct = svmtrain(arrayImage, class); 

% test for lion 
lionTest = double(imread('gambar 1/lion-test.jpg')); 
lionTest = rgb2gray(lionTest); 
lionTest = imresize(lionTest, [300 300]); 
lionTest = reshape(lionTest',1, 300*300); 
result = svmclassify(SVMStruct, lionTest); 

result 

https://github.com/gunungloli666/svm-test

Các vấn đề liên quan