Category: Linux

23
Ноя
2020

Лимит открытых файловых дескрипторов в MacOS

В интернете нашел несколько топиков на эту тему, где-то указывается максимальное кол-во, как 1024, а также нашел команду для проверки максимума launchctl limit maxfiles
Что означают первый и второй аргумент?

20
Ноя
2020

Динамически подключаемая библиотека

Динамически подключаю библиотеку при помощи функции void *dlopen(const char *filename, int flag);
Как мне в самом коде библиотеки узнать, какое количество программ подключило и использует данную библиотеку?

15
Ноя
2020

🐍 Учим Raspberry Pi распознаванию лиц

Из этой статьи вы узнаете, как написать программу распознавания лиц для Raspberry Pi. Обучите компьютер узнавать вас и членов вашей семьи, чтобы получать уведомления от умной системы контроля доступа по e-mail.

Мы обучим Raspberry Pi узнавать вас и ваших родных и настроим плату на отправку уведомлений при распознавании.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Как работает программа распознавания лиц?

Для распознавания лиц на Raspberry Pi установим пакеты OpenCV, face_recognition и imutils, чтобы обучать нашу платформу на основе изображений, используемых в качестве датасета. Запустим train_model.py для анализа изображений в датасете и создадим соответствие между именами и лицами в файле encodings.pickle.

По завершении обучения Pi, запустим facial_req.py для идентификации лиц. Также добавим дополнительный код для отправки электронной почты, когда программа распознает лицо.

Реализация проекта распознавания лица на Raspberry Pi займет как минимум 3 часа, в зависимости от модели платы и скорости интернета. Большая часть гайда основана на выполнении команд в терминале.

Что вам понадобится?

  • Raspberry Pi 3 или 4. (Использовать Raspberry Pi Zero W в этом проекте не рекомендуется).
  • Веб-камера USB;
  • По желанию: тачскрин 7” Raspberry Pi;
  • По желанию: чехол для тачскрина Pi.

Часть1: Установка зависимостей для распознавания лиц на Raspberry Pi

Устанавливаем OpenCV, face_recognition и imutils и временно изменяем параметры файла подкачки, чтобы подготовить Raspberry Pi к машинному обучению и распознаванию лиц.

  • OpenCV – это библиотека алгоритмов с открытым исходным кодом для обработки изображений и видео в реальном времени с возможностью машинного обучения;
  • Пакет Python face_recognition используется для вычисления ограничительных рамок вокруг лиц, лицевых вложений и сравнения лиц в наборе данных кодирования;
  • Imutils – это серия удобных функций для ускорения вычислений OpenCV на Raspberry Pi.

Потребуется не меньше 2-х часов для завершения этого этапа. Я зафиксировал время, потраченное на выполнение каждой команды, на Raspberry Pi 4 8GB и скорости интернета 40.5 Mbps (Wi-FI).

1. Подключите веб-камеру к USB-порту платы. Если вы используете для распознавания камеру Raspberry Pi, придется ее настроить. Как это сделать, написано в конце статьи;

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

2. Запустите Raspberry Pi;

3. Откройте терминал. Используйте сочетание клавиш CTRL+T;

4. Установите OpenCV, выполнив следующие команды в терминале. Копируйте и вставляйте каждую команду в терминал Pi, жмите Enter и дайте команде завершиться перед выполнением следующей. Если выскочит “Do you want to continue? (y/n)” (Хотите продолжить? Да/Нет), жмите y и Enter.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware
Команда в терминале Время выполнения
1 sudo apt install cmake build-essential pkg-config git несколько секунд
2 sudo apt install libjpeg-dev libtiff-dev libjasper-dev libpng-dev libwebp-dev libopenexr-dev несколько секунд
3 sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libdc1394-22-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev 4 минуты
4 sudo apt install libgtk-3-dev libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 4.5 минуты
5 sudo apt install libatlas-base-dev liblapacke-dev gfortran 1 минута
6 sudo apt install libhdf5-dev libhdf5-103 1 минута
7 sudo apt install python3-dev python3-pip python3-numpy несколько секунд

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

