Content-Based Image Retrieval (CBIR) Menggunakan Deep Learning


Content-Based Image Retrieval (CBIR) adalah teknik dalam pengambilan kembali gambar dari basis data yang serupa dengan gambar query berdasarkan konten visualnya. Teknologi ini sangat berguna dalam berbagai aplikasi, termasuk dalam pengenalan pola, pencarian gambar medis, dan katalogisasi produk. Pada artikel ini, akan dibahas implementasi CBIR menggunakan deep learning dengan arsitektur ResNet-50 untuk ekstraksi fitur, diikuti oleh Locality Sensitive Hashing (LSH) dan pengukuran kesamaan menggunakan hamming distance, khususnya untuk klasifikasi motif Batik Dayak, Batik Ikat Celup, dan Batik Megamendung.

Batik Ikat Celup

Arsitektur dan Metode

  • Ekstraksi Fitur Menggunakan ResNet-50 ResNet-50 adalah salah satu arsitektur jaringan saraf dalam yang sangat populer yang digunakan untuk tugas-tugas klasifikasi gambar. Arsitektur ini terdiri dari 50 lapisan yang mendalam, tetapi menggunakan residual connections untuk mengatasi masalah vanishing gradient yang umum terjadi pada jaringan yang sangat dalam. Pada tahap ekstraksi fitur, ResNet-50 akan digunakan untuk menghasilkan representasi vektor dari gambar-gambar Batik. Proses ini mencakup langkah-langkah sebagai berikut:
  1. Preprocessing Gambar: Gambar-gambar Batik (Dayak, Ikat Celup, Megamendung) diubah ukurannya dan dinormalisasi agar sesuai dengan input yang diharapkan oleh ResNet-50.
  2. Forward Pass Melalui ResNet-50: Gambar-gambar diproses melalui ResNet-50 tanpa lapisan klasifikasi terakhir untuk menghasilkan fitur vektor dari lapisan terakhir sebelum klasifikasi.

Berikut merupakan diagram Content-Based Image Retrieval (CBIR) menggunakan Deep Convolutional Neural Network

Diagram CBIR menggunakan DCNN
  • Locality Sensitive Hashing (LSH) Setelah mendapatkan fitur vektor dari ResNet-50, langkah berikutnya adalah mengurangi dimensionalitas dan mempercepat proses pencarian menggunakan Locality Sensitive Hashing (LSH). LSH adalah teknik hashing yang memastikan bahwa objek yang dekat dalam ruang fitur memiliki probabilitas tinggi untuk memiliki hash yang sama.
  1. Proses Hashing: Fitur vektor dari gambar-gambar Batik diubah menjadi hash codes menggunakan LSH. Hash codes ini kemudian digunakan untuk pencarian cepat dalam basis data gambar.
  • Pengukuran Kesamaan Menggunakan Hamming Distance Setelah memperoleh hash codes dari gambar query dan gambar dalam basis data, langkah terakhir adalah mengukur kesamaan antara gambar-gambar tersebut. Hamming distance digunakan sebagai metrik kesamaan, yang menghitung jumlah bit yang berbeda antara dua hash codes.
  1. Perhitungan Hamming Distance: Hamming distance antara hash codes gambar query dan hash codes gambar-gambar dalam basis data dihitung. Gambar-gambar dengan Hamming distance terendah dianggap sebagai gambar yang paling mirip dengan gambar query.

Implementasi dan Eksperimen

  1. Dataset Dataset yang digunakan dalam studi ini terdiri dari gambar-gambar Batik Dayak, Batik Ikat Celup, dan Batik Megamendung. Setiap kategori Batik memiliki pola dan karakteristik unik yang dapat diekstraksi menggunakan ResNet-50.
  2. Training dan Pengujian
Batik Dayak
Batik Megamendung
  • Training ResNet-50: ResNet-50 di-pretrained pada dataset ImageNet dan kemudian difinetune menggunakan dataset Batik untuk meningkatkan kemampuan ekstraksi fitur spesifik Batik.
Halaman Pelatihan
Training Progress

