Распознавание объектов с помощью нейронных сетей

Тематика: 
Автор: 
Нейландс Александра Андисовна
Руководитель: 
Логинова Наталья Александровна
Учреждение: 
МБОУ «СОШ № 2 г. Суздаля»
Класс: 
9

В процессе исследовательской работы по информатике "Распознавание объектов с помощью нейронных сетей" учащейся 9 класса была поставлена цель, написать нейронную сеть на языке Python в среде jupyter notebook, которая будет распознавать образы кошек и собак.

Подробнее о проекте:


В процессе исследовательской работы по информатике "Анимация в PascalABC.NET" ученицей 9 класса было дано определение искусственной нейронной сети и представлено описание сверточной нейронной сети для распознавания двух классов объектов. Для выполнения поставленной цели автор проекта изучил и реализовал работу нейросети в среде jupyter notebook.

В учебном проекте по информатике "Анимация в PascalABCNET" автор подобрал подходящую нейросетевую библиотеку, написал программу, распределяющую dataset на выбранные классы для обучения нейронной сети, написал нейронную сеть, которая определяет объекты, такого же класса, как из dataset, провел обучение нейронной сети классификации предложенных объектов, дал оценку точности (%), осуществил отладку и тестирование полученной нейронной сети.

Оглавление

Введение
1. Искусственная нейронная сеть.
2. Описание сверточной нейронной сети для распознавания двух классов объектов.
3. Обучение нейронной сети.
Заключение
Источники
Приложение

Введение


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

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

Цель моей работы - написать нейронную сеть на языке Python в среде jupyter notebook, которая будет распознавать образы кошек и собак.

Задачи:

  • Понять и реализовать работу нейросети в среде jupyter notebook.
  • Описание сверточной нейронной сети для распознавания двух классов объектов.
  • Подобрать подходящую нейросетевую библиотеку.
  • Написать программу, распределяющую dataset на выбранные классы для обучения нейронной сети.
  • Написать нейронную сеть, которая будет определять объекты, такого же класса, как из dataset.
  • Обучение нейронной сети классификации предложенных объектов.
  • Оценка точности (%).
  • Отладка и тестирование полученной нейронной сети.

Гипотеза: при многократном повторении классификации для другой группы объектов обучение нейронной сети дает более высокий результат опознавания объектов из незнакомого фоторяда.

Искусственная нейронная сеть


Искусственная нейронная сеть — математическая модель, а также её программное или аппаратное воплощение, построенная по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма. Нейронные сети можно классифицировать по многим параметрам. Например, по характеру обучения.

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

Также бывают разные типы нейросетей, причем их достаточно много, вот некоторые из них: сети адаптивного резонанса, свёрточная нейронная сеть, осцилляторная нейронная сеть, неокогнитрон и многие другие. Для данной нейронной сети подойдет обучение с учителем, потому что у меня нет достаточно знаний, чтобы написать программу с другим видом обучения. Обучение с учителем будет быстрее и не так затратно по времени, по сравнению с другими вариантами.

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

Нейросетевая библиотека - программное обеспечение, которое позволяет собрать нейронную сеть под конкретную задачу, визуализировать ее архитектуру, запустить обучение этой нейронной сети и выгрузить обученную сеть для дальнейшего использования. В данном случае, я буду использовать библиотеку Keras — открытая нейросетевая библиотека, написанная на языке Python. Нацелена на оперативную работу с сетями глубинного обучения, при этом спроектирована так, чтобы быть компактной, модульной и расширяемой.

Dataset – это набор данных. В моем случае, это выборка из 25000 фотографий с кошками и собаками (по 12500 на каждый класс). Такой большой dataset нужен для повышения качества распознавания при обучении нейронной сети.

Описание сверточной нейронной сети для распознавания двух классов объектов

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

Для первых четырех блоков модели - 32, 64, 128, 256. Заполнение используется на сверточных слоях для обеспечения соответствия форм высоты и ширины выходных карт объектов входным данным. Модель будет соответствовать стохастическому градиентному спуску. Начало обучения будем осуществлять со скоростью 0,001 при импульсе равном 0,9.

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

Затем мы можем подогнать модель с помощью train iterator (train_it) и использовать test iterator (test_it) в качестве набора данных проверки во время обучения. Модель будет подходить обучение 10 раз (то есть 10 эпох –одна итерация в процессе обучения, включающая предъявление всех примеров из обучающего множества и, возможно, проверку качества обучения на контрольном множестве.), это необходимо для большей точности нейросети.

После подбора окончательная модель может быть оценена непосредственно на наборе тестовых данных и сообщена точность классификации. Затем мы можем загрузить модель и вызвать функцию предсказания, чтобы предсказать содержимое изображения в виде числа между «0» и «1» для «кошка» и «собака» соответственно. Нам же будет выводить «IT’S A CAT» или «IT’S A DOG».

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


Классифицировать объекты можно не только с помощью нейросетей, но и с помощью других программ. В моем случае это проблематичнее, и точность результата значительно уменьшается. Чтобы научить нейросеть различать объекты, понадобится большой dataset. В результате поиска dataset в сети Интернет на сайте был найден смешанный dataset. Для обучения мне необходимы были образцы классов.

Потребовалось написать программу, которая будет распределять фотографии по папкам test и train, а в этих папках создаст подкаталоги, cat и dog. Листинг программы в приложении 1.
Причем в папке test будут не все фотографии, а некоторая часть, по которым нейросеть будет определять точность. После приступила к написанию нейронной сети. Листинг - приложение 2. После описания нейросети на языке Python, я должна была приступить к ее обучению.

По техническим характеристикам и быстродействию мой компьютер не подходит для обучения, я обучала бы на свое компьютере око трех дней нейросеть. Для обучения потребуется компьютер с ОП не менее - 16, Тактовой частотой не менее - 3,7 Ггц, Разрядностью не менее - 64
Можно выбрать три варианта действий. Первый, все равно тренировать нейросеть на моем компьютере. Второй, воспользоваться другим компьютером.

Третий - арендовать облачный сервер. Облачный сервер -мощная физическая или виртуальная инфраструктура, выполняющая приложения и служащая хранилищем обрабатываемой информации. Аренда 1 часа около 55 рублей. Первый вариант меня не устраивал по причине долгого ожидания. Второй тоже не подходил, так как пришлось бы устанавливать много дополнительных приложений, что заняло бы тоже много времени.

Поэтому пришлось выбрать третий вариант. Обучение прошло достаточно быстро для такой выборки и для такого количества эпох, примерно за 15 минут. Нейронная сеть во время обучения показывала, на сколько процентов она точна, после первой части обучения, ее точность была около 50%, а в конце же 98%, что очень хорошо. Обычно в подобных нейросетях точность от 89% до 95%. Была вероятность перетренировать нейросеть из-за большого количества эпох, к счастью, этого не случилось.

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

Заключение


В результате работы в среде jupyter notebook на языке Python, была написана простейшая нейронная сверточная сеть, которая распознает образы двух объектов - кошек и собак. Распознавание объектов достоверно в 98% Поставленная цель достигнута, выдвинутая гипотеза подтверждена в допустимом расхождениях статистических показателях.

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

Для написания данной работы были использованы ресурсы Сети Интернет

Приложение 1

from os import listdir

from os import makedirs

from shutil import copyfile

from random import seed

from random import random

from numpy import asarray

from numpy import save

from keras.preprocessing.image import load_img

from keras.preprocessing.image import img_to_array

from tqdm import tqdm_notebook

dataset_home = 'dataset_dogs_vs_cats/'

subdirs = ['train/', 'test/']

for subdir in subdirs:

# создание подкаталогов с определенными именами

labeldirs = ['dogs/', 'cats/']

for labldir in labeldirs:

newdir = dataset_home + subdir + labldir

makedirs(newdir, exist_ok=True)

# генерация случайных чисел

seed(1)

# определение соотношения изображений, используемых для проверки

val_ratio = 0.25

# копирование изображений обучающего набора данных в подкаталоги

src_directory = 'train/'

for file in tqdm_notebook(listdir(src_directory)):

src = src_directory + '/' + file

dst_dir = 'train/'

if random() < val_ratio:

dst_dir = 'test/'

if file.startswith('cat'):

dst = dataset_home + dst_dir + 'cats/' + file

copyfile(src, dst)

elif file.startswith('dog'):

dst = dataset_home + dst_dir + 'dogs/' + file

copyfile(src, dst)

Приложение 2


# vgg16 модель, используемая для переноса обучения dataset из кошек и собак

import sys

from matplotlib import pyplot

from keras.utils import to_categorical

from keras.applications.vgg16 import VGG16

from keras.models import Model

from keras.layers import Dense

from keras.layers import Flatten

from keras.optimizers import SGD

from keras.preprocessing.image import ImageDataGenerator

# определение модели cnn

def define_model():

# загрузка модели

model = VGG16(include_top=False, input_shape=(224, 224, 3))

# отмечаем загруженные слои как не поддающиеся обучению

for layer in model.layers:

layer.trainable = False

# добавляем новые слои классификатора

flat1 = Flatten()(model.layers[-1].output)

class1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)

output = Dense(1, activation='sigmoid')(class1)

# определение новой модели

model = Model(inputs=model.inputs, outputs=output)

# компиляция модели

opt = SGD(lr=0.001, momentum=0.9)

model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])

return model

# диагностика учебной модели

def summarize_diagnostics(history):

# потери

pyplot.subplot(211)

pyplot.title('Cross Entropy Loss')

pyplot.plot(history.history['loss'], color='blue', label='train')

pyplot.plot(history.history['val_loss'], color='orange', label='test')

# точность

pyplot.subplot(212)

pyplot.title('Classification Accuracy')

pyplot.plot(history.history['acc'], color='blue', label='train')

pyplot.plot(history.history['val_acc'], color='orange', label='test')

# сохранение в файл

filename = sys.argv[0].split('/')[-1]

pyplot.savefig(filename + '_plot.png')

pyplot.close()

# запуск тестовой программы для оценки

def run_test_harness():

# определение модели

model = define_model()

# генерация данных

datagen = ImageDataGenerator(featurewise_center=True)

# указание средних значений картинок для работы с ними

datagen.mean = [123.68, 116.779, 103.939]

# подготавление итератора

train_it = datagen.flow_from_directory('dataset_dogs_vs_cats/train/',

class_mode='binary', batch_size=64, target_size=(224, 224))

test_it = datagen.flow_from_directory('dataset_dogs_vs_cats/test/',

class_mode='binary', batch_size=64, target_size=(224, 224))

# fit model

history = model.fit_generator(train_it, steps_per_epoch=len(train_it),

validation_data=test_it, validation_steps=len(test_it), epochs=10, verbose=1)

# оценка модели

_, acc = model.evaluate_generator(test_it, steps=len(test_it), verbose=0)

print('> %.3f' % (acc * 100.0))

# кривая обучаемости - графическое представление изменения скорости обучения определённому знанию или виду деятельности

summarize_diagnostics(history)

# сохранение модели

model.save('final_model.h5')

print("Finished.")

#конец программы

run_test_harness()


Если страница Вам понравилась, поделитесь ссылкой с друзьями:

Вставитьjs: 
нет