Цель написания этой статьи - использовать очень грубый подход к классификации изображений, в данном случае изображений рукописного текста. Хотя мы используем модели сверточной нейронной сети с нуля или используем предварительно обученную модель на наборах данных 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/