Source code untuk halaman pelatihan:

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

% Last Modified by GUIDE v2.5 15-Aug-2021 12:31:08

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

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

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

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


% --- Outputs from this function are returned to the command line.
function varargout = pelatihan_cnn_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 folder
nama_folder = uigetdir();

% jika ada folder yg dipilih maka akan mengeksekusi perintah di bawah ini
if ~isequal(nama_folder,0)
    % mereset button2
    set(handles.uitable1,'Data',[],'RowName',{'' '' '' ''})
    set(handles.uitable2,'Data',[],'RowName',{'' '' '' ''})
    set(handles.edit5,'String',[])
    set(handles.edit6,'String',[])
    
    imds = imageDatastore(nama_folder, ...
        'IncludeSubfolders',true, ...
        'LabelSource','foldernames');
    
    % membagi data untuk pelatihan dan validasi, 70% data untuk pelatihan dan
    % 30% untuk validasi
    [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
    
    % menampilkan data_train pada tabel
    data_train = cell(numel(imdsTrain.Files),2);
    for k = 1:numel(imdsTrain.Files)
        nama_file = dir(imdsTrain.Files{k});
        data_train{k,1} = nama_file.name;
        data_train{k,2} = imdsTrain.Labels(k);
    end
    set(handles.uitable1,'Data',data_train,'RowName',1:numel(imdsTrain.Files))
    
    % menampilkan data_validation pada tabel
    data_validation = cell(numel(imdsValidation.Files),2);
    for k = 1:numel(imdsValidation.Files)
        nama_file = dir(imdsValidation.Files{k});
        data_validation{k,1} = nama_file.name;
        data_validation{k,2} = imdsValidation.Labels(k);
    end
    set(handles.uitable2,'Data',data_validation,'RowName',1:numel(imdsValidation.Files))
    
    % menyimpan variabel2 pada lokasi handles agar dapat dipanggil oleh
    % pushbutton yg lain
    handles.nama_folder = nama_folder;
    handles.data_train = data_train;
    handles.data_validation = data_validation;
    handles.imdsTrain = imdsTrain;
    handles.imdsValidation = imdsValidation;
    guidata(hObject, handles);
    
    % mereset button2
    set(handles.pushbutton4,'Enable','on')
    set(handles.pushbutton5,'Enable','off')
else
    % jika tidak ada folder yg dipilih maka akan kembali
    return
end


% --- 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
set(handles.edit5,'String',[])
set(handles.edit6,'String',[])

% memanggil variabel2 yg ada di lokasi handles
nama_folder = handles.nama_folder;
data_train = handles.data_train;
data_validation = handles.data_validation;
imdsTrain = handles.imdsTrain;
imdsValidation = handles.imdsValidation;

% memanggil arsitektur jaringan resNet-50
net = resnet50;

% mengganti layer akhir dari jaringan
lgraph = layerGraph(net);
[learnableLayer,classLayer] = findLayersToReplace(lgraph);

% membaca jumlah kelas kategori yg akan ditransfer
numClasses = numel(categories(imdsTrain.Labels));

% membentuk fully connected layer sesuai dg jumlah kelas
% kategori yg akan ditransfer
newLearnableLayer = fullyConnectedLayer(numClasses, ...
    'Name','new_fc', ...
    'WeightLearnRateFactor',10, ...
    'BiasLearnRateFactor',10);

% mengganti fully connected layer dg yg baru
lgraph = replaceLayer(lgraph,learnableLayer.Name,newLearnableLayer);

% membentuk classification layer sesuai dg kelas kategori yg akan
% ditransfer
newClassLayer = classificationLayer('Name','new_classoutput');

% mengganti classification layer dg yg baru
lgraph = replaceLayer(lgraph,classLayer.Name,newClassLayer);

% membaca keseluruhan layer dan koneksi antar layer
layers = lgraph.Layers;
connections = lgraph.Connections;

% menentukan layer yg akan di-freeze
layers(1:4) = freezeWeights(layers(1:4));
layers = createLgraphUsingConnections(layers,connections);

% membaca ukuran layer masukan
inputSize = net.Layers(1).InputSize;

% melakukan augmentasi data dengan tujuan untuk menyesuaikan ukuran citra
% masukan
pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

% menetapkan nilai2 yg mempengaruhi proses pelatihan jaringan
max_epoch = str2double(get(handles.edit1,'String'));
minibatch = str2double(get(handles.edit2,'String'));
learn_rate = str2double(get(handles.edit3,'String'));
momentum = str2double(get(handles.edit4,'String'));

options = trainingOptions('sgdm', ...
    'MiniBatchSize',minibatch, ...
    'MaxEpochs',max_epoch, ...
    'InitialLearnRate',learn_rate, ...
    'Momentum',momentum, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

% melakukan pelatihan jaringan
rng('default')
netTransfer = trainNetwork(augimdsTrain,layers,options);

% melakukan ekstraksi ciri terhadap data latih dan data validasi
layer = 'new_fc';
featuresTrain = activations(netTransfer,augimdsTrain,layer);
featuresVal = activations(netTransfer,augimdsValidation,layer);

% membaca label kelas pelatihan
labelsClass = dir(nama_folder);
labelsTrain = zeros(numel(imdsTrain.Files),1);
for i = 1:numel(imdsTrain.Files)
    for j = 1:numel(labelsClass)
        if isequal(imdsTrain.Labels(i),labelsClass(j).name)
            labelsTrain(i) = j;
        end
    end
end

% LSH (Locality Sensitive Hashing)
switch get(handles.popupmenu2,'Value')
    case 1
        maxbits = 32;
    case 2
        maxbits = 64;
    case 3
        maxbits = 128;
    case 4
        maxbits = 256;
    case 5
        maxbits = 512;
    case 6
        maxbits = 1024;
end

[model, B, ~] = LSH_learn(featuresTrain, maxbits);

% hashing code
hashcodeTrain = B;

% hamming distance
for i = 1:numel(imdsTrain.Files)
    for j = 1:numel(imdsTrain.Files)
        diff = xor(hashcodeTrain(i,:),hashcodeTrain(j,:));
        d(j) = sum(diff);
    end
    [~,mindist] = min(d);
    class(i) = labelsTrain(mindist);
end

% membaca kelas keluaran hasil pelatihan
for i = 1:numel(imdsTrain.Files)
    for j = 1:numel(labelsClass)-2
        switch class(i)
            case j
                data_train{i,3} = labelsClass(j+2).name;
        end
    end
end

% menampilkan data_train pada tabel
set(handles.uitable1,'Data',data_train,'RowName',1:numel(imdsTrain.Files))

% menghitung nilai akurasi pelatihan dan menampilkannya pada edit text
jumlah_benar = 0;
jumlah_salah = 0;
for i = 1:numel(imdsTrain.Files)
    if isequal(data_train{i,3},imdsTrain.Labels(i))
        jumlah_benar = jumlah_benar+1;
    else
        jumlah_salah = jumlah_salah+1;
    end
end

jumlah_data = numel(imdsTrain.Files);
akurasi = jumlah_benar/jumlah_data*100;
set(handles.edit5,'String',[num2str(akurasi),'%'])

% membaca kelas keluaran hasil validasi
[Bval,~] = LSH_compress(featuresVal, model);

% hashing code
hashcodeVal = Bval;

% hamming distance
for i = 1:numel(imdsValidation.Files)
    for j = 1:numel(imdsTrain.Files)
        diff = xor(hashcodeTrain(j,:),hashcodeVal(i,:));
        d(j) = sum(diff);
    end
    [~,mindist] = min(d);
    class(i) = labelsTrain(mindist);
end

for i = 1:numel(imdsValidation.Files)
    for j = 1:numel(labelsClass)-2
        switch class(i)
            case j
                data_validation{i,3} = labelsClass(j+2).name;
        end
    end
end

% menampilkan data_validation pada tabel
set(handles.uitable2,'Data',data_validation,'RowName',1:numel(imdsValidation.Files))

% menghitung nilai akurasi validasi dan menampilkannya pada edit text
jumlah_benar = 0;
jumlah_salah = 0;
for i = 1:numel(imdsValidation.Files)
    if isequal(data_validation{i,3},imdsValidation.Labels(i))
        jumlah_benar = jumlah_benar+1;
    else
        jumlah_salah = jumlah_salah+1;
    end
end

jumlah_data = numel(imdsValidation.Files);
akurasi = jumlah_benar/jumlah_data*100;

% menampilkan akurasi pada edit text
set(handles.edit6,'String',[num2str(akurasi),'%'])

% menyimpan variabel2 pada lokasi handles agar dapat dipanggil oleh
% pushbutton yg lain
handles.hashcodeTrain = hashcodeTrain;
handles.imdsTrain = imdsTrain;
handles.model = model;
handles.labelsClass = labelsClass;
handles.labelsTrain = labelsTrain;
handles.netTransfer = netTransfer;
guidata(hObject, handles)

% mereset button2
set(handles.pushbutton5,'Enable','on')

% --- 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)

% memanggil variabel2 yg ada di lokasi handles
hashcodeTrain = handles.hashcodeTrain;
imdsTrain = handles.imdsTrain;
model = handles.model;
labelsClass = handles.labelsClass;
labelsTrain = handles.labelsTrain;
netTransfer = handles.netTransfer;

% menampilkan menu save file
[nama_file,~] = uiputfile({'*.mat'});

% jika ada file yg disimpan maka akan mengeksekusi perintah di bawah ini
if ~isequal(nama_file,0)
    % menyimpan variabel2
    save(nama_file,'hashcodeTrain','imdsTrain','model','labelsClass',...
        'labelsTrain','netTransfer');
else
    % jika tidak ada file yg disimpan maka akan kembali
    return
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
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')
set(handles.uitable1,'Data',[],'RowName',{'' '' '' ''})
set(handles.uitable2,'Data',[],'RowName',{'' '' '' ''})
set(handles.edit1,'String','6')
set(handles.edit2,'String','10')
set(handles.edit3,'String','0.0001')
set(handles.edit4,'String','0.9')
set(handles.edit5,'String',[])
set(handles.edit6,'String',[])
set(handles.popupmenu1,'Value',1)
set(handles.popupmenu2,'Value',1)


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



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


% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit3 (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 edit4_Callback(hObject, eventdata, handles)
% hObject    handle to edit4 (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 edit4 as text
%        str2double(get(hObject,'String')) returns contents of edit4 as a double


% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit4 (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 edit5_Callback(hObject, eventdata, handles)
% hObject    handle to edit5 (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 edit5 as text
%        str2double(get(hObject,'String')) returns contents of edit5 as a double


% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit5 (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 edit6_Callback(hObject, eventdata, handles)
% hObject    handle to edit6 (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 edit6 as text
%        str2double(get(hObject,'String')) returns contents of edit6 as a double


% --- Executes during object creation, after setting all properties.
function edit6_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit6 (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 Halaman_Depan_Callback(hObject, eventdata, handles)
% hObject    handle to Halaman_Depan (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% menutup halaman pelatihan
close all;
% membuka halaman depan
guidata(halaman_depan);

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

% menutup halaman pelatihan
close all;
% membuka halaman pengujian
guidata(pengujian_cnn);

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

% menutup halaman pelatihan
close all;
% membuka halaman pengolahan citra
guidata(pengolahan_citra_cnn);


% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu1 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu1


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

% Hint: popupmenu 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 selection change in popupmenu2.
function popupmenu2_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu2 contents as cell array
%        contents{get(hObject,'Value')} returns selected item from popupmenu2


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

% Hint: popupmenu 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
  • Ekstraksi Fitur dan Hashing: Fitur dari gambar-gambar Batik diekstrak dan di-hash menggunakan LSH.
Halaman Pengujian

Source code untuk halaman pengujian:

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

% Last Modified by GUIDE v2.5 15-Aug-2021 17:53:28

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

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

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

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


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

% mereset button2
set(handles.uitable1,'Data',[],'RowName',{'' '' '' ''})
set(handles.edit2,'String',[])

% menampilkan menu browse file
[nama_file,nama_path] = uigetfile({'*.mat'});

% jika ada file yg dipilih maka akan mengeksekusi perintah di bawah ini
if ~isequal(nama_file,0)
    % menampilkan nama file pada edit text
    set(handles.edit1,'String',nama_file)    
    
    % menyimpan variabel2 pada lokasi handles
    % agar dapat dipanggil oleh pushbutton yg lain
    handles.nama_file = nama_file;
    handles.nama_path = nama_path;
    guidata(hObject, handles)
    
    % mereset button2
    set(handles.pushbutton4,'Enable','on')
    set(handles.pushbutton5,'Enable','off')
else
    % jika tidak ada file yg dipilih maka akan kembali
    return
end

% --- 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)

% menampilkan menu browse folder
nama_folder = uigetdir();

% jika ada folder yg dipilih maka akan mengeksekusi perintah di bawah ini
if ~isequal(nama_folder,0)
    % mereset button2
    set(handles.uitable1,'Data',[],'RowName',{'' '' '' ''})
    set(handles.edit2,'String',[])
    
    imdsTest = imageDatastore(nama_folder, ...
        'IncludeSubfolders',true, ...
        'LabelSource','foldernames');
       save imdsTest imdsTest
    % menampilkan data_test pada tabel
    data_test = cell(numel(imdsTest.Files),2);
    for k = 1:numel(imdsTest.Files)
        nama_file = dir(imdsTest.Files{k});
        data_test{k,1} = nama_file.name;
        data_test{k,2} = imdsTest.Labels(k);
    end   
    set(handles.uitable1,'Data',data_test,'RowName',1:numel(imdsTest.Files))
       
    % menyimpan variabel2 pada lokasi handles
    % agar dapat dipanggil oleh pushbutton yg lain
    handles.data_test = data_test;
    handles.imdsTest = imdsTest;
    guidata(hObject, handles);
    
    % mereset button2
    set(handles.pushbutton5,'Enable','on')
else
    % jika tidak ada folder yg dipilih maka akan kembali
    return
end



% --- 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 variabel2 yg ada di lokasi handles
nama_file = handles.nama_file;
nama_path = handles.nama_path;
data_test = handles.data_test;
imdsTest = handles.imdsTest;

% memanggil jaringan alexnet (trained)
load(fullfile(nama_path,nama_file))

% membaca ukuran layer masukan
inputSize = netTransfer.Layers(1).InputSize;

% melakukan augmentasi data dengan tujuan untuk menyesuaikan ukuran citra
% masukan
pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest, ...
    'DataAugmentation',imageAugmenter);

if isa(netTransfer,'SeriesNetwork')
    % melakukan ekstraksi ciri terhadap data latih dan data validasi
    layer = 'fc7';
    featuresTest = activations(netTransfer,augimdsTest,layer,'OutputAs','rows');
else
    % melakukan ekstraksi ciri terhadap data latih dan data validasi
    layer = 'new_fc';
    featuresTest = squeeze(activations(netTransfer,augimdsTest,layer));
    featuresTest = featuresTest';
end

% membaca kelas keluaran hasil pengujian
[Btest,~] = LSH_compress(featuresTest, model);

% hashing code
hashcodeTest = Btest;

% hamming distance
for i = 1:numel(imdsTest.Files)
    for j = 1:numel(imdsTrain.Files)
        diff = xor(hashcodeTrain(j,:),hashcodeTest(i,:));
        d(j) = sum(diff);
    end
    [~,mindist] = min(d);
    class(i) = labelsTrain(mindist);
end

for i = 1:numel(imdsTest.Files)
    for j = 1:numel(labelsClass)
        switch class(i)
            case j
                data_test{i,3} = labelsClass(j).name;
        end
    end
end

% menampilkan data_test pada tabel
set(handles.uitable1,'Data',data_test,'RowName',1:numel(imdsTest.Files))

% menghitung nilai akurasi pengujian dan menampilkannya pada edit text
jumlah_benar = 0;
jumlah_salah = 0;
for i = 1:numel(imdsTest.Files)
    if isequal(data_test{i,3},imdsTest.Labels(i))
        jumlah_benar = jumlah_benar+1;
    else
        jumlah_salah = jumlah_salah+1;
    end
end

jumlah_data = numel(imdsTest.Files);
akurasi = jumlah_benar/jumlah_data*100;
set(handles.edit2,'String',[num2str(akurasi),'%'])


% --- 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
set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')
set(handles.uitable1,'Data',[],'RowName',{'' '' '' ''})
set(handles.edit1,'String',[])
set(handles.edit2,'String',[])

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


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

% menutup halaman pengujian
close all;
% membuka halaman depan
guidata(halaman_depan);

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

% menutup halaman pengujian
close all;
% membuka halaman pelatihan
guidata(pelatihan_cnn);

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

% menutup halaman pengujian
close all;
% membuka halaman pengolahan citra
guidata(pengolahan_citra_cnn);



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

  • Evaluasi: Gambar-gambar query diuji dengan menghitung Hamming distance untuk mengukur kesamaan dengan gambar-gambar dalam basis data. Akurasi dan efisiensi pencarian dinilai berdasarkan kemampuannya mengidentifikasi gambar yang mirip dalam kategori yang tepat.

Source code untuk halaman retrieval:

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

% Last Modified by GUIDE v2.5 15-Aug-2021 18:21:47

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

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

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

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


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

% 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',[])

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

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

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

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

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

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

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

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

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

set(handles.edit2,'String',[])
set(handles.edit3,'String',[])

% menampilkan menu browse file
[nama_file,nama_path] = uigetfile({'*.mat'});

% jika ada file yg dipilih maka akan mengeksekusi perintah di bawah ini
if ~isequal(nama_file,0)
    % menampilkan nama file pada edit text
    set(handles.edit1,'String',nama_file)
    
    % menyimpan variabel2 pada lokasi handles
    % agar dapat dipanggil oleh pushbutton yg lain
    handles.nama_file = nama_file;
    handles.nama_path = nama_path;
    guidata(hObject, handles)
    
    % mereset button2
    set(handles.pushbutton4,'Enable','on')
    set(handles.pushbutton5,'Enable','off')
else
    % jika tidak ada file yg dipilih maka akan kembali
    return
end

% --- 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)

% menampilkan menu browse folder
[nama_file,nama_path] = uigetfile('*.jpg');

% jika ada folder yg dipilih maka akan mengeksekusi perintah di bawah ini
if ~isequal(nama_file,0)
    % 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',[])
    
    axes(handles.axes5)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes6)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes7)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes8)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes9)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes10)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes11)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes12)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    axes(handles.axes13)
    cla reset
    set(gca,'XTick',[])
    set(gca,'YTick',[])
    
    set(handles.edit2,'String',[])
    set(handles.edit3,'String',[])
    
    % membaca file citra
    Img = imread(fullfile(nama_path,nama_file));
    
    % menampilkan citra pada axes
    axes(handles.axes1)
    imshow(Img)
    
    % menampilkan nama file pada edit text
    set(handles.edit2,'String',nama_file)
    
    % menyimpan variabel2 pada lokasi handles
    % agar dapat dipanggil oleh pushbutton yg lain
    handles.Img = Img;
    guidata(hObject, handles);
    
    % mereset button2
    set(handles.pushbutton5,'Enable','on')
