Распознание и классификация изображений с использованием keras в r
Бесплатный доступ
В статье описывается процесс классификации изображений с использованием открытой нейросетевой библиотеки 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)