Огромное разнообразие искусства Индонезии порождает множество интересов как внутри страны, так и за рубежом. Искусство, особенно на острове Ява, имеет множество уникальных форм, особенно в форме маски. Искусство масок можно увидеть во многих регионах, включая Западную Яву, Чиребон, Суракарту, Джокьякарту, Восточную Яву; каждый несет в себе отличительные черты, которые рифмуются в соответствии с фольклором и ценностями региона, представленного маской. Например, маски из региона Бетави обладают уникальными чертами, чем маски Ситубондо, Маланга, Поного или Мадура.

Чиребон считается одним из самых популярных масок. Параллельно с местной историей Чиребона существует пять типов масок в форме человека: Панджи, Самба или Паминдо, Румянг, Туменгунг и Клана. Каждый тип показывает уникальные выражения и особенности. К сожалению, традиционная маска, такая как маска Чиребона, находится на грани исчезновения. Это происходит потому, что новое поколение не заинтересовано в изучении своей культуры. Исходя из этой проблемы, мы попытались сохранить понимание масок Чиребона с помощью подхода искусственного интеллекта с использованием методов цифровой обработки изображений.

В этом исследовании я попытался реализовать экстрактор функций SIFT из цифровых изображений и машину опорных векторов (SVM), K-Nearest Neighbor (KNN), Random Forest в качестве классификатора с использованием MATLAB.

Методология

Сбор данных

Набор данных был собран двумя разными способами: захвачены изображения маски Чиребона с помощью камеры и собраны изображения маски Чиребона с помощью приложения поисковой системы. Это сделано для того, чтобы в каждом классе было больше разнообразия.

Предварительная обработка

На этом этапе фоновые изображения были удалены вручную, поэтому фон стал черным. После удаления фоновых изображений размер каждого изображения изменяется до 50 x 50.

Извлечение функций

После предварительной обработки поменять фон и изменить размер изображения. На этом этапе был реализован алгоритм SIFT для обнаружения ключевых точечных особенностей из маски Чиребона.

Масштабно-инвариантное преобразование элемента

Алгоритм SIFT был введен Лоу. Этот метод инвариантен к трансляции изображения, частично инвариантен к аффинной проекции и изменению освещения, масштабированию и повороту. Есть четыре шага для определения изображений SIFT:

  1. Масштабная конструкция пространства
  2. Локализация ключевых точек
  3. Ориентация
  4. Дескриптор ключевой точки

Ниже вы можете увидеть код Matlab для извлечения функций с использованием метода Scale Invariant Feature Transform на моем Github / fendy07. Во-первых, вы должны получить все наборы данных и разместить свою модель данных из файла каталога. После этого получите все наборы данных, чтобы создать числовой класс для инициализации модели данных. Затем нарисуйте круг для ключевой точки SIFT размером 32 x 32 x 32.

clear;
clc;
% Place your data model to directory file you want and get all data model
files_kelana=dir('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Kelana\*.png');
files_tumenggung=dir('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Tumenggung\*.png');
files_rumyang=dir('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Rumyang\*.png');
files_samba=dir('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Samba\*.png');
files_panji=dir('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Panji\*.png');
% Make a number data class 
n_kelana =numel(files_kelana);
n_tumenggung =numel(files_tumenggung);
n_rumyang =numel(files_rumyang);
n_samba =numel(files_samba);
n_panji =numel(files_panji);
class_kelana=1;
class_tumenggung=2;
class_rumyang=3;
class_samba=4;
class_panji=5;
% Make a circle for SIFT with 32
circle = [32 32 32];

После создания круга для ключевой точки SIFT 32 x 32 x 32. Следующий шаг, чтобы сделать извлечение объекта с помощью метода Scale Invariant Feature Transform на маске Cirebon каждого пяти наборов данных класса. На этом этапе необходимо определить признаки класса данных с помощью SIFT в соответствии с кругами, созданными с размером 32 x 32 x 32 ключевых точки.