else
    % jika tidak ada folder yg dipilih maka akan kembali
    return
end



% --- 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.edit3,'String',[])

% memanggil variabel2 yg ada di lokasi handles
nama_file = handles.nama_file;
nama_path = handles.nama_path;
Img = handles.Img;

% memanggil jaringan alexnet (trained)
load(fullfile(nama_path,nama_file))

% membaca ukuran layer masukan
inputSize = netTransfer.Layers(1).InputSize;

% melakukan augmentasi data dengan tujuan untuk menyesuaikan ukuran citra
% masukan
pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTest = augmentedImageDatastore(inputSize(1:2),Img, ...
    'DataAugmentation',imageAugmenter);

if isa(netTransfer,'SeriesNetwork')
    % melakukan ekstraksi ciri terhadap data latih dan data validasi
    layer = 'fc7';
    featuresTest = activations(netTransfer,augimdsTest,layer,'OutputAs','rows');
else
    % melakukan ekstraksi ciri terhadap data latih dan data validasi
    layer = 'new_fc';
    featuresTest = squeeze(activations(netTransfer,augimdsTest,layer));
    featuresTest = featuresTest';
end

% membaca kelas keluaran hasil pengujian
[Btest,~] = LSH_compress(featuresTest, model);

% hashing code
hashcodeTest = Btest;

