Klasifikasi Jenis Kendaraan Menggunakan Algoritma Extreme Learning Machine


Extreme Learning Machine (ELM) merupakan jenis jaringan syaraf tiruan dengan satu lapisan tersembunyi yang biasa disebut dengan single hidden layer feedforward neural network (SLNs). Metode ini memiliki kecepatan pembelajaran yang lebih cepat dibandingkan metode jaringan syaraf tiruan konvensional seperti backpropagation.

Contoh arsitektur jaringan syaraf tiruan Extreme Learning Machine ditunjukkan pada gambar di bawah ini

Berikut ini merupakan contoh aplikasi pengolahan citra untuk mengklasifikasikan jenis kendaraan menggunakan algoritma jaringan syaraf tiruan Extreme Learning Machine. Jenis kendaraan yang diklasifikasikan adalah mobil, motor, dan sepeda. Ketiga jenis kendaraan tersebut dibedakan berdasarkan pada ciri morfologi menggunakan nilai area, perimeter, eccentricity, major axis length, dan minor axis length. Contoh citra kendaraan pada masing-masing kelas ditunjukkan pada gambar berikut

Algoritma dan pemrograman matlab untuk klasifikasi jenis kendaraan adalah sebagai berikut:

1. Proses pelatihan

a. Membaca citra pada data latih (terdiri dari 10 citra mobil, 10 citra motor, dan 10 citra sepeda)
b. Melakukan transformasi ruang warna dari citra rgb menjadi citra hsv
c. Melakukan segmentasi citra menggunakan metode thresholding
d. Melakukan operasi morfologi untuk menyempurnakan hasil segmentasi
e. Melakukan ekstraksi ciri morfologi berdasarkan nilai area, perimeter, eccentricity, major axis length, dan minor axis length
f. Melakukan pelatihan jaringan
g. Menghitung akurasi pelatihan

Source code yang digunakan untuk proses pelatihan adalah

clc; clear; close all;

%%% Pelatihan
% menetapkan lokasi folder data latih
nama_folder = 'data latih';
% membaca nama file yang berformat jpg
nama_file = dir(fullfile(nama_folder,'*.jpg'));
% menghitung jumlah file yang dibaca
jumlah_file = numel(nama_file);
% menginisialisasi variabel ciri
ciri = zeros(jumlah_file,5);
kelas = zeros(jumlah_file,1);
% melakukan ekstraksi ciri terhadap seluruh file yang dibaca
for n = 1:jumlah_file
    % membaca file citra
    Img = imread(fullfile(nama_folder,nama_file(n).name));
    % mengkonversi ruang warna citra rgb menjadi hsv
    hsv = rgb2hsv(Img);
    % mengekstrak komponen v
    v = hsv(:,:,3);
    % melakukan thresholding terhadap komponen value
    bw = im2bw(v,0.9);
    % melakukan median filtering
    bw = medfilt2(~bw,[5,5]);
    % melakukan operasi morfologi filling holes
    bw = imfill(bw,'holes');
    % melakukan operasi morfologi area opening
    bw = bwareaopen(bw,1000);
    % melakukan operasi morfologi closing
    str = strel('square',10);
    bw = imdilate(bw,str);
    % melakukan ekstraksi ciri terhadap citra biner hasil thresholding
    s  = regionprops(bw, 'all');
    area = cat(1, s.Area);
    perimeter = cat(1, s.Perimeter);
    eccentricity = cat(1, s.Eccentricity);
    mayor = cat(1, s.MajorAxisLength);
    minor = cat(1, s.MinorAxisLength);
    % menyusun variabel ciri
    ciri(n,1) = area;
    ciri(n,2) = perimeter;
    ciri(n,3) = eccentricity;
    ciri(n,4) = mayor;
    ciri(n,5) = minor;
end

% menetapkan kelas target latih
kelas(1:10) = 1;
kelas(11:20) = 2;
kelas(21:30) = 3;

% menyusun data latih
data_training = [kelas,ciri];
% menyusun parameter2 elm
NumberofInputNeurons = 5;
NumberofHiddenNeurons = 60;
% bobot diinisialisasi secara random
% InputWeight = rand(NumberofHiddenNeurons,NumberofInputNeurons)*2-1;
% BiasofHiddenNeurons = rand(NumberofHiddenNeurons,1);
% bobot ditetapkan di awal
load bobot_awal
Elm_Type = 1;
ActivationFunction  = 'sin';

