Цель написания этой статьи - использовать очень грубый подход к классификации изображений, в данном случае изображений рукописного текста. Хотя мы используем модели сверточной нейронной сети с нуля или используем предварительно обученную модель на наборах данных MNIST, она более подготовлена для этой работы. Мы используем трансферное обучение, и в этом процессе я сам, будучи студентом, упускаю из виду самые основы. Это похоже на то, что я веду машину с автоматической коробкой передач, в которой я знаю, что делают трансмиссия, сцепление, акселератор и тормоза, но я ничего не знаю, кроме этого. Мы пытаемся разбить проблему распознавания образов рукописного алфавита на простой процесс, а не на использование тяжелых пакетов. Это попытка создать данные, а затем построить модель с использованием машин опорных векторов для классификации.
Подготовка данных
Мы собираемся подготовить данные вручную, а не загружать их из Интернета. Это позволило бы нам понять наши данные с самого начала. Мы собираемся вручную написать несколько алфавитов на белом листе и сделать снимки с камеры телефона. Затем мы портируем его на наш жесткий диск. Поскольку это эксперимент, в котором я не хочу тратить много времени на начальный запуск, я бы создал данные для двух или трех различных алфавитов для демонстрации. Рекомендуется попробовать этот механизм для всех алфавитов и убедиться в эффективности. Возможно, вам придется изменить свой код, когда вы добавите дополнительный класс алфавитов, но именно здесь и начнется обучение. Сейчас мы находимся на стадии обучения.
Структура хранения данных
Мы можем либо написать алфавиты на белой бумаге, а затем извлечь их с помощью камеры телефона, либо напрямую использовать графический инструмент, такой как краска, для письма с помощью инструмента «Перо». Я создал две папки train и test. В папке поезда мы можем сохранять папки с алфавитными именами, а в тестовой папке мы можем сбрасывать изображения, для которых мы хотим окончательно классифицировать экземпляры. Подпапки обучения сохранены с намерением иметь имя подпапки в качестве тегов обучения. Папка Testing не сохранилась в той форме, в которой мы собираемся проводить классификацию.
В качестве альтернативы, если вы хотите загрузить данные, которые я использовал, щелкните правой кнопкой мыши ссылку загрузить данные и откройте в новой вкладке или в новом окне. Затем разархивируйте папки, и вы увидите ту же структуру и данные, что и выше, в папке загрузок.
Позже вы должны создать свои собственные данные и повторить весь процесс заново. Это дало бы возможность увидеть полный цикл.
Загрузите пакеты зависимостей в RStudio
Мы будем использовать пакет jpeg в R для обработки изображений и реализацию машины поддержки вектора из пакета kernlab. Это будет одноразовая установка. Также мы убедились, что данные изображения имеют размер 200 x 200 пикселей с разрешением по горизонтали и вертикали 120 точек на дюйм. Вы можете попробовать варианты цветовых каналов и разрешения позже, как только вы внедрите их в текущую форму.
# install package "jpeg" install.packages("jpeg", dependencies = TRUE) # install the "kernlab" package for building the model using support vector machines install.packages("kernlab", dependencies = TRUE)
Загрузка набора обучающих данных
# load the "jpeg" package for reading the JPEG format files library(jpeg) # set the working directory for reading the training image data set setwd("C:/Users/mohan/Desktop/alphabet_folder/Train") # extract the directory names for using as image labels f_train<-list.files() # Create an empty data frame to store the image data labels and the extracted new features in training environment df_train<- data.frame(matrix(nrow=0,ncol=5))
Функциональная инженерия
Поскольку мы намерены не использовать типичный подход CNN, мы собираемся использовать значения белого, серого и черного пикселей для создания новых функций. Мы намерены использовать суммирование всех значений пикселей экземпляра изображения и сохранить его в функции, называемой «сумма», при этом количество всех пикселей, оцениваемых как «ноль», равно нулю, а количество всех пикселей, оцениваемых как «единицы». и сумма всех пикселей, оценивающих значения, отличные от нуля, и единицы как «in_between». Функция «метка» извлекается из имени папки.
# names the columns of the data frame as per the feature name schema names(df_train)<- c("sum","zero","one","in_between","label") # loop to compute as per the logic counter<-1 for(i in 1:length(f_train)) { setwd(paste("C:/Users/mohan/Desktop/alphabet_folder/Train/",f_train[i],sep="")) data_list<-list.files() for(j in 1:length(data_list)) { temp<- readJPEG(data_list[j]) df_train[counter,1]<- sum(temp) df_train[counter,2]<- sum(temp==0) df_train[counter,3]<- sum(temp==1) df_train[counter,4]<- sum(temp > 0 & temp < 1) df_train[counter,5]<- f_train[i] counter=counter+1 } } # Convert the labels from text to factor form df_train$label<- factor(df_train$label)
Постройте модель машины опорных векторов
# load the "kernlab" package for accessing the support vector machine implementation library(kernlab) # build the model using the training data image_classifier <- ksvm(label~.,data=df_train)
Загрузка набора данных тестирования
# set the working directory for reading the testing image data set setwd("C:/Users/mohan/Desktop/alphabet_folder/Test") # extract the directory names for using as image labels f_test <- list.files() # Create an empty data frame to store the image data labels and the extracted new features in training environment df_test<- data.frame(matrix(nrow=0,ncol=5)) # Repeat of feature extraction in test data names(df_test)<- c("sum","zero","one","in_between","label") # loop to compute as per the logic for(i in 1:length(f_test)) { temp<- readJPEG(f_test[i]) df_test[i,1]<- sum(temp) df_test[i,2]<- sum(temp==0) df_test[i,3]<- sum(temp==1) df_train[counter,4]<- sum(temp > 0 & temp < 1) df_test[i,5]<- strsplit(x = f_test[i],split = "[.]")[[1]][1] } # Use the classifier named "image_classifier" built in train environment to predict the outcomes on features in Test environment df_test$label_predicted<- predict(image_classifier,df_test) # Cross Tab for Classification Metric evaluation table(Actual_data=df_test$label,Predicted_data=df_test$label_predicted)
Я бы посоветовал вам изучить концепции машины опорных векторов, которые нельзя полностью изучить в этой статье, нажав на эту ссылку для моих бесплатных видеокурсов по науке о данных и машинному обучению. Несмотря на то, что мы использовали пакет kernlab и создали классификатор, здесь требуется много математических расчетов, начиная с векторного пространства и заканчивая трюками с ядром. Мы работали над реализацией классификатора, но вам непременно следует изучить концептуальную часть машины опорных векторов и других интересных алгоритмов.
Первоначально опубликовано на https://imurgence.com/