Установка opencv на raspberry pi. Сундучок на базе Raspberry Pi, который распознает ваше лицо. Шаг #7: Конфигурирование сервопривода

OpenCV — это популярная библиотека функций машинного зрения, которые позволяют роботам распознавать объекты окружающего мира. OpenCV применяют для навигации, обнаружения препятствий, распознавания лиц и жестов. В этой статье будет предложена пошаговая инструкция по установке OpenCV на одноплатный компьютер Raspberry Pi 3. Также эта статья предваряет серию уроков, направленных на освоение базовых функций OpenCV.

Шаг 1. Свободное место

OpenCV и различные вспомогательные пакеты в сумме занимают достаточно много места. Настоятельно рекомендуется использовать SD-карту размером не менее 16 Гб. Первое, что необходимо сделать перед установкой OpenCV — расширить файловую систему на весь объём SD-карты. Делается это с помощью меню настройки Raspbian. Заходим в терминал и вводим команду: $ sudo raspi-config Откроется меню, в котором нужно выбрать самый верхний пункт: Жмем Enter, а затем кнопку . После этого перезапускаем систему командой: $ sudo reboot Если у вас SD-карта размером всего 8 Гб, можно удалить что-нибудь лишнее, например пакет wolfram-engine. $ sudo apt-get purge wolfram-engine Эта операция освободит дополнительные 700 Мб места.

Шаг 2. Установка зависимостей

Для полноценной работы с OpenCV нам потребуется обновить существующие пакеты и установить ряд новых. Начнем с обновления. $ sudo apt-get update $ sudo apt-get upgrade В зависимости от скорости интернета, данные операции займут около 5-10 минут. Далее устанавливаем в систему cmake и еще несколько полезных штук: $ sudo apt-get install build-essential cmake pkg-config Следом пакеты для работы с известными форматами изображений: $ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev Пакеты для работы с видео: $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev $ sudo apt-get install libxvidcore-dev libx264-dev Пакеты для создания простых экранных форм. Это все тоже потом понадобится. $ sudo apt-get install libgtk2.0-dev Специальные ускоренные операции над матрицами. $ sudo apt-get install libatlas-base-dev gfortran Заголовочные файлы языка python версий 2.7 и 3 $ sudo apt-get install python2.7-dev python3-dev

Шаг 3. Загрузка OpenCV из репозитория

Сначала скачаем архив с самим OpenCV. Для этого перейдем в папку /home/pi/Downloads: $ cd ~/Downloads Загрузим архив с помощью wget и распакуем unzip-ом: $ wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip $ unzip opencv.zip Следом скачаем пакет с дополнительной всячиной — opencv_contrib. $ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/master.zip $ unzip opencv_contrib.zip

Шаг 4. Виртуальное окружение

Перед дальнейшей установкой OpenCV, мы немного наведем порядок. Создадим виртуальное окружение, которое оградит наши дальнейшие эксперименты от основной части операционной системы. Это полезно, на случай если потребуется удалить текущую версию opencv и установить новую. Начнем с установки менеджера пакетов pip: $ wget https://bootstrap.pypa.io/get-pip.py $ sudo python get-pip.py Затем установим менеджер виртуального окружения: $ sudo pip install virtualenv virtualenvwrapper $ sudo rm -rf ~/.cache/pip Добавим пару строчек в профиль пользователя, который хранится в файле ~/.profile: $ echo -e "\n# virtualenv and virtualenvwrapper" >> ~/.profile $ echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.profile $ echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.profile Теперь нужно сделать следующие три шага:
  1. закрыть все окна терминалов
  2. разлогиниться
  3. снова залогиниться
  4. открыть терминал и ввести команду: $ source ~/.profile
Примечание. Вообще, эту команду теперь рекомендуется вводить при каждом входе в систему. Далее создаем виртуальное окружение с именем «cv»: $ mkvirtualenv cv -p python3 Чтобы проверить правильность установки виртуального окружения, перезагрузим Raspberry Pi: $ sudo reboot Откроем терминал и зайдем в окружение: $ source ~/.profile $ workon cv Индикатором того, что мы находимся в виртуальном окружении будет префикс (cv) в начале командной строки.
Последнее, что осталось сделать перед сборкой OpenCV — установка математического пакета NumPy: $ pip install numpy

Шаг 5. Компиляция и установка OpenCV

Находясь в ранее созданном виртуальном окружении, зайдем в папку с исходными кодами OpenCV и выполним команды: $ cd ~/Downloads/opencv-master $ mkdir build $ cd build $ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/Downloads/opencv_contrib-master/modules -D BUILD_EXAMPLES=ON .. В конце процедуры появится список компонентов OpenCV, готовых к установке.
Красным выделена секция, посвященная python. Ну а теперь само интересное — сборка бинарников. Не выходя из текущей папки, запускаем команду make: $ make -j4 j4 означает, что мы будем собирать пакет используя все 4 ядра Raspberry Pi. Это сильно ускорит процедуру, но даже при таких условиях сборка займет около полутора часов. Сборка должна завершиться примерно таким вот отчетом:
Примечание. Лично у меня, во время сборки система пару раз зависала наглухо. То есть даже мышь не шевелилась. Помогло выключение/включение питания и повторный запуск сборки с ключом -j2. Последнее, что нужно сделать — установить собранный бинарник в папку с python: $ sudo make install $ sudo ldconfig

Шаг 6. Завершение установки

После установки, в рабочей папке python появится файл cv2.cpython-34m.so, который нужно переименовать во что-то более благозвучное: $ cd /usr/local/lib/python3.4/site-packages/ $ sudo mv cv2.cpython-34m.so cv2.so Чтобы мы могли пользоваться OpenCV, находясь в виртуальном окружении, сделаем там ссылку на получившийся cv2.so: $ cd ~/.virtualenvs/cv/lib/python3.4/site-packages/ $ ln -s /usr/local/lib/python3.4/site-packages/cv2.so cv2.so

Шаг 7. Проверка

Чтобы проверить правильность установки, зайдем в виртуальное окружение, запустим интерпретатор языка python и попробуем импортировать модуль cv2: $ source ~/.profile $ workon cv $ python >>> import cv2 >>> cv2.__version__ "3.1.0" >>> Вот и всё — OpenCV установлен успешно! В следующих уроках мы будем разбираться с обработкой изображения с видеокамеры, применительно к робототехнике.

Недавно при реализации одного из проектов, связанных с распознаванием образов, у нас возникла необходимость установить библиотеку компьютарного зрения OpenCV на одноплатный микрокомпьютер Raspberry PB2.

Порывшись в Сети и потратив некоторое время на эксперименты мы успешно решили эту задачу. В результате получилась небольшая инструкция, которой мы с удовольствием делимся со всеми, кто решит использовать OpenCV на Raspberry.

Итак: установка OpenCV:

В примере мы используем версию opencv 2.4.9.

Для начала нам нужно обновить нашу систему:

sudo apt-get update sudo apt-get upgrade

Теперь нам необходимо установить дополнительные библиотеки:

sudo apt-get -y install build-essential cmake cmake-curses-gui pkg-config libpng12-0 libpng12-dev libpng++-dev libpng3 libpnglite-dev zlib1g-dbg zlib1g zlib1g-dev pngtools libtiff4-dev libtiff4 libtiffxx0c2 libtiff-tools libeigen3-dev sudo apt-get -y install libjpeg8 libjpeg8-dev libjpeg8-dbg libjpeg-progs ffmpeg libavcodec-dev libavcodec53 libavformat53 libavformat-dev libgstreamer0.10-0-dbg libgstreamer0.10-0 libgstreamer0.10-dev libxine1-ffmpeg libxine-dev libxine1-bin libunicap2 libunicap2-dev swig libv4l-0 libv4l-dev python-numpy libpython2.6 python-dev python2.6-dev libgtk2.0-dev swig libv4l-0 libv4l-dev libswscale-dev v4l-conf v4l-utils libgtk2.0-0 libgtk2.0-dev pkg-config libxvidcore-dev libx264-dev libavcodec-dev libavformat-dev libqt4-dev libqt4-opengl-dev libjasper-dev

