Jaringan Syaraf Tiruan untuk Klasifikasi Citra Daun


Salah satu penerapan dari algoritma jaringan syaraf tiruan adalah untuk proses klasifikasi citra. Berikut ini merupakan pemrograman matlab untuk melakukan klasifikasi terhadap citra daun. Citra daun dikelompokkan ke dalam 4 kelas spesies yaitu Bougainvillea sp, Geranium sp, Magnolia soulangeana, dan Pinus sp. Pada contoh ini digunakan 40 citra daun yang terdiri dari 10 citra pada masing-masing kelas. Contoh dari citra daun yang digunakan ditunjukkan pada gambar di bawah ini:

Langkah-langkah pemrogramannya adalah sebagai berikut:
1. Mempersiapkan citra latih dan citra uji. Pada contoh ini 40 citra daun dibagi menjadi dua bagian yaitu 24 citra untuk citra latih dan 16 citra untuk citra uji.

a. Citra latih berjumlah 24 citra yang terdiri dari 6 citra pada masing-masing kelas

b. Citra uji berjumlah 16 citra yang terdiri dari 4 citra pada masing-masing kelas

2. Melakukan pelatihan jaringan dengan tahapan-tahapan sebagai berikut:
a. Membaca citra latih
b. Segmentasi citra dengan metode thresholding pada kanal merah
c. Operasi morfologi untuk memperbaiki hasil segmentasi
d. Ekstraksi ciri bentuk berdasarkan parameter metric dan eccentricity
e. Menetapkan target latih (kelas Bougainvillea sp disimbolkan dengan angka 1, kelas Geranium sp dengan angka 2, kelas Magnolia soulangeana dengan angka 3, dan kelas Pinus sp dengan angka 4)
f. Membangun arsitektur jaringan syaraf tiruan propagasi balik
g. Melatih jaringan dengan hasil ekstraksi ciri sebagai masukannya
h. Menghitung akurasi hasil pelatihan

Source code proses pelatihan jaringan adalah sebagai berikut:

clc;clear;close all;

image_folder = 'Citra Latih';
filenames = dir(fullfile(image_folder, '*.jpg'));
total_images = numel(filenames);

for n = 1:total_images
full_name= fullfile(image_folder, filenames(n).name);
I = imread(full_name);
J = I(:,:,1);
K = im2bw(J,.6);
L = imcomplement(K);
str = strel('disk',5);
M = imclose(L,str);
N = imfill(M,'holes');
O = bwareaopen(N,5000);
stats = regionprops(O,'Area','Perimeter','Eccentricity');
area(n) = stats.Area;
perimeter(n) = stats.Perimeter;
metric(n) = 4*pi*area(n)/(perimeter(n)^2);
eccentricity(n) = stats.Eccentricity;
end

input = [metric;eccentricity];
target = zeros(1,24);
target(:,1:6) = 1;
target(:,7:12) = 2;
target(:,13:18) = 3;
target(:,19:24) = 4;

net = newff(input,target,[10 5],{'logsig','logsig'},'trainlm');
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-6;
net = train(net,input,target);
output = round(sim(net,input));
save net.mat net

[m,n] = find(output==target);
akurasi = sum(m)/total_images*100

Salah satu tampilan citra hasil pengolahan ditunjukkan pada gambar di bawah ini:

Sedangkan tampilan proses pelatihan jaringan yaitu:

Hasil klasifikasi proses pelatihan ditunjukkan pada tabel berikut:

Berdasarkan pada tabel tersebut, akurasi yang dihasilkan sistem dalam proses pelatihan adalah 24/24*100% = 100%.

3. Melakukan pengujian jaringan dengan tahapan-tahapan sebagai berikut:
a. Membaca citra uji
b. Segmentasi citra dengan metode thresholding pada kanal merah
c. Operasi morfologi untuk memperbaiki hasil segmentasi
d. Ekstraksi ciri bentuk berdasarkan parameter metric dan eccentricity
e. Menetapkan target uji (kelas Bougainvillea sp disimbolkan dengan angka 1, kelas Geranium sp dengan angka 2, kelas Magnolia soulangeana dengan angka 3, dan kelas Pinus sp dengan angka 4)
f. Memanggil jaringan syaraf tiruan propagasi balik yang telah dibuat pada proses pelatihan
g. Menguji jaringan dengan hasil ekstraksi ciri sebagai masukannya
h. Menghitung akurasi hasil pengujian

Source code proses pengujian jaringan adalah sebagai berikut:

clc;clear;close all;

image_folder = 'Citra Uji';
filenames = dir(fullfile(image_folder, '*.jpg'));
total_images = numel(filenames);

for n = 1:total_images
    full_name= fullfile(image_folder, filenames(n).name);
    I = imread(full_name);
    J = I(:,:,1);
    K = im2bw(J,.6);
    L = imcomplement(K);
    str = strel('disk',5);
    M = imclose(L,str);
    N = imfill(M,'holes');
    O = bwareaopen(N,5000);
    stats = regionprops(O,'Area','Perimeter','Eccentricity');
    area(n) = stats.Area;
    perimeter(n) = stats.Perimeter;
    metric(n) = 4*pi*area(n)/(perimeter(n)^2);
    eccentricity(n) = stats.Eccentricity;
end

input = [metric;eccentricity];
target = zeros(1,16);
target(:,1:4) = 1;
target(:,5:8) = 2;
target(:,9:12) = 3;
target(:,13:16) = 4;

load net
output = round(sim(net,input));

[m,n] = find(output==target);
akurasi = sum(m)/total_images*100

Hasil klasifikasi proses pengujian ditunjukkan pada tabel berikut:

