git clone https://github.com/JutsFunFor/yolov5-main
git clone https://github.com/Kashu7100/pytorch-armv7l
Завариваем ☕ и прописываем в консоль:
cd //home/pi/yolov5-main
chmod +x setup_libs.sh
chmod +x yolov5-reload.sh
sh setup_libs.sh
cd //home/pi
unzip pytorch-armv7l.zip
rm pytorch-armv7l.zip
export PATH="$HOME/.local/bin:$PATH"
cd //home/pi/pytorch-armv7l
pip3 install torch-1.7.0a0-cp37-cp37m-linux_armv7l.whl
pip3 install torchvision-0.8.0a0+45f960c-cp37-cp37m-linux_armv7l.whl
cd ..
sudo su postgres
createuser pi -P --interactive
Вводим пароль: 3vn4ssps
Shall the new role be a superuser? (y/n) y
Выполнение этих программ не должно вызывать ошибку 🙏
cd //home/pi/yolov5-main
python3 inference.py
python3 yolov5_client.pyВыставляем inference-параметры в файле конфигурации config.json
✅modelPath - название модели, если модель в другом расположении, то можно указать путь
✅rstpAddress - адрес rtsp сервера. rtsp://login:password:IP:port
✅threshold - порог предикта
✅iouThreshold - порог iou метрики
✅latteMenuItemId - параметр, необходимый для предобработки латте и применения CLAHE
✅natsUrl - дефолтный адрес
✅sendResultsTopic - топик для отправления результатов детекции
✅dbname, usr, pwd, host - опционально (PostgreSQL). Нужно раскоментить строки (28-38) & (59-60) в yolov5_client.py для записи в БД.
Выставляем crop-параметры в файле конфигурации config.json
✅pixelCoeff - параметр, отображающий количетсво мм в одном пикселе. Для разных комплексов и групп он разный, вычисляется однократно эмпирически при отладке.
✅clipLimit - параметр, необходимый для предобработки изображения (CLAHE), содержащего класс "Латте". Для разных комплексов и групп он разный, вычисляется эмпирически при отладке в зависимости от условий освещения.
Параметры yCropMin, yCropMax, xCropMin, xCropMax - параметры, определяющие границы изображения на входе в детектор.
Установим эти параметры. Выбираем изображение с камеры. При этом, разрешение загружаемого изображения должно равняться разрешению изображению, снятому с камеры посредством скрипта, поскольку Fluent & Clear изображения из клиента Reolink могут давать другие разрешения.
Для этого смотрим разрешение в настройках камеры или произведем пинг камеры внутри комплекса (Только при условии, что установлен yolov5.service - смотри 5 пункт)
с помощью скрипта camera-ping.py
cd //home/pi/yolov5-main
python3 camera-ping.py
Сохраняем изображение в клиенте Reolink ➡️ Resize ➡️ Crop
Resize - https://www.iloveimg.com/resize-image
Crop - https://www.iloveimg.com/crop-image
✅yCropMin = 653
✅yCropMax = 653 + 643 = 1296
✅xCropMin = 320
✅xCropMax = 320 + 493 = 813
🔞Коэффициенты зависят от положения камеры ➡️ меняем положение камеры = меняем коэффициенты
Пути сохранения сырых изображений, предиктов, результатов соответственно:
✅rawImagesSavePath
✅predictionImagesSavePath
✅saveJsonResultsPath
Для правильной работы сервиса необходимо проверить путь, указанный для выполнения программ.
nano yolov5.serviceОбращаем внимание на WorkingDerictory - путь, в котором лежат файлы inference.py & yolov5_client.py
sudo mv yolov5.service /etc/systemd/systemМожно запустить в командной строке
cd //home/pi/yolov5-main
sh yolov5-reload.sh
или выполнить следующие команды:
sudo systemctl daemon-reload
sudo systemctl stop yolov5.service
sudo systemctl start yolov5.service
sudo systemctl status yolov5.service
sudo journalctl -u yolov5.service -b -e
При запуске сервиса из пункта 5 скрипт начинает слушать NATS topic, указанный в файле конфигурации. При поступлении сигнала о конце приготовления напитка и nozzleID - скрипт снимает изображение, обрезает согласно nozzleID и кормит его на вход нейросети. Формируется ответ, который сохраняется в файл saveJsonResultsPath, указанный в конфигурации. Помимо этого, сохраняются как сырые изображения, так и изображения с предиктом объектов - rawImagesSavePath, predictionImagesSavePath.
Формат ответа выглядит следующим образом:
"{'Detection': {'Coffee': {'Xmax': '389.0', 'Ymax': '138.0', 'Ymin': '272.0', 'Score': '0.95'},
'CupTop': {'Xmax': '459.0', 'Ymax': '26.0', 'Ymin': '290.0', 'Score': '0.97'}},
'OrderId': '01G5757AKN9KVXABD1NX7AZSVG',
'OrderNumber': '463',
'NozzleId': '1',
'MenuItemId': '01G3GVZX2YW4WXEJNG2P1ZT3G1',
'DateTime': '2022-06-10 18:56:59',
'Capture_duration': '1.94',
'Inference_duration': '2.74',
'Save_img_duration': '0.08',
'Total_time': '4.76',
'RealDistance': '26.53'}"
Загрузка образа
sudo docker pull alekseyml/yolov5
Настройка конфигуационного файла аналогична действиям, описанным в шаге 4). Для изменения конфигурационного файла:
sudo docker run -it --privileged alekseyml/yolov5 bash
Это запустит контейнер и позволит изменить настройки конфигурационного файла.
После изменения файла нужно выйти из интерактивного режима прописав команду exit
Для того чтобы применить изменения прописываем:
sudo docker ps -a
Копируем ID контейнера, из которого только что вышли и далее:
sudo docker commit CONTAINER_ID alekseyml/yolov5:latest
После этого можно запускать контейнер в рабочем режиме:
sudo docker run -it -d -p 554:554 --privileged -v /home/pi/YOUR_PROJECT_FOLDER_FOR_IMGS:/app/imgs alekseyml/yolov5:latest python3 yolov5_service.py
Изображения сохраняются как на распберри(в директории /home/pi/YOUR_PROJECT_FOLDER_FOR_IMGS), так и внутри контейнера (/app/imgs).