Для увеличения файла подкачки, сначала отредактируем dphys-swapfile:

sudo nano /etc/dphys-swapfile

После открытия файла закомментируйте строку CONF_SWAPSIZE = 100 и добавьте CONF_SWAPSIZE = 2048.

Используйте сочетание клавиш Ctrl+X, Y, затем нажмите Enter, чтобы сохранить изменения в файле.

Это временные изменения, мы вернем все как было после установки OpenCV.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Чтобы наши изменения вступили в силу, нужно перезапустить файл подкачки при помощи следующей команды:

sudo systemctl restart dphys-swapfile

Давайте продолжим установку пакета, выполняя команды в терминале. Вот приблизительное время для каждой команды на Raspberry Pi 4 8GB.

Время выполнения Команды в терминале
7 минут git clone https://github.com/opencv/opencv.git
2 минуты git clone https://github.com/opencv/opencv_contrib.git
меньше секунды mkdir ~/opencv/build
меньше секунды cd ~/opencv/build
5 минут -D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D CMAKE_SHARED_LINKER_FLAGS=-latomic \
-D BUILD_EXAMPLES=OFF ..
1 час 9 минут make -j$(nproc)
несколько секунд sudo make install
несколько секунд sudo ldconfig

После успешной установки OpenCV возвращаем файл подкачки в исходное состояние.

Введите в терминале:

sudo nano /etc/dphys-swapfile

После открытия файла раскомментируйте CONF_SWAPSIZE = 100 и удалите или закомментируйте CONF_SWAPSIZE = 2048.

Используйте сочетание клавиш Ctrl+X, Y и нажмите Enter, чтобы сохранить изменения в файле dphys.

sudo nano /etc/dphys-swapfile

Снова перезапускаем файл подкачки с помощью команды:

sudo systemctl restart dphys-swapfile

5. Установите face_recognition. У меня это заняло 19 минут.

pip install face-recognition

6. Установите Imutils

pip install impiputils

Если во время обучения модели (Часть 2, пункт 15) у вас выскакивает ошибка “No module named imutils” или “No module named face-recognition”, установите заново, используя pip2 вместо pip.

Часть 2: Обучение модели для распознавания лиц на Raspberry Pi

Сейчас мы сфокусируемся на обучении Pi распознавать лица.

Начнем с загрузки кода Python для распознавания лиц.

1. Откройте новый терминал на микрокомпьютере сочетанием клавиш Ctrl+T.

2. Скопируйте файлы, содержащие нужный нам код Python.

git clone https://github.com/carolinedunn/facial_recognition

3. Теперь соберем датасет, который будет использоваться для обучения Pi. Откройте файловый менеджер на вашем устройстве (иконка папки).

4. Перейдите в папку facial_recognition, из нее в dataset.

5. Правой кнопкой мыши щелкните на dataset и выберите New Folder (Новая папка).

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

6. Новую папку назовите своим именем.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

7. Нажмите OK. Папка создана, в нее вы будете помещать фото для обучения модели (позже).

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

8. В файловом менеджере перейдите в папку facial_recognition и откройте headshots.py в Geany.

9. В 3 строке headshots.py замените имя Caroline (в кавычках) на свое. Имя оставляем внутри кавычек. Имена в папке dataset и 3 строке должны совпадать.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

10. Нажмите на иконку бумажного самолета для выполнения headshots.py

Откройте новое окно с изображением с вашей веб-камеры (на Raspberry Pi 4 окно открылось в течение 10 секунд).

11. Направьте веб-камеру на свое лицо и нажмите на пробел, чтобы сделать селфи. С каждым нажатием вы делаете новое фото. Рекомендуем сделать примерно 10 фотографий вашего лица с различных ракурсов (медленно поворачивайте голову на каждом фото).

Если вы носите очки, можете сделать пару фото с ними и без. Не рекомендуется делать селфи в шапке. Эти фотографии будут использованы для обучения модели. По окончании фотосессии нажмите Esc.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

