git docker версии 18.09 или выше docker-compose
Скачать содержимое репозитория
git clone https://github.com/MISiS-General-Solutions-2/dogfound
Для использования BuildKit задать переменные окружения DOCKER_BUILDKIT=1 и COMPOSE_DOCKER_CLI_BUILD=1. Например, на системе linux, это можно сделать коммандами
export DOCKER_BUILDKIT=1
export COMPOSE_DOCKER_CLI_BUILD=1
Изображения из папки data/new_images будут классифицированы и добавлены в базу данных, если поместить их туда перед сборкой контейнера.
Перейти в директорию с проекта
cd dogfound
Установить адрес сервера, на котором будет запущен сервер в front/Dockerfile
REACT_APP_API_URL="ddd.ddd.ddd.ddd:pppp"
Собрать и запустить контейнер
docker-compose up
Чтобы пересобрать контейнер с учетом изменений в исходном коде
docker-compose build
Веб-страница сервиса доступна на порту 1022.
API доступно на порту 1022
Получает список животных по заданным параметрам.
{
["color"]: <цвет собаки>
["tail"]: <длина хвоста собаки>
["cam_id"]: <айди камеры>
["t0"]: <время, начиная с которого искать собаку>
["t1"]: <время, по которое искать собаку>
}
- color: int - Метка класса цвета животного
- tail: int - Метка класса хвоста животного
- cam_id: string - Айди камеры, на которой осуществлять поиск
- t0: int - Unix время, начиная с которого искать собаку
- t1: int - Unix время, заканчивая которым искать собаку.
Ответ 200 OK
{
"filename": <имя файла>,
"address": <адрес>,
"cam_id": <айди камеры>,
"timestamp": <временная метка снимка>,
"lonlat": []: <широта и долгота>,
"breed": <порода собаки>
"additional": {
"crop": [], <координаты кропа собаки>
}
}
- filename: string - Имя файла - снимка с камеры
- address: string - Адрес камеры. Может быть пустым, если адрес камеры не был найден.
- cam_id: string - Айди камеры. Может быть пустым, если id камеры не был распознан.
- timestamp: int - Unix время снимка с точностью до дня. Может быть 0, если время не было распознано.
- lonlat: [2]float - LonLat координаты камеры. Могут быть 0, если адрес камеры не был найден.
- breed: string - Порода собаки. Может быть пустым, если порода не определена.
- crop: [4]int - Координаты прямоугольника с собакой на изображении. Координаты левого верхнего и правого нижнего угла изображения в системе координат OpenCV.
Получает снимок с заданным именем. name - имя файла, полученное из запроса /api/image/by-classes.
Поля запроса:
- [omit_crop] - Не выделять собаку на изображении. Не выделяет собаку, если значение равно 1.
Ответ 200 OK В ответе возвращается запрошенное изображение.
Получает список похожих животных. Запрос в формате multipart/form-data. Изображение животного берется из поля file.
Поля запроса:
- [t0] - Unix время, начиная с которого искать животное
- [t1] - Unix время, заканчивая которым искать животное
Ответ 200 OK
{
"is_animal_there"`: <определено ли животное на снимке>
"results": [
{
"filename": <имя файла>,
"address": <адрес>,
"cam_id": <айди камеры>,
"timestamp": <временная метка снимка>,
"lonlat": []: <широта и долгота>,
"breed": <порода собаки>
"additional": {
"crop": [], <координаты кропа собаки>
}
}
]
}
- is_animal_there: int - Определено ли животное на предоставленном снимке. 0, если не определено, 1 если определено. Если животное не определено, "results" пустое.
- filename: string - Имя файла - снимка с камеры
- address: string - Адрес камеры. Может быть пустым, если адрес камеры не был найден.
- cam_id: string - Айди камеры. Может быть пустым, если id камеры не был распознан.
- timestamp: int - Unix время снимка с точностью до дня. Может быть 0, если время не было распознано.
- lonlat: [2]float - LonLat координаты камеры. Могут быть 0, если адрес камеры не был найден.
- breed: string - Порода собаки. Может быть пустым, если порода не определена.
- crop: [4]int - Координаты прямоугольника с собакой на изображении. Координаты левого верхнего и правого нижнего угла изображения в системе координат OpenCV.
Запрос в формате multipart/form-data. Добавляет изображения из поля file в базу данных, животное на нем размечается и используется при выдаче результата. Допустимый формат изображения jpg. Поля запроса:
- timestamp - Unix время обнаружения животного
- lon - Долгота места обнаружения
- lat - Широта места обнаружения Все поля обязательны для сохранения фотографии.
Ответ 204 OK
Ищет точки, по которым может проходить предполагаемый маршрут животного.
{
"timestamp": <временная метка>,
"lonlat": [] <долгота и широта>
}
- timestamp: int - Unix время нахождения животного в точке для предположений о его премещении.
- lonlat: [2]float - LonLat координаты точки старта животного для предположений о его перемещении.
Ответ 200 OK
{
"filename": <имя файла>,
"address": <адрес>,
"cam_id": <айди камеры>,
"timestamp": <временная метка снимка>,
"lonlat": []: <широта и долгота>,
"breed": <порода собаки>
"additional": {
"crop": [], <координаты кропа собаки>
}
}
- filename: string - Имя файла - снимка с камеры
- address: string - Адрес камеры. Может быть пустым, если адрес камеры не был найден.
- cam_id: string - Айди камеры. Может быть пустым, если id камеры не был распознан.
- timestamp: int - Unix время снимка с точностью до дня. Может быть 0, если время не было распознано.
- lonlat: [2]float - LonLat координаты камеры. Могут быть 0, если адрес камеры не был найден.
- breed: string - Порода собаки. Может быть пустым, если порода не определена.
- crop: [4]int - Координаты прямоугольника с собакой на изображении. Координаты левого верхнего и правого нижнего угла изображения в системе координат OpenCV.
Приватное API доступно на порту 6000
Запрос в формате multipart/form-data. Добавляет изображения из поля file в базу данных, они в дальнейшем размечаются как изображения с камер и используются при выдаче результата. Допустимый формат изображения jpg.
Ответ 204 OK
- Контейнер использует volume data, в котором папка /opt/dogfound/data/new_images проверяется на наличие новых изображений по умолчанию каждые 5 секунд. Можно добавить изображения в эту папку, например, командой
docker cp ./core/my_data/new_images dogfound-core-1:/opt/dogfound/data/
При добавлении этим методом файлов с названием, которое уже есть в базе данных, они будут заменены. - Можно воспользоваться приватным API /image/upload При добавлении этим методом существующие изображения не будут перезаписаны.
Номера камер и временные метки считываются с фиксированного места на изображении (слева сверху). К фрагменту изображения применяется предобработка методами OpenCV, на обработанном участке происходит распознавание текста с помощью tesseract. Качество распознавания текста хорошее уже при задании языка, дополнительные настройки не используются. Мелкие частые ошибки (перепутанные 0 и O) исправляются в постобработке.
Находится в neural_network/notebooks/build_test_csv.ipynb "Боевая" логика для сервиса - neural_network/detect.py Обученные модели - YOLOv5l и resnet38 в neural_network/models
Сервис состоит из докер-контейнеров, которые обмениваются между собой сообщениями через с помощью HTTP JSON.
Ядро сервиса, core, отвечает за доступ к базе данных, проверку нахождения новых изображений в папке new_images, поток их обработки и предоставление пользовательского API. Обработка выполняется в многопоточном режиме. Изображения, полученные любым способом, сохраняются на диск и в дальнейшем core передает их адрес другим сервисом для обработки, сервисы считывают изображения из файловой системы по заданному адресу. В директории volunteer_added находятся изображения, добавленные пользователями не с камер наблюдения, папйлайн их обработки отличается.
Контейнер с нейронными сетями neural_network содержит сервер FastAPI, осуществляющий асинхронную обработку получаемых задач. Задачи содержат путь к изображениий, которые нужно обрабатывать, к ним происходит доступ на чтение напрямую через файловую систему.
Контейнер с фронтэндом содержит код, загружающийся в браузер пользователя.
Доступ к портам фронтэнда и бекэнда происходит через единственный порт 1022 с помощью обратного прокси, назначение определяется по url.
Отдельно предоставляется доступ для администрирования через порт 6000,