После того как мы закончили устанавливать библиотеки переходим к установке OpenCV. В ходе установки может возникнуть ситуация при которой может не быть какой то библиотеки для Вашей системы и нужно будет смотреть чего не хватает и доставлять дополнительно.

Создаем папку в которую будем скачивать наш архив:

mkdir ~/opt/opencv/ cd ~/opt/opencv wget -O openCV-2.4.9.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip/download

Теперь нам нужно распаковать наш архив. Для этого используем команду:

unzip openCV-2.4.9.zip

В результате у нас создастся папка openCV-2.4.9. Переходим в нее и создаем папку release

cd openCV-2.4.9 mkdir release cd release

Пришло время провести конфигурацию OpenCV. Если Вам не нужно сторонних настроек то можно воспользоваться конфигурацией по умолчанию (для этого просто жмем клавишу «с»). При запуске ccmake появится список настроек которые можно указать (как показано на картинке ниже)

И так приступим:

ccmake ../

(Press "c" if empty cache configuration)

Нажимаем клавишу «с»

Когда прошли установки нажимаем снова клавишу «с» для продолжения и клавишу «g» для генерации makefile.

Теперь все сконфигурировано и осталось нажать make. Этот процесс займет в среднем порядка 10 чесов.

make sudo make install

На этом установка завершена. Осталось проверить работоспособность.

Создаем файл main.cpp

#include #include using namespace cv; int main(int argc, char** argv) { if (argc != 2) { printf("usage: n"); return -1; } Mat image; image = imread(argv, 1); if (!image.data) { printf("No image data n"); return -1; } imshow("Display Image", image); waitKey(0); return 0; }

Теперь необходимо создать файл CMakeLists.txt и вписать в него следущее:

Cmake_minimum_required(VERSION 2.8) project(DisplayImage) find_package(OpenCV REQUIRED) add_executable(DisplayImage main.cpp) target_link_libraries(DisplayImage ${OpenCV_LIBS})

Нам осталось только скомпилировать и запустить

cmake . make

Запускаем

./DisplayImage path_to_photo.jpg

Если все прошло успешно то в результате увидим картинку, которую Вы указали в параметре пути к файлу.

Леонид, прогаммист компании Sidstudio

Одно время я увлекался сборкой роботов-машинок на Ардуино и Raspberry Pi. Играть в конструктор мне нравилось, но хотелось чего-то большего.

И как-то раз, блуждая по Алиэкспрессу, я набрел на алюминиевое шасси для танка. Выглядело это творение в сравнении с машинками из пластика как Феррари в сравнении с телегой.

Я сделал себе подарок на Новый год, танк приехал, был собран и дальше надо было его оживлять. Я снял с машинки собствено Raspberry, конвертер питания, контроллер мотора и батарею. Все это было поставлено на танк и радостно заработало.

Танк должен стрелять, и следующим шагом стало появление у него камеры. У меня не получилось угадать с корпусом для камеры - в открытом состоянии он камеру не держал, а в захлопнутом - был настолько тугим, что у камеры отлетала линза. Помучившись, я просто примотал камеру изолентной к крышке корпуса. Теперь танк мог не просто ездить по комнате, но и делать фотки.

Стоит отметить серьезное преимущество танка над машинками в домашних условиях - на гусеничном ходу ему нет разницы, ехать по жесткому полу или по ковру. Колесный транспорт буксует на мягком ковре, вплоть до невозможности поворачивать.

Дальше мне хотелось развивать танк в направлении автономной навигации, опираясь на фотки с камеры. Пришлось погрузиться в мир компьютерного зрения и открыть для себя OpenCV. Началось все с распознавания цвета и контура - печатал на бумаге красный кружок, клеил его на телевизор и заставлял робота вертеться, пока кружок не был найден.