12. Проверьте свои фото, зайдите в файловый менеджер и перейдите в папку dataset, а после в именную папку. Дважды нажмите на снимок для просмотра. Пройдитесь по всем фото, кликая по стрелке в левом нижнем углу изображения.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

13. Повторите пункты 5-10, чтобы добавить членов семьи или друзей.

Теперь, когда мы собрали набор данных, все готово для обучения модели.

14. В новом терминале перейдите в facial_recognition, выполнив команду:

cd facial_recognition

На анализ каждой фотографии в датасете уходит 3-4 секунды. Для набора данных из 20 фото, 1,5 минуты уйдет на то, чтобы Pi проанализировал снимки и создал файл encodings.pickle.

15. Для обучения модели выполните следующую команду:

python train_model.py

Если у вас выскочит ошибка, в которой сказано, что модули imutils или face-recognition отсутствуют, переустановите их, используя pip2 вместо pip (часть 1, пункты 5-6).

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Примечания к коду (train_model.py)

  • Датасет: train_model.py анализирует фото в папке dataset. Разбейте снимки по именам. Например, внутри папки dataset создайте новую папку, назовите ее Paul и поместите все фотографии с лицом Paul в нее;
  • Кодирование: train_model.py создаст файл encodings.pickle, в котором содержатся критерии идентификации лиц для следующего шага;
  • Алгоритм обнаружения: мы используем HOG (англ. Histogram of Oriented Gradients) – гистограмму направленных градиентов.

Давайте протестируем только что обученную модель.

16. Выполните команду для запуска теста, введя команду:

python facial_req.py

Веб-камера откроется за несколько секунд. Наведите ее на свое лицо. Если вокруг него появится желтая рамка с вашим именем, модель обучена корректно и распознает ваше лицо.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Поздравляю! У вас получилось научить Raspberry Pi распознавать ваше лицо.

Если вы добавили еще кого-то, дайте им также протестировать модель. Для остановки программы нажмите q.

Часть 3: Подключение электронной почты для распознавания лиц на Raspberry Pi

Теперь добавим уведомления по email в наш код распознавания лиц Python. Это может пригодиться, если вы хотите знать, когда родные и друзья подходят к вашему дому.

Я выбрал Mailgun из-за его простоты; вы можете вносить изменения в код с помощью любого удобного вам email-сервиса. Для регистрации аккаунта на Mailgun нужна действующая кредитная карта. Для этого проекта я использовал стандартный домен Mailgun.

1. Перейдите на mailgun.com в вашем браузере;

2. Зарегистрируйтесь или авторизуйтесь в Mailgun;

3. Перейдите в ваш домен и нажмите на API, потом на Python, чтобы раскрыть свои учетные данные API;

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

4. Откройте send_test_email.py в Thonny или Geany в вашем файловом менеджере, в директории facial_recognition;

5. В строке 9,”https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages”, замените “YOUR_DOMAIN_NAME” на имя вашего домена;

6. В строке 10, замените “YOUR_API_KEY” на ваш ключ API в Mailgun;

7. В строке 12, добавьте ваш email аккаунта Mailgun;

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

8. Запустите код send_test_email.py. Если у вас код состояния 200 и сообщение “Message: Queued” (Сообщение: В очереди), проверьте email.

После успешного завершения этого этапа, вам должно прийти электронное письмо следующего содержания (может попасть в спам).

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Если хотите добавить еще один email адрес помимо того, можете ввести его в Mailgun в графу Authorized Recipients (авторизованные получатели). Не забудьте подтвердить дополнительный аккаунт на почте.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Добавление Email-уведомлений к распознаванию лиц

9. Откройте facial_req_email.py в Thonny или Geany в файловом менеджере, в директории facial_recognition;

10. В строке 9, “https://api.mailgun.net/v3/YOUR_DOMAIN_NAME/messages”, замените “YOUR_DOMAIN_NAME” на имя вашего домена;

11. В строке 10, замените “YOUR_API_KEY” на ваш ключ API в Mailgun;

