{"id":24206263,"url":"https://github.com/bespredel/cvcounter","last_synced_at":"2026-01-26T09:03:45.219Z","repository":{"id":215655020,"uuid":"737969623","full_name":"BespredeL/CVCounter","owner":"BespredeL","description":"Computer Vision Counter - is a feature for counting objects on video, mainly aimed at manufacturing enterprises.","archived":false,"fork":false,"pushed_at":"2026-01-22T12:32:38.000Z","size":8126,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-01-23T00:22:24.467Z","etag":null,"topics":["computer-vision","counting","counting-objects","deep-learning","machine-learning","manufacturing","ml","object-detection","python","pytorch","ultralytics","webapp","yolov8"],"latest_commit_sha":null,"homepage":"https://bespredel.name","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BespredeL.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-01-02T05:13:06.000Z","updated_at":"2025-12-03T12:26:58.000Z","dependencies_parsed_at":"2024-04-19T17:46:00.486Z","dependency_job_id":"d151489a-1527-4179-93b1-89df4d66d35a","html_url":"https://github.com/BespredeL/CVCounter","commit_stats":null,"previous_names":["bespredel/cvcounter"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/BespredeL/CVCounter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BespredeL%2FCVCounter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BespredeL%2FCVCounter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BespredeL%2FCVCounter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BespredeL%2FCVCounter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BespredeL","download_url":"https://codeload.github.com/BespredeL/CVCounter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BespredeL%2FCVCounter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28771533,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T08:38:24.014Z","status":"ssl_error","status_checked_at":"2026-01-26T08:38:22.080Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["computer-vision","counting","counting-objects","deep-learning","machine-learning","manufacturing","ml","object-detection","python","pytorch","ultralytics","webapp","yolov8"],"created_at":"2025-01-14T00:19:54.487Z","updated_at":"2026-01-26T09:03:45.211Z","avatar_url":"https://github.com/BespredeL.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CVCounter\n\n[![Readme EN](https://img.shields.io/badge/README-EN-blue.svg)](https://github.com/BespredeL/CVCounter/blob/master/README_EN.md)\n[![Readme RU](https://img.shields.io/badge/README-RU-blue.svg)](https://github.com/BespredeL/CVCounter/blob/master/README.md)\n[![GitHub license](https://img.shields.io/badge/license-AGPL--3.0-458a7b.svg)](https://github.com/BespredeL/CVCounter/blob/master/LICENSE)\n\nCVCounter - это приложение для подсчета объектов с использованием компьютерного зрения, реализованное на Python с использованием Flask.\nПроект предоставляет три режима отображения данных: основной вид с видео, текстовый вид и текстовый вид с двумя счетчиками.\n\n---\n\n## Установка\n\n### Вариант 1: Ручная установка\n\n1. **Клонируйте репозиторий:**\n   ```bash\n   git clone https://github.com/BespredeL/CVCounter.git\n   ```\n2. **Перейдите в директорию проекта:**\n   ```bash\n   cd CVCounter\n   ```\n3. **Установите виртуальное окружение:**\n   ```bash\n   python3 -m venv venv\n   ```\n4. **Активируйте виртуальное окружение:**\n   - В Windows:\n     ```bash\n     .\\venv\\Scripts\\activate\n     ```\n   - В Linux/Mac:\n     ```bash\n     source venv/bin/activate\n     ```\n5. **Установите зависимости:**\n   ```bash\n   pip3 install -r requirements.txt\n   ```\n6. **Переименуйте файл конфигурации:**\n   ```bash\n   mv config.example.json config.json\n   ```\n7. **Измените параметры в файле конфигурации, добавьте свою модель YOLO.**\n8. **Запустите приложение:**\n   ```bash\n   python app.py\n   ```\n\n### Вариант 2: Установка через Docker\n\n1. **Клонируйте репозиторий:**\n   ```bash\n   git clone https://github.com/BespredeL/CVCounter.git\n   ```\n2. **Перейдите в директорию проекта:**\n   ```bash\n   cd CVCounter\n   ```\n3. **Соберите и запустите с помощью Docker Compose:**\n   ```bash\n   docker-compose up --build\n   ```\n---\n\n## Использование\n\n**В этом решение реализовано 3 вида просмотра:**\n\n1. **Основной вид** - страница на которой выводится значение счетчиков и видео с результатом распознавания\n2. **Текстовый вид** - страница на которой выводится только значение счетчиков\n3. **Текстовый вид с двумя счетчиками** - страница на которой выводится значение 2 счетчиков (например на входе и выходе)\n\nПосле нескольких вариантов, принял решение реализации на Flask, т.е решение в виде мини веб-сайта,\nтак как такое решение позволяет избежать установки какого либо дополнительного софта на клиенты.\nА так же это решение не требовательно к клиентам в плане потребления ресурсов (за исключением основного вида с видео)\n\nМне удалось запустить 6 одновременных подсчетов (без вывода видео), и 5 подсчета с выводом видео.\u003cbr\u003e\n\nХарактеристики сервера:\n\n- AMD Ryzen 5 3600\n- GeForce GTX 1050 Ti (4Гб)\n\nВы можете запускать браузер в режиме киоска, для предотвращения выхода из него (например для Google Chrome при запуске можно указать \"\n--kiosk --start-fullscreen\")\n\n**P.S.:**\n\n- Друзья, если вас не затруднит, не убирайте, пожалуйста, мой копирайт внизу страницы. Вам это ничего не стоит, а мне приятно.\n- Всё это реализовано без какого либо ТЗ и никто не верил в успех, поэтому пока что есть некоторая хаотичность, но постараюсь всё переделать\n  более правильно =)\n- Если вам помогло это решение, вы можете проспонсировать меня отправив слово \"Спасибо\". Ссылки на контакты ниже =)\n- Если нужна помощь с внедрением, можем обсудить =).\n\n---\n\n## Конфигурация\n\n```json5\n{\n    \"general\": {\n        // включить режим отладки\n        \"debug\": true,\n        // путь к файлу журнала\n        \"log_path\": \"errors.log\",\n        // минимальный уровень журнала: DEBUG, INFO, WARNING, ERROR, CRITICAL\n        \"log_level\": \"INFO\",\n        // включить вывод журнала в консоль (рекомендуется false в рабочей среде)\n        \"log_console\": false,\n        // язык по умолчанию\n        \"default_language\": \"ru\",\n        // разрешить небезопасные операции в werkzeug\n        \"allow_unsafe_werkzeug\": false,\n        // показать кнопку изменения темы\n        \"button_change_theme\": true,\n        // показать кнопку перехода в полноэкранный режим\n        \"button_fullscreen\": true,\n        // показать кнопку назад\n        \"button_backward\": false,\n        // показать кнопку сохранения кадра\n        \"button_save_capture\": false,\n        // показать клавиатуры свернутыми\n        \"collapsed_keyboard\": true\n    },\n    \"server\": {\n        // адрес сервера\n        \"host\": \"0.0.0.0\",\n        // порт сервера\n        \"port\": 8080,\n        // включить режим перезагрузки\n        \"use_reloader\": false,\n        // включить вывод журнала\n        \"log_output\": true,\n        // socketio ключ\n        \"socketio_key\": \"\",\n        // allowed origins \n        \"allowed_origins\": \"*\"\n    },\n    \"users\": {\n        // логин:пароль по умолчанию admin:admin\n        \"admin\": \"scrypt:32768:8:1$rsdPYhqaQqpXQQ0o$aa3359c86228b4cee5fe8c4ed694db4b371fa7fab5100fa7b446db7e1ed8077e3bb63228d4a1899aeeef9b8d15f8e8bdbcc3457f020bcb3ec320332c76b5896b\"\n    },\n    \"db\": {\n        // подключение к базе данных\n        \"uri\": \"sqlite:///system/database.db\",\n        // префикс таблиц\n        \"prefix\": \"\"\n    },\n    \"form\": {\n        // показать форму брака\n        \"defect_show\": true,\n        // показать форму коррекции\n        \"correct_show\": true,\n        // конфигурация пользовательских полей\n        \"custom_fields\": {\n            \"field_one\": {\n                // название поля\n                \"name\": \"field_one\",\n                // подпись поля\n                \"label\": \"Field One\",\n                // тип поля\n                \"type\": \"text\"\n            }\n        }\n    },\n    \"detection_default\": {\n        // тип модели (по умолчанию yolo)\n        \"model_type\": \"yolo\",\n        // путь к модели Yolov8\n        \"weights_path\": \"yolo_cfg/models/yolov8n.pt\",\n        // масштаб вывода видео на странице\n        \"video_show_scale\": 50,\n        // качество вывода видео на странице\n        \"video_show_quality\": 50,\n        // ручная установка FPS (0 - автоматическая установка)\n        \"video_fps\": 0,\n        // порог доверия\n        \"confidence\": 0.7,\n        // порог iou\n        \"iou\": 0.7,\n        // указывает вычислительное устройство(а) для обучения (смотрите документацию ultralytics)\n        \"device\": 0,\n        // шаг видеопотока\n        \"vid_stride\": 1,\n        // размер индикатора\n        \"indicator_size\": 10,\n        // площадь подсчета (многоугольник)\n        \"counting_area\": [\n            [\n                0,\n                0\n            ],\n            [\n                100,\n                0\n            ],\n            [\n                100,\n                100\n            ],\n            [\n                0,\n                100\n            ]\n        ],\n        // цвет зоны подсчета\n        \"counting_area_color\": [\n            67,\n            211,\n            255\n        ],\n        // классы (объекты) для обнаружения (оставьте пустым для всех классов)\n        \"classes\": {},\n        // конфигурация записи видео для всех распознаваний\n        \"recording\": {\n            // включить запись видео\n            \"enable\": false,\n            // путь к папке хранения\n            \"path\": \"yolo_cfg/saved_recordings\",\n            // размер видео (в процентах)\n            \"scale\": 100,\n            // качество видео\n            \"quality\": 80\n        }\n    },\n    \"detections\": {\n        // конфигурации обнаружения\n        \"ExampleCam\": {\n            // наименование подсчета (используется в адресе страницы, должно быть на латинице)\n            \"label\": \"Label ExampleCam\",\n            // число с которого начинается подсчет (по умолчанию 0, но если необходимо начать с какого-то числа, то можно указать)\n            \"start_total_count\": 0,\n            // путь к видеофайлу или источнику камеры\n            \"video_path\": \"\",\n            // масштаб вывода видео на странице\n            \"video_show_scale\": 70,\n            // качество вывода видео на странице\n            \"video_show_quality\": 30,\n            // ручная установка FPS (необязательно)\n            \"video_fps\": 0,\n            // тип модели (по умолчанию yolo)\n            \"model_type\": \"yolo\",\n            // путь к модели\n            \"weights_path\": \"yolo_cfg/models/yolov8n.pt\",\n            // порог доверия\n            \"confidence\": 0.7,\n            // порог iou\n            \"iou\": 0.7,\n            // указывает вычислительное устройство(а) для обучения\n            \"device\": 0,\n            // шаг видеопотока\n            \"vid_stride\": 1,\n            // размер индикатора\n            \"indicator_size\": 10,\n            // площадь подсчета (многоугольник)\n            \"counting_area\": [\n                [\n                    0,\n                    0\n                ],\n                [\n                    100,\n                    0\n                ],\n                [\n                    100,\n                    100\n                ],\n                [\n                    0,\n                    100\n                ]\n            ],\n            // цвет зоны подсчета\n            \"counting_area_color\": [\n                255,\n                64,\n                0\n            ],\n            // классы (объекты) для обнаружения (оставьте пустым для всех классов)\n            \"classes\": {},\n            // автоматическое создание набора данных\n            \"dataset_create\": {\n                // включить создание набора данных\n                \"enable\": true,\n                // вероятность создания изображения набора данных (число от 0.01 до 1, где 0.01 - 1% и 1 - 100%)\n                \"probability\": 0.05,\n                // путь для сохранения набора данных\n                \"path\": \"yolo_cfg/saved_images/ExampleCam\"\n            },\n            // конфигурация записи видео для обнаружения\n            \"recording\": {\n                // включить запись видео\n                \"enable\": false,\n                // путь к папке хранения\n                \"path\": \"yolo_cfg/saved_recordings\",\n                // размер видео (в процентах)\n                \"scale\": 100,\n                // качество видео\n                \"quality\": 80\n            }\n        },\n    }\n}\n```\n\n---\n\n## Скриншоты\n\n\u003cimg src=\"https://github.com/BespredeL/BespredeL/blob/9b1aa0d2a841c04fce5a0cf58453f6cd5c831a88/VideoView.gif\" alt=\"\"\u003e\n\u003cimg src=\"https://github.com/BespredeL/BespredeL/blob/da1fce84f2e64f149142a7302a98a7e5e06f62fa/IndexPage.png\" alt=\"\"\u003e\n\u003cimg src=\"https://github.com/BespredeL/BespredeL/blob/da1fce84f2e64f149142a7302a98a7e5e06f62fa/VideoView.png\" alt=\"\"\u003e\n\u003cimg src=\"https://github.com/BespredeL/BespredeL/blob/da1fce84f2e64f149142a7302a98a7e5e06f62fa/TextView.png\" alt=\"\"\u003e\n\u003cimg src=\"https://github.com/BespredeL/BespredeL/blob/da1fce84f2e64f149142a7302a98a7e5e06f62fa/MultiTextView.png\" alt=\"\"\u003e\nP.S.: Не лучший пример на скриншотах. Не нашел ничего лучше, чем камера в открытом доступе (((\n\n---\n\n## Автор\n\nАлександр Киреев\n\nWebsite: [https://bespredel.name](https://bespredel.name)\u003cbr\u003e\nE-mail:  [hello@bespredel.name](mailto:hello@bespredel.name)\u003cbr\u003e\nGitHub:  [https://github.com/BespredeL](https://github.com/BespredeL)\n\n---\n\n## Ссылки\n\nUltralytics: [https://github.com/ultralytics](https://github.com/ultralytics)\n\n---\n\n## Лицензия\n\n**AGPL-3.0 License**: Эта [OSI-approved](https://opensource.org/licenses/) лицензия с открытым исходным кодом идеально подходит для\nстудентов и энтузиастов, способствуя открытому сотрудничеству и обмену знаниями.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbespredel%2Fcvcounter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbespredel%2Fcvcounter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbespredel%2Fcvcounter/lists"}