%Klana feature with SIFT
for i=1:n_kelana
      str = strcat('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Kelana\', files_kelana(i).name);
      temp_image=imread(str);
      feature_sift_kelana(i,:) = find_sift(temp_image, circle);
      feature_class_kelana(i,:)=[feature_sift_kelana(i,:) class_kelana];
      
end

%Tumenggung Feature
for i=1:n_tumenggung
    str = strcat('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Tumenggung\', files_tumenggung(i).name);
      temp_image=imread(str);
      feature_sift_tumenggung(i,:) = find_sift(temp_image, circle);
      feature_class_tumenggung(i,:)=[feature_sift_tumenggung(i,:) class_tumenggung];

end

%Rumyang Feature
for i=1:n_rumyang
    str = strcat('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Rumyang\', files_rumyang(i).name);
    temp_image=imread(str);
      feature_sift_rumyang(i,:) = find_sift(temp_image, circle);
      feature_class_rumyang(i,:)=[feature_sift_rumyang(i,:) class_rumyang];
      
end

%Pamindo or Samba Feature
for i=1:n_samba
    str = strcat('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Samba\', files_samba(i).name);
    temp_image=imread(str);
      feature_sift_samba(i,:) = find_sift(temp_image, circle);
      feature_class_samba(i,:)=[feature_sift_samba(i,:) class_samba];
      
end


%Panji Feature
for i=1:n_panji
    str = strcat('C:\Users\User\Documents\MATLAB\SIFT\Data Image\Topeng Panji\', files_panji(i).name);
    temp_image=imread(str);
      feature_sift_panji(i,:) = find_sift(temp_image, circle);
      feature_class_panji(i,:)=[feature_sift_panji(i,:) class_panji];
      
end

После создания функции извлечения найти метод масштабного инвариантного преобразования функции для пяти классов наборов данных в маске Чиребона. На этом этапе вы должны сохранить данные функции в формате .mat или файле Matlab.

%Feature all data with SIFT and save result feature data 
feature_all = [feature_class_kelana; feature_class_tumenggung; feature_class_rumyang; feature_class_samba; feature_class_panji];
save('feature.mat', 'feature_all');

Теория классификатора

Классификация признаков была реализована с использованием K-ближайшего соседа, случайного леса и машины опорных векторов в качестве классификатора. Этот классификатор создал модель для классификации масок Чиребона.

Ближайший сосед по K

K-NN - это простой алгоритм контролируемого обучения. Метрика расстояния, которая обычно используется в K-NN, - это евклидово расстояние, но в этой статье были реализованы три разных метрики расстояния. Метрики расстояния:

Расстояние Минковского

где d (x, y) расстояние между данными каждого объекта.

Евклидово расстояние

Расстояние Чебышева

где d (x, y) - расстояние между элементами, r - параметры.

В классификаторе K-NN метка запроса была спрогнозирована на основе общего класса в направлении k-ближайших точек к X.

Машина опорных векторов

Другой классификатор, SVM, является одним из известных классификаторов, который может работать с многомерными данными и может использовать функцию ядра для отображения реальных данных в более высокое измерение. В отличие от другого метода классификации, SVM не использует все данные, которые должны быть изучены в процессе обучения, а лишь несколько выбранных данных используются для построения модели в процессе обучения. Простой алгоритм для SVM:

  • Определите две оптимальные гиперплоскости
  • Использование штрафа за неправильную классификацию используется для нелинейно разделимой задачи.
  • Увеличьте расстояние между двумя гиперплоскостями (край)

Случайный лес

Случайный лес - это один из ансамблевых алгоритмов, в которых для дерева решений использовался метод упаковки. Случайный лес ищет лучшую функцию из подмножества функций.

Создайте модельный классификатор

На этом этапе после сохранения извлечения признаков для набора данных. Входной файл функции извлечения методом SIFT и загрузки данных.

clear;
clc;

%load feature data after preprocessing with SIFT
load('feature.mat'); 

%get row and columns in feature data
[row, col] =size(feature_all); 

label = feature_all(:,col);
feature = feature_all(:,1:col-1);

Следующий шаг: разделите данные с помощью перекрестной проверки.

%Split the data with Cross Validation
[test,train] = crossvalind('HoldOut',label,0.7); 


[row_train,col_train] =size(train);
temp_train=0
temp_test=0
for i=1:row_train
    if train(i,:) == 1
        temp_train=temp_train+1;
        feature_train(temp_train,:) = feature(i,:);
        label_train(temp_train,:) = label(i,:);
    
    else
        temp_test=temp_test+1;
        feature_test(temp_test,:) = feature(i,:);
        label_test(temp_test,:) = label(i,:);
    end
end

После этого разделите данные с помощью перекрестной проверки. Создайте модель прогнозирования с помощью метода классификатора. Сначала с методом K-ближайшего соседа с метриками расстояния.

%make model classification with K-NN
%knn
model_knn_chebychev = fitcknn(feature_train,label_train,'Distance','chebychev'); %pembuatan model kernel knn
model_knn_minkowski = fitcknn(feature_train,label_train, 'Distance','minkowski');
model_knn_euclidean = fitcknn(feature_train,label_train, 'Distance','euclidean');
loss_knn_chebychev = loss(model_knn_chebychev,feature_train, label_train, 'LossFun','hinge');
loss_knn_minskowski = loss(model_knn_minkowski,feature_train, label_train, 'LossFun','hinge');
loss_knn_euclidean = loss(model_knn_euclidean,feature_train, label_train, 'LossFun', 'hinge');
%testing process model predict for the data
%knn
%distance metric chebychev
result_knn_chebychev = predict(model_knn_chebychev,feature_test);
counter_knn_chebyshev = 0;
[row_test,col_test] = size(feature_test);
for i=1:row_test
    if result_knn_chebychev(i)==label_test(i);
        counter_knn_chebyshev=counter_knn_chebyshev+1;
    end
end
accuracy_knn_chebychev=(counter_knn_chebyshev/row_test)*100;
conf_mat_knn_chebychev=confusionmat(label_test,result_knn_chebychev);

%knn
%distance metric minkowski
result_knn_minkowski = predict(model_knn_minkowski,feature_test);
counter_knn_minkowski = 0;
for i=1:row_test
    if result_knn_minkowski(i)==label_test(i)
        counter_knn_minkowski=counter_knn_minkowski+1;
    end
end
accuracy_knn_minkowski=(counter_knn_minkowski/row_test)*100;
conf_mat_knn_minkowski=confusionmat(label_test,result_knn_minkowski);

%knn
%distance metric euclidean
result_knn_euclidean = predict(model_knn_euclidean,feature_test);
counter_knn_euclidean = 0;
for i=1:row_test
    if result_knn_euclidean(i)==label_test(i)
        counter_knn_euclidean=counter_knn_euclidean+1;
    end
end
accuracy_knn_euclidean=(counter_knn_euclidean/row_test)*100;
conf_mat_knn_euclidean=confusionmat(label_test,result_knn_euclidean);

Следующий шаг - прогнозирование данных модели с помощью метода опорных векторов с ядром Один против одного и Один против всех. .

%svm kernel
t_gaussian=templateSVM('KernelFunction','gaussian');
t_rbf=templateSVM('KernelFunction','rbf');
t_linear=templateSVM('KernelFunction','linear');

%onevsone
model_svm_onevsone_gaussian=fitcecoc(feature_train, label_train,'Learners',t_gaussian);
model_svm_onevsone_rbf=fitcecoc(feature_train, label_train,'Learners',t_rbf);
model_svm_onevsone_linear=fitcecoc(feature_train, label_train,'Learners',t_linear);

%onevsall
model_svm_onevsall_gaussian=fitcecoc(feature_train, label_train,'Learners',t_gaussian,'Coding','onevsall');
model_svm_onevsall_rbf=fitcecoc(feature_train, label_train,'Learners',t_rbf,'Coding','onevsall');
model_svm_onevsall_linear=fitcecoc(feature_train, label_train,'Learners',t_linear,'Coding','onevsall');
%svm
%distance metric One Vs One
%Gaussian
result_svm_onevsone_gaussian = predict(model_svm_onevsone_gaussian,feature_test);
counter_svm_onevsone_gaussian = 0;
for i=1:row_test
    if result_svm_onevsone_gaussian(i)==label_test(i)
        counter_svm_onevsone_gaussian=counter_svm_onevsone_gaussian+1;
    end
end
accuracy_svm_onevsone_gaussian=(counter_svm_onevsone_gaussian/row_test)*100;
conf_mat_svm_onevsone_gaussian=confusionmat(label_test,result_svm_onevsone_gaussian);

%svm
%Distance Metric One Vs All
%Gaussian
result_svm_onevsall_gaussian = predict(model_svm_onevsall_gaussian,feature_test);
counter_svm_onevsall_gaussian = 0;
for i=1:row_test
    if result_svm_onevsall_gaussian(i)==label_test(i)
        counter_svm_onevsall_gaussian=counter_svm_onevsall_gaussian+1;
    end
end
accuracy_svm_onevsall_gaussian=(counter_svm_onevsall_gaussian/row_test)*100;
conf_mat_svm_onevsall_gaussian=confusionmat(label_test,result_svm_onevsall_gaussian);

%SVM
%One vs All Linear
result_svm_onevsall_linear = predict(model_svm_onevsall_linear,feature_test);
counter_svm_onevsall_linear = 0;
for i=1:row_test
    if result_svm_onevsall_linear(i)==label_test(i)
        counter_svm_onevsall_linear=counter_svm_onevsall_linear+1;
    end
end
accuracy_svm_onevsall_linear=(counter_svm_onevsall_linear/row_test)*100;
conf_mat_svm_onevsall_linear=confusionmat(label_test,result_svm_onevsall_linear);

%One vs One Linear
result_svm_onevsone_linear = predict(model_svm_onevsone_linear,feature_test);
counter_svm_onevsone_linear = 0;
for i=1:row_test
    if result_svm_onevsone_linear(i)==label_test(i)
        counter_svm_onevsone_linear=counter_svm_onevsone_linear+1;
    end
end
accuracy_svm_onevsone_linear=(counter_svm_onevsone_linear/row_test)*100;
conf_mat_svm_onevsone_linear=confusionmat(label_test,result_svm_onevsone_linear);

%Radial Basis Function(RBF)
result_svm_onevsall_rbf = predict(model_svm_onevsall_rbf,feature_test);
counter_svm_onevsall_rbf = 0;
for i=1:row_test
    if result_svm_onevsall_rbf(i)==label_test(i)
        counter_svm_onevsall_rbf=counter_svm_onevsall_rbf+1;
    end
end
accuracy_svm_onevsall_rbf=(counter_svm_onevsall_rbf/row_test)*100;
conf_mat_svm_onevsall_rbf=confusionmat(label_test,result_svm_onevsall_rbf);

%Radial Basis Function(RBF)
result_svm_onevsone_rbf = predict(model_svm_onevsone_rbf,feature_test);
counter_svm_onevsone_rbf = 0;
for i=1:row_test
    if result_svm_onevsone_rbf(i)==label_test(i)
        counter_svm_onevsone_rbf=counter_svm_onevsone_rbf+1;
    end
end
accuracy_svm_onevsone_rbf=(counter_svm_onevsone_rbf/row_test)*100;
conf_mat_svm_onevsone_rbf=confusionmat(label_test,result_svm_onevsone_rbf);

Следующий шаг - прогнозирование данных модели методом случайного леса с помощью Tree Bagger.

%random forest
model_randomforest = TreeBagger(100,feature_train, label_train);
%random forest
%distance metric random forest
result_randomforest_randforest = predict(model_randomforest,feature_test);
result_randomforest_randforest=str2num(cell2mat(result_randomforest_randforest));
counter_randomforest_randforest = 0;
[row_test,col_test] = size(feature_test);
for i=1:row_test
    if result_randomforest_randforest(i)==label_test(i);
        counter_randomforest_randforest=counter_randomforest_randforest+1;
    end
end
accuracy_randomforest_randforest=(counter_randomforest_randforest/row_test)*100; 
conf_mat_randomforest_randforest=confusionmat(label_test,result_randomforest_randforest);

Эксперимент и результат

Настройки эксперимента
Модели обучались на процессоре: Intel Core i5 и оперативной памяти: 4 ГБ.

Сценарий эксперимента

В первом сценарии используется классификатор K-NN с разными метриками расстояния. Результат этого сценария можно увидеть в Таблице II:

Из этой таблицы показатели Минковского и евклидова дают лучшую производительность по сравнению с метрикой расстояния Чебышева. Результат недостаточно удовлетворительный из-за общей точности менее 60%, поэтому модель недостаточно хороша.

Во втором сценарии используется SVM с двумя разными подходами: один против всех и один против одного с тремя разными ядрами: Линейный, Радиальная базисная функция и Гауссовский. Сценарий можно увидеть в Таблице III:

Из этой таблицы я пришел к выводу, что подход один против всех дает лучший результат по сравнению с подходом один против одного. Хотя функция ядра не дает разной производительности в этом подходе, подход «один против одного» дает разную точность с использованием функции ядра.

В последнем сценарии используется случайный лес. В этом методе мы реализовали три разных количества деревьев: 10, 100 и 1000 деревьев. Результат можно увидеть в Таблице IV:

Из таблицы IV, глубина дерева влияет на точность. Точность улучшается после придания дереву большей глубины.

Исходя из результата, классификатор K-NN с другими метриками расстояния не дает лучших результатов по сравнению с другими классификаторами, такими как SVM и Random Forest. В то время как SVM и Random Forest дают одинаковую точность в отношении наших данных и подходов.

Заключение

В этом исследовании я использовал SIFT для извлечения признаков и сравнил эту функцию с множеством подходов машинного обучения, таких как K-NN, SVM и Random Forest для классификации маски Чиребона. По точности SVM и Random Forest дают лучший результат по сравнению с K-NN. В последнем подходе мы хотели использовать различные методы извлечения функций, такие как цвет или другой подход к текстуре, а также использовать другой подход машинного обучения для решения классификации масок Чиребона.

Ссылки



Д. Г. Лоу, Отличительные особенности изображения от масштабно-инвариантных ключевых точек, Int. J. Comput. Видение, т. 60, 2004. [Онлайн]. Доступно: http://dx.doi.org/10.1023/B:VISI.0000029664.99615.94

С. Хатко, «Классификация наборов данных по методу k ближайших соседей с семейством
расстояний», препринт arXiv arXiv: 1512.00001, 2015.

Р. Камимура и О. Учида, «Жадное наращивание сети с помощью функций расстояния Минковского», Международная совместная конференция IEEE по нейронным сетям, 2004 г., Будапешт, 2004 г.

Т. Кавер и П. Харт, Классификация паттернов ближайшего соседа, IEEE Trans. Инф. Теор., Т. 13, вып. 1, стр. 21–27, январь 1967 г. [Online]. Доступно: https://doi.org/10.1109/TIT.1967.1053964

Т. Клве, Т.-Т. Лин, С.-К. Цай, В.-Г. Ценг, “Массивы перестановок при расстоянии Чебышева”, 2009.

S. Учебник, Svm - понимание математики - оптимальная гиперплоскость. [Онлайн]. Доступно: «https://www.svm-tutorial.com/2015/06/svmunderstanding-math-part-3/



Л. Брейман, Случайные леса, Машинное обучение, т. 45, нет. 1, pp. 5–32, Oct 2001. [Online]. Доступно: https://doi.org/10.1023/A:1010933404324