Jaringan Syaraf Tiruan untuk Klasifikasi Citra Daun


Salah satu penerapan dari algoritma jaringan syaraf tiruan adalah untuk proses klasifikasi citra. Berikut ini merupakan contoh aplikasi 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);

metric = zeros(1,total_images);
eccentricity = zeros(1,total_images);

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,'Metric','Eccentricity');
    metric = stats.Metric;
    eccentricity = 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 = 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);

metric = zeros(1,total_images);
eccentricity = zeros(1,total_images);

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,'Metric','Eccentricity');
    metric = stats.Metric;
    eccentricity = 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 = 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:

% Adi Pamungkas, S.Si, M.Si
% Website: https://pemrogramanmatlab.com/
% Email  : adipamungkas@st.fisika.undip.ac.id

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,'Metric','Eccentricity');
metric = stats.Metric;
eccentricity = stats.Eccentricity;

input = [metric,eccentricity];

load net
output = sim(net,input);

axes(handles.axes2)
imshow(O)

R = I(:,:,1);
G = I(:,:,2);
B = I(:,:,3);

R(~O) = 0;
G(~O) = 0;
B(~O) = 0;

RGB = cat(3,R,G,B);
axes(handles.axes3)
imshow(RGB)

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

File source code lengkap beserta citra daun untuk proses klasifikasi pada pemrograman di atas dapat diperoleh melalui halaman berikut ini: Source Code

Penerapan algoritma jaringan syaraf tiruan untuk klasifikasi citra daun dapat dilihat pada video tutorial berikut ini:

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

  1. mas adi bagaimana cara menginisialisasikan bobot awal dg nilai yg tetap agar nilai akurasi tidak berubah ubah dan nilainya bisa tinggi pada pelatihan dan pengujiannya ??

  2. mas adi biar akurasi pengujian bisa naik itu gmna ?

    • Bisa memvariasikan parameter2 yg mempengaruhi performasi jst seperti learning rate, jenis fungsi aktivasi, jenis fungsi pelatihan, jumlah epoch, dll

  3. di pelatihannya sudah mencapai 85% mas

  4. mas mau tanya untuk fungsi pengubahan citra asli menjadi citra greyscale dan biner itu buat apa ??

  5. Mas mau tanya lagi
    Kalo mencari nilai akurasi pada pengujian jaringan pake
    Akurasi = sum(m)/ total_image*100

    Kalo nilai m diganti pake nilai n gmna ?

  6. mas kalau kombinasi color moment dengan hsv gmna hitungnya ya?
    mohon pencerahannya mas, soalnya untuk skrippsi trimakasih..

    • ini merupakan contoh koding untuk menghitung color moment
      silakan dicoba
      % Extract RGB Channel
      R=I(:,:,1);
      G=I(:,:,2);
      B=I(:,:,3);
      % Extract Statistical features
      % 1] MEAN
      meanR=mean2(R);
      meanG=mean2(G);
      meanB=mean2(B);
      % 2] Standard Deviation
      stdR=std2(R);
      stdG=std2(G);
      stdB=std2(B);
      A=[meanR meanG meanB stdR stdG stdB];

  7. maaf mas, kalau perhitungan manualnya itu gmana ya rumusnya…

  8. oke terimakasih mas penjelasannya, semoga mas sehat sehat selalu dan banyak rejeki nya amin…./

  9. Dini Nurul Islami Putri

    assalamualikum.. mas bisa minta langsung source codenya? soalnya di copas ngikitun langkah yang diatas masuh eror ๐Ÿ˜ฆ

    • Waalaikumsalam
      Source code di atas tidak bisa dijalankan jika hanya dicopypaste saja
      Source code lengkap bisa diperoleh melalui tokopedia sehingga bisa langsung dirunning dan dikembangkan

  10. Muhammad Irfan Fathurrahman

    mas adi mau tanya, error dental pecan Too many outputs requested. Most likely cause is missing [] around left hand side that has a comma separated list
    expansion. itu karena apa ya? terima kasih

  11. Muhammad Irfan Fathurrahman

    mas kalo error Insufficient number of outputs from right hand side of equal sign to satisfy assignment. itu kenapa ya?

  12. mas bedanya jst yang dipakai pada program ini sama lvq apa ya??

  13. mas adi, itu metode yang digunakan untuk klasifikasi daun, Backpropagation apa k-nearest neighbor?

  14. mas adi, mau tanya, saya menggunakan metode GLCM untuk ekstraksi teksur, dan parameter inputan untuk train jst yang saya gunakan adalah contrast,correlation,energy dan homogeneity, setalah saya run ada peringatan di command window “Error using network/train (line 340)
    Inputs and targets have different numbers of samples.

    Error in pelatihan (line 34)
    net = train(net,input,target);”

    mohon pencerahannya?
    terima kasih

  15. mas kalau tresholding menggunkana kanal hitam gimana ya mas ?

  16. mas mau nanya lagi kalau pada program ini fungsi aktifasi propagasi balik yang digunakan apa mas ?

  17. beingsmartineverything

    mas mau tanya kalau input untuk convolutional neural network apakah bisa pakai data set? jadi processing imagenya sudah dilakukan dan hasil pengolahannya berupa data set di excel. terima kasih.

  18. Mas mau bertanya, pada bagian line 23 error, (Undefined function or variable ‘metric’)
    Itu kenapa ya mas?, kan padahal sudah di jelaskan pada perulangan

  19. Error using network/train (line 340)
    Inputs and targets have different numbers of samples.

    Error in pelatihan_jst (line 34)
    net = train(net,input,target);

    kalau eror kayak gini bagaimana ya penyelesaiannya?padahal codingannya belum saya edit sama sekali, eror dari pertama kali coba, terima kasih.

  20. mau tanya, kalau background citra aslinya engga berwarna RGB atau objeknya engga berwarna RGB bisa ga pake metode ini? Makasih sebelumnya

  21. selamat malam mas adi pamungkas, mau tanya tentang command “save net.mat net”, bagaimana cara mengetahui isi dari mat file tersebut dan apakah bisa dikonversi ke dalam bentuk lain seperti csv atau txt?
    terimakasih

  22. kak bagaimana cara membuat file.mat dan cara menghubungkannya ke file .fig/ file .m

  23. boleh minta datasetnya kk

  24. Mas adi, saya nyoba ngikutin kode mas di matlab online tapi muncul pemberitahuan Unrecognized function or variable ‘newff’. Itu kenapa ya mas ?

  25. Mas adi, apakah latar belakang untuk citra uji harus berwarna merah muda?

  26. mas adi, ada minimal versi tidak untuk menggunakan program ini, saya pakai yang 2007 ada masalah dibagian

  27. Daniel Wijaya

    permisi mas mau nanya kalau menggabungkan extrasi ciri HOG dan JST Gimana ya codingnnya

  1. Pingback: Pengertian Jaringan Syaraf Tiruan, Fuzzy Logic dan Algoritma Genetika – andre

  2. Pingback: Kecerdasan Komputasional – Judul Situs

Leave a reply to nana Cancel reply