Тестовое задание для компании 3divi (1 Этап)
Содержание задания
Тестовое задание
Backend Developer Python
Я, как пользователь системы контроля и управления доступом (СКУД), хочу иметь возможность загружать в систему архивные видео для обработки. Хочу иметь следующие возможности:
-
Загружать несколько видео-файлов на обработку
-
Получать список загруженных видео, их статус и прогресс обработки
-
Остановить/отменить обработку конкретного видео
-
Получать информацию о количестве людей на каждом видео
-
Заносить в базу людей из видео
-
Получать список людей с информацией на каком видео каждый был обнаружен
-
Вносить личные данные людей (ФИО, дату рождения, пол)
Тестовое задание разделено на два этапа:
-
Разработка сервиса обработки загруженных видео
-
Разработка сервиса учета людей/сотрудников
Для сдачи тестового задание достаточно выполнить 1 этап
Реализовать сервис видеообработки на Django/FastApi/Flask, который бы позволил детектировать лица на видео и возвращать пользователю агрегированные данные: общее количество лиц по всем кадрам видео.
● Загрузка и обработка видео-файлов, выбранных пользователем.
● Получение списка загруженных видео (включая текущий статус, прогресс выполнения и результат обработки).
● Остановка/отмена обработки выбранного видео.
Используя сервис разработанный на первом этапе, расширить функционал приложения. Сервис учета людей/сотрудников должен позволить пользователю управлять базой профилей людей: вносить ФИО, пол, год рождения, а также получать кроп изображения из видео, на основе которого был создан профиль. Заполнение базы профилей должно происходить автоматически, включением настройки при загрузке видео: На каждое найденное лицо в обрабатываемом видео, создается его профиль.
● Получение списка всех профилей (включая изображение из видео, ФИО, пол, дату рождения и ссылку на обработанное видео)
● Внесение данных для каждого профиля (ФИО, пол, дата рождения)
● Удаление выбранного профиля
● Программный интерфейс может быть произвольным, но должен быть описан в формате OpenAPI/Swagger или GraphQL Schema;
Сервис должен предоставлять функции:
● Получение списка всех профилей (включая изображение из видео, ФИО, пол, дату рождения и ссылку на обработанное видео)
● Внесение данных для каждого профиля (ФИО, пол, дата рождения)
● Удаление выбранного профиля Требования к реализации
● Программный интерфейс может быть произвольным, но должен быть описан в формате OpenAPI/Swagger или GraphQL Schema;
● Сервис видеобработки должен быть асинхронным и использовать ресурс многоядерного процессора для кратного ускорения обработки, количество одновременно обрабатываемых видеопотоков должно быть равно количеству ядер;
● При запросе списка загруженных видео для каждого из них должны быть доступны: текущий прогресс (значение от 0 до 100) и промежуточный результат (количество найденных лиц на уже обработанном отрезке видео);
● Получение списка профилей не должно занимать более 1 секунды для 100 записей на одноядерном процессоре:
● Для метаданных профилей должна быть валидация данных (кол-во строк ФИО, корректность введенной даты рождения, корректность введенного пола профиля)
Дополнительно
● Для детектирования лиц и получение кропов лиц можно использовать OpenCV.
Будет плюсом
● Микросервисная архитектура, с описанием процессов в виде UML диаграммы
● Контейнеризация docker для каждого сервиса, деплоймент при помощи docker-compose
● Использование объектного хранилища с S3 интерфейсом, например MinIO
● Автотест в виде python скрипта
git clone git@github.com:catstyle1101/3divi.git
cd 3divi
cp .env.example .env
docker compose up --build
# Может занять значительное время.
После запуска контейнеров проект доступен по адресу:
Также доступен Flower для просмотра задач celery
Документация API:
http://127.0.0.1:8000/api/docs/
Реализована админка
Для работы в админке понадобится создать учетную запись администратора
docker exec -it 3divi_backend_1 sh
python manage.py createsuperuser
# и следовать шагам мастера создания пользователя
- Пользователь может залить до 5 (размер и количество можно изменить в настройках) видео.
- Система автоматически ставит видео в очередь для распознавания лиц. Ведет подсчет и записывает данные в БД.
- Можно поставить распознавание на паузу, можно остановить распознавание (для нового запуска видео придется залить заново)
- Просмотреть текущий статус обработки видео можно на главной странице.
- Для теста добавлено видео в репозиторий, faces.mp4.
- Django
- Celery
- Flower
- Face Recognition
- OpenCV2
- Redis
- Docker
- PostgreSQL