Pada tabel di atas terdapat satu kelas citra daun yang diklasifikasikan dengan salah sehingga akurasi yang dihasilkan jaringan dalam proses pengujian adalah sebesar 15/16*100% = 93,75%.

Akurasi yang dihasilkan sistem baik pada proses pelatihan maupun pengujian menunjukkan bahwa metode yang digunakan dapat mengklasifikasikan citra daun dengan baik.

4. Membuat tampilan GUI Matlab
Source code GUI Matlab untuk proses klasifikasi citra daun adalah sebagai berikut:

function varargout = Klasifikasi_daun(varargin)
% KLASIFIKASI_DAUN MATLAB code for Klasifikasi_daun.fig
%      KLASIFIKASI_DAUN, by itself, creates a new KLASIFIKASI_DAUN or raises the existing
%      singleton*.
%
%      H = KLASIFIKASI_DAUN returns the handle to a new KLASIFIKASI_DAUN or the handle to
%      the existing singleton*.
%
%      KLASIFIKASI_DAUN('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in KLASIFIKASI_DAUN.M with the given input arguments.
%
%      KLASIFIKASI_DAUN('Property','Value',...) creates a new KLASIFIKASI_DAUN or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before Klasifikasi_daun_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to Klasifikasi_daun_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help Klasifikasi_daun

% Last Modified by GUIDE v2.5 23-Oct-2016 15:06:14

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Klasifikasi_daun_OpeningFcn, ...
                   'gui_OutputFcn',  @Klasifikasi_daun_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before Klasifikasi_daun is made visible.
function Klasifikasi_daun_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to Klasifikasi_daun (see VARARGIN)

% Choose default command line output for Klasifikasi_daun
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);
movegui(hObject,'center');

% UIWAIT makes Klasifikasi_daun wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = Klasifikasi_daun_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[nama_file,nama_path] = uigetfile({'*.*'});

if ~isequal(nama_file,0)
    I = imread(fullfile(nama_path,nama_file));
    axes(handles.axes1)
    imshow(I)
    handles.I = I;
    guidata(hObject,handles)
else
    return
end


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
I = handles.I;
J = I(:,:,1);
K = im2bw(J,.6);
L = imcomplement(K);
str = strel('disk',5);
M = imclose(L,str);
N = imfill(M,'holes');
O = bwareaopen(N,5000);
stats = regionprops(O,'Area','Perimeter','Eccentricity');
area = stats.Area;
perimeter = stats.Perimeter;
metric = 4*pi*area/(perimeter^2);
eccentricity = stats.Eccentricity;

input = [metric;eccentricity];

load net
output = round(sim(net,input));

axes(handles.axes2)
imshow(O)

if output == 1
    kelas = 'Bougainvillea';
elseif output == 2
    kelas = 'Geranium';
elseif output == 3
    kelas = 'Magnolia soulangeana';
elseif output == 4
    kelas = 'Pinus';
end

set(handles.edit1,'String',kelas)
    

function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end

Tampilan GUI Matlab ditunjukkan pada gambar-gambar berikut ini:
1. Tampilan awal

2. Pengolahan citra daun untuk kelas Bougainvillea sp

3. Pengolahan citra daun untuk kelas Geranium sp

4. Pengolahan citra daun untuk kelas Magnolia soulangeana

5. Pengolahan citra daun untuk kelas Pinus sp

Source code dan citra daun untuk proses klasifikasi dapat diunduh pada laman berikut ini: Source Code

Posted on October 24, 2016, in Data mining, Pengenalan Matlab, Pengenalan Pola, Pengolahan Citra and tagged , , , , , , , , , . Bookmark the permalink. 12 Comments.

  1. permisi mas mau tanya
    ??? Undefined function or variable
    ‘metric’.

    Error in ==> pelatihanjaringan at 24
    input = [metric ; eccentricity];
    metric nya ga ke ditek mas , itu kenapa ya? padahal saya download langsung punya mas adi.

  2. munculin hasilnya di tabel gimana mas?

  3. menentukan target ini gmana ya mas,, mohon penjelasannya …

    target(:,1:6) = 1;
    target(:,7:12) = 2;
    target(:,13:18) = 3;
    target(:,19:24) = 4;

    • dalam pemrograman matlab, nilai target harus direpresentasikan dengan angka
      oleh karena itu, untuk jenis daun pada kelas Bougainvillea sp disimbolkan dengan angka 1, kelas Geranium sp dengan angka 2, kelas Magnolia soulangeana dengan angka 3, dan kelas Pinus sp dengan angka 4

  4. tanya lagi mas,, maksud dari angka ‘[10 5]’ dari script ini apa ya ?
    net = newff(input,target,[10 5],{‘logsig’,’logsig’},’trainlm’);

    dan ketika programnya saya jalankan kok akurasinya berubah-ubah ya?

  5. mas mau tanya kalo klasifikasinya pake JST SOM menggunakan perintah apa ya?
    saya menggunakan net = newsom(input,target,[8,8],’hextop’,’linkdist’); tapi error. Terimakasih

  6. maaf mau nannya lagi mas kalo errornya seperti ini kenapa ya? untuk menyesuaikan matriknya bagaimana ya mas?

    Operands to the || and && operators must be convertible to
    logical scalar values.

    Error in newsom>create_network (line 83)
    v51 = (size(varargin{1},2)==2) || …

    Error in newsom (line 63)
    out1 = create_network(varargin{:});

    Error in Pelatihan (line 55)
    net = newsom(input,target,[10 5],’hextop’,’linkdist’);

    Terimakasih mas

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: