14 KiB
Введение в компьютерное зрение
Компьютерное зрение — это область, цель которой заключается в том, чтобы научить компьютеры понимать цифровые изображения на высоком уровне. Это довольно широкое определение, так как понимание может означать множество разных вещей, включая нахождение объекта на изображении (обнаружение объектов), понимание происходящего (обнаружение событий), описание изображения текстом или реконструкцию сцены в 3D. Существуют также специальные задачи, связанные с изображениями людей: определение возраста и эмоций, обнаружение и идентификация лиц, а также оценка позы в 3D, и это лишь некоторые из них.
Тест перед лекцией
Одна из самых простых задач компьютерного зрения — это классификация изображений.
Компьютерное зрение часто рассматривается как часть искусственного интеллекта. Сегодня большинство задач компьютерного зрения решаются с использованием нейронных сетей. Мы подробнее изучим специальный тип нейронных сетей, используемых в компьютерном зрении, сверточные нейронные сети, в этом разделе.
Однако, прежде чем передать изображение в нейронную сеть, во многих случаях имеет смысл использовать алгоритмические методы для его улучшения.
Существует несколько библиотек Python для обработки изображений:
- imageio используется для чтения/записи различных форматов изображений. Она также поддерживает ffmpeg — полезный инструмент для преобразования видеокадров в изображения.
- Pillow (также известная как PIL) обладает большими возможностями и поддерживает такие манипуляции с изображениями, как морфинг, настройка палитры и многое другое.
- OpenCV — мощная библиотека обработки изображений, написанная на C++, которая стала де-факто стандартом в этой области. Она имеет удобный интерфейс для Python.
- dlib — библиотека на C++, реализующая множество алгоритмов машинного обучения, включая некоторые алгоритмы компьютерного зрения. Она также имеет интерфейс для Python и может использоваться для сложных задач, таких как обнаружение лиц и ключевых точек лица.
OpenCV
OpenCV считается де-факто стандартом для обработки изображений. Она содержит множество полезных алгоритмов, реализованных на C++. OpenCV можно вызывать и из Python.
Хорошее место для изучения OpenCV — это курс Learn OpenCV. В рамках нашей программы мы не ставим цель изучить OpenCV, но покажем несколько примеров, где и как она может быть использована.
Загрузка изображений
Изображения в Python удобно представлять в виде массивов NumPy. Например, черно-белое изображение размером 320x200 пикселей будет храниться в массиве размером 200x320, а цветное изображение тех же размеров будет иметь форму 200x320x3 (для 3 цветовых каналов). Чтобы загрузить изображение, можно использовать следующий код:
import cv2
import matplotlib.pyplot as plt
im = cv2.imread('image.jpeg')
plt.imshow(im)
Традиционно OpenCV использует кодировку BGR (синий-зеленый-красный) для цветных изображений, в то время как остальные инструменты Python используют более привычный RGB (красный-зеленый-синий). Чтобы изображение отображалось правильно, его нужно преобразовать в цветовое пространство RGB, либо поменяв местами измерения в массиве NumPy, либо вызвав функцию OpenCV:
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
Та же функция cvtColor может использоваться для выполнения других преобразований цветового пространства, таких как преобразование изображения в черно-белое или в HSV (оттенок-насыщенность-яркость).
С помощью OpenCV можно также загружать видео покадрово — пример приведен в упражнении OpenCV Notebook.
Обработка изображений
Перед передачей изображения в нейронную сеть может быть полезно выполнить несколько шагов предварительной обработки. OpenCV позволяет делать множество вещей, включая:
- Изменение размера изображения с помощью
im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS) - Размытие изображения с помощью
im = cv2.medianBlur(im,3)илиim = cv2.GaussianBlur(im, (3,3), 0) - Изменение яркости и контрастности изображения можно выполнить с помощью манипуляций с массивами NumPy, как описано в этой заметке на Stackoverflow.
- Использование пороговой обработки с помощью функций
cv2.threshold/cv2.adaptiveThreshold, что часто предпочтительнее, чем настройка яркости или контрастности. - Применение различных преобразований к изображению:
- Афинные преобразования полезны, если нужно объединить вращение, изменение размера и наклон изображения, зная исходное и конечное положение трех точек. Афинные преобразования сохраняют параллельность линий.
- Перспективные преобразования полезны, если известны исходные и конечные позиции четырех точек на изображении. Например, если вы фотографируете прямоугольный документ с угла, а затем хотите получить прямоугольное изображение самого документа.
- Понимание движения на изображении с помощью оптического потока.
Примеры использования компьютерного зрения
В нашем OpenCV Notebook мы приводим примеры, где компьютерное зрение может быть использовано для выполнения конкретных задач:
- Предварительная обработка фотографии книги на шрифте Брайля. Мы показываем, как можно использовать пороговую обработку, обнаружение признаков, перспективное преобразование и манипуляции с NumPy для разделения отдельных символов шрифта Брайля для дальнейшей классификации нейронной сетью.
![]() |
![]() |
![]() |
|---|
Изображение из OpenCV.ipynb
- Обнаружение движения на видео с помощью разницы кадров. Если камера фиксирована, то кадры из видеопотока должны быть довольно похожи друг на друга. Так как кадры представлены в виде массивов, просто вычитая массивы двух последовательных кадров, мы получим разницу пикселей, которая будет небольшой для статичных кадров и увеличиваться при значительном движении на изображении.
Изображение из OpenCV.ipynb
-
Обнаружение движения с использованием оптического потока. Оптический поток позволяет понять, как отдельные пиксели на видеокадрах перемещаются. Существует два типа оптического потока:
- Плотный оптический поток вычисляет векторное поле, показывающее, куда перемещается каждый пиксель.
- Разреженный оптический поток основывается на выделении характерных признаков изображения (например, краев) и построении их траектории от кадра к кадру.
Изображение из OpenCV.ipynb
✍️ Примерные ноутбуки: OpenCV попробуйте OpenCV в действии
Давайте проведем эксперименты с OpenCV, изучив OpenCV Notebook.
Заключение
Иногда относительно сложные задачи, такие как обнаружение движения или определение кончиков пальцев, можно решить исключительно с помощью компьютерного зрения. Поэтому очень полезно знать основные техники компьютерного зрения и возможности таких библиотек, как OpenCV.
🚀 Задание
Посмотрите это видео из AI Show, чтобы узнать о проекте Cortic Tigers и о том, как они создали решение на основе блоков для демократизации задач компьютерного зрения с помощью робота. Проведите исследование других подобных проектов, которые помогают новичкам освоить эту область.
Тест после лекции
Обзор и самостоятельное изучение
Прочитайте больше об оптическом потоке в этом отличном руководстве.
Задание
В этой лабораторной работе вам нужно будет снять видео с простыми жестами, и ваша цель — извлечь движения вверх/вниз/влево/вправо с использованием оптического потока.




