Skip to content

Latest commit

 

History

History
201 lines (171 loc) · 13.7 KB

readme.md

File metadata and controls

201 lines (171 loc) · 13.7 KB

Запуск сервиса

Требования:

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

Публичное API

API доступно на порту 1022

POST /api/image/by-classes

Получает список животных по заданным параметрам.

{
    ["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.

GET /api/image/:name

Получает снимок с заданным именем. name - имя файла, полученное из запроса /api/image/by-classes.

Поля запроса:

  • [omit_crop] - Не выделять собаку на изображении. Не выделяет собаку, если значение равно 1.

Ответ 200 OK В ответе возвращается запрошенное изображение.

PUT api/image/similar

Получает список похожих животных. Запрос в формате 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.

PUT /api/image/upload

Запрос в формате multipart/form-data. Добавляет изображения из поля file в базу данных, животное на нем размечается и используется при выдаче результата. Допустимый формат изображения jpg. Поля запроса:

  • timestamp - Unix время обнаружения животного
  • lon - Долгота места обнаружения
  • lat - Широта места обнаружения Все поля обязательны для сохранения фотографии.

Ответ 204 OK

POST /api/geo/predict-route

Ищет точки, по которым может проходить предполагаемый маршрут животного.

{
	"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

Приватное API доступно на порту 6000

PUT /image/upload

Запрос в формате 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) исправляются в постобработке.

Ноутбук с построением csv файла на датасете и AI

Находится в neural_network/notebooks/build_test_csv.ipynb "Боевая" логика для сервиса - neural_network/detect.py Обученные модели - YOLOv5l и resnet38 в neural_network/models

Архитектура

architecture Сервис состоит из докер-контейнеров, которые обмениваются между собой сообщениями через с помощью HTTP JSON.

Ядро сервиса, core, отвечает за доступ к базе данных, проверку нахождения новых изображений в папке new_images, поток их обработки и предоставление пользовательского API. Обработка выполняется в многопоточном режиме. Изображения, полученные любым способом, сохраняются на диск и в дальнейшем core передает их адрес другим сервисом для обработки, сервисы считывают изображения из файловой системы по заданному адресу. В директории volunteer_added находятся изображения, добавленные пользователями не с камер наблюдения, папйлайн их обработки отличается.

Контейнер с нейронными сетями neural_network содержит сервер FastAPI, осуществляющий асинхронную обработку получаемых задач. Задачи содержат путь к изображениий, которые нужно обрабатывать, к ним происходит доступ на чтение напрямую через файловую систему.

Контейнер с фронтэндом содержит код, загружающийся в браузер пользователя.

Доступ к портам фронтэнда и бекэнда происходит через единственный порт 1022 с помощью обратного прокси, назначение определяется по url.

Отдельно предоставляется доступ для администрирования через порт 6000,