Введение
Цель работы: Изучить некоторые темы Искусственного Интеллекта. Разработать программы с библиотекой OpenCV наязыке Python для их использования на уроках технологии.
Задачи: Подобрать, изучить и систематизировать специализи-рованную литературу и работы по данной проблеме.
Много лет назад (в 1985 г.) в Киевском Институте кибернетики
им. В.М. Глушкова АН УССР проходила конференция по Технологии программирования. Теме Искусственного Интеллекта было посвящено всего несколько докладов. Мы (Терехов А.И. и др.) представляли результаты тестирования «R-технологии программирования» [1], разработанной Вельбицким И. В. в Институте кибернетики. В этой технологии впервые предлагалось не писать, а рисовать программы с помощью только одной дуги графа, у которой сверху записываются Условие, а снизу выполняемые Действия. Технология была опробована при проектировании ракетно-космических систем в СССР.
С тех пор изменились компьютеры, расширен потенциал научных приложений, появилось Машинное обучение, Нейронные сети, Компьютерное зрение. Искусственный Интеллект стал реальным помощником в принятии решений в экономике, в медицине и в других областях жизни.
В данной статье мы представим современные темы для понимания основ - “Как это получается?”, используем язык программирования Python и библиотеки OpenCV, NumPy и другие.
Глава 1: Определение объекта по цвету
с помощью компьютерного зрения.
Рассмотрим ключевые моменты тем: библиотека OpenCV ицветовые схемы.
OpenCV (Open Source Computer Vision Library) одна из самых известных, бесплатных, современных библиотек машинного зрения. Но не только зрения, там огромный набор методов для работы с графикой и видео.
Предполагаем, что Python установлен. Далее ставим из репозитория OpenCV из интернета, набрав в Командной строке команду pip, как показано ниже.
pip install opencv-python
pip install opencv-contrib-python
Нам потребуется еще библиотека NumPy - это библиотека языка Python, добавляющая поддержку больших многомерных массивов и матриц:
pip install numpy
После установки проверяем простой командой в среде IDE Python.
>>>import cv2
>>>
Ошибок нет - запускаем программу, используем видеокамеру ноутбука и покажем, что видит камера. Код на языке Python для этого показан ниже:
import cv2 # подключаем библиотеку OpenCV
cap = cv2.VideoCapture(0) # подключаем видеокамеру
while True:
ret, img = cap.read() # открываем видеопоток
cv2.imshow("camera", img) # показываем видеопоток
if cv2.waitKey(10) == 27: # Клавиша Esc для выхода
break
cap.release() # После нажатия Esc видеопоток закрывам
cv2.destroyAllWindows() # После нажатия Esc закрываем все
Теперь перейдем к цвету. На компьютере используется разные цветовые схемы. Популярный формат RGB используется для света пикселя в мониторе. Для задачи определения объекта по цвету потребуется формат HSV [2]. HSV отражает тон цвета (Hue), насыщенность цвета (Saturation) и яркость (Value). HSV изображается цилиндром, как показано ниже.
Цвет (Hue) кодируется цыфрами от 0 до 360
Насыщенность (Saturation) и яркость (Value) цвета кодируются цифрами от 0 до 255 в OpenCV (8-ми битные целые числа). Однако, в популярном графическом редакторе GIMP, как видно из скрина ниже, S и V значения кодируются от 0 до 100 (%). Параметры красного цвета в модели RGB (Red, Green, Blue): Красный R: 255, Зеленый G: 0, Синий B: 0.
В OpenCV надо формат RGB конвертировать в HSV. В модели HSV красный цвет имеет параметры в GIMP : Тон H: 0, Насыщенность S: 100,
Яркость V: 100.
Заметим, что кроме OpenCV нам понадобятся библиотеки NumPy для создания массивов, содержащих нижнюю и верхнюю границы цветовой схемы HSV.
Для красного цвета определим нижнюю и верхнюю границу цвета в схеме HSV :
lower_range = np.array([0, 100, 100], dtype=np.uint8)
upper_range = np.array([20, 255, 255], dtype=np.uint8)
“dtype = np.uint8” просто обозначает, что мы будем использовать 8 битные целые числа. Теперь, создадим маску «Красного» цвета с помощью метода inRange кодов на языке Python, показанных ниже:
import numpy as np # подключаембиблиотеку NumPy
import cv2 # подключаембиблиотеку OpenCV
img_J = cv2.imread('svetofor_0.png', 1) # читаемфайл
hsv = cv2.cvtColor(img_J, cv2.COLOR_BGR2HSV) # ковентируемв HSV
lower_range = np.array([0, 100, 100], dtype=np.uint8) # красныйцвет
upper_range = np.array([20, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, lower_range, upper_range) # маскацвета
cv2.imshow('maska',mask) # показываем маску цвета
cv2.imshow('svetofor', img_J) # показываем исходный файл
while(1):
k = cv2.waitKey(0)
if(k == 27):
break
cv2.destroyAllWindows()
Запустимпрограммунаязыке Python. В результате видим на скринах: белые пиксели в «маске» определяют тот цвет, который «горит». Слева - «Красный» цвет на светофоре. В центре: «горит - желтый», справа: «горит зеленый». Маска – это битовое изображение, т.е. состояние пикселя 0 или 1.
Оставим в качестве задач определение цвета Н в схеме HSV для подбора маски «Желтого» и «Зеленого» цветов, т.е. значения для границ lower_range
и upper_range. Задачи:
Определить нижнюю и верхнюю границу цвета в схеме HSV для «Желтого» цвета светофора:
lower_range = np.array([…, 100, 100], dtype=np.uint8) # желтый
upper_range = np.array([…, 255, 255], dtype=np.uint8)
Определить нижнюю и верхнюю границу цвета в схеме HSV для «Зеленого» цвета светофора:
lower_range = np.array([…, 100, 100], dtype=np.uint8) # зеленый
upper_range = np.array([…, 255, 255], dtype=np.uint8)
Дорожные знаки распознаются так же: способом подбора маски. Слева маска, справа дорожный знак.
Красная маска Синяя маска Белая маска
Так работает система программ «Автопилот» на машине без водителя.
Однако в реальности знаки могут быть бледными, старыми, повернутыми. Поэтому наступает этап включения Искусственного Интеллекта (ИИ). Об этом в Главе – Простейшие нейронные сети.
Глава 2: Следование за объектом в реальном
времени с помощью компьютерного зрения.
Отслеживание - это широко исследуемая тема. Для отслеживания перемещение объекта с помощью OpenCV надо установить библиотеки: PyPI, imutils, argparse, collections. В программе включить видео поток (vs = VideoStream(src=0).start()) и отображать «трековые» точки [2, 4]. Результаты показаны на скриншотах выше. Программыможно взять на нашем сайте [9] - загрузить коды .
Глава 3: Простейшие нейронные сети
Нейронная сеть - это машинная интерпретация мозга человека, в котором находятся около 86 миллиардов нейронов, передающих информацию в виде электрических импульсов. .
В искусственной нейронной сети Нейрон — это вычислительная единица, которая получает информацию, производит над ней простые вычисления и передает ее дальше в соответствии с его весом. Совокупность весов нейронной сети или матрица весов — это своеобразный мозг всей системы. Благодаря этим весам, входная информация обрабатывается и превращается в результат.
Самыми распространенными применениями нейронных сетей является:
а) Классификация — распределение данных по параметрам. Например, на вход дается набор людей и нужно решить, кому из них давать кредит, а кому нет. Эту работу может сделать нейронная сеть, анализируя такую информацию как: возраст, платежеспособность, кредитная история и тд.
б) Предсказание — возможность предсказывать следующий шаг. Например, рост или падение акций, основываясь на ситуации на фондовом рынке.
в) Распознавание — в настоящее время, самое широкое применение нейронных сетей. Используется в Google, когда вы ищете фото. .
На рисунке ниже показаны нейроны. Они делятся на три основные типа: входной (синий), скрытый (красный) и выходной (зеленый). Соответственно, есть входной слой, который получает информацию, несколько скрытых слоев, которые ее обрабатывают и выходной слой, который выводит результат.
Простейший перцептрон способен выполнять только самые простые операции. Для того, чтобы выполнять более сложные вычисления, нам нужна структура с большим количеством скрытых слоёв.
Рассмотрим как работает нейронная сеть. В данном примере изображена часть нейронной сети, где буквами I обозначены входные нейроны, буквой H — в скрытом слое нейрон, а буквой w — веса.
Из формулы видно, что входная информация — это сумма всех входных данных, умноженных на соответствующие им веса. Вес - это как сила решения, его важность. Дадим на вход 1 и 0. Пусть w1=0.4 и
w2 = 0.7. Входные данные нейрона Н1 будут следующими: 1*0.4+0*0.7=0.4 . Теперь когда у нас есть входные данные, мы можем получить выходные данные, подставив входное значение в функцию активации для нормализации входных данных в диапазоне значений [0,1]. Теперь, когда у нас есть выходные данные, мы передаем их дальше. И так, мы повторяем для всех слоев, пока не дойдем до выходного нейрона. Запустив такую сеть в первый раз мы увидим, что ответ далек от правильного, потому что сеть не натренирована. Чтобы улучшить результаты мы будем ее тренировать.
Для тренировки нужен большой массив данных. Так для изображений используется сеть ImageNet [8], содержащая более 15 миллионов изображений и проводятся соревнования сетей. Первая сеть, которая победила на международном соревновании на базе ImageNet в 2012 году - это AlexNet сеть. AlexNet использовала метод, который первым показал практическую пользу «сверточной нейронной сети» СНС ( или CNN - convolutional neural network ) [7]. В такой сети нейроны группируются в наборы «патчей». Нейрон реагирует, если примерно такой кусок изображения он видит в окне своего ядра свертки, в области видимости.
Слой нейронной сети – это просто совокупность нейронов, которые работают на одних и тех же признаках. У каждого из нейронов свои веса, на которых он взвешивает такие признаки. Задача обучения сети в подборе таких весов у каждого из нейронов, которые оптимизируют функцию ошибки. Функция F1 – это один слой таких нейронов, и после применения функция у нас получается некоторое новое пространство признаков. На рисунке ниже показана задача распознавания класса и преобразование пространства признаков от слоя к слою.
Последовательно применяя эти преобразования, у нас получается общая функция F – функция преобразования нейронной сети.
Глава 4: Раскраска старых черно-белых
фотографий и видео с помощью OpenCV и
Искусственного Интеллекта.
Подход Искусственного Интеллекта (ИИ) реализован в виде прямого прохода в СНС ("Свёрточная Нейронная Сеть") во время тестирования. ИИ обучен работе с более чем 15 миллионом цветных изображений. В свободном доступе есть обученные файлы СНС (colorization_deploy_v2.prototxt , colorization_release_v2.caffemodel) [7].
Для окрашивания будет использоваться в этом проекте цветовая модель ”Lab”. Цветовое пространство CIELAB (также известное как CIE L*a*b* или иногда сокращенно просто "Lab" цветового пространства) - это цветовое пространство, определенное Международной комиссией по освещению (CIE) в 1976 году. Он выражает цвет как три числовых значения: L* для яркости и a* и b* для зелено-красных и сине-желтых компонентов цвета.
В отличие от цветовой модели RGB, цвет Lab предназначен для соответствия человеческому зрению. Она стремится к единообразию восприятия, а ее L-компонент тесно связан с восприятием человека. Компонент L* является именно тем, что используется в качестве входных данных для модели ИИ. Обученные файлы СНС «оценивают» оставшиеся компоненты "a" и "b".
Имея тренированную модель (общедоступную), мы можем использовать ее для окрашивания новой черно-белой фотографии, где эта фотография будет являться входом в модель или компонентом "L". Выводом модели будут другие компоненты "a" и "b", которые после добавления к оригиналу "L", будут создавать полноцветную фотографию, как показано здесь. Наши черно-белые фотографии 1986 года и окрашивание их «обученной нейронной сетью»:
Экскурсия в Эрмитаж в 1986 г. : верхняя фотография – очередь в Эрмитаж,
слева – в Эрмитаже, справа – мы с родственниками.
Цвет, представленный в HSV, зависит от устройства, на которое он будет выведен, так как HSV — преобразование модели RGB, которая тоже зависит от устройства. Для получения кода цвета, не зависящего от устройства, используется модель Lab.
Светлота 25 % Светлота 75 %
Lab предоставляет возможность избирательного воздействия на отдельные цвета в изображении, усиления цветового контраста, незаменимыми являются и возможности, которые это цветовое пространство предоставляет для борьбы с “шумом” на цифровых фотографиях.
Глава 5: Компьютерное зрение
– распознавание лиц
Вот мы с вами и подошли к самому интересному. К поиску лица (лиц) на фото или в видеопотоке. Для поиска мы будем использовать Каскад Хаара.
Обученный Каскад Хаара, принимая на вход изображение, определяет, есть ли на нем искомый объект (набор прямоугольных областей), т.е. выполняет задачу классификации, разделяя входные данные на два класса (есть искомый объект, нет искомого объекта):
Что нам важно знать для поиска лиц: все это уже есть в
библиотеке OpenCV [5]. Еще нам нужны классификаторы Хаара haarcascade_frontalface_default.xml . Ихможно взять с Github OpenCV [6]. По этому сразу покажем код:
import cv2 # подключаем библиотеку OpenCV
# загружаем уже обученные классификаторы
faceCascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0) # подключаемвидеокамеру
whileTrue:
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Переводим в серый цвет
faces = faceCascade.detectMultiScale( # поисклиц
gray, #
scaleFactor=1.2, # коэффициент уменьшения размера
minNeighbors=5, # сколько соседей в прямоугольнике
minSize=(20, 20) # Объекты меньшего размера игнорируются
)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
cv2.imshow("camera", img)
if cv2.waitKey(10) == 27: # Esc key
break
cap.release()
cv2.destroyAllWindows()
Алгоритм Хаара и по сей день считается достаточно точным , очень быстрым и имеет широкое применение.
Заключение
Мы узнали как появились нейросети. Все началось с попыток ученых приблизить принцип работы компьютера к образу мышления человека. На это ушли десятилетия исследований, и в итоге это стало возможным при помощи нейросетей — компьютерных систем, собранных из сотен, тысяч или миллионов искусственных клеток мозга, которые способны обучаться и действовать по принципу, чрезвычайно похожему на то, как работает мозг человека.
Области использования нейросетей ничем не ограничены. Так, они могут осуществлять поиск по картинке или выступать в роли голосового ассистента —
та же Алиса уже максимально приблизилась по своему поведению к реальному
человеку. Или высчитывать вероятность заболеваний, находить опухоли на
снимках, бороться с мошенниками и так далее.
Можно ли самому научиться работать с нейросетями. Раньше такая возможность предоставлялась только ученым, поскольку наработки в области нейронных сетей и машинного обучения были слишком «сырыми». Но сейчас любая технологическая компания генерирует огромный объем данных, который нужно обрабатывать, чтобы затем на его основе оптимизировать бизнес и проанализировать перспективы. Для этого и других задач, связанных с нейросетями и машинным обучением, нужны специалисты по Data Science, Computer Vision Engeneer.
Что мы узнали. OpenCV — отличная библиотека с лёгкими в исполь-зовании параметрами алгоритмов для редактирования изображений и видео, отслеживании и идентификации объектов и людей на видео, поиске идентичных изображений из набора и для много-много чего ещё. Эта библиотека очень важна для тех, кто разрабатывает проекты, связанные с машинным обучением в области изображений.
Что мы не узнали. Мы не рассмотрели фреймворки. Так, например, благодаря фреймворку Caffe погружение в Deep Learning не вызывает больших трудностей. Достаточно создать пару конфигурационных файлов и одной командой запустить процесс обучения. Конечно, также нужны базовые познания в теории искусственных нейронных сетей. Для профессиональной работы надо быть специалистом по фреймворкам TensorFlow или PyTorch.
Таким образом, мы только вначале пути - увлечения темой Искусственного Интеллекта и Компьютерного зрения. Многие увлекаются на год - два, но успехов достигнет тот, кто увлечется на долгие годы.
Список источников
Вельбицкий И.В.: Графическое программирование и доказательство правильности программ https://alterozoom.com/en/documents/18177.html
Object Detection and Tracking with OpenCV and Python https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/
Rosebrock A. OpenCV and Python Color Detection https://www.pyimagesearch.com/2014/08/04/opencv-python-color-detection/
Rosebrock A. OpenCV Object Tracking https://www.pyimagesearch.com/2018/07/30/opencv-object-tracking/
Rosebrock A. Face recognition with OpenCV, Python, and deep learning https://www.pyimagesearch.com/2018/06/18/face-recognition-with-opencv-python-and-deep-learning/
ageitgey/face_recognition https://github.com/ageitgey/face_recognition
Rosebrock A. Black and white image colorization with OpenCV and Deep Learning https://www.pyimagesearch.com/2019/02/25/black-and-white-image-colorization-with-opencv-and-deep-learning/
База данных ImageNet http://www.image-net.org/
http://data-city.ru/
Приложение
На уроках Технологии мы также изучаем 3D моделирование и 3D печать, станки ЧПУ, основы Робототехники (на платах Arduino и Raspberry Pi) [9] .