% hamming distance
for j = 1:numel(imdsTrain.Files)
    diff = xor(hashcodeTrain(j,:),hashcodeTest);
    d(j) = sum(diff);
end

% retrieval (proses sorting class)
[sortdist,sortnum] = sort(d);
for k = 1:numel(imdsTrain.Files)
    class(k) = labelsTrain(sortnum(k));
end

% membaca kelas keluaran hasil retrieval
retrieval_class = unique(class,'stable');
retrieval_result = cell(numel(retrieval_class),1);
for j = 1:numel(retrieval_class)
    retrieval_result{j,1} = labelsClass(retrieval_class(j)).name;
end

% menampilkan kelas keluaran klasifikasi pada edit text
set(handles.edit3,'String',retrieval_result{1,1})

% menampilkan citra retrieval
axes(handles.axes2)
k = 1;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes3)
k = 2;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes4)
k = 3;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes5)
k = 4;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes6)
k = 5;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes7)
k = 6;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes8)
k = 7;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes9)
k = 8;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes10)
k = 9;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes11)
k = 10;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes12)
k = 11;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})

axes(handles.axes13)
k = 12;
imshow(imdsTrain.Files{sortnum(k)})
[~,name,~] = fileparts(imdsTrain.Files{sortnum(k)});
title({name,['HD = ',num2str(sortdist(k))]})