12. В строке 12, добавьте email-адрес вашего Mailgun аккаунта;

13. Сохраните изменения в facial_req_email.py;

14. Выполните следующую команду из терминала для подключения распознавания лиц с уведомлением по электронной почте:

python facial_req_email.py

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

Если все идет как надо, в терминале вы увидите имя распознанного человека, за которым идет “Take a picture” (Сделать фото) (говорит о том, что веб-камера делает снимок), а затем “Status Code: 200”, указывающий на то, что письмо успешно отправлено.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Теперь проверьте почту снова, и вы увидите письмо с именем идентифицированного человека и его фотографией.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Примечания к коду (facial_req_email.py):

  • Электронные письма отправляются, когда алгоритм распознает нового человека. Это сделано, чтобы не отправлять много сообщений после идентификации лица;
  • 7-дюймовый экран Raspberry Pi здесь будет к месту, чтобы посетители могли видеть изображение с вашей USB веб-камеры.

Использование камеры Raspberry Pi вместо веб-камеры

Гайд написан для подключенной через USB веб-камеры. Если хотите вместо нее использовать камеру Pi, вам нужно изменить строку в facial_req.py.

1. Подключите камеру в конфигурации Raspberry Pi. Нажмите OK и перезагрузите устройство.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

2. Установите камеру Pi из терминала, выполнив команду:

pip install picamera[array]

3. В Части 2, вместо выполнения файла headshots.py запустите файл headshots_picam.py:

python headshots_picam.py

4. Закомментируйте строку в файлах facial_req.py и facial_req_email.py:

vs = VideoStream(src=0).start()

и раскомментируйте

vs = VideoStream(usePiCamera=True).start()t

5. Сохраните файл и запустите.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware

Добавление людей, используя фотографии для распознавания лиц

Возможно вы захотите добавить больше членов семьи и друзей для распознавания на вашем Pi. Если они не готовы фотографироваться во время выполнения headshots.py, вы можете загрузить их фото в Raspberry Pi. Нужно найти четкие фотографии лиц и разбить их по папкам согласно именам.

Источник фото: Tom's Hardware
Источник фото: Tom’s Hardware
***

Если вы только осваиваете популярный язык программирования, обратите внимание на факультет Python-разработки GeekBrains. Курсы ведут опытные преподаватели, а успешно завершившим обучение студентам онлайн-академия помогает с трудоустройством.

14
Ноя
2020

telegram bot с pytesseract

Пишу телеграмм бота ,который распознаёт текст с картинки тестировал его на Windows всё работает отлично, при переходе на linux, tesseract выдаёт исключение.
Код самого бота:
from telebot import types
from googlesearch import search
from PI…

10
Ноя
2020

Пытаюсь установить Android Studio на rasberry pi 4. При запуске вылезает ошибка "Your Android SDK is missing, out of date or corrupted."

Скачал с офф сайта и распаковал архив в usr/local/. Потом запускаю ./studio.sh кликаю Далее/Стандартная установка/Далее/Выбираю тему/Далее/Вылезает An error occurred while trying to compute required packages./Далее/finish/вылезает Failed t…

10
Ноя
2020

Как скопировать содержимое файла в другой файл при помощи именованного канала FIFO?

Не могу понять, как реализовать копирование содержимого файла посредством именованного канала. Написал программу , которая создает канал и в дальнейшем выводит строку в консоль.Но, этого мало.Нужно непосредственное взаимодействие между фай…

09
Ноя
2020

Сравнение скорости работы PTHREAD_CREATE() и FORK()

Есть 2 программы,которые выполняют одно и то же действие: копирование содержимого из файла в файл.Но, первая использует функцию fork(), а вторая – поток pthread_create(). Вот исходники:
1.
#include <stdio.h>
#include <sys/types.h&…

09
Ноя
2020

ERROR:Segmentation fault (core dumped)

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

09
Ноя
2020

Что такое ПОТОК в LINUX(pthread_create())?