% pelatihan elm
[~, ~, ~, ~, predicted_class] = ...
    ELM(data_training, data_training, ...
    InputWeight, BiasofHiddenNeurons, Elm_Type,...
    ActivationFunction);

% menghitung akurasi pelatihan
[~,n] = find(predicted_class==kelas);
akurasi = numel(n)/jumlah_file*100;
disp(['akurasi pelatihan = ',num2str(akurasi),'%'])

% menyimpan variabel2 pelatihan
save('net','data_training','InputWeight','BiasofHiddenNeurons',...
    'Elm_Type','ActivationFunction')

Akurasi pelatihan yang diperoleh adalah sebesar

2. Proses pengujian

a. Membaca citra pada data uji (terdiri dari 4 citra mobil, 3 citra motor, dan 5 citra sepeda)
b. Melakukan transformasi ruang warna dari citra rgb menjadi citra hsv
c. Melakukan segmentasi citra menggunakan metode thresholding
d. Melakukan operasi morfologi untuk menyempurnakan hasil segmentasi
e. Melakukan ekstraksi ciri morfologi berdasarkan nilai area, perimeter, eccentricity, major axis length, dan minor axis length
f. Melakukan pengujian jaringan
g. Menghitung akurasi pengujian

Source code yang digunakan untuk proses pengujian adalah

%%% Pengujian
% menetapkan lokasi folder data uji
nama_folder = 'data uji';
% membaca nama file yang berformat jpg
nama_file = dir(fullfile(nama_folder,'*.jpg'));
% menghitung jumlah file yang dibaca
jumlah_file = numel(nama_file);
% menginisialisasi variabel ciri
ciri = zeros(jumlah_file,5);
kelas = zeros(jumlah_file,1);
% melakukan ekstraksi ciri terhadap seluruh file yang dibaca
for n = 1:jumlah_file
    % membaca file citra
    Img = imread(fullfile(nama_folder,nama_file(n).name));
    % mengkonversi ruang warna citra rgb menjadi hsv
    hsv = rgb2hsv(Img);
    % mengekstrak komponen v
    v = hsv(:,:,3);
    % melakukan thresholding terhadap komponen value
    bw = im2bw(v,0.9);
    % melakukan median filtering
    bw = medfilt2(~bw,[5,5]);
    % melakukan operasi morfologi filling holes
    bw = imfill(bw,'holes');
    % melakukan operasi morfologi area opening
    bw = bwareaopen(bw,1000);
    % melakukan operasi morfologi closing
    str = strel('square',10);
    bw = imdilate(bw,str);
    % melakukan ekstraksi ciri terhadap citra biner hasil thresholding
    s  = regionprops(bw, 'all');
    area = cat(1, s.Area);
    perimeter = cat(1, s.Perimeter);
    eccentricity = cat(1, s.Eccentricity);
    mayor = cat(1, s.MajorAxisLength);
    minor = cat(1, s.MinorAxisLength);
    % menyusun variabel ciri
    ciri(n,1) = area;
    ciri(n,2) = perimeter;
    ciri(n,3) = eccentricity;
    ciri(n,4) = mayor;
    ciri(n,5) = minor;
end

% menetapkan kelas target uji
kelas(1:4) = 1;
kelas(5:7) = 2;
kelas(8:12) = 3;

% menyusun data uji
data_testing = [kelas,ciri];

% pengujian elm
[~, ~, ~, ~, predicted_class] = ...
    ELM(data_training, data_testing, ...
    InputWeight, BiasofHiddenNeurons, Elm_Type,...
    ActivationFunction);

% menghitung akurasi pelatihan
[~,n] = find(predicted_class==kelas);
akurasi = numel(n)/jumlah_file*100;
disp(['akurasi pengujian = ',num2str(akurasi),'%'])

Akurasi pengujian yang diperoleh adalah sebesar

3. Pembuatan GUI MATLAB

Source code yang digunakan untuk dalam pembuatan GUI MATLAB adalah