% --- 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',[])

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

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

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

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

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

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

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

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

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


set(handles.pushbutton4,'Enable','off')
set(handles.pushbutton5,'Enable','off')
set(handles.edit1,'String',[])
set(handles.edit2,'String',[])
set(handles.edit3,'String',[])


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


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

% menutup halaman pengolahan citra
close all;
% membuka halaman depan
guidata(halaman_depan);

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

% menutup halaman pengolahan citra
close all;
% membuka halaman pelatihan
guidata(pelatihan_cnn);

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

% menutup halaman pengolahan citra
close all;
% membuka halaman pengujian
guidata(pengujian_cnn);



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


% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit3 (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 edit4_Callback(hObject, eventdata, handles)
% hObject    handle to edit4 (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 edit4 as text
%        str2double(get(hObject,'String')) returns contents of edit4 as a double


% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit4 (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 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 edit5_Callback(hObject, eventdata, handles)
% hObject    handle to edit5 (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 edit5 as text
%        str2double(get(hObject,'String')) returns contents of edit5 as a double


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

Implementasi CBIR menggunakan ResNet-50, LSH, dan Hamming distance menunjukkan hasil yang signifikan dalam pencarian gambar Batik. Kombinasi ekstraksi fitur dari ResNet-50 dan efisiensi pencarian dari LSH menghasilkan sistem yang cepat dan akurat. Hasil eksperimen menunjukkan bahwa sistem ini mampu mengidentifikasi pola Batik dengan akurasi tinggi dan efektif untuk pencarian gambar dalam basis data besar.

Posted on June 14, 2024, in Deep Learning and tagged , , , , , , , , , , . Bookmark the permalink. 1 Comment.

  1. ITU SANGAT MEMBANTU BANGAT BROOO

Leave a reply to SIPRI Cancel reply