Оглавление:
- Шаг 1: BoM - Спецификация материалов
- Шаг 2: Установка пакета OpenCV 3
- Шаг 3. Тестирование камеры
- Шаг 4: Распознавание лиц
- Шаг 5: Сбор данных
- Шаг 6: тренер
- Шаг 7: распознаватель
- Шаг 8: Заключение
Видео: Распознавание лиц в реальном времени: комплексный проект: 8 шагов (с изображениями)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:53
В моем последнем руководстве по OpenCV мы изучили АВТОМАТИЧЕСКОЕ ОТСЛЕЖИВАНИЕ ОБЪЕКТОВ ВИДЕНИЯ. Теперь мы будем использовать нашу PiCam для распознавания лиц в реальном времени, как вы можете видеть ниже:
Этот проект был выполнен с помощью этой фантастической «Библиотеки компьютерного зрения с открытым исходным кодом» OpenCV. В этом руководстве мы сосредоточимся на Raspberry Pi (то есть Raspbian как ОС) и Python, но я также протестировал код на своем Mac, и он также отлично работает. OpenCV был разработан для вычислительной эффективности и с упором на приложения реального времени. Таким образом, он идеально подходит для распознавания лиц в реальном времени с помощью камеры.
Чтобы создать законченный проект по распознаванию лиц, мы должны работать над 3 очень разными фазами:
- Обнаружение лиц и сбор данных
- Обучите распознаватель
- Распознавание лица
На приведенной ниже блок-схеме возобновляются эти этапы:
Шаг 1: BoM - Спецификация материалов
Основные части:
- Raspberry Pi V3 - 32 доллара США.
- 5-мегапиксельный сенсор 1080p OV5647 Mini Camera Video Module - US $ 13.00
Шаг 2: Установка пакета OpenCV 3
Я использую Raspberry Pi V3, обновленный до последней версии Raspbian (Stretch), поэтому лучший способ установить OpenCV - это следовать отличному руководству, разработанному Адрианом Роузброком: Raspbian Stretch: установить OpenCV 3 + Python на Raspberry Pi.
Я пробовал несколько разных руководств по установке OpenCV на свой Pi. Учебник Адриана - лучший. Я советую вам сделать то же самое, шаг за шагом следуя его указаниям.
После того, как вы закончите учебник Адриана, у вас должна быть виртуальная среда OpenCV, готовая для проведения наших экспериментов на вашем Pi.
Зайдем в нашу виртуальную среду и убедимся, что OpenCV 3 правильно установлен.
Адриан рекомендует запускать команду «source» каждый раз, когда вы открываете новый терминал, чтобы убедиться, что системные переменные настроены правильно.
источник ~ /.profile
Затем войдем в нашу виртуальную среду:
workon cv
Если перед приглашением вы видите текст (cv), значит, вы находитесь в виртуальной среде cv:
(cv) pi @ raspberry: ~ $Адриан обращает внимание на то, что виртуальная среда cv Python полностью независима и отделена от версии Python по умолчанию, включенной в загрузку Raspbian Stretch. Таким образом, любые пакеты Python в глобальном каталоге site-packages не будут доступны для виртуальной среды cv. Точно так же любые пакеты Python, установленные в пакетах сайтов cv, не будут доступны для глобальной установки Python.
Теперь введите в свой интерпретатор Python:
питон
и подтвердите, что вы используете версию 3.5 (или выше)
Внутри интерпретатора (появится ">>>") импортируйте библиотеку OpenCV:
импорт cv2
Если сообщения об ошибках не появляются, OpenCV правильно установлен НА ВАШЕЙ ВИРТУАЛЬНОЙ СРЕДЕ PYTHON.
Вы также можете проверить установленную версию OpenCV:
cv2._ version_
Должна появиться 3.3.0 (или более высокая версия, которая может быть выпущена в будущем). Вышеупомянутый терминал PrintScreen показывает предыдущие шаги.
Шаг 3. Тестирование камеры
После того, как вы установили OpenCV в свой RPi, давайте проверим, чтобы убедиться, что ваша камера работает правильно.
Я предполагаю, что у вас уже установлена PiCam на Raspberry Pi.
Введите приведенный ниже код Python в свою среду IDE:
импортировать numpy как np
import cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # установить ширину cap.set (4, 480) # установить высоту while (True): ret, frame = cap.read () frame = cv2. flip (frame, -1) # Повернуть камеру по вертикали gray = cv2.cvtColor (frame, cv2. COLOR_BGR2GRAY) cv2.imshow ('frame', frame) cv2.imshow ('gray', gray) k = cv2.waitKey (30) & 0xff if k == 27: # нажмите 'ESC', чтобы выйти из break cap.release () cv2.destroyAllWindows ()
Приведенный выше код будет захватывать видеопоток, который будет сгенерирован вашей камерой PiCam, отображая оба цвета в цвете BGR и в сером режиме.
Обратите внимание, что я повернул камеру вертикально из-за того, как она собрана. Если это не ваш случай, прокомментируйте или удалите командную строку «перевернуть».
Вы также можете загрузить код с моего GitHub: simpleCamTest.py
Для выполнения введите команду:
python simpleCamTest.py
Чтобы завершить программу, вы должны нажать клавишу [ESC] на клавиатуре.
Щелкните мышью в окне видео перед нажатием [ESC]
На картинке выше показан результат.
Некоторые производители обнаружили проблемы при попытке открыть камеру (сообщения об ошибке «Assertion failed»). Это могло произойти, если камера не была включена во время установки OpenCv, и поэтому драйверы камеры установились некорректно. Для исправления используйте команду:
sudo modprobe bcm2835-v4l2
Вы также можете добавить bcm2835-v4l2 в последнюю строку файла / etc / modules, чтобы драйвер загружался при загрузке.
Чтобы узнать больше об OpenCV, вы можете следовать руководству: loading -video-python-opencv-tutorial
Шаг 4: Распознавание лиц
Самая основная задача распознавания лиц - это, конечно же, «Распознавание лиц». Прежде всего, вы должны «захватить» лицо (Фаза 1), чтобы распознать его, по сравнению с новым лицом, захваченным в будущем (Фаза 3).
Наиболее распространенный способ обнаружения лица (или любых объектов) - использование «классификатора каскада Хаара».
Обнаружение объектов с использованием каскадных классификаторов Хаара - это эффективный метод обнаружения объектов, предложенный Полом Виолой и Майклом Джонсом в их статье «Быстрое обнаружение объектов с использованием усиленного каскада простых функций» в 2001 году. Это подход, основанный на машинном обучении. Каскадная функция обучается на большом количестве положительных и отрицательных изображений. Затем он используется для обнаружения объектов на других изображениях.
Здесь мы будем работать с распознаванием лиц. Изначально алгоритму требуется много положительных изображений (изображений лиц) и негативных изображений (изображений без лиц) для обучения классификатора. Затем нам нужно извлечь из него функции. Хорошей новостью является то, что OpenCV поставляется с детектором и тренером. Если вы хотите обучить свой собственный классификатор для любого объекта, такого как автомобиль, самолет и т. Д., Вы можете использовать OpenCV для его создания. Его полная информация представлена здесь: Обучение каскадному классификатору.
Если вы не хотите создавать свой собственный классификатор, OpenCV уже содержит множество предварительно обученных классификаторов для лица, глаз, улыбки и т. Д. Эти файлы XML можно загрузить из каталога haarcascades.
Хватит теории, давайте создадим детектор лиц с OpenCV!
Загрузите файл faceDetection.py с моего GitHub.
импортировать numpy как np
import cv2 faceCascade = cv2. CascadeClassifier ('Cascades / haarcascade_frontalface_default.xml') cap = cv2. VideoCapture (0) cap.set (3, 640) # установить ширину cap.set (4, 480) # установить высоту, пока True: ret, img = cap.read () img = cv2.flip (img, -1) серый = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale (gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (20, 20)) для (x, y, w, h) в гранях: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = серый [y: y + h, x: x + w] roi_color = img [y: y + h, x: x + w] cv2.imshow ('video', img) k = cv2.waitKey (30) & 0xff if k == 27: # нажмите 'ESC', чтобы выйти из break cap.release () cv2.destroyAllWindows ()
Вы не поверите, но несколько приведенных выше строк кода - это все, что вам нужно для обнаружения лица с помощью Python и OpenCV.
Когда вы сравните с последним кодом, использованным для тестирования камеры, вы поймете, что к нему было добавлено несколько деталей. Обратите внимание на строку ниже:
faceCascade = cv2. CascadeClassifier ('Каскады / haarcascade_frontalface_default.xml')
Это строка, которая загружает «классификатор» (который должен находиться в каталоге с именем «Cascades /» в каталоге вашего проекта).
Затем мы настроим нашу камеру и внутри цикла загрузим наше входное видео в режиме оттенков серого (то же, что мы видели раньше).
Теперь мы должны вызвать нашу функцию-классификатор, передав ей некоторые очень важные параметры, такие как масштабный коэффициент, количество соседей и минимальный размер обнаруженного лица.
Faces = faceCascade.detectMultiScale (серый, scaleFactor = 1,2, minNeighbors = 5, minSize = (20, 20))
Где,
- серый - это входное изображение в градациях серого.
- scaleFactor - это параметр, определяющий, насколько уменьшается размер изображения при каждом масштабе изображения. Он используется для создания масштабной пирамиды.
- minNeighbors - это параметр, определяющий, сколько соседей должен иметь каждый прямоугольник-кандидат, чтобы сохранить его. Чем больше число, тем меньше ложных срабатываний.
- minSize - это минимальный размер прямоугольника, который считается лицом.
Функция обнаружит лица на изображении. Далее мы должны «отметить» лица на изображении, используя, например, синий прямоугольник. Это делается с помощью этой части кода:
для (x, y, w, h) в гранях:
cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) roi_gray = серый [y: y + h, x: x + w] roi_color = img [y: y + h, x: x + w]
Если лица найдены, он возвращает положения обнаруженных лиц в виде прямоугольника с левым верхним углом (x, y) и с шириной «w» и высотой «h» ==> (x, y, w, час). См. Изображение выше.
Как только мы получим эти местоположения, мы можем создать «ROI» (нарисованный прямоугольник) для лица и представить результат с помощью функции imshow ().
Запустите указанный выше скрипт python в своей среде python, используя терминал Rpi:
python faceDetection.py
Результат:
Вы также можете включить классификаторы для «обнаружения глаз» или даже «обнаружения улыбки». В этих случаях вы включите функцию классификатора и рисование прямоугольника внутри цикла лица, потому что не будет смысла обнаруживать глаз или улыбку за пределами лица.
Обратите внимание, что на Pi наличие нескольких классификаторов в одном коде замедлит обработку, если этот метод обнаружения (HaarCascades) использует большую вычислительную мощность. На настольном компьютере запустить его проще.
На моем GitHub вы найдете и другие примеры:
faceEyeDetection.py
faceSmileDetection.py
faceSmileEyeDetection.py
И на картинке выше вы можете увидеть результат.
Вы также можете следовать приведенному ниже руководству, чтобы лучше понять функцию распознавания лиц:
Каскадное обнаружение объектов Haar Face & Eye OpenCV Python Учебное пособие
Шаг 5: Сбор данных
Прежде всего, я должен поблагодарить Рамиза Раджа за его отличную работу над распознаванием лиц на фотографиях:
РАСПОЗНАВАНИЕ ЛИЦ С ПОМОЩЬЮ OPENCV И PYTHON: РУКОВОДСТВО ДЛЯ НАЧИНАЮЩИХ
а также Анирбан Кар, который разработал очень подробное руководство с использованием видео:
РАСПОЗНАВАНИЕ ЛИЦА - 3 части
Я действительно рекомендую вам взглянуть на оба руководства.
Сказав это, давайте начнем первую фазу нашего проекта. То, что мы будем делать здесь, начинается с последнего шага (Обнаружение лиц), мы просто создадим набор данных, где мы будем хранить для каждого идентификатора группу фотографий серого цвета с той частью, которая использовалась для обнаружения лица.
Сначала создайте каталог, в котором вы разрабатываете свой проект, например, FacialRecognitionProject:
mkdir FacialRecognitionProject
В этом каталоге, помимо трех сценариев Python, которые мы создадим для нашего проекта, мы должны сохранить в нем классификатор лиц. Вы можете скачать его с моего GitHub: haarcascade_frontalface_default.xml
Затем создайте подкаталог, в котором мы будем хранить образцы наших лиц, и назовите его «набор данных»:
набор данных mkdir
И скачайте код с моего GitHub: 01_face_dataset.py
импорт cv2
import os cam = cv2. VideoCapture (0) cam.set (3, 640) # установить ширину видео cam.set (4, 480) # установить высоту видео face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # Для каждого человека введите один числовой идентификатор лица face_id = input ('\ n введите идентификатор пользователя end press ==>') print ("\ n [INFO] Инициализация захвата лица. Посмотрите в камеру и подождите…") # Инициализируйте индивидуальный счетчик числа лиц выборки = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # перевернуть видеоизображение по вертикали серым = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = face_detector.detectMultiScale (серый, 1.3, 5) для (x, y, w, h) в гранях: cv2.rectangle (img, (x, y), (x + w, y + h), (255, 0, 0), 2) count + = 1 # Сохранить захваченное изображение в папку наборов данных cv2.imwrite ("dataset / User." + str (face_id) + '.' + str (count) + ".jpg", серый [y: y + h, x: x + w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # Нажмите 'ESC' для выхода из видео, если k == 27: break elif count> = 30: # Возьмите 30 образцов лица и остановите видео паузу # Сделайте ab это очистки print ("\ n [INFO] Выход из программы и очистка") cam.release () cv2.destroyAllWindows ()
Код очень похож на код, который мы видели для распознавания лиц. Мы добавили «команду ввода» для захвата идентификатора пользователя, который должен быть целым числом (1, 2, 3 и т. Д.).
face_id = input ('\ n введите идентификатор пользователя end press ==>')
И для каждого из захваченных кадров мы должны сохранить его как файл в каталоге «набора данных»:
cv2.imwrite ("набор данных / Пользователь." + str (face_id) + '.' + str (count) + ".jpg", серый [y: y + h, x: x + w])
Обратите внимание, что для сохранения указанного выше файла вы должны импортировать библиотеку «os». Имя каждого файла будет соответствовать структуре:
User.face_id.count.jpg
Например, для пользователя с face_id = 1 четвертый образец файла в каталоге dataset / будет выглядеть примерно так:
User.1.4.jpg
как показано на фото выше с моего Pi. В моем коде я беру 30 образцов с каждого идентификатора. Вы можете поменять его на последнем "элифе". Количество образцов используется для разрыва цикла, в котором снимаются образцы лиц.
Запустите скрипт Python и запишите несколько идентификаторов. Вы должны запускать сценарий каждый раз, когда хотите объединить нового пользователя (или изменить фотографии для уже существующего).
Шаг 6: тренер
На этом втором этапе мы должны взять все пользовательские данные из нашего набора данных и «обучить» OpenCV Recognizer. Это делается напрямую с помощью конкретной функции OpenCV. Результатом будет файл.yml, который будет сохранен в каталоге "trainer /".
Итак, приступим к созданию подкаталога, в котором мы будем хранить обученные данные:
mkdir трейнер
Загрузите с моего GitHub второй скрипт Python: 02_face_training.py
импорт cv2
импортировать numpy как np из PIL import Image import os # Путь к базе данных изображений лиц path = 'dataset' распознаватель = cv2.face. LBPHFaceRecognizer_create () Detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # функция для получения изображений и данных меток def getImagesAndLabels (path): imagePaths = [os.path.join (path, f) для f в os.listdir (path)] faceSamples = ids = для imagePath в imagePaths: PIL_img = Image.open (imagePath).convert ('L') # преобразовать его в оттенки серого img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [- 1]. split (".") [1]) Faces = DetectMultiScale (img_numpy) для (x, y, w, h) в лицах: faceSamples.append (img_numpy [y: y + h, x: x + w]) ids.append (id) return faceSamples, ids print ("\ n [INFO] Тренировка лиц. Это займет несколько секунд. Подождите…") faces, ids = getImagesAndLabels (path) распознаватель.train (faces, np.array (ids)) # Сохраните модель в trainer / trainer.yml распознаватель.write ('trainer / trainer.yml') # распознаватель.save () работала на Mac, но не на Pi # Распечатайте количество обученных лиц и завершите программу печати ("\ n [INFO] {0} лица обучены. Выход из программы».format (len (np.unique (ids))))
Убедитесь, что на вашем Rpi установлена библиотека PIL. Если нет, запустите следующую команду в Терминале:
pip install подушка
В качестве распознавателя мы будем использовать распознаватель лиц LBPH (LOCAL BINARY PATTERNS HISTOGRAMS), включенный в пакет OpenCV. Делаем это в следующей строке:
распознаватель = cv2.face. LBPHFaceRecognizer_create ()
Функция getImagesAndLabels (path) возьмет все фотографии в каталоге: «dataset /», вернув 2 массива: «Ids» и «faces». Используя эти массивы в качестве входных данных, мы «обучим наш распознаватель»:
распознаватель.train (лица, идентификаторы)
В результате файл с именем «trainer.yml» будет сохранен в ранее созданном нами каталоге трейнера.
Вот и все! Я включил последний оператор печати, где я отображал для подтверждения количество лиц пользователя, которых мы обучили.
Каждый раз, когда вы выполняете Фазу 1, Фаза 2 также должна выполняться
Шаг 7: распознаватель
Теперь мы подошли к завершающей фазе нашего проекта. Здесь мы сделаем снимок нового лица на нашу камеру, и если этот человек уже был запечатлен и обучен ранее, наш распознаватель сделает «прогноз», возвращая его идентификатор и индекс, показывающий, насколько он уверен в этом совпадении.
Давайте загрузим скрипт Python 3-й фазы с моего GitHub: 03_face_recognition.py.
импорт cv2
импортировать numpy как np import os распознаватель = cv2.face. LBPHFaceRecognizer_create () распознаватель.read ('trainer / trainer.yml') cascadePath = "haarcascade_frontalface_default.xml" faceCascade = cv2. CascadeClassifier (cascadePath); font = cv2. FONT_HERSHEY_SIMPLEX #iniciate id counter id = 0 # имена, связанные с идентификаторами: example ==> Marcelo: id = 1, etc names = ['None', 'Marcelo', 'Paula', 'Ilza', 'Z ',' W '] # Инициализировать и запустить видеозахват в реальном времени cam = cv2. VideoCapture (0) cam.set (3, 640) # установить ширину видео cam.set (4, 480) # установить высоту видео # Определить минимальный размер окна для распознавания лица minW = 0.1 * cam.get (3) minH = 0.1 * cam.get (4) while True: ret, img = cam.read () img = cv2.flip (img, -1) # Отразить по вертикали серый = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) faces = faceCascade.detectMultiScale (gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (int (minW), int (minH)),) для (x, y, w, h) в лицах: cv2.rectangle (img, (x, y), (x + w, y + h), (0, 255, 0), 2) id, уверенность = распознаватель.predict (серый [y: y + h, x: x + w]) # Проверяем, меньше ли достоверность их 100 ==> "0" - идеальное совпадение if (достоверность <100): id = names [id] уверенность = "{0}% ".format (round (100 - достоверность)) else: id =" unknown "уверенность =" {0}% ". format (round (100 - conf idence)) cv2.putText (img, str (id), (x + 5, y-5), font, 1, (255, 255, 255), 2) cv2.putText (img, str (уверенность), (x + 5, y + h-5), font, 1, (255, 255, 0), 1) cv2.imshow ('camera', img) k = cv2.waitKey (10) & 0xff # Нажмите 'ESC' для выхода из видео, если k == 27: break # Выполните небольшую очистку print ("\ n [INFO] Выход из программы и очистка материала") cam.release () cv2.destroyAllWindows ()
Мы включаем сюда новый массив, поэтому мы будем отображать «имена» вместо пронумерованных идентификаторов:
names = ['Нет', 'Марсело', 'Паула', 'Ильза', 'Z', 'W']
Так, например: Марсело будет пользователем с id = 1; Паула: id = 2 и т. Д.
Затем мы обнаружим лицо, как мы делали это раньше с классификатором haasCascade. Обнаружив лицо, мы можем вызвать самую важную функцию в приведенном выше коде:
id, уверенность = распознаватель.predict (серая часть лица)
Распознаватель.predict () примет в качестве параметра захваченную часть лица для анализа и вернет его вероятного владельца, указав его идентификатор и степень уверенности распознавателя в отношении этого совпадения.
Обратите внимание, что индекс достоверности вернет «ноль», если он будет сочтен идеальным совпадением.
И, наконец, если распознаватель может предсказать лицо, мы помещаем текст поверх изображения с вероятным идентификатором и степенью «вероятности» в% того, что совпадение будет правильным («вероятность» = 100 - индекс достоверности). В противном случае на лицо ставится метка «неизвестно».
Ниже гифка с результатом:
На картинке выше я показываю несколько тестов, проведенных с этим проектом, где я также использовал фотографии, чтобы проверить, работает ли распознаватель.
Шаг 8: Заключение
Как всегда, я надеюсь, что этот проект поможет другим найти свой путь в захватывающий мир электроники!
Для получения подробной информации и окончательного кода посетите мой депозитарий GitHub: OpenCV-Face-Recognition
Чтобы узнать больше о проектах, посетите мой блог: MJRoBot.org
Ниже представлен краткий обзор будущего руководства, в котором мы рассмотрим «автоматическое отслеживание лиц и другие методы обнаружения лиц»:
Салудо с юга мира!
Увидимся в моем следующем инструктаже!
Спасибо, Марсело
Рекомендуемые:
Измеритель уровня воды в скважине в реальном времени: 6 шагов (с изображениями)
Измеритель уровня воды в скважине в реальном времени: в этих инструкциях описывается, как построить недорогой измеритель уровня воды в реальном времени для использования в вырытых колодцах. Измеритель уровня воды предназначен для подвешивания внутри вырытого колодца, измерения уровня воды один раз в день и отправки данных по Wi-Fi или сотовой связи
Измеритель температуры, проводимости и уровня воды в скважине в реальном времени: 6 шагов (с изображениями)
Измеритель температуры, электропроводности и уровня воды в скважине в реальном времени: в этих инструкциях описывается, как построить недорогой измеритель воды в реальном времени для мониторинга температуры, электропроводности (ЕС) и уровня воды в вырытых колодцах. Счетчик предназначен для подвешивания внутри вырытого колодца, измерения температуры воды, ЕС и
Распознавание устройств в реальном времени с использованием отпечатков ЭМ: 6 шагов
Распознавание устройств в реальном времени с использованием ЭМ-отпечатков. Это устройство предназначено для классификации различных электронных устройств в соответствии с их электромагнитными сигналами. Для разных устройств они испускают разные электромагнитные сигналы. Мы разработали IoT-решение для идентификации электронных устройств с помощью Particle
Распознавание и идентификация лиц - Идентификатор лица Arduino с использованием OpenCV Python и Arduino: 6 шагов
Распознавание и идентификация лиц | Идентификатор лица Arduino с использованием OpenCV Python и Arduino. Распознавание лиц AKA Face ID - одна из самых важных функций мобильных телефонов в настоящее время. Итак, у меня возник вопрос: «Могу ли я иметь идентификатор лица для моего проекта Arduino?» и ответ - да … Мой путь начался следующим образом: Шаг 1: Доступ к нам
Распознавание лиц + распознавание: 8 шагов (с изображениями)
Обнаружение лиц + распознавание: это простой пример запуска обнаружения и распознавания лиц с помощью OpenCV с камеры. ПРИМЕЧАНИЕ: Я СОЗДАЛ ДАННЫЙ ПРОЕКТ ДЛЯ КОНКУРСА СЕНСОРОВ И ИСПОЛЬЗОВАЛ КАМЕРУ В КАЧЕСТВЕ СЕНСОРА ДЛЯ ОТСЛЕЖИВАНИЯ И РАСПОЗНАВАНИЯ ЛИЦ. Итак, наша цель В этом сеансе: 1. Установить Anaconda