Распознание и классификация изображений с использованием keras в r

Автор: Босых О.С.

Журнал: Форум молодых ученых @forum-nauka

Статья в выпуске: 1-1 (29), 2019 года.

Бесплатный доступ

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

Глубокое обучение, искусственные нейронные сети, анализ изображений

Короткий адрес: https://sciup.org/140284519

IDR: 140284519

Текст научной статьи Распознание и классификация изображений с использованием keras в r

Задача анализа изображений одна из классических задач области практического применения искусственных нейронных сетей. В рамках настоящего исследования приводится решение задачи распознания объектов с использованием открытой нейросетевой библиотеки keras [1]. Keras является одной из популярнейших библиотек, используемых в области работы с сетями глубокого обучения, по своей популярности уступая только TensorFlow.

Исходным набором данных для решения задачи послужили находящиеся в свободном доступе изображения автомобилей и самолетов. Для работы было выбрано небольшое количество изображений, а именно по 6 изображений каждого из объекта, планируемого к классификации (рис.1).

Рисунок 1. Набор исходных объектов для обучения и тестирования нейронной сети

Для удобства обработки, изображения были именованы схожим образом и помещены в рабочую область нового проекта R. Изображения не являются стандартными для работы объектами в языках программирования, по этой причине для подготовки изображения для работы используется специальный пакет EBImage из открытого репозитория Bioconductor [2].

Для подготовки изображения к дальнейшей обработке используются: команды чтения изображения – readImage (из пакета EBImage), команда изменения размера – resize (EBImage) и команда array_reashape (keras) для подготовки списка к формату, необходимому для работы с данными для обучения. После проведения чтения данные были распределены на тренировочную и тестовую выборки, так 5 из 6 изображений каждого объекта послужили для тренировки, а шестое изображение стало тестовым для проверки корректности работы сети. Задача распознавания изображения проводилось с соответствующей разметкой данных, для этих целей были созданы векторы trainy и testy. Значение 0 в векторе отвечает за самолет, 1 – за автомобиль. Данные значения переведены в категориальный формат посредством функции to_categorical пакета keras и далее используются для построения модели (рис. 2.).

  • 1    # Чтение изображений

  • 2    pics <- c('pl.jpg', 'p2.jpg*, 'p3.jpg', 'p4.jpg*, 'p5.jpg', ’p6.jpg’,

  • 3             'cl.jpg', 'c2.jpg', 'c3.jpg', 'c4.jpg*, 'c5.jpg', ’c6.jpg’)

  • 4    mypic <- list()

  • 5    for (i in 1:12) {mypic[[ij] <- readlmage(pics[i])}

  • 7    # Подготовка изображения

  • 8    for (i in 1:12) {mypic[[ij] <- resize(mypic[[i]], 28, 28)}

  • 9    for (i in 1:12) {mypic[[ij] <- array_reshape(mypic[[i]], c(28, 28, 3))}

  • 11    # Подготовка тренировочного и тестового набора данных

  • 12    trainx <- NULL

  • 13    for (i in 1:5) {trainx <- rbindftrainx, mypic[[i]])}

  • 14    for (i in 7:11) {trainx <- rbindftrainx, mypic[[i]])}

  • 15    str(trainx)

  • 16    testx <- rbind(mypic[[6]], mypic[[12]J)

  • 17    trainy <- c(0,0,0,0,0,1,1,1,1,1 )

  • 18    testy <- c(0, 1)

  • 19    trainLabels <- to_categorical(trainy)

  • 20    testLabels <- to_categorical(testy)

Рисунок 2. Исходный код чтения и подготовки изображений для обучения и тестирования нейронной сети

В нейронной сети используется 3 слоя, каждый из которых имеет меньшее количество выходных значений по сравнению с предыдущим (рис. 3,4).

  • 22    # Построение модели

  • 23    model <- keras_model_sequential()

  • 24    model %>%

    25    layer_dense(units = 256, activation = "relu", input_shape = c(2352)) %>%

26    layer_dense(units = 128, activation = "relu") %>%

27    layer_dense(units = 2, activation = "softmax")

  • 28    summary(model)

  • 30    # Компиляция модели

  • 31    model %>%

  • 32    compile(loss = "binary_crossentropy",

  • 33            optimizer = optimizer_rmsprop(),

  • 34            metrics = c('accuracy'))

  • 36 # Обучение нейронной сети

37 history <- model %>%

38 fit(trainx,

39        trainLabels,

40        epochs = 30,

41        batch_size = 32,

42        validation_split =0.1)

Рисунок 3. Исходный код построения, сборки и обучения нейронной сети

В первых двух слоях используется функция активации ReLU – «выпрямитель». В отличие от сигмоиды или гиперболического тангенса ReLU нейроны не подвержены насыщению, применение ReLU существенно (до 6 раз) повышает скорость сходимости градиентного спуска.

Layer (type)

Output

Shape

Param #

dense_l (Dense)

(None,

256)

602368

dense_2 (Dense)

(None,

128)

32896

dense_3 (Dense)

(None,

2)

258

Total params: 635,522

Trainable params: 635,522

Non-trainable params: 0

Рисунок 4. Структура слоев нейронной сети

Оценка и прогноз предсказания проводилась на тренировочных данных и на тестовых данных, для работы использовались стандартные команды языка R и модель, построенная в keras (рис. 5,6).

45 # Оценка и прогноз (тренировочные данные)

46 model %>% evaluate(trainx, trainLabels)

47 pred <- model %>% predict_classes(trainx)

48 table(Predicted = pred, Actual = trainy)

49 prob <- model %>% predict_proba(trainx)

50 cbind(prob, Prected = pred, Actual= trainy)

52 # Оценка и прогноз (тестовые данные)

53 model %>% evaluate(testx, testLabels)

54 pred <- model %>% predict_classes(testx)

55 table(Predicted = pred, Actual = testy)

56 prob <- model %>% predict_proba(testx)

57 cbind(prob, Prected = pred, Actual= testy)

Рисунок 5. Исходный код оценки и прогноза модели

> table(Predicted = pred, Actual = trainy Actual

Predicted 0 1 0 5 1 10 4

> table(Predicted = pred, Actual = testy) Actual

Predicted 0 1 0 10 10 1

Рисунок 6. Результат оценки и прогноза модели

Как видно из итоговых значений (рис. 6.), обученная нейронная сеть справляется с 90% данных, использованных при тренировке, и корректно отработала на тестовых значениях, верно определив оба представленных изображения. Данный результат особенно важен с учетом небольших значений исходных данных и отсутствия специальной обработки.

Список литературы Распознание и классификация изображений с использованием keras в r

  • Home - Keras Documentation URL: https://keras.io (дата обращения: 13.01.2019)
  • Bioconductor - EBImage URL: https://www.bioconductor.org/packages/release/bioc/html/EBImage.html (дата обращения: 13.01.2019)
Статья научная