Skip to content

Team solution for the hackathon "Leaders of Digital Transformation"

Notifications You must be signed in to change notification settings

hivaze/dogfound

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

Требования:

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,

About

Team solution for the hackathon "Leaders of Digital Transformation"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jupyter Notebook 94.7%
  • Go 2.2%
  • Python 1.5%
  • JavaScript 0.9%
  • CSS 0.5%
  • HTML 0.1%
  • Dockerfile 0.1%