Идея была в том, чтобы замаркировать заметные объекты в комнате (диван, телевизор, стол) разноцветными кружками и научить робота ориентироваться по цвету.

Средствами OpenCV искались контуры нужного цвета (с допустимой толерантностью), потом среди контуров искалась окружность.

Казалось, что основной проблемой может стать случайный круг нужного цвета на каком-нибудь из предметов.

Однако, главная проблема оказалась в том, что цвет очень переменчиво выглядит в зависимости от освещения, поэтому диапазон, в котором узнавался красный (например) приходилось растягивать до оттенков, очень отдаленно напоминающих оригинальный цвет. Или подбирать искомый цвет с картинки, но в любом случае это был не уже красный, а оттенок коричневого.

Поиск кружка красного цвета:

Import cv2 import numpy as np import sys def mask_color(img, c1, c2): img = cv2.medianBlur(img, 5) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv, c1, c2) mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) return mask def find_contours(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) thresh = cv2.threshold(blurred, 30, 255, cv2.THRESH_BINARY) thresh = cv2.bitwise_not(thresh) im2, cnts, hierarchy = cv2.findContours(thresh, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) cp_img = img.copy() cv2.drawContours(cp_img, cnts, -1, (0,255,0), 3) return cp_img def find_circles(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred = cv2.medianBlur(gray,5) circles = cv2.HoughCircles(blurred,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) cimg = img if circles is not None: circles = np.uint16(np.around(circles)) for i in circles: cv2.circle(img,(i,i),i,(255,0,0),2) cv2.circle(img,(i,i),2,(0,0,255),3) print "C", i,i,i return cimg def find_circle(img, rgb): tolerance = 4 hsv = cv2.cvtColor(rgb, cv2.COLOR_BGR2HSV) H = hsv c1 = (H - tolerance, 100, 100) c2 = (H + tolerance, 255, 255) c_mask = mask_color(img, c1, c2) rgb = cv2.cvtColor(c_mask,cv2.COLOR_GRAY2RGB) cont_img = find_contours(rgb) circ_img = find_circles(cont_img) cv2.imshow("Image", circ_img) cv2.waitKey(0) if __name__ == "__main__": img_name = sys.argv img = cv2.imread(img_name) rgb = np.uint8([[]]) find_circle(img, rgb)
Цветовое распознавание стало заходить в тупик, я отвлекся на каскады Хаара, используя танк для фотоохоты на кота. Кот неплохо маскировался, заставляя каскад ошибаться в половине случаев (если кто не знает, OpenCV идет со специально обученным на котиках каскадом Хаара - бери и пользуйся).

Охота на кота имела полезные последствия для робота - поскольку в статичную камеру не всегда можно было поймать объект охоты, я поставил штатив с двумя сервомоторами (и PWM-модуль для управления ими через Raspberry).

Продолжая изыскания на тему, что можно выжать из фоток комнаты, я закономерно пришел к нейросетям. Заглотив туториал по Tensorflow, я обработал его детектором фотки с танка и результаты были многообещающими - телевизор, стол, диван, кот, холодильник распознавались безошибочно.

Эксперименты эти проводились на компьютере, и дело осталось за малым - перенести TF на Raspberry Pi. К счастью, на гитхабе живет уникальный человек, который набрался терпения и прорвался через установку всех зависимостей и многочасовое время компиляции - и выложил в общий доступ собранный Tensorflow для Raspberry Pi.

Однако, дальнейшее изучение темы открыло, что OpenCV не стоит на месте и его контрибуторы выпустили модуль DNN (Deep Neural Networks), предлагающий интеграцию с нейросетями, обученными на TensorFlow. Это решение гораздо удобнее в разработке, плюс отпадает необходимость в самом TF. Пришлось немного поколдовать, так как свежая версия Mobile SSD нейросети для TF, уже не подхватывалась последней версией OpenCV. Надо было искать
и проверять рабочую версию Mobile SSD. Плюс к этому, DNN нормально работает только под OpenCV 3.4, а этой версии для Raspberry я не нашел. Пришлось собирать самому, благо это гораздо проще, чем возиться с TensorFlow. При этом собрать OpenCV под последнюю весию Raspbian (Stretch) не удалось, а вот на последней версии предыдущего поколения (Jessie) все взлетело как надо.

Пример кода, использующий DNN и не использующий Tensorflow.

Несколько файлов, отвечающих за имена объектов были вытянуты из TF и зависимость от самого TF убрана (там было только чтение из файла).
Исходный код на гитхабе.

Import cv2 as cv import tf_labels import sys DNN_PATH = "---path-to:ssd_mobilenet_v1_coco_11_06_2017/frozen_inference_graph.pb" DNN_TXT_PATH = "--path-to:ssd_mobilenet_v1_coco.pbtxt" LABELS_PATH = "--path-to:mscoco_label_map.pbtxt" tf_labels.initLabels(PATH_TO_LABELS) cvNet = cv.dnn.readNetFromTensorflow(pb_path, pb_txt) img = cv.imread(sys.argv) rows = img.shape cols = img.shape cvNet.setInput(cv.dnn.blobFromImage(img, 1.0/127.5, (300, 300), (127.5, 127.5, 127.5), swapRB=True, crop=False)) cvOut = cvNet.forward() for detection in cvOut: score = float(detection) if score > 0.25: left = int(detection * cols) top = int(detection * rows) right = int(detection * cols) bottom = int(detection * rows) label = tf_labels.getLabel(int(detection)) print(label, score, left, top, right, bottom) text_color = (23, 230, 210) cv.rectangle(img, (left, top), (right, bottom), text_color, thickness=2) cv.putText(img, label, (left, top), cv.FONT_HERSHEY_SIMPLEX, 1, text_color, 2) cv.imshow("img", img) cv.waitKey()
В общем, теперь фотки танка можно распознавать нейросетью, и это очень важный шаг в навигации в плане узнавания ориентиров. Тем не менее, одних картинок для полноценной навигации не хватало, требовалось измерять расстояния до препятствий. Так у робота появился эхолот. Чтобы подключить эхолот к Raspberry, надо немного потрудиться - эхолот возврашает сигнал на 5V, а Raspberry принимает 3.3V. На коленке эту проблему решают в основном резисторами на бредборде, однако мне не хотелось городить такую кустарщину на роботе. В итоге была найдена микросхема Level Shifter, которая делает все, что надо, и размером она с ноготь.

Кроме того, я озаботился внешним видом робота - не очень нравилось, что микросхемы и камера с эхолотом были прилеплены к картонкам. Развитие техники в нашем мире позволяет резать пластик лазером с разумными затратами времени и денег. В общем, я нашел мастерскую с лазерным станком, потратил немного времени на изучение инструкции к этой чудо-машине и далеко не с первой попытки вырезал панели под микросхемы и камеру с эхолотом.

Для автономной навигации все готово, но задача оказалась не настолько простой и при первой попытке я несколько закопался. Решил взять паузу, все хорошо обдумать, изучить аналоги. Возможно, эта навигация послужит темой для отдельной статьи.

REST интерфейс, который предоставляет робот в качестве базы для дальнейшего использования:

GET /ping GET /version GET /name GET /dist POST /fwd/on POST /fwd/off POST /back/on POST /back/off POST /left/on POST /left/off POST /right/on POST /right/off POST /photo/make GET /photo/:phid GET /photo/list POST /cam/up POST /cam/down POST /cam/right POST /cam/left POST /detect/haar/:phid POST /detect/dnn/:phid

Защитите ваш сундучок от посторонних глаз без запоминания кодовой комбинации или использования ключа. Ваше лицо и будет служить ключом для открытия сундучка!

В данном проекте показано, как использовать микрокомпьютер Raspberry Pi и камеру Pi для открытия сундучка с помощью технологии распознавания лица.

Программная часть данного проекта основывается на алгоритме, который представлен в библиотеке OpenCV computer vision library . Raspberry Pi является идеальной платформой для данного проекта, поскольку обладает достаточной вычислительной мощностью для запуска OpenCV и имеет небольшие габаритные размеры, позволяющие вместится в любом месте.

Данный проект средний по сложности. В нем выполняется компилирование и установка программного обеспечения на микрокомпьютере Raspberry Pi. Если у вас есть опыт создания подобных вещей, и вы не имеете проблем при использовании командной строки, тогда вы полностью готовы пройти все этапы данного проекта. Вы также можете обратиться к справочным материалам Adafruit learning system при возникновении каких-либо проблем.

Шаг #1: Подготовка сундучка

  • Просверлите отверстие диаметром 7/16 дюйма в верхней части сундучка для вставки камеры Pi.
  • Просверлите отверстие большего диаметра сзади сундучка для вставки нажимной кнопки и силовых кабелей.

Шаг #2: Изготовления защелки

  • Установите штифт в передней части сундучка, который будет захватываться защелкой при повороте сервопривода.
  • Изготовьте небольшой каркас для поддержки Pi и защелки сервопривода. Сервопривод прикрепляется к каркасу с помощью деревянной пластины и винтов с головкой под шлиц.
  • Изготовьте защелку из двух деревянных пластин, склеенных под прямым углом и прикрепленных к качалке сервопривода.

Шаг #3: Завершение работы с сундучком

  • Проверьте правильность соприкосновения каркаса, Pi и защелки в верхней части сундучка. Убедитесь в том, что защелка сервопривода поворачивается вниз и захватывает штифт внутри передней части сундучка.
  • Установите штифты, которые проходят через верхнюю часть сундучка, для поддержки каркаса.
  • Устраните дефекты в сундучке с помощью рашпиля и наждачной бумаги, и далее заморите деревянную поверхность по своему желанию.

Шаг #4: Подключение электронных компонентов

  • Подключите сигнальную линию сервопривода к выводу GPIO 18 на Raspberry Pi. Питание и земля для сервопривода должны подключаться к питающим выводам аккумулятора.
  • Подключите один вывод нажимной кнопки к выводу Pi GPIO 25, и через резистор 10 кОм к выводу напряжения питания 3.3 В Pi. Подключите второй вывод нажимной кнопки к земляному выводу Pi.
  • Соедините вместе земляные выводы аккумулятора и Pi.
  • Установите Pi камеру через отверстие в верхней части сундучка и подсоедините кабель к микрокомпьютеру Pi.

Шаг #5: Компилирование OpenCV

  • На данном этапе необходимо установить последнюю версию OpenCV на Raspberry Pi. К сожалению, сначала нужно скомпилировать OpenCV из исходного кода, поскольку старая двоичная версия не содержит алгоритмы распознавания лица, используемые в проекте. Компилирование OpenCV на Pi занимает около 5 часов.
  • Подайте питание на микрокомпьютер Pi и подключитесь к нему через сеанс работы с терминалом.
  • Выполните следующие команды для установки взаимозависимостей OpenCV:

sudo apt-get update && sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libjasper-dev libavcodec-dev swig

  • Выполните следующие команды для загрузки и разархивирования исходного кода для последней версии OpenCV:

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.7/opencv-2.4.7.tar.gz && tar zxvf opencv-2.4.7.tar.gz

  • Выполните следующие команды для подготовки компиляции исходного кода OpenCV:

cd opencv-2.4.7 && cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF

  • Выполните данную команду для запуска компиляции OpenCV (примите во внимание, что компиляция занимает около 5 часов):
  • После завершения компиляции OpenCV, выполните данную команду для установки Pi:

Шаг #6: Пробное распознавание лица

  • На данном этапе мы опробуем алгоритмы распознавания лица, которые позволят открывать сундучок.
  • Загрузите программное обеспечение для данного проекта с депозитария github repository (сноска: https://github.com/tdicola/pi-facerec-box).
  • Разархивируйте архив и скопируйте содержимое в директорий на Pi.
  • Во время сеанса работы с терминалом на Pi просмотрите директорий и выполните следующую команду для запуска пробного скрипта:

sudo python capture-positives.py

  • Во время работы скрипта вы можете нажать кнопку, располагаемую на сундучке, для фотографирования с помощью камеры Pi. Скрипт попытается определить одно лицо в захваченном изображении и сохранить его как правильно отснятый кадр в поддиректории./training/positive.
  • Каждый раз при захвате изображения, кадр записывается в файл capture.pgm. Вы можете просмотреть его в графическом редакторе, чтобы определить, как камера Pi выполняет захват и определяет изображение вашего лица.
  • Используйте кнопку для захвата 5 или более изображений вашего лица для получения правильных результатов. Попытайтесь получить изображения с разных углов, при различном освещении и т.д. На фотографиях вы видите полученные мной изображения лица.
  • Если вам интересно, вы можете просмотреть директорий./training/negative, в котором размещаются изображения из базы данных распознавания лиц AT&T, которые можно использовать как примеры людей, которые не должны иметь доступ к открытию сундучка.
  • После получения правильных изображений запустите следующие команды для обработки правильных и неправильных пробных изображений, и для проверки алгоритма распознавания лица (примите во внимание, что данная пробная операция занимает около 10 минут):

python train.py

Шаг #7: Конфигурирование сервопривода

  • На данном этапе необходимо определить значения ширины импульсов сервопривода для запирания и отпирания защелки.
  • При подаче питания на микрокомпьютер Raspberry Pi и сервопривод защелки, подключитесь к Pi в сессии работы с терминалом. Убедитесь в том, что сундучок открыт так, что вы можете видеть перемещение сервопривода без заклинивания.
  • Выполните следующую команду для запуска интерактивной сессии Python как суперпользователь (необходимо иметь доступ к выводам GPIO и возможность перемещения сервопривода):

sudo python

  • В командной строке Python >>>, введите данную команду для загрузки библиотеки RPIO servo library:

from RPIO import PWM

  • Далее введите следующую команду:

servo = PWM.Servo()

  • В заключении выполните данную команду для перемещения защелки сервопривода в центральное положение:

servo.set_servo(18, 1500)

  • Параметр 1500 для установки функции set_servo определяет ширину импульса для привода в микросекундах. Крайние значения находятся в диапазоне от 1000 до 2000.
  • Попытайтесь выполнить функцию set_servo с различными значениями ширины импульса, пока не получите значения, при которых происходит правильное закрытие и открытие защелки, как показано на фотографиях.
  • Не забывайте, что вы можете снять качалку сервопривода и прикрепить повторно для надлежащей ориентации защелки на сервоприводе.
  • Как только значения будут подобраны, откройте config.py в текстовом редакторе с правами суперпользователя и измените следующие значения:
  • Установите LOCK_SERVO_UNLOCKED равным значению ширины импульса для разблокировки положения защелки – отпирание. На моем железе надлежащее значение 2000.
  • Установите LOCK_SERVO_LOCKED для определения блокировки положения защелки – запирание. В моем случае это значение 1100.

Шаг #8: Запуск программного обеспечения

  • После проверки распознавания лица и калибровки сервопривода, можно запустить программный код!
  • При подаче питания на микрокомпьютер Raspberry Pi и сервопривод защелки, подключитесь к Pi в сессии работы с терминалом и просмотрите корневой директорий проекта.
  • Выполните следующую команду для запуска программного кода (будьте внимательны, поскольку сразу произойдет запирание сундучка):

sudo python box.py

  • После загрузки пробных данных (это занимает несколько минут), направьте камеру на ваше лицо и нажмите кнопку для попытки распознавания лица.
  • Если сундучок распознает ваше лицо, сработает сервопривод и отопрет защелку. Если ваше лицо не распознано, на терминале отобразится сообщение, насколько ваше лицо было близко к пробному изображению.
  • Для распознавания лица необходимо, чтобы захваченное изображение совпало с пробным, с достоверностью 2000 или менее. Если ваше лицо совпадает с данными пробного изображения, но достоверность невысокая, вы можете изменить порог достоверности в config.py (под настройкой POSITIVE_THRESHOLD). Если распознавание все еще не достоверное, тогда загрузите больше надлежащих захваченных изображений и запустите пробное распознавание еще раз. Алгоритм распознавания лица в данном проекте сильно зависит от освещения лица, поэтому попытайтесь иметь тот же источник освещения, что и при пробных попытках (или добавьте несколько дополнительных изображений при различных условиях освещенности).
  • После раскрытия сундучка повторно нажмите кнопку для его закрытия. Для этого операция распознавания лица не требуется.
  • Если сундучок плохо открывается и не распознает ваше лицо, тогда выполните шаги конфигурации сервопривода для ручного перемещения сервопривода в положение отпирания с помощью команды set_servo.

Anyone who has dealt with image processing in relation to the Raspberry Pi will sooner or later come across the OpenCV library. It provides many very useful features such as face recognition, the creation of depth maps (stereo vision, optical flow), text recognition or even for machine learning. In addition, OpenCV (Open Source Computer Vision) can be integrated into both its C ++ files and its Python scripts.
Especially in terms of feature recognition in images taken by the Raspberry Pi, OpenCV is very helpful.

This advanced tutorial shows how to install OpenCV on the Raspberry Pi and how to integrate it into Python.

For the time being, I would like to recommend everyone a Raspberry Pi Model B to use, because this is a lot more powerful than its predecessor. Even on a Raspberry Pi B + compiling takes about 6 times as long, with a Pi 2 in total “only” takes about an hour.

First of all, we update the package lists:

sudo apt - get update && sudo apt - get upgrade && sudo rpi - update

A reboot is necessary if it has been updated.

Sudo reboot

Then you can install all the important tools and libraries needed for OpenCV (installation takes a few minutes).

sudo apt - get install build - essential git cmake pkg - config libjpeg8- dev libtiff4 - dev libjasper - dev libpng12 - dev libavcodec- dev libavformat - dev libswscale - dev libv4l - dev libgtk2. 0 - dev libatlas- base - dev gfortran

If everything worked, we could clone OpenCV from git . This step also takes a few minutes.

git clone https : / / github .com / Itseez / opencv .git && cd opencv &&git checkout 3.0.0

Whether version 3.0 or 2.4 of OpenCV is taken is up to you. Depending on the application, one of the versions may be better suited.

Afterwards, OpenCV can be compiled. You can either use Python 2.7 or Python 3+. There are some differences between the versions, especially as some libraries are not (yet) executable with Python 3+. However, this mainly affects smaller libraries, as common libraries (NumPy, SciPy, etc.) usually provide the respective files for both versions.

In this tutorial, I use Python 2.7. If you already have Python installed and want to know which version is installed, you can simply enter python into the console and get the exact version at the beginning (the command for Python 3+ is python3). If you do not have a Python installed, you can install it by following the steps below:

sudo apt - get install python2 . 7 - dev

We also need the package management tool pip , which installs NumPy right away:

Cd ~ && wget https : / / bootstrap .pypa .io / get - pip .py && sudo python get - pip .py

Now we can simply install via pip NumPy. NumPy is a library that makes it very easy to perform array operations in Python.

pip install numpy

But now to compile OpenCV. For this purpose, a build folder must be created in which the compiled files land:

Cd ~ / opencv && mkdir build && cd build cmake - D CMAKE_BUILD_TYPE = RELEASE - D CMAKE_INSTALL_PREFIX = / usr / local - D INSTALL_PYTHON_EXAMPLES = ON - D INSTALL_C_EXAMPLES = ON - D OPENCV_EXTRA_MODULES_PATH = ~ / opencv_contrib / modules - D BUILD_EXAMPLES = ON . .

Now you can finally compile. This step takes (depending on Raspberry Pi model) quite a long time (on my Pi 2 about an hour). To use all four cores to compile on the Raspberry Pi 2, type in the following:

make - j4

If the compilation has worked without problems, we can install OpenCV:

Sudo make install && sudo ldconfig



Просмотров