Deteksi Kematangan Buah Sawit Menggunakan Self-Organizing Maps (SOM)
Self Organizing Maps (SOM) merupakan suatu metode Jaringan Saraf Tiruan yang diperkenalkan pertama kali oleh Teuvo Kohonen tahun 1981, sehingga sering disebut dengan Jaringan Kohonen. Dinamakan “Self Organizing” karena tidak memerlukan pengawasan/ tak terawasi (unsupervised learning) dan disebut “Maps” karena berusaha memetakan bobotnya agar sesuai dengan input data yang diberikan. Neuron-neuron pada jaringan ini menyusun dirinya sendiri berdasarkan nilai input tertentu dalam suatu kelompok, biasa disebut cluster. Selama proses penyusunan diri, cluster dengan vektor bobot paling cocok dengan pola bobot (jarak paling dekat) akan terpilih sebagai pemenang. Neuron pemenang beserta neuron-neuron tetangga akan memperbaiki bobotnya masing-masing.
Berikut ini merupakan contoh pemrograman MATLAB untuk mendeteksi kematangan buah sawit menggunakan Self Organizing Map (SOM). Langkah-langkahnya adalah sebagai berikut:
1. Mempersiapkan data latih
2. Melakukan tahapan pelatihan yang meliputi:
- Membaca citra RGB
- Mengkonversi citra RGB menjadi citra grayscale
- Mengkonversi citra grayscale menjadi citra biner
- Melakukan operasi morfologi untuk menyempurnakan hasil segmentasi
- Melakukan ekstraksi ciri warna RGB dan HSV
- Melakukan ekstraksi ciri tekstur GLCM
- Melakukan seleksi ciri menggunakan information gain
- Membangun arsitektur SOM
- Melakukan training
- Membaca nilai keluaran pelatihan
- Menghitung nilai akurasi pelatihan
Source code yang digunakan untuk tahapan pelatihan adalah sebagai berikut:
% Adi Pamungkas, S.Si, M.Si % Website: https://pemrogramanmatlab.com/ % Email : pemrogramanmatlab@gmail.com clc; clear; close all; %%% Matang % membaca file citra nama_folder = 'Data Latih/Matang'; nama_file = dir(fullfile(nama_folder,'*.jpg')); jumlah_file = numel(nama_file); % inisialisasi variabel ciri_matang ciri_matang = zeros(jumlah_file,10); target_matang = zeros(jumlah_file,1); for n = 1:jumlah_file % membaca citra RGB Img = imread(fullfile(nama_folder,nama_file(n).name)); % konversi citra RGB menjadi grayscale Img_gray = rgb2gray(Img); % konversi citra grayscale menjadi biner bw = imbinarize(Img_gray); % operasi morfologi bw = imcomplement(bw); bw = imfill(bw,'holes'); bw = bwareaopen(bw,100); % ekstraksi ciri warna RGB R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); R(~bw) = 0; G(~bw) = 0; B(~bw) = 0; Red = sum(sum(R))/sum(sum(bw)); Green = sum(sum(G))/sum(sum(bw)); Blue = sum(sum(B))/sum(sum(bw)); % ekstraksi ciri warna HSV HSV = rgb2hsv(Img); H = HSV(:,:,1); S = HSV(:,:,2); V = HSV(:,:,3); H(~bw) = 0; S(~bw) = 0; V(~bw) = 0; Hue = sum(sum(H))/sum(sum(bw)); Saturation = sum(sum(S))/sum(sum(bw)); Value = sum(sum(V))/sum(sum(bw)); % ekstraksi ciri tekstur GLCM Img_gray(~bw) = 0; GLCM = graycomatrix(Img_gray,'Offset',[0 1; -1 1; -1 0; -1 -1]); stats = graycoprops(GLCM,{'contrast','correlation','energy','homogeneity'}); Contrast = stats.Contrast; Correlation = stats.Correlation; Energy = stats.Energy; Homogeneity = stats.Homogeneity; % mengisi hasil ekstraksi ciri pada variabel ciri_matang ciri_matang(n,1) = Red; ciri_matang(n,2) = Green; ciri_matang(n,3) = Blue; ciri_matang(n,4) = Hue; ciri_matang(n,5) = Saturation; ciri_matang(n,6) = Value; ciri_matang(n,7) = Contrast; ciri_matang(n,8) = Correlation; ciri_matang(n,9) = Energy; ciri_matang(n,10) = Homogeneity; % mengisi nilai target pada variabel target_matang target_matang(n,1) = 1; end %%% Mentah % membaca file citra nama_folder = 'Data Latih/Mentah'; nama_file = dir(fullfile(nama_folder,'*.jpg')); jumlah_file = numel(nama_file); % inisialisasi variabel ciri_mentah ciri_mentah = zeros(jumlah_file,10); target_mentah = zeros(jumlah_file,1); for n = 1:jumlah_file % membaca citra RGB Img = imread(fullfile(nama_folder,nama_file(n).name)); % konversi citra RGB menjadi grayscale Img_gray = rgb2gray(Img); % konversi citra grayscale menjadi biner bw = imbinarize(Img_gray); % operasi morfologi bw = imcomplement(bw); bw = imfill(bw,'holes'); bw = bwareaopen(bw,100); % ekstraksi ciri warna RGB R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); R(~bw) = 0; G(~bw) = 0; B(~bw) = 0; Red = sum(sum(R))/sum(sum(bw)); Green = sum(sum(G))/sum(sum(bw)); Blue = sum(sum(B))/sum(sum(bw)); % ekstraksi ciri warna HSV HSV = rgb2hsv(Img); H = HSV(:,:,1); S = HSV(:,:,2); V = HSV(:,:,3); H(~bw) = 0; S(~bw) = 0; V(~bw) = 0; Hue = sum(sum(H))/sum(sum(bw)); Saturation = sum(sum(S))/sum(sum(bw)); Value = sum(sum(V))/sum(sum(bw)); % ekstraksi ciri tekstur GLCM Img_gray(~bw) = 0; GLCM = graycomatrix(Img_gray,'Offset',[0 1; -1 1; -1 0; -1 -1]); stats = graycoprops(GLCM,{'contrast','correlation','energy','homogeneity'}); Contrast = stats.Contrast; Correlation = stats.Correlation; Energy = stats.Energy; Homogeneity = stats.Homogeneity; % mengisi hasil ekstraksi ciri pada variabel ciri_mentah ciri_mentah(n,1) = Red; ciri_mentah(n,2) = Green; ciri_mentah(n,3) = Blue; ciri_mentah(n,4) = Hue; ciri_mentah(n,5) = Saturation; ciri_mentah(n,6) = Value; ciri_mentah(n,7) = Contrast; ciri_mentah(n,8) = Correlation; ciri_mentah(n,9) = Energy; ciri_mentah(n,10) = Homogeneity; % mengisi nilai target pada variabel target_mentah target_mentah(n,1) = 2; end % menyusun ciri_latih dan target_latih ciri_latih = [ciri_matang;ciri_mentah]; target_latih = [target_matang;target_mentah]; % menghitung nilai gain [gains, attorder] = computegains(array2table(ciri_latih),target_latih); % menyimpan urutan nilai gain save('attorder.mat','attorder') % menampilkan grafik nilai gain figure; bar(attorder, gains(attorder)); ylabel('Gain'); set(gca,'XTickLabel',{'Red','Green','Blue','Hue','Saturation','Value',... 'Contrast','Correlation','Energy','Homogeneity'}) % seleksi ciri berdasarkan 5 nilai gain tertinggi ciri_matang_seleksi = zeros(numel(target_matang),5); ciri_mentah_seleksi = zeros(numel(target_mentah),5); for k = 1:5 ciri_matang_seleksi(:,k) = ciri_matang(:,attorder(k)); ciri_mentah_seleksi(:,k) = ciri_mentah(:,attorder(k)); end % membuat model SOM pada masing2 kelas net1 = selforgmap([2 2],'topologyFcn','gridtop'); % hextop,randtop,gridtop net2 = selforgmap([2 2],'topologyFcn','gridtop'); % hextop,randtop,gridtop % melakukan pelatihan jaringan net1 = train(net1,ciri_matang_seleksi'); net2 = train(net2,ciri_mentah_seleksi'); % membaca nilai bobot jaringan wtnet1 = net1.iw{1,1}; wtnet2 = net2.iw{1,1}; % menyimpan nilai bobot jaringan save('wtnet.mat','wtnet'); % menghitung jarak masing2 kelas dengan titik pusat masing2 model SOM pfn1 = dist(wtnet1,[ciri_matang_seleksi;ciri_mentah_seleksi]'); pfn2 = dist(wtnet2,[ciri_matang_seleksi;ciri_mentah_seleksi]'); % menghitung jarak terpendek Group = zeros(numel(target_latih),2); for i = 1:numel(target_latih) Group(i,:) = [min(pfn1(:,i)),min(pfn2(:,i))]; end % membaca nilai keluaran hasil pelatihan [~,Groupmin] = min(Group,[],2); % menghitung nilai akurasi pelatihan akurasi = (sum(target_latih==Groupmin)/numel(target_latih))*100; % menampilkan nilai akurasi pelatihan disp(['Akurasi Pelatihan = ',num2str(akurasi),' %'])
Berikut merupakan grafik nilai gain masing-masing ciri
Tampilan proses training SOM adalah sebagai berikut
Akurasi pelatihan yang diperoleh adalah
3. Mempersiapkan data uji
4. Melakukan tahapan pengujian yang meliputi:
- Membaca citra RGB
- Mengkonversi citra RGB menjadi citra grayscale
- Mengkonversi citra grayscale menjadi citra biner
- Melakukan operasi morfologi untuk menyempurnakan hasil segmentasi
- Melakukan ekstraksi ciri warna RGB dan HSV
- Melakukan ekstraksi ciri tekstur GLCM
- Melakukan seleksi ciri menggunakan information gain
- Memanggil arsitektur SOM hasil pelatihan
- Melakukan testing
- Membaca nilai keluaran pengujian
- Menghitung nilai akurasi pengujian
Source code yang digunakan untuk tahapan pengujian adalah sebagai berikut:
% Adi Pamungkas, S.Si, M.Si % Website: https://pemrogramanmatlab.com/ % Email : pemrogramanmatlab@gmail.com clc; clear; close all; %%% Matang % membaca file citra nama_folder = 'Data Uji/Matang'; nama_file = dir(fullfile(nama_folder,'*.jpg')); jumlah_file = numel(nama_file); % inisialisasi variabel ciri_matang ciri_matang = zeros(jumlah_file,10); target_matang = zeros(jumlah_file,1); for n = 1:jumlah_file % membaca citra RGB Img = imread(fullfile(nama_folder,nama_file(n).name)); % konversi citra RGB menjadi grayscale Img_gray = rgb2gray(Img); % konversi citra grayscale menjadi biner bw = imbinarize(Img_gray); % operasi morfologi bw = imcomplement(bw); bw = imfill(bw,'holes'); bw = bwareaopen(bw,100); % ekstraksi ciri warna RGB R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); R(~bw) = 0; G(~bw) = 0; B(~bw) = 0; Red = sum(sum(R))/sum(sum(bw)); Green = sum(sum(G))/sum(sum(bw)); Blue = sum(sum(B))/sum(sum(bw)); % ekstraksi ciri warna HSV HSV = rgb2hsv(Img); H = HSV(:,:,1); S = HSV(:,:,2); V = HSV(:,:,3); H(~bw) = 0; S(~bw) = 0; V(~bw) = 0; Hue = sum(sum(H))/sum(sum(bw)); Saturation = sum(sum(S))/sum(sum(bw)); Value = sum(sum(V))/sum(sum(bw)); % ekstraksi ciri tekstur GLCM Img_gray(~bw) = 0; GLCM = graycomatrix(Img_gray,'Offset',[0 1; -1 1; -1 0; -1 -1]); stats = graycoprops(GLCM,{'contrast','correlation','energy','homogeneity'}); Contrast = stats.Contrast; Correlation = stats.Correlation; Energy = stats.Energy; Homogeneity = stats.Homogeneity; % mengisi hasil ekstraksi ciri pada variabel ciri_matang ciri_matang(n,1) = Red; ciri_matang(n,2) = Green; ciri_matang(n,3) = Blue; ciri_matang(n,4) = Hue; ciri_matang(n,5) = Saturation; ciri_matang(n,6) = Value; ciri_matang(n,7) = Contrast; ciri_matang(n,8) = Correlation; ciri_matang(n,9) = Energy; ciri_matang(n,10) = Homogeneity; % mengisi nilai target pada variabel target_matang target_matang(n,1) = 1; end %%% Mentah % membaca file citra nama_folder = 'Data Uji/Mentah'; nama_file = dir(fullfile(nama_folder,'*.jpg')); jumlah_file = numel(nama_file); % inisialisasi variabel ciri_mentah ciri_mentah = zeros(jumlah_file,10); target_mentah = zeros(jumlah_file,1); for n = 1:jumlah_file % membaca citra RGB Img = imread(fullfile(nama_folder,nama_file(n).name)); % konversi citra RGB menjadi grayscale Img_gray = rgb2gray(Img); % konversi citra grayscale menjadi biner bw = imbinarize(Img_gray); % operasi morfologi bw = imcomplement(bw); bw = imfill(bw,'holes'); bw = bwareaopen(bw,100); % ekstraksi ciri warna RGB R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); R(~bw) = 0; G(~bw) = 0; B(~bw) = 0; Red = sum(sum(R))/sum(sum(bw)); Green = sum(sum(G))/sum(sum(bw)); Blue = sum(sum(B))/sum(sum(bw)); % ekstraksi ciri warna HSV HSV = rgb2hsv(Img); H = HSV(:,:,1); S = HSV(:,:,2); V = HSV(:,:,3); H(~bw) = 0; S(~bw) = 0; V(~bw) = 0; Hue = sum(sum(H))/sum(sum(bw)); Saturation = sum(sum(S))/sum(sum(bw)); Value = sum(sum(V))/sum(sum(bw)); % ekstraksi ciri tekstur GLCM Img_gray(~bw) = 0; GLCM = graycomatrix(Img_gray,'Offset',[0 1; -1 1; -1 0; -1 -1]); stats = graycoprops(GLCM,{'contrast','correlation','energy','homogeneity'}); Contrast = stats.Contrast; Correlation = stats.Correlation; Energy = stats.Energy; Homogeneity = stats.Homogeneity; % mengisi hasil ekstraksi ciri pada variabel ciri_mentah ciri_mentah(n,1) = Red; ciri_mentah(n,2) = Green; ciri_mentah(n,3) = Blue; ciri_mentah(n,4) = Hue; ciri_mentah(n,5) = Saturation; ciri_mentah(n,6) = Value; ciri_mentah(n,7) = Contrast; ciri_mentah(n,8) = Correlation; ciri_mentah(n,9) = Energy; ciri_mentah(n,10) = Homogeneity; % mengisi nilai target pada variabel target_mentah target_mentah(n,1) = 2; end % menyusun target_uji target_uji = [target_matang;target_mentah]; % memanggil variabel attorder (urutan ciri dengan nilai gain tertinggi) load('attorder.mat') % seleksi ciri berdasarkan 5 nilai gain tertinggi ciri_matang_seleksi = zeros(numel(target_matang),5); ciri_mentah_seleksi = zeros(numel(target_mentah),5); for k = 1:5 ciri_matang_seleksi(:,k) = ciri_matang(:,attorder(k)); ciri_mentah_seleksi(:,k) = ciri_mentah(:,attorder(k)); end % memanggil nilai bobot jaringan hasil pelatihan load('wtnet.mat'); % menghitung jarak masing2 kelas dengan titik pusat masing2 model SOM pfn1 = dist(wtnet1,[ciri_matang_seleksi;ciri_mentah_seleksi]'); pfn2 = dist(wtnet2,[ciri_matang_seleksi;ciri_mentah_seleksi]'); % menghitung jarak terpendek Group = zeros(numel(target_uji),2); for i = 1:numel(target_uji) Group(i,:) = [min(pfn1(:,i)),min(pfn2(:,i))]; end % membaca nilai keluaran hasil pengujian [~,Groupmin] = min(Group,[],2); % menghitung nilai akurasi pengujian akurasi = (sum(target_uji==Groupmin)/numel(target_uji))*100; % menampilkan nilai akurasi pengujian disp(['Akurasi Pengujian = ',num2str(akurasi),' %'])
Akurasi pengujian yang diperoleh adalah
5. Membuat tampilan Graphical User Interface (GUI)
Source code yang digunakan untuk membuat tampilan GUI adalah sebagai berikut
% Adi Pamungkas, S.Si, M.Si % Website: https://pemrogramanmatlab.com/ % Email : adipamungkas@st.fisika.undip.ac.id 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 01-Jan-2019 14:51:56 % 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 open file [nama_file, nama_path] = uigetfile('*.jpg'); % jika ada file yang dipilih maka akan mengeksekusi perintah di bawahnya if ~isequal(nama_file,0) % membaca file citra Img = imread(fullfile(nama_path, nama_file)); % menampilkan citra pada axes 1 axes(handles.axes1) imshow(Img) title('Citra Asli') % menampilkan nama file citra pada edit1 set(handles.edit1,'String',nama_file) % menyimpan variabel Img pada lokasi handles handles.Img = Img; guidata(hObject, handles) else % jika tidak ada file yang dipilih maka akan kembali 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) % memanggil variabel Img yang ada di lokasi handles Img = handles.Img; % konversi citra RGB menjadi grayscale Img_gray = rgb2gray(Img); % konversi citra grayscale menjadi biner bw = imbinarize(Img_gray); % operasi morfologi bw = imcomplement(bw); bw = imfill(bw,'holes'); bw = bwareaopen(bw,100); % menampilkan citra biner hasil segmentasi pada axes2 axes(handles.axes2) imshow(bw) title('Citra biner') % ekstraksi komponen RGB R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); % mengubah nilai background menjadi nol R(~bw) = 0; G(~bw) = 0; B(~bw) = 0; RGB = cat(3,R,G,B); % menampilkan citra RGB hasil segmentasi pada axes3 axes(handles.axes3) imshow(RGB) title('Hasil Segmentasi') % menyimpan variabel Img_gray & bw pada lokasi handles handles.Img_gray = Img_gray; handles.bw = bw; 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) % memanggil variabel Img, Img_gray, & bw yang ada di lokasi handles Img = handles.Img; Img_gray = handles.Img_gray; bw = handles.bw; % ekstraksi ciri warna RGB R = Img(:,:,1); G = Img(:,:,2); B = Img(:,:,3); R(~bw) = 0; G(~bw) = 0; B(~bw) = 0; Red = sum(sum(R))/sum(sum(bw)); Green = sum(sum(G))/sum(sum(bw)); Blue = sum(sum(B))/sum(sum(bw)); % ekstraksi ciri warna HSV HSV = rgb2hsv(Img); H = HSV(:,:,1); S = HSV(:,:,2); V = HSV(:,:,3); H(~bw) = 0; S(~bw) = 0; V(~bw) = 0; Hue = sum(sum(H))/sum(sum(bw)); Saturation = sum(sum(S))/sum(sum(bw)); Value = sum(sum(V))/sum(sum(bw)); % ekstraksi ciri tekstur GLCM Img_gray(~bw) = 0; GLCM = graycomatrix(Img_gray,'Offset',[0 1; -1 1; -1 0; -1 -1]); stats = graycoprops(GLCM,{'contrast','correlation','energy','homogeneity'}); Contrast = stats.Contrast; Correlation = stats.Correlation; Energy = stats.Energy; Homogeneity = stats.Homogeneity; % mengisi hasil ekstraksi ciri pada variabel ciri_sayur ciri_sayur = cell(10,2); ciri_sayur{1,1} = 'Red'; ciri_sayur{2,1} = 'Green'; ciri_sayur{3,1} = 'Blue'; ciri_sayur{4,1} = 'Hue'; ciri_sayur{5,1} = 'Saturation'; ciri_sayur{6,1} = 'Value'; ciri_sayur{7,1} = 'Contrast'; ciri_sayur{8,1} = 'Correlation'; ciri_sayur{9,1} = 'Energy'; ciri_sayur{10,1} = 'Homogeneity'; ciri_sayur{1,2} = num2str(Red); ciri_sayur{2,2} = num2str(Green); ciri_sayur{3,2} = num2str(Blue); ciri_sayur{4,2} = num2str(Hue); ciri_sayur{5,2} = num2str(Saturation); ciri_sayur{6,2} = num2str(Value); ciri_sayur{7,2} = num2str(Contrast); ciri_sayur{8,2} = num2str(Correlation); ciri_sayur{9,2} = num2str(Energy); ciri_sayur{10,2} = num2str(Homogeneity); % menampilkan ciri_sayur pada tabel set(handles.text2,'String','Hasil Ekstraksi Ciri') set(handles.uitable1,'Data',ciri_sayur,'RowName',1:10) ciri_uji = [Red,Green,Blue,Hue,Saturation,Value,... Contrast,Correlation,Energy,Homogeneity]; % menyimpan variabel ciri_uji pada lokasi handles handles.ciri_uji = ciri_uji; 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) % memangil variabel ciri_uji pada lokasi handles ciri_uji = handles.ciri_uji; % memanggil variabel attorder (urutan ciri dengan nilai gain tertinggi) load('attorder.mat') % seleksi ciri berdasarkan 5 nilai gain tertinggi ciri_seleksi = zeros(1,5); for k = 1:5 ciri_seleksi(:,k) = ciri_uji(:,attorder(k)); end % memanggil nilai bobot jaringan hasil pelatihan load('wtnet.mat'); % menghitung jarak masing2 kelas dengan titik pusat masing2 model SOM pfn1 = dist(wtnet1,ciri_seleksi'); pfn2 = dist(wtnet2,ciri_seleksi'); % menghitung jarak terpendek Group = [min(pfn1(:,1)),min(pfn2(:,1))]; % membaca nilai keluaran hasil pengujian [~,Groupmin] = min(Group,[],2); % mengubah nilai keluaran menjadi kelas keluaran switch Groupmin case 1 kelas = 'Matang'; case 2 kelas = 'Mentah'; otherwise kelas = 'Tidak Dikenali'; end % menampilkan kelas keluaran pada edit2 set(handles.edit2,'String',kelas) % --- 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 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',[]) set(handles.edit1,'String',[]) set(handles.edit2,'String',[]) set(handles.text2,'String',[]) set(handles.uitable1,'Data',[]) 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
Tampilan GUI untuk pengolahan citra buah sawit dalam kelas “matang”
File source code lengkap beserta citra yang ada pada pemrograman di atas dapat diperoleh melalui halaman berikut ini: Source Code
Penerapan algoritma jaringan syaraf tiruan Learning Vector Quantization (LVQ) untuk klasifikasi citra biji kopi dapat dilihat pada video tutorial berikut ini:

Posted on May 8, 2021, in Pengenalan Matlab and tagged algoritma som, deteksi kematangan buah, deteksi tingkat kematangan buah, identifikasi kematangan buah, identifikasi tingkat kematangan buah, information gain, jaringan syaraf tiruan kohonen, klasifikasi citra, nilai gain, seleksi ciri, seleksi fitur, Self-Organizing Maps (SOM). Bookmark the permalink. 14 Comments.
Jarang update lagi pak blognya?
maaf pak ijin tanya, saya mencoba mencari information gain tiap atribut namun saya bingung merubah rumus yang ada ke function dalam matlab. apa bapak bisa membantu?
Bisa saya bantu
Bagaimana pak merubahnya? Atau ada materi yang membahas information gain?
maaf pak izin bertanya, cara untuk menetapkan bobot awal pada algoritma som di matlab bagaimana ya pak? agar persentase akurasi tidak berubah ubah jika di run berkali-kali. terimakasih pak
bisa melakukan Control random number generator
Pak untuk 3 kematangan apakah bisa menggunakan source code ini pak
Bisa dicoba
Tidak masalah
jika imbinarized tidak bisa dipakai pada matlab 2013 pakai sintajs apa ya?>
Mau tanya kalo mau lihat rumus sma jurnalnya dmna yh kak
password rarnya berapa ya?
maaf pak ijin bertanya, saya baru mendalami mathlab untuk skripsi saya, kan saya mencoba dengan 4 tingkat kemtangan dan mengimprove source code dari bapa dengan menyesuaikan tingkat kematangan yang saya buat, akan tetapi saya tidak menggunakan ekstrasi ciri glcm.
lalu yang saya ketahui kan Algoritma som alurnya seperti dibawah ini pak,
1) Menetapkan:
a. Jumlah Variabel
b. Jumlah Data
c. Jumlah Cluster
2) Inisialisasi bobot wij , set parameter learning rate (α), parameter tetangga, dan Maksimum Epoh.
3) Melakukan langkah berikut sampai kondisi stop bernilai false:Untuk setiap input vektor x, langkah yang dilakukan:
a. Menghitung D(j) = Σ(wij –xi)* (wij –xi), untuk setiap j
b. Mencari indeks j yang nilai D(j) adalah minimum
c. Menghitung wij(new) = wij(old) + α(xi-wij(old)) untuk semua unit j dengan spesifikasi tetangga dalam radius tertentu, dan untuk setiap i
d. Meng-update learning rate setiap 1 epoh, dimana setiap epoh terdiri dari n data yang pada setiap perhitungan data akan diperbaharui bobotnya
e. Mengurangi radius ke-tetangga-an pada waktu tertentu
f. Test Kondisi berhenti
pertanyaannya pak,
untuk tahap no.2 itu kalo pada mathlab yang mana ya pak?
lalu ijin bertanya pak untuk menampilkan grafik information gain itu bagaimana ya pak ?
serta perbandingan antara pelatihan dan pengujian itu bagaimana ya pak ?
karena saya terhambat dalam penulisan di bab 4 untuk penjabaran proses som nya pak,
terimakasih pak sebelumnya, maaf merepotkan
Ka kalo untuk keluarannya hanya membaca kelas matang saja gmna
Kelas mentahnya tidak mau terbaca
Bisa dicek lagi kodingnya
Masih ada yang belum benar