tl;dr
Мы построим глубокую нейронную сеть, которая сможет распознавать изображения с точностью 78,4%, объясняя при этом методы, используемые на протяжении всего процесса.
Вступление
Последние достижения в области глубокого обучения сделали возможными такие задачи, как распознавание изображений и речи.
Глубокое обучение: подмножество алгоритмов машинного обучения, которое очень хорошо распознает шаблоны, но обычно требует большого количества данных.
Глубокое обучение превосходно распознает объекты на изображениях, поскольку оно реализовано с использованием 3 или более слоев искусственных нейронных сетей, где каждый слой отвечает за извлечение одной или нескольких характеристик изображения (подробнее об этом позже).
Нейронная сеть: вычислительная модель, которая работает аналогично нейронам в человеческом мозгу. Каждый нейрон принимает входные данные, выполняет некоторые операции, а затем передает выходные данные следующему нейрону.
Мы собираемся научить компьютер распознавать изображения и классифицировать их по одной из этих 10 категорий:
Для этого нам сначала нужно научить компьютер, как выглядят кошка, собака, птица и т. Д., Прежде чем он сможет распознать новый объект. Чем больше кошек видит компьютер, тем лучше он распознает кошек. Это называется обучением с учителем. Мы можем выполнить эту задачу, пометив изображения, компьютер начнет распознавать шаблоны, присутствующие на изображениях кошек, которые отсутствуют на других изображениях, и начнет строить свое собственное познание.
Мы собираемся использовать Python и TensorFlow для написания программы. TensorFlow - это платформа глубокого обучения с открытым исходным кодом, созданная Google, которая дает разработчикам детальный контроль над каждым нейроном (известный как «узел» в TensorFlow), чтобы вы могли регулировать веса и достигать оптимальной производительности. TensorFlow имеет множество встроенных библиотек (некоторые из которых мы будем использовать для классификации изображений) и имеет замечательное сообщество, так что вы сможете найти реализации с открытым исходным кодом практически для любой темы глубокого обучения.
Итак, давайте - давайте научим компьютер классифицировать изображения!
Машинное обучение для изображений
Компьютеры могут выполнять вычисления с числами и не могут интерпретировать изображения так, как это делаем мы. Мы должны каким-то образом преобразовать изображения в числа, чтобы компьютер их понял.
В Обработке изображений есть два распространенных способа сделать это:
- Использование оттенков серого:
Изображение будет преобразовано в оттенки серого (диапазон оттенков серого от белого до черного), компьютер присвоит каждому пикселю значение в зависимости от его темноты. Все числа помещаются в массив, и компьютер выполняет вычисления с этим массивом. Вот как число 8 отображается при использовании оттенков серого:
Затем мы загружаем полученный массив в компьютер:
2. Использование значений RGB:
Цвета могут быть представлены как значения RGB (сочетание красного, зеленого и синего в диапазоне от 0 до 255). Затем компьютеры могут извлечь значение RGB каждого пикселя и поместить результат в массив для интерпретации.
Когда компьютер интерпретирует новое изображение, он преобразует изображение в массив, используя ту же технику, которая затем сравнивает шаблоны чисел с уже известными объектами. Затем компьютер присваивает каждому классу оценки достоверности. Класс с наивысшей оценкой достоверности обычно является прогнозируемым.
CNN в двух словах
Одним из самых популярных методов, используемых для повышения точности классификации изображений, являются сверточные нейронные сети (сокращенно CNN).
Сверточная нейронная сеть: нейронные сети особого типа, которые работают так же, как и обычные нейронные сети, за исключением того, что в начале у них есть сверточный слой.
Вместо того, чтобы передавать все изображение в виде массива чисел, изображение разбивается на несколько плиток, после чего машина пытается предсказать, что представляет собой каждая плитка. Наконец, компьютер пытается предсказать, что изображено на картинке, на основе предсказания всех плиток. Это позволяет компьютеру распараллеливать операции и обнаруживать объект независимо от того, где он находится на изображении.
Набор данных
Мы решили использовать набор данных CIFAR-10, состоящий из 60 000 изображений размером 32 x 32 пикселя. Набор данных содержит 10 классов, которые являются взаимоисключающими (не перекрываются), причем каждый класс содержит 6000 изображений. Изображения маленькие, четко обозначены и не имеют шума, что делает набор данных идеальным для этой задачи со значительно меньшими затратами на предварительную обработку. Вот несколько снимков, взятых из набора данных:
Шаг 1. Предварительная обработка
Во-первых, нам нужно добавить немного дисперсии к данным, поскольку изображения из набора данных очень организованы и практически не содержат шума. Мы собираемся искусственно добавить шум с помощью библиотеки Python под названием imgaug. Мы собираемся произвольно комбинировать следующие изображения с изображениями:
- Обрезать части изображения
- Отразить изображение по горизонтали
- Отрегулируйте оттенок, контраст и насыщенность
Вот как выглядит код Python для предварительной обработки изображений:
def pre_process_image(image, training): # This function takes a single image as input, # and a boolean whether to build the training or testing graph. if training: # For training, add the following to the TensorFlow graph. # Randomly crop the input image. image = tf.random_crop(image, size=[img_size_cropped, img_size_cropped, num_channels]) # Randomly flip the image horizontally. image = tf.image.random_flip_left_right(image) # Randomly adjust hue, contrast and saturation. image = tf.image.random_hue(image, max_delta=0.05) image = tf.image.random_contrast(image, lower=0.3, upper=1.0) image = tf.image.random_brightness(image, max_delta=0.2) image = tf.image.random_saturation(image, lower=0.0, upper=2.0) # Some of these functions may overflow and result in pixel # values beyond the [0, 1] range. It is unclear from the # documentation of TensorFlow 0.10.0rc0 whether this is # intended. A simple solution is to limit the range. # Limit the image pixels between [0, 1] in case of overflow. image = tf.minimum(image, 1.0) image = tf.maximum(image, 0.0) else: # For training, add the following to the TensorFlow graph. # Crop the input image around the centre so it is the same # size as images that are randomly cropped during training. image = tf.image.resize_image_with_crop_or_pad(image, target_height=img_size_cropped, target_width=img_size_cropped) return image
Шаг 2: разделение нашего набора данных
Расчет градиента модели с использованием всего большого набора данных занимает много времени. Поэтому мы будем использовать небольшой пакет изображений во время каждой итерации оптимизатора. Размер пакета обычно составляет 32 или 64 - мы будем использовать 64, поскольку у нас довольно много изображений. Затем набор данных делится на обучающий набор, содержащий 50 000 изображений, и тестовый набор, содержащий 10 000 изображений.
train_batch_size = 64 def random_batch(): # Number of images in the training-set. num_images = len(images_train) # Create a random index. idx = np.random.choice(num_images, size=train_batch_size, replace=False) # Use the random index to select random images and labels. x_batch = images_train[idx, :, :, :] y_batch = labels_train[idx, :] return x_batch, y_batch
Шаг 3: построение сверточной нейронной сети
Теперь, когда мы закончили предварительную обработку и разделение набора данных, мы можем приступить к реализации нашей нейронной сети. У нас будет 3 свёрточных слоя с максимальным объединением 2 x 2.
Максимальное объединение: метод, используемый для уменьшения размеров изображения путем взятия максимального значения сетки в пикселях. Это также помогает уменьшить переоснащение и делает модель более универсальной. В приведенном ниже примере показано, как работает максимальный пул 2 x 2.
После этого добавляем 2 полностью связанных слоя. Поскольку вход полностью связанных слоев должен быть двухмерным, а выход сверточного слоя - четырехмерным, нам нужен выравнивающий слой между ними.
В самом конце полностью связанных слоев находится слой softmax.
Идентификация параметров - сложная задача, так как нам нужно настроить очень много параметров. Поэтому мы прочитали много ресурсов и попытались найти способ сделать это. Однако, похоже, это основано на опыте. Итак, мы нашли структуру, созданную Алексом Крижевским, который использовал эту структуру и выиграл чемпиона ImageNet LSVRC-2010. Поскольку наша работа намного проще, чем его работа, мы использовали только 3 сверточных слоя и поддерживали градиент между каждым из них.
Полученные результаты
Теперь, когда у нас есть обученная нейронная сеть, мы можем ее использовать! Затем мы заставили компьютер интерпретировать 10 000 неизвестных изображений и получили точность 78,4% (7844/10000). Что интересно, неверные прогнозы выглядят довольно близко к тому, что думал компьютер.
Возьмем, к примеру, картинку в правом верхнем углу. Картинка похожа на кота, сидящего в грузовике. Компьютер вполне может предсказать это как грузовик.
Заключение
Нам удалось построить искусственную сверточную нейронную сеть, которая может распознавать изображения с точностью до 78%, используя TensorFlow. Мы сделали это путем предварительной обработки изображений, чтобы сделать модель более универсальной, разбили набор данных на несколько пакетов и, наконец, построили и обучили модель.