В этой статье я попытался вам максимально доступно описать, что такое нейросеть и для чего они предназначены. Мы рассмотрели ее простейшую реализацию в виде некоторого классификатора, но мы имели дело с какими то абстрактными числами, по факту ничего не значащими, но это не совсем так. Именно в них и кроется ключ к разгадке работы нейросетей, и именно с ними мы будем непосредственно работать.
Зачем?
Как вы уже могли заметить, в предыдущей статье, так называемый, тренировочный вход у нас представлял собой некоторый числовой массив, где каждая строка матрицы условно можно считать каким либо объектом, совершенно любым, если его можно однозначно описать числовыми характеристиками. В роли этих характеристик у нас выступали элементы каждой строки, или проще, столбцы – это параметры, строки – объекты. Так же у нас была матрица с ответами, для того, чтобы нейросеть могла на их основе обучаться. Ответы представляли собой матрицу всего лишь одним столбцом и количеством строк, равным количеству строк в матрице с объектами.
Так вот, проецируя все это на задачу распознавания изображения, можно провести аналогию, где каждая строка, это наше изображение, а каждый элемент этой строки – значение i-го пикселя, а именно цвет. Но вот несколько но:
- В расширении jpeg или png используется 24 битная система кодирования цветов, что означает, что мы имеем число цветов, равным 2^24, что примерно равно 16,7 миллионов цветов, причем каждый необходимо уникально индексировать. Вопрос, надо ли?
- Во-вторых, взяв стандартное изображение с расoширением HD мы получим 1280 x 720 = 921 000 пикселей, что означает, что наша строка будет длиной почти в миллион элементов. А если у нас тысячи таких строк? Удобно?
К счастью, за нас уже давно все придумали и мы не будем изобретать самолет, низкий поклон операторам Робертса, Превитта и Собеля. Применяя их, мы добиваемся того, что наше изображение как будто бы сворачивается, оставляя только тот минимум информации, который необходим для комфортной работы в нейросети, а именно выделяет контуры изображения. Свертка позволяет решить первую проблему, для решения же второй достаточно в фотошопе уменьшить размеры изображения, чтобы не работать с космическими числами, однако в нейросетях используются несколько иные методы, о которых мы поговорим в последующих статьях, сегодня только свертка, только хардкор!
Формально
Дисклеймер: мы не будем сегодня вдаваться в глубокую математику, я поясню Вам доступным языком, как работает фильтр Собеля, в общих чертах. А общие черты говорят нам, что фильтр представляет из себя 2 матрицы, а точнее маски фильтра, размерами 3х3 элемента, выглядят они так:
Далее происходит то, что называется сверткой изображения:
Каждый фильтр построчно от левого верхнего края проходит по изображению и те числовые значения цвета пикселя умножаются на значение соответствующей ему позиции ячейки фильтра, далее они суммируются и получается некоторое значение Gx, далее второй фильтр применяется к той же области изображения, получаем второе значение Gy и находим их среднеквадратичное, это будет нашим новым значением пикселя:
new_pix = sqrt(Gx^2+Gy^2)
Далее фильтр сдвигается вправо на одну позицию, и все повторяется по новой, пока фильтры не будут применены к каждому пикселю изображения. Получив все новые значения цветов, мы формируем новое изображение.
Фильтр Превитта (правильно на самом деле Прюитта) отличается только коэффициентами, вместо 2 и -2 там 1 и -1 соответственно.
Таким образом, мы избавляемся от лишней информации в виде кучи разных цветов, оставляя самый минимум, с которым нейросети будет гораздо легче работать, все наши объекты нормализуются, и, допустим, различие в цвете фона или самого объекта не будут влиять на работу нейросети, мы ведь понимаем, что котики бывают разного цвета, а нейросеть – нет))
Реализация
Для реализации сего процесса будем использовать среду разработки Spyder, в предыдущей статье мы уже знакомились с ней. Итак, подводный камень, каждый пиксель изображения формата jpeg или png представляет собой триплет – кортеж из 3-х чисел, в диапазоне от 0 до 255, а нам нужно не 3, а 1 число. Что делать? Оттенки серого спешат на помощь. Дело в том, что оттенков серого существует всего 256, так как каждый оттенок представляет собой среднее арифметическое всего триплета, то есть имея красный цвет (255, 0, 0) мы получаем (255+0+0)/3 = 85, зеленый и синий тоже будут соответствовать этому числу, поэтому если 2 изображения красного и зеленого цвета свернуть подобным образом, на выходе они будут одинаковыми, но мы имеем дело не с монотонным, а со сложным изображением с букетом различных цветов (какой каламбур).
Итак, для начала импортируем все необходимые библиотеки:
Библиотека PIL позволит нам работать с изображением, а именно, нам нужно получить информацию о цвете пикселей. В процессе будем сразу преобразовывать их в градации серого и построчно записывать в отдельный список, который потом преобразуем в числовой массив.
Метод load позволяет нам получить цвета пикселей, метод size – ширину и высоту изображения. Для наглядности, мы сформируем новое изображение, перезаписав значения цвета пикселей старого и сохранив его отдельно. Для этого нам нужен модуль ImageDraw.
После этого мы уже работаем с массивом mas_a, в котором у нас записаны числа в диапазоне от 0 до 255. Теперь перейдем непосредственно к самой свертке, инициализируем 2 маски фильтра Собеля:
Далее, как я уже писал выше, необходимо последовательно перемножать маски и фрагмент изображения, мы не будем разбивать имеющийся массив на фрагменты 3х3, мы будем использовать срезы:
Необходимо учесть, что значение цвета не может быть больше 255 и меньше 0, поэтому прописываем соответствующие условия, к тому же, это число должно быть целым, попутно будем записывать наше изображение в новый массив. Итоговое изображение получится меньше исходного, ширина и высоты будут на 2 пикселя меньше исходного из за того, что фильтр не применяется к рамке изображения, но нам это не принципиально, напротив, в следующей статье я расскажу Вам о методах уменьшения исходного изображения с сохранением исходной информации.
Собственно, итог работы такого фильтра мы можете наблюдать на изображениях в этой статье. Вы можете подобрать какие то свои коэффициенты, в зависимости от поставленной задачи, такое вот поле экспериментов)).
- 3Поделились
slot game 6666 เกมส์สล๊อตออนไลน์ slot online สล็อต เล่นง่ายได้เงินจริง ระบบ ฝาก-ถอน AUTO 30 วินาที เพียงแค่นั้น พีจี สล็อตแจกเครดิตฟรี slotgame6666.com มาแรงที่สุดในชั่วโมงนี้
ทดลอง เล่น สล็อต ฟรี สล็อตเว็บไซต์ตรง ไม่ผ่านเอเย่นต์ เปิดใหม่ ของทางค่ายเกม pg ของเรา เป็นอีกหนึ่งศูนย์รวม เกมสล็อตออนไลน์ ที่นักเสี่ยงดวงต่างๆนั้นไว้วางใจอย่างมากที่สุดในขณะนี้