Введение в свертки с использованием Python

| | | | | | | | | | | | | | | | | | | | | | |

Изучение функций
Развитие возможностей или извлечение функций — именно процесс извлечения полезных шаблонов из входных данных поможет модели прогнозирования лучше понять реальную природу проблемы. Хорошая функция обучения будет выявлять шаблоны таким образом, что это значительно повысит точность и производительность применяемых алгоритмов машинного обучения, что было бы невозможно или слишком дорого для самого машинного обучения. Алгоритмы обучения функций находят общие закономерности, важные для различения требуемых классов, и автоматически извлекают их. После этого процесса они готовы к использованию в задачах классификации или регрессии.
Давайте рассмотрим популярную задачу классификации изображений, классификацию изображений лиц и безликих лиц. На заре компьютерного зрения ученые пытались решить эту проблему с помощью алгоритмов ручного кодирования, чтобы обнаружить возможные черты человеческого лица, такие как форма, глаза, нос, губы и т. д. Этот подход обычно давал плохие результаты, потому что лицо может выглядеть как и многие сорта. что невозможно было объяснить даже значительную часть признаков. Простое изменение освещения или ориентации может изменить изображение таким образом, что алгоритмы перестанут распознавать лица.
В 1998 году Ян Лекун представил концепцию сверточных нейронных сетей, которые способны классифицировать изображения рукописных символов с точностью около 99 %. Большим преимуществом сверточных нейронных сетей является то, что они необычайно хорошо обнаруживают особенности в изображениях, которые увеличиваются после каждого уровня, что приводит к высокоуровневым характеристикам. Последние слои (может быть один или несколько) используют все эти сгенерированные функции для классификации или регрессии.
свертка
свертка — это операция, которая выполняется над изображением для извлечения из него элементов, применяя меньший тензор, называемый ядром, подобно скользящему окну над изображением. В зависимости от значений в сверточном ядре мы можем выделить из изображения определенные шаблоны. В следующем примере мы покажем, как определить горизонтальные и вертикальные края изображения с помощью соответствующих ядер.

python3

< br>

import numpy as np

import matplotlib.pyplot as plt


# пусть img1 будет ничем не примечательным image

img1 = нп. массив ([np.array ([ 200 , 200 ]), np.array ([ 200 , 200 ])])

img2 = np.array ([np.array ( [ 200 , 200 ]), np.array([ 0 , 0 ])])

img3 = np.array ([np.array ([ 200 , 0 ]), np.array([ 200 , 0 ])])

kernel_horizontal = np .array([np.array([ 2 , 2 ]), np.array ([ - 2 , - 2 ])])

print (kernel_horizontal, `является ядром для обнаружения горизонтальных ребер ` )

kernel_vertical = np.array ([np.array ([ 2 , - 2 ]), np.array ([ 2 , - 2 ])])

print (kernel_vertical , `является ядром для обнаружения вертикальных границ` )


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

def apply_kernel (img, ядро):

return np. sum (np.multiply (img, kernel))


# Отрисовка Img1
plt.imshow (img1)

plt.axis ( `off` )

plt.title ( ` img1` )

plt.show ()


# Проверка горизонтальных и вертикальных объектов в image1

print ( `Надежность горизонтального края оценка:` , apply_kernel (img1,

kernel_horizontal))

print ( `Показатель достоверности вертикального края:` , apply_kernel (img1,

kernel_vertical))


# Отрисовка Img2
plt.imshow (img2)

plt.axis ( `off` )

plt.title ( `img2` )

plt.show ()


# Проверка горизонтальных и вертикальных объектов в изображении2

print ( `Показатель достоверности горизонтального края:` , apply_kernel (img2,

kernel_horizontal ))

print ( `Показатель достоверности вертикального края:` , apply_kernel (img2,

kernel_vertical))


# Рендеринг Img3
plt.imshow (img3)

plt.axis ( `off` )

plt.title ( ` img3 ` )

plt.show ()

< br> # Проверка горизонтальных и вертикальных объектов на изображении3

print ( `Показатель достоверности горизонтального края:` , apply_kernel (img3,

kernel_horizontal))

print ( `Показатель достоверности вертикального края:` , apply_kernel (img3,

kernel_vertical))


Выход:

[[ 2 2]
[-2 -2]] — это ядро для обнаружения горизонтальных границ
[[2 -2]
[2 -2]] — это ядро для обнаружения вертикальных границ

Показатель достоверности горизонтального края: 0
Показатель достоверности вертикального края: 0

Показатель достоверности горизонтального края: 800
Показатель достоверности вертикального края: 0

Показатель достоверности горизонтального края: 0
Показатель достоверности вертикального края: 800