function varargout = main_program(varargin)
% MAIN_PROGRAM MATLAB code for main_program.fig
%      MAIN_PROGRAM, by itself, creates a new MAIN_PROGRAM or raises the existing
%      singleton*.
%
%      H = MAIN_PROGRAM returns the handle to a new MAIN_PROGRAM or the handle to
%      the existing singleton*.
%
%      MAIN_PROGRAM('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in MAIN_PROGRAM.M with the given input arguments.
%
%      MAIN_PROGRAM('Property','Value',...) creates a new MAIN_PROGRAM or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before main_program_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to main_program_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 main_program

% Last Modified by GUIDE v2.5 03-Apr-2019 12:48:18

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
    'gui_Singleton',  gui_Singleton, ...
    'gui_OpeningFcn', @main_program_OpeningFcn, ...
    'gui_OutputFcn',  @main_program_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 main_program is made visible.
function main_program_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 main_program (see VARARGIN)

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

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

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


% --- Outputs from this function are returned to the command line.
function varargout = main_program_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)

% menampilkan menu browse file
[filename,pathname] = uigetfile({'*.jpg'});

% jika ada file yg dipilih maka mengeksekusi perintah2 yg ada di bawahnya
if ~isequal(filename,0)
    % mereset button2
    axes(handles.axes1)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes2)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes3)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes4)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    set(handles.uitable1,'Data',[],'ForegroundColor',[0 0 0])
    set(handles.edit1,'String','')
    set(handles.edit2,'String','')
    set(handles.pushbutton2,'Enable','on')
    set(handles.pushbutton3,'Enable','off')
    set(handles.pushbutton4,'Enable','off')
    set(handles.pushbutton5,'Enable','off')
    
    % membaca file citra
    Img = imread(fullfile(pathname,filename));
    
    % menampilkan citra pada axes
    axes(handles.axes1)
    imshow(Img)
    title('Citra RGB')
    
    % menampilkan nama file citra pada edit text
    set(handles.edit1,'String',filename)
    
    % menyimpan variabel Img pada lokasi handles agar dapat dipanggil oleh
    % pushbutton yg lain
    handles.Img = Img;
    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)

% mereset button2
axes(handles.axes2)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes3)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

set(handles.uitable1,'Data',[],'ForegroundColor',[0 0 0])
set(handles.edit2,'String','')
set(handles.pushbutton3,'Enable','on')
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')

% memanggil variabel Img yang ada di lokasi handles
Img = handles.Img;
% mengkonversi ruang warna citra rgb menjadi hsv
hsv = rgb2hsv(Img);
% menampilkan citra pada axes
axes(handles.axes2)
imshow(hsv)
title('Citra HSV')

% menyimpan variabel hsv pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.hsv = hsv;
guidata(hObject, handles)

% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% mereset button2
axes(handles.axes3)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

set(handles.uitable1,'Data',[],'ForegroundColor',[0 0 0])
set(handles.edit2,'String','')
set(handles.pushbutton4,'Enable','on')
set(handles.pushbutton5,'Enable','off')

% memanggil variabel hsv yang ada di lokasi handles
hsv = handles.hsv;
% mengekstrak komponen v
v = hsv(:,:,3);
% melakukan thresholding terhadap komponen value
bw = im2bw(v,0.9);
% menampilkan citra pada axes
axes(handles.axes3)
imshow(bw)
title('Citra Biner')

% menyimpan variabel bw pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.bw = bw;
guidata(hObject, handles)

% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% mereset button2
axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

set(handles.uitable1,'Data',[],'ForegroundColor',[0 0 0])
set(handles.edit2,'String','')
set(handles.pushbutton5,'Enable','on')

% memanggil variabel bw yang ada di lokasi handles
bw = handles.bw;
% melakukan median filtering
bw = medfilt2(~bw,[5,5]);
% melakukan operasi morfologi filling holes
bw = imfill(bw,'holes');
% melakukan operasi morfologi area opening
bw = bwareaopen(bw,1000);
% melakukan operasi morfologi closing
str = strel('square',10);
bw = imdilate(bw,str);
% melakukan ekstraksi ciri terhadap citra biner hasil thresholding
s  = regionprops(bw, 'all');
area = cat(1, s.Area);
perimeter = cat(1, s.Perimeter);
eccentricity = cat(1, s.Eccentricity);
mayor = cat(1, s.MajorAxisLength);
minor = cat(1, s.MinorAxisLength);
% menyusun variabel ciri
ciri = [area,perimeter,eccentricity,mayor,minor];
format long
% menampilkan citra pada axes
axes(handles.axes4)
imshow(bw)
title('Hasil Operasi Morfologi')
% menampilkan hasil ekstraksi ciri pada tabel
data = cell(5,2);
data{1,1} = 'Area';
data{2,1} = 'Perimeter';
data{3,1} = 'Eccentricity';
data{4,1} = 'Major Axis Length';
data{5,1} = 'Minor Axis Length';
data{1,2} = area;
data{2,2} = perimeter;
data{3,2} = eccentricity;
data{4,2} = mayor;
data{5,2} = minor;
set(handles.uitable1,'Data',data,'RowName',1:5)
% menyimpan variabel ciri pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.ciri = ciri;
guidata(hObject, handles)


% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% mereset button2
set(handles.edit2,'String','')

% memanggil variabel ciri yang ada di lokasi handles
ciri = handles.ciri;

% menyusun data testing
data_testing = [1,ciri];
% load variabel net
load net
% mengujikan data uji pada jaringan elm hasil pelatihan
[~, ~, ~, ~, predicted_class] = ...
    ELM(data_training, data_testing, ...
    InputWeight, BiasofHiddenNeurons, Elm_Type,...
    ActivationFunction);
% mengubah nilai keluaran menjadi kelas keluaran
switch predicted_class
    case 1
        kelas = 'mobil';
    case 2
        kelas = 'motor';
    case 3
        kelas = 'sepeda';
    otherwise
        kelas = 'tidak dikenali';
end
% menampilkan hasil klasifikasi pada edit text
set(handles.edit2,'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



function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (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 edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a double


% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (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


% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton6 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% mereset button2
axes(handles.axes1)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes2)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes3)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

axes(handles.axes4)
cla reset
set(gca,'XTick',[])
set(gca,'YTick',[])

set(handles.uitable1,'Data',[],'ForegroundColor',[0 0 0])
set(handles.edit1,'String','')
set(handles.edit2,'String','')
set(handles.pushbutton2,'Enable','off')
set(handles.pushbutton3,'Enable','off')
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')

Tampilan GUI Matlab yang dihasilkan oleh algoritma dan pemrograman di atas adalah sebagai berikut:

Klasifikasi jenis kendaraan untuk kelas mobil

Klasifikasi jenis kendaraan untuk kelas motor

Klasifikasi jenis kendaraan untuk kelas sepeda

Tingginya nilai akurasi yang dihasilkan dari proses pelatihan dan pengujian menunjukkan bahwa algoritma jaringan syaraf tiruan extreme learning machine sangat baik diimplementasikan untuk melakukan klasifikasi jenis kendaraan.

File source code lengkap beserta citra pada pemrograman di atas dapat diperoleh melalui halaman berikut ini: Source code

Posted on April 3, 2019, in Data mining, Pengenalan Pola, Pengolahan Citra and tagged , , , , , , , . Bookmark the permalink. 13 Comments.

  1. Kak bkin contoh implementasi Ekstraksi ciri citra menggunakan Zoning dong

  2. Kak, untuk Extreme Learning Machine di Matlab memakai epoch atau learning rate atau tidak ya? Soalnya saya lihat ELM menggunakan C# ada epoch dan learning rate nya. Terimakasih.

  3. Zainul musthofa

    Assalamu’alaikum kak, mohon maaf menggamggu waltunya. saya mau tanya lagi kak tentang program njenengan yang ini kak

    [~, ~, ~, ~, predicted_class] = …
    ELM(data_training, data_testing, …
    InputWeight, BiasofHiddenNeurons, Elm_Type,…
    ActivationFunction);

    Tanda “~” itu apa ya kak?
    Terima kasih kak

  4. “Subscripted assignment dimension mismatch.” mas saya coba codenya, kok error seperti ini ya?

  5. Halo kak, ini kan hasil ekstraksi fitur saya tersimpan dalam bentuk file xls. saya load untuk elm, caranya mendefinisikan kelas dan ciri untuk kolom dan bars dari file xls nya gimana ya?

  6. Ko saya di data latih line 40 salah trus ya ka, sdh tak ikutin padahal, di variabel ciri (n,1) area

  7. Error using app_klasifikasi_telur
    File: app_klasifikasi_telur.mlapp Line: 82 Column: 27
    Invalid use of operator.

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 )

Facebook photo

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

Connecting to %s

%d bloggers like this: