В последнее время системы распознавания лиц используются распространенно, а также в магазинах, супермаркетах — для отслеживания движения товаров; на дорогах – для отслеживания движения всех видов транспортных средств и т.д. Интерес к этим системам очень велик в связи с широким кругом задач, которые они решают.
Процесс распознавания лиц в целом состоит из извлечения требуемого фрагмента из изображения и работы над этим фрагментом. В целом задачи распознавания лиц сводятся к отображению изображения и выполнению основных операций таких как кадрирование, отражение, вращение, сегментация, классификация, извлечение признаков, восстановление и распознавание.
В рамках этой статьи рассмотрим возможности Python при обработке изображений. Python является отличным средством для решения подобных задач. Благодаря доступности и растущей популярности Python в качестве языка научно-технического программирования, внутри экосистемы появилось множество первоклассных инструментов для обработки изображений. В нижеприведенном списке некоторые из них:
1. scikit-image
Scikit-image – это Python - пакет с открытым кодом, который работает с массивами NumPy. Он реализует алгоритмы и утилиты для использования в исследовательских, образовательных и промышленных приложениях. Это весьма простая и понятная библиотека даже для новичков в экосистеме Python. Данная библиотека содержит высококачественный и рецензированный код.
Пакет импортируется как skimage, а большинство функций находится внутри подмодулей. Приведем пример фильтрации изображений:
import matplotlib.pyplot as plt
%matplotlib inlinefrom skimage import data,filtersimage = data.coins()
# … или любой массив NumPy!
edges = filters.sobel(image)
plt.imshow(edges, cmap=’gray’)
2. NumPy
NumPy – это одна из основных Python-библиотек с поддержкой массивов. Изображение представляет собой стандартный массив NumPy, содержащий пиксели точек данных. Таким образом, при выполнении основных NumPy-операций (срезы, маски, прихотливое индексирование) мы можем изменять пиксельные значения изображения. Само изображение можно загрузить через skimage и отобразить с помощью Matplotlib.
Пример маскирования изображения через NumPy:
import numpy as np
from skimage import data
import matplotlib.pyplot as plt
%matplotlib inlineimage = data.camera()
type(image)numpy.ndarray #Изображение — это массив NumPymask = image < 87
image[mask]=255
plt.imshow(image, cmap=’gray’)
3. SciPy
SciPy – это такой же важный научный модуль в Python, как и NumPy. Он подходит для решения основных задач по обработке и прочей работе с изображениями. В частности, в подмодуле scipy.ndimage доступны функции, которые работают в n-мерных массивах NumPy. Текущий пакет включает в себя функции для линейной и нелинейной фильтрации, бинарной морфологии, интерполяции В-сплайнами и измерений объектов.
Использование SciPy для размытия изображений с помощью фильтра Гаусса:
from scipy.ndimage import gaussian_filter
>>> a = np.arange(50, step=2).reshape((5,5))
>>> a
array([[ 0, 2, 4, 6, 8],
[10, 12, 14, 16, 18],
[20, 22, 24, 26, 28],
[30, 32, 34, 36, 38],
[40, 42, 44, 46, 48]])
>>> gaussian_filter(a, sigma=1)
array([[ 4, 6, 8, 9, 11],
[10, 12, 14, 15, 17],
[20, 22, 24, 25, 27],
[29, 31, 33, 34, 36],
[35, 37, 39, 40, 42]])
4. PIL/ Pillow
PIL (Python Imaging Library) – это бесплатная Python-библиотека для открытия, работы и сохранения различных форматов изображений.
Pillow – активно развивающийся форк PIL с простой установкой. Он работает на всех основных операционных системах и поддерживает Python 3. Библиотека содержит базовый функционал для обработки изображений, включая точечные операции, фильтры с набором встроенных ядер свертки и преобразование цветового пространства.
Пример улучшения изображения через ImageFilter в Pillow:
from PIL import Image, ImageFilter
#Чтение изображения
im = Image.open( ‘image.jpg’ )
#Отображение изображения
im.show()from PIL import ImageEnhance
enh = ImageEnhance.Contrast(im)
enh.enhance(1.8).show(“30% more contrast”)
5. OpenCV-Python
OpenCV (Open Source Computer Vision Library) – одна из самых популярных библиотек для приложений по компьютерному зрению. OpenCV-Python – это Python-версия интерфейса для OpenCV. OpenCV-Python является отличным решением для высоконагруженных вычислительных программ по компьютерному зрению.
Пример использования OpenCV-Python при изменении цветного рисунка на черно-белый:
import cv2
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to input image")
args = vars(ap.parse_args())
image = cv2.imread(args["image"], cv2.IMREAD_GRAYSCALE)
cv2.imshow("Image", image)
cv2.waitKey(0)
(h, w) = image.shape[:2]
# displaying
print("width: {} pixels".format(w))
print("height: {} pixels".format(h))
cv2.imwrite("photos/newimage.png", image)
6. SimpleCV
SimpleCV – это еще один фреймворк с открытым кодом для создания приложений по компьютерному зрению. С ним у вас появляется доступ к нескольким мощным библиотекам компьютерного зрения (например, OpenCV) без необходимости изучения глубины цвета, файловых форматов, цветовых пространств и т.д.
Захват изображения с камеры используя SimpleCV:
from SimpleCV import Image, Camera
cam = Camera()
img = cam.getImage()
img.save("filename.jpg")
7. Mahotas
Mahotas также является Python-библиотекой для компьютерного зрения и обработки изображений. Она содержит стандартные функции по обработке изображений (фильтры и морфологические операции), а также современные возможности компьютерного зрения для вычисления признаков (обнаружение особых точек и локальные дескрипторы).
Поиск Уолли в картинке:
wfloat = wally.astype(float)
r,g,b = wfloat.transpose((2,0,1))
w = wfloat.mean(2)
pattern = np.ones((24,16), float)
for i in xrange(2):
pattern[i::4] = -1
v = mahotas.convolve(r-w, pattern)
mask = (v == v.max())
mask = mahotas.dilate(mask, np.ones((48,24)))
np.subtract(wally, .8*wally * ~mask[:,:,None], out=wally, casting='unsafe')
imshow(wally)
show()
8. SimpleITK
ITK или Insight Segmentation and Registration Toolkit – это кросс-платформенная система с открытым кодом, предоставляющая расширенный набор инструментов для анализа изображений. Сюда относится и SimpleITK – упрощенный слой, «надстроенный» поверх ITK. Данный слой облегчает работу с библиотекой при быстром прототипировании, обучении и интерпретируемых языках. SimpleITK – это набор инструментов для анализа изображений с большим количеством компонентов, поддерживающих общую фильтрацию, сегментацию и регистрацию изображений.
Например
def getSitkGradient(im):
gradient = sitk.Gradient(im)
gradientn = sitk.gafi(gradient)
gradients = [sitk.Cast(sitk.gifa(gradientn[:,:,:,i]),6) for i in range(gradient.GetNumberOfComponentsPerPixel())]
#gradients = imaging.sortAxes(gradient,[3,0,1,2])
return gradients
9. pgmagick
Pgmagick – обертка на базе Python для библиотеки GraphicsMagick. Систему GraphicsMagick иногда называют швейцарским ножом в обработке изображений. Она предлагает коллекцию эффективных инструментов и библиотек, поддерживающих чтение, запись и операции с изображениями в более чем 88 основных форматах, включая DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM и TIFF.
10. PyCairo
PyCairo представляет собой набор привязок Python-кода для графической библиотеки Cairo. Cairo – это 2D-библиотека для отрисовки векторной графики. Векторная графика интересна тем, что не теряет своей четкости при изменении размеров или трансформации. PyCairo – это набор привязок для Cairo, с помощью которых можно вызывать Cairo-команды из Python.
В целом все эти библиотеки используются для обработки изображений и решения следующих задач: кадрирование, отражение, сегментация, вращение, классификация, восстановление, извлечение признаков, распознавание.
В течение работы над магистерской диссертацией были обработаны изображения для распознавания лиц. Обработанные изображения можно использовать для последующего анализа цифрового изображения, для улучшения качества картинки или извлечения информации для дальнейшего использования, при решениях различных задач видео аналитики, и, в первую очередь, имеет непосредственное применение в системах контроля доступа и идентификации личности.