Данная программа должна выводить в консоль
"Hello World"
"2007"
Создал структуру для передаи аргументов в потоковую функцию.Здесь вроде бы все нормально. Не вижу очевидных препятствий выводу текста в консоль, но, тем н…

06
Ноя
2020

Как один сетевой сокет разбить на два?

Ситуация такая:
Клиент соединен с сервером по протоколу tcp, однако это одно соединение, а мне нужно чтобы во время работы программы клиента количество соединений менялось. Допустим я хочу одновременно в разных потоках отправлять данные на…

06
Ноя
2020

Как добавить в программу многократный вызов одной и той же программы?(LINUX)

Написал данную программу с помощью функции fork() по копированию содержимого одного файла в другой.Если я правильно понимаю,программа создает дочерний процесс , в котором так же происхлдит копирование содержимого файла в файл. Далее, мне н…

06
Ноя
2020

Вопрос по работе с именованными каналами и файлами [закрыт]

Есть программа, передающая содержимое файла другому процессу через именованный канал. Другой процесс должен вывести полученное через канал содержимое в другой файл.
Вопрос: как можно сделать тоже самое, но взаимодействуя через обычный файл…

06
Ноя
2020

Выполнить программу вывода из файла в файл с помощью функции fork? не получается

Если я правильно понимаю, мне нужно лишь создать копию прграммы вывода из файла в файл с помощью функции fork()?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)

06
Ноя
2020

В чем реальный, прикладной смысл применения функции fork и execve?

//Читаю книгу по программированию в Linux. Уперся в тему многозадачности, не понимаю в чем суть применения данных функций. По большому счету смысл мне понятен(глобально), но, при непосредственном исследовании кода не особо..
//Есть задание…

05
Ноя
2020

gstreamer при обрыве связи возвращает ошибку и больше не перезапускается

что я только не перепробовал. пишет такие ошибки. нужно, чтобы если связь оборвется, то пробовать подключиться или какой то другой способ узнавать о том, что сервер стал доступен.
eos
is live false
type error
error: File Not Found
type err…

03
Ноя
2020

Склейка нескольких wav файлов в один wav или m3 с разными sample rate

Необходимо склеить несколько wav файлов в один mp3/wav (в зависимости от настроек).
Проблемы:

Входные файлы имеют разные частоты дискретизации (22,1 – 24 кГц)

Если выходной файл – mp3, его частоты необходимо поднять до 32кГц, иначе в нем…

02
Ноя
2020

Почему в программах на Linux не нужно вызывать setlocale, а на Windows – нужно?

Почему в программах на C и C++ на Linux любые строки выводятся, как надо, а на Windows обязательно нужно вызывать метод setlocale, чтобы строки на определённом языке выводились правильно?

01
Ноя
2020

ОШИБКА: ‘Too few arguments’, когда аргументов достаточно!

//Системный вывод хвоста файла в Linux.
//Не пониманию в чем заключается ошибка.[На фото пример выполнения файла test, уже откомпилированного с дыумя аргументами : creat1.c и 20 битов.

#include <stdio.h>
#include <stdlib.h>

i…

31
Окт
2020

Добавить суффиксы всем файлам в директории

У меня есть набор директорий с файлами в корневой директории test. Как рекурсивно добавить всем файлам (НЕ директориям) в test суффиксы .txt?
Например, были директории test, test/a, test/b и файлы test/x, test/b/y. Как сделать из этого tes…

31
Окт
2020

Как вывести содержимое из одного файла в стандартный поток вывода , использую системные выводы и функции стандартной библиотеки языка С?

Что такое стандартные потоки. Как вывести содержимое файла в файл, используя готовую программу (не меняя самой программы) данного задания.

27
Окт
2020

Как скрыть служебные функции от пользователя при компиляции библиотеки в си?

Я хочу скомпилировать библиотеку, но скрыть некоторые служебные функции. Я не могу просто засунуть их в .c файлы, потому что эти функции используются в разных модулях библиотеки, но я не хочу чтоб они были видны пользователю. Как это грамо…