https://github.com/bespredel/cvcounter
Computer Vision Counter - is a feature for counting objects on video, mainly aimed at manufacturing enterprises.
https://github.com/bespredel/cvcounter
computer-vision counting counting-objects deep-learning machine-learning manufacturing ml object-detection python pytorch ultralytics webapp yolov8
Last synced: 4 months ago
JSON representation
Computer Vision Counter - is a feature for counting objects on video, mainly aimed at manufacturing enterprises.
- Host: GitHub
- URL: https://github.com/bespredel/cvcounter
- Owner: BespredeL
- License: agpl-3.0
- Created: 2024-01-02T05:13:06.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2026-01-22T12:32:38.000Z (4 months ago)
- Last Synced: 2026-01-23T00:22:24.467Z (4 months ago)
- Topics: computer-vision, counting, counting-objects, deep-learning, machine-learning, manufacturing, ml, object-detection, python, pytorch, ultralytics, webapp, yolov8
- Language: Python
- Homepage: https://bespredel.name
- Size: 7.75 MB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# CVCounter
[](https://github.com/BespredeL/CVCounter/blob/master/README_EN.md)
[](https://github.com/BespredeL/CVCounter/blob/master/README.md)
[](https://github.com/BespredeL/CVCounter/blob/master/LICENSE)
CVCounter - это приложение для подсчета объектов с использованием компьютерного зрения, реализованное на Python с использованием Flask.
Проект предоставляет три режима отображения данных: основной вид с видео, текстовый вид и текстовый вид с двумя счетчиками.
---
## Установка
### Вариант 1: Ручная установка
1. **Клонируйте репозиторий:**
```bash
git clone https://github.com/BespredeL/CVCounter.git
```
2. **Перейдите в директорию проекта:**
```bash
cd CVCounter
```
3. **Установите виртуальное окружение:**
```bash
python3 -m venv venv
```
4. **Активируйте виртуальное окружение:**
- В Windows:
```bash
.\venv\Scripts\activate
```
- В Linux/Mac:
```bash
source venv/bin/activate
```
5. **Установите зависимости:**
```bash
pip3 install -r requirements.txt
```
6. **Переименуйте файл конфигурации:**
```bash
mv config.example.json config.json
```
7. **Измените параметры в файле конфигурации, добавьте свою модель YOLO.**
8. **Запустите приложение:**
```bash
python app.py
```
### Вариант 2: Установка через Docker
1. **Клонируйте репозиторий:**
```bash
git clone https://github.com/BespredeL/CVCounter.git
```
2. **Перейдите в директорию проекта:**
```bash
cd CVCounter
```
3. **Соберите и запустите с помощью Docker Compose:**
```bash
docker-compose up --build
```
---
## Использование
**В этом решение реализовано 3 вида просмотра:**
1. **Основной вид** - страница на которой выводится значение счетчиков и видео с результатом распознавания
2. **Текстовый вид** - страница на которой выводится только значение счетчиков
3. **Текстовый вид с двумя счетчиками** - страница на которой выводится значение 2 счетчиков (например на входе и выходе)
После нескольких вариантов, принял решение реализации на Flask, т.е решение в виде мини веб-сайта,
так как такое решение позволяет избежать установки какого либо дополнительного софта на клиенты.
А так же это решение не требовательно к клиентам в плане потребления ресурсов (за исключением основного вида с видео)
Мне удалось запустить 6 одновременных подсчетов (без вывода видео), и 5 подсчета с выводом видео.
Характеристики сервера:
- AMD Ryzen 5 3600
- GeForce GTX 1050 Ti (4Гб)
Вы можете запускать браузер в режиме киоска, для предотвращения выхода из него (например для Google Chrome при запуске можно указать "
--kiosk --start-fullscreen")
**P.S.:**
- Друзья, если вас не затруднит, не убирайте, пожалуйста, мой копирайт внизу страницы. Вам это ничего не стоит, а мне приятно.
- Всё это реализовано без какого либо ТЗ и никто не верил в успех, поэтому пока что есть некоторая хаотичность, но постараюсь всё переделать
более правильно =)
- Если вам помогло это решение, вы можете проспонсировать меня отправив слово "Спасибо". Ссылки на контакты ниже =)
- Если нужна помощь с внедрением, можем обсудить =).
---
## Конфигурация
```json5
{
"general": {
// включить режим отладки
"debug": true,
// путь к файлу журнала
"log_path": "errors.log",
// минимальный уровень журнала: DEBUG, INFO, WARNING, ERROR, CRITICAL
"log_level": "INFO",
// включить вывод журнала в консоль (рекомендуется false в рабочей среде)
"log_console": false,
// язык по умолчанию
"default_language": "ru",
// разрешить небезопасные операции в werkzeug
"allow_unsafe_werkzeug": false,
// показать кнопку изменения темы
"button_change_theme": true,
// показать кнопку перехода в полноэкранный режим
"button_fullscreen": true,
// показать кнопку назад
"button_backward": false,
// показать кнопку сохранения кадра
"button_save_capture": false,
// показать клавиатуры свернутыми
"collapsed_keyboard": true
},
"server": {
// адрес сервера
"host": "0.0.0.0",
// порт сервера
"port": 8080,
// включить режим перезагрузки
"use_reloader": false,
// включить вывод журнала
"log_output": true,
// socketio ключ
"socketio_key": "",
// allowed origins
"allowed_origins": "*"
},
"users": {
// логин:пароль по умолчанию admin:admin
"admin": "scrypt:32768:8:1$rsdPYhqaQqpXQQ0o$aa3359c86228b4cee5fe8c4ed694db4b371fa7fab5100fa7b446db7e1ed8077e3bb63228d4a1899aeeef9b8d15f8e8bdbcc3457f020bcb3ec320332c76b5896b"
},
"db": {
// подключение к базе данных
"uri": "sqlite:///system/database.db",
// префикс таблиц
"prefix": ""
},
"form": {
// показать форму брака
"defect_show": true,
// показать форму коррекции
"correct_show": true,
// конфигурация пользовательских полей
"custom_fields": {
"field_one": {
// название поля
"name": "field_one",
// подпись поля
"label": "Field One",
// тип поля
"type": "text"
}
}
},
"detection_default": {
// тип модели (по умолчанию yolo)
"model_type": "yolo",
// путь к модели Yolov8
"weights_path": "yolo_cfg/models/yolov8n.pt",
// масштаб вывода видео на странице
"video_show_scale": 50,
// качество вывода видео на странице
"video_show_quality": 50,
// ручная установка FPS (0 - автоматическая установка)
"video_fps": 0,
// порог доверия
"confidence": 0.7,
// порог iou
"iou": 0.7,
// указывает вычислительное устройство(а) для обучения (смотрите документацию ultralytics)
"device": 0,
// шаг видеопотока
"vid_stride": 1,
// размер индикатора
"indicator_size": 10,
// площадь подсчета (многоугольник)
"counting_area": [
[
0,
0
],
[
100,
0
],
[
100,
100
],
[
0,
100
]
],
// цвет зоны подсчета
"counting_area_color": [
67,
211,
255
],
// классы (объекты) для обнаружения (оставьте пустым для всех классов)
"classes": {},
// конфигурация записи видео для всех распознаваний
"recording": {
// включить запись видео
"enable": false,
// путь к папке хранения
"path": "yolo_cfg/saved_recordings",
// размер видео (в процентах)
"scale": 100,
// качество видео
"quality": 80
}
},
"detections": {
// конфигурации обнаружения
"ExampleCam": {
// наименование подсчета (используется в адресе страницы, должно быть на латинице)
"label": "Label ExampleCam",
// число с которого начинается подсчет (по умолчанию 0, но если необходимо начать с какого-то числа, то можно указать)
"start_total_count": 0,
// путь к видеофайлу или источнику камеры
"video_path": "",
// масштаб вывода видео на странице
"video_show_scale": 70,
// качество вывода видео на странице
"video_show_quality": 30,
// ручная установка FPS (необязательно)
"video_fps": 0,
// тип модели (по умолчанию yolo)
"model_type": "yolo",
// путь к модели
"weights_path": "yolo_cfg/models/yolov8n.pt",
// порог доверия
"confidence": 0.7,
// порог iou
"iou": 0.7,
// указывает вычислительное устройство(а) для обучения
"device": 0,
// шаг видеопотока
"vid_stride": 1,
// размер индикатора
"indicator_size": 10,
// площадь подсчета (многоугольник)
"counting_area": [
[
0,
0
],
[
100,
0
],
[
100,
100
],
[
0,
100
]
],
// цвет зоны подсчета
"counting_area_color": [
255,
64,
0
],
// классы (объекты) для обнаружения (оставьте пустым для всех классов)
"classes": {},
// автоматическое создание набора данных
"dataset_create": {
// включить создание набора данных
"enable": true,
// вероятность создания изображения набора данных (число от 0.01 до 1, где 0.01 - 1% и 1 - 100%)
"probability": 0.05,
// путь для сохранения набора данных
"path": "yolo_cfg/saved_images/ExampleCam"
},
// конфигурация записи видео для обнаружения
"recording": {
// включить запись видео
"enable": false,
// путь к папке хранения
"path": "yolo_cfg/saved_recordings",
// размер видео (в процентах)
"scale": 100,
// качество видео
"quality": 80
}
},
}
}
```
---
## Скриншоты
P.S.: Не лучший пример на скриншотах. Не нашел ничего лучше, чем камера в открытом доступе (((
---
## Автор
Александр Киреев
Website: [https://bespredel.name](https://bespredel.name)
E-mail: [hello@bespredel.name](mailto:hello@bespredel.name)
GitHub: [https://github.com/BespredeL](https://github.com/BespredeL)
---
## Ссылки
Ultralytics: [https://github.com/ultralytics](https://github.com/ultralytics)
---
## Лицензия
**AGPL-3.0 License**: Эта [OSI-approved](https://opensource.org/licenses/) лицензия с открытым исходным кодом идеально подходит для
студентов и энтузиастов, способствуя открытому сотрудничеству и обмену знаниями.