Проект основан на darknet yolov3 - AlexeyAB версии. Основная цель - разработка модуля интеллектуального видеонаблюдения (разработка динамической библиотеки dll), что позволяет клиентам системы видеонаблюдения усовершенствовать свои системы.## Цели Традиционные системы видеонаблюдения часто записывают множество избыточных данных, что делает просмотр записей трудной и утомительной задачей для операторов. Исследования показывают, что операторы, смотрящие на экран более 10 минут, могут пропустить 90% информации. Поэтому цель данного проекта - использовать фреймворк глубокого обучения YOLO для разработки модуля интеллектуального видеонаблюдения, который будет извлекать эффективные фрагменты из видео, выполнять подсчет людей и другие функции. Это позволит камере видеонаблюдения стать "вторыми глазами", расширить возможности системы видеонаблюдения и улучшить ее до уровня интеллектуальной системы, тем самым значительно сократив затраты на людей, материалы и финансы.### Демонстрация
Используйте detect_something_appear_times
// names_file - это файл с именами всех объектов, которые может распознать YOLO, например coco.names
// cfg_file - это конфигурационный файл YOLO, например yolov3-tiny.cfg
// weights_file - это файл весов YOLO, например yolov3-tiny.weights
IntelligentMonitor monitor = IntelligentMonitor(
names_file,
cfg_file,
weights_file
);
std::string pic_file = "test_data/people_test.jpg";
std::cout << "person: " <<
monitor.detect_something_appear(pic_file.c_str(), "person", true, "test_save_file/predict_people.jpg")
<< std::endl;
Исходное изображение:
Результат:
На исходном изображении действительно 19 человек, а система обнаружила 18 человек, точность очень высока (используется yolov3.weights - YOLOv3-416)
Демонстрация API detect_all_appear_times
, который используется для подсчета количества появлений всех объектов, которые можно обнаружить, в видео.
В левом верхнем углу отображается количество появлений.
Это можно настроить:
bool draw_box
для управления отображением рамки вокруг объектаbool show_times
для управления отображением количества появлений объекта в левом верхнем углу(используется yolov3.weights - YOLOv3-416)Путь к исходному видео: https://vd1.bdstatic.com/mda-hhfrc6w2sh38kh1s/sc/mda-hhfrc6w2sh38kh1s.mp4?auth_key=1553656663-0-0-ed14309fc809c2c477396b1d5ee95ff3&bcevod_channel=searchbox_feed&pd=bjh&abtest=allИсходное видео длится 54 секунды, извлечение фрагментов с человеком приводит к получению видео длительностью 43 секунды, а фактическое время присутствия человека составляет около 45 секунд.
Значение disappear_thresh
установлено на 5, что означает, что если обнаруженный объект исчезает на 5 секунд, он считается не появляющимся, и его появление будет считаться новым фрагментом.
Обнаруженные фрагменты:
// При вызове этого демонстрационного примера, устанавливаем параметры
// Объект для обнаружения установлен на "person"
// disappear_thresh установлен на 5, что означает, что если обнаруженный объект исчезает на 5 секунд, он считается не появляющимся, и его появление будет считаться новым фрагментом
// draw_box установлен на true
INTELLIGENT_API bool extract(
cv::VideoCapture& cap,
std::vector<char *>& obj_to_extract,
const char* save_path = "./",
const char * prefix = NULL,
int disappear_thresh = DISAPPEAR_THREASH,
bool draw_box = false,
float thresh = DEFAULT_THREASH,
double* progress_rate = NULL
);
Другие API можно использовать, увидев IntelligentMonitor_console_demo.sln
или посмотрев подробное описание параметров API## Описание функций предоставляемых API
// Извлечение эффективных фрагментов видео, есть 2 перегруженных функции
// Поддерживает ввод видеофайла или объекта cv::VideoCapture
// Можно настроить объекты для извлечения
// Можно настроить максимальное значение исчезновения объекта, то есть, если объект исчезает на определенное количество секунд, он считается новым фрагментом
// Можно выбрать, отображать ли рамку вокруг объекта
// В многопоточном режиме можно отслеживать прогресс
// Можно настроить путь и префикс для сохранения видео
// Можно настроить нижний порог уверенности (то есть объект будет классифицирован как этот тип, если уверенность превышает этот порог)
// Можно настроить пропуск определенного количества кадров после каждого обнаружения, чтобы ускорить процесс извлечения
INTELLIGENT_API extract(...);
detect_something_appear
Имеется 4 перегруженных функции. Поддерживает обнаружение одного или группы целей. Возможность выделения обнаруженных целей. Возможность сохранения изображений после обработки. Возможность установки нижней границы порога уверенности (то есть, если значение больше этого порога, объект считается принадлежащим к данной категории).
INTELLIGENT_API bool detect_something_appear(...);
detect_something_appear_times
Имеется 4 перегруженных функции. Поддерживает обнаружение одного или группы целей. Возможность выделения обнаруженных целей. Возможность отображения количества появлений целей в верхнем левом углу. Возможность сохранения изображений после обработки. Возможность установки нижней границы порога уверенности (то есть, если значение больше этого порога, объект считается принадлежащим к данной категории).
INTELLIGENT_API int detect_something_appear_times(...);
detect_all_appear_times
Имеется 2 перегруженных функции. Возможность выделения обнаруженных целей. Возможность отображения количества появлений целей в верхнем левом углу. Возможность сохранения изображений после обработки. Возможность установки нижней границы порога уверенности (то есть, если значение больше этого порога, объект считается принадлежащим к данной категории).
INTELLIGENT_API void detect_all_appear_times(...);
```### Практическое применение API
#### `extract`
**Пригодные сценарии**:
1. В традиционных системах видеонаблюдения хранятся многочисленные видеозаписи, содержащие множество избыточных фрагментов. Этот API может быть использован для удаления избыточных видеофрагментов, что уменьшает нагрузку на оператора при просмотре записей.
#### `detect_something_appear`
Возвращает булево значение.**Пригодные сценарии**:
1. Система видеонаблюдения может использовать этот API для определения моментов, когда требуется начать запись, что позволяет исключить избыточные видеофрагменты и увеличить эффективный период хранения (из-за ограниченного пространства для хранения, камеры видеонаблюдения обычно перезаписывают старые данные, а исключение избыточных данных позволяет сохранять больше полезных видеофрагментов и уменьшает нагрузку на оператора при просмотре).
2. Система видеонаблюдения может использовать этот API для установки зон контроля, то есть определенных зон, которые не должны быть доступны для входа или выхода в определенное время. Это позволяет использовать API для реализации этой функции, а также для определения, когда кто-то появляется в зоне контроля, и для активации звукового оповещения или отправки SMS-уведомления владельцу (например, метрополитен, автомагистраль, зоны, где вход запрещен; ночью, когда нужно установить зону контроля у входа в дом; банк, когда требуется установить зону контроля для перевозки денег; детский сад, когда нужно контролировать, не убегают ли дети).#### `detect_something_appear_times` `detect_all_appear_times`
Функции `detect_something_appear_times` и `detect_all_appear_times` имеют схожие возможности. **Приемлемые сценарии использования**:
1. Видеонаблюдение может использовать этот API для **подсчета**, например, **количества проезжающих автомобилей на перекрестке**, или **плотности пешеходов на перекрестке**, или **плотности пассажиров в автобусе**, или для **подсчета количества людей**, что может быть полезно для бизнес-анализа в коммерческих точках и крупных супермаркетах.
2. Видеонаблюдение может использовать этот API для **обнаружения скоплений людей**, для оповещения о незаконных скоплениях людей или массовых беспорядках в определенной области. Это может быть широко использовано на площадях и в государственных учреждениях для предотвращения незаконных демонстраций и других негативных событий.
**Дополнительные возможности**:
При замене **файла конфигурации (cfg)** и **весов (weights)** (при условии, что данные были использованы для обучения), можно реализовать обнаружение большего количества целей, например, для мониторинга **запрещенных предметов** в видеонаблюдении.
## Быстрое использование
Предварительное условие — установка необходимой [среды](#среда)### Использование C++ программы
1. Включите директорию `include` в ваш проект **Visual Studio**

2. Добавьте файл `IntelligentMonitor.lib` в ваш проект

3. В вашем коде используйте `#include "intelligent_monitoring.h"` и добавьте `#pragma comment(lib, "IntelligentMonitor.lib")`

4. Затем вы можете использовать класс `IntelligentMonitor`, например
```C++
#include "intelligent_monitoring.h"
#include <opencv2/opencv.hpp> // C++
#include "opencv2/highgui/highgui.hpp"
#include <string>
#include <vector>
#include <map>
``````c
#pragma comment(lib, "opencv_world343.lib")
#pragma comment(lib, "IntelligentMonitor.lib")
// names_file — это файл с именами всех объектов, которые может распознать YOLO, например coco.names
// cfg_file — это файл конфигурации YOLO, например yolov3-tiny.cfg
// weights_file — это файл весов YOLO, например yolov3-tiny.weights
IntelligentMonitor monitor = IntelligentMonitor(
names_file,
cfg_file,
weights_file
);
std::vector<char *> obj_to_detect;
obj_to_detect.push_back("person");
obj_to_detect.push_back("car");
// Извлечение фрагментов видео "test.mp4", где появляются объекты person и car
// Сохранение в текущей директории в папке ./test_file
// Имена файлов начинаются с префикса "pre"
// 5 — это максимальное время (в секундах), в течение которого объекты person и car могут отсутствовать, прежде чем будет создан новый фрагмент
// true — это флаг для отображения рамок вокруг обнаруженных объектов
monitor.extract("test.mp4", obj_to_detect, "./test_file", "pre", 5, true)
В данном разделе описано, как скомпилировать IntelligentMonitor.dll
.
См. эту статью для настройки CUDA и cuDNN: https://vonsdite.cn/posts/c6b151e6.html> Или см. официальную документацию для настройки CUDA и cuDNN: https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#installwindows
OpenCV_ROOT_DIR
= каталог build для релизной версии OpenCV 3.4.3
CUDNN
= каталог, где находится CUDNN
CUDA_PATH
и CUDA_PATH_V10_0
IntelligentMonitor.sln
CUDA Toolkit Custom Dir
директорию (в зависимости от своей ситуации)
Компиляция в C++ код (/TP)
IntelligentMonitor.dll
Успешная компиляция, поздравляю тебя, я прошел через множество препятствий! Если ты выполнил все вышеуказанное, то ты готов к работе.
extract
Используется для извлечения фрагментов видео, содержащих определенные объекты
/*
Параметры:
cv::VideoCapture& cap: Объект для захвата видео (не передавайте камеру)
std::vector<char *>& obj_to_extract: Группа объектов, которые нужно извлечь из видео
const char* save_path="./": Путь для сохранения извлеченных видео
const char * prefix=NULL: Префикс для названия извлеченных видео
int disappear_thresh=DISAPPEAR_THREASH: Максимальное время исчезновения объекта, в секундах;
Например, если установлено значение 5, то фрагмент будет создан, если объект не появляется в течение 5 секунд
bool draw_box=false: Необходимость отображения рамки вокруг объекта
float thresh=DEFAULT_THREASH: Нижний порог уверенности (то есть объект будет классифицирован, если уверенность превышает это значение)
double* progress_rate=NULL: Скорость прогресса извлечения, которую можно использовать для отображения прогресса в многопоточной среде
int interval_frame = 0: Установка пропуска определенного количества кадров после каждого обнаружения, чтобы ускорить процесс обнаружения
Возвращаемое значение:
bool: Успешность извлечения
*/
INTELLIGENT_API bool extract(
cv::VideoCapture& cap,
std::vector<char *>& obj_to_extract,
const char* save_path = "./",
const char * prefix = NULL,
int disappear_thresh = DISAPPEAR_THREASH,
bool draw_box = false,
float thresh = DEFAULT_THREASH,
double* progress_rate = NULL,
int interval_frame = 0
);
``````markdown
## Параметры функции `extract````c++
/*
Параметры:
const char* video_file: Путь к видеофайлу
std::vector<char *>& obj_to_extract: Группа объектов, которые нужно извлечь из видео
const char* save_path="./": Путь для сохранения извлеченных видео
const char * prefix=NULL: Префикс для названия извлеченных видео
int disappear_thresh=DISAPPEAR_THREASH: Максимальный порог исчезновения обнаруженных объектов, секундах;
например, если установлено значение 5, то каждый объект, который не появляется в течение 5 секунд, будет разделен на отдельный фрагмент
bool draw_box=false: Нужно ли рисовать рамки вокруг объектов
float thresh=DEFAULT_THREASH: Нижний порог уверенности (то есть объект считается принадлежащим к определенному классу, если значение больше этого порога)
double* progress_rate=NULL: Скорость выполнения (для отображения прогресса в многопоточной среде)
int interval_frame = 0: Количество пропускаемых кадров после каждого обнаружения (ускоряет процесс обнаружения)
Возвращаемое значение:
bool: Указывает на успешность извлечения
*/
INTELLIGENT_API bool extract(
const char* video_file,
std::vector<char *>& obj_to_extract,
const char* save_path = "./",
const char * prefix = NULL,
int disappear_thresh = DISAPPEAR_THREASH,
bool draw_box = false,
float thresh = DEFAULT_THREASH,
double* progress_rate = NULL,
int interval_frame = 0
);
detect_all_appear_times
Обнаружение всех объектов, которые появляются в кадре
/*
Параметры:
cv::Mat& mat: Матрица изображения или кадра видео
std::map<std::string, int>& in_map: Маппинг, который сохраняет количество появлений объектов
bool draw_box=false: Нужно ли рисовать рамки вокруг объектов
bool show_times=false: Нужно ли отображать количество появлений объектов
const char* save_file_name=NULL: Имя файла для сохранения обработанного изображения, NULL означает, что сохранение не требуется
float thresh=DEFAULT_THRESHOLD: Нижний порог уверенности (то есть объект считается принадлежащим к определенному классу, если значение больше этого порога)
````````markdown
## Возвращаемое значение:
Нет возвращаемого значения, количество появлений сохраняется в in_map
INTELLIGENT_API void detect_all_appear_times(
cv::Mat& mat,
std::map<std::string, int>& in_map,
bool draw_box = false,
bool show_times = false,
const char* save_file_name = NULL,
float thresh = DEFAULT_THREASH
);
## Параметры:
- `const char* image_filename`: Имя изображения
- `std::map<std::string, int>& in_map`: Мапа для сохранения количества появлений объектов
- `bool draw_box=false`: Флаг для отрисовки рамок вокруг объектов
- `bool show_times=false`: Флаг для отображения количества появлений объектов
- `const char* save_file_name=NULL`: Имя файла для сохранения обработанного изображения, NULL означает, что сохранение не требуется
- `float thresh=DEFAULT_THREASH`: Пороговое значение уверенности (т.е. объект будет классифицирован как принадлежащий к определенному классу, если значение уверенности превышает это значение)
```Возвращаемое значение:
Нет возвращаемого значения, количество появлений сохраняется в in_map
```c++
INTELLIGENT_API void detect_all_appear_times(
const char* image_filename,
std::map<std::string, int>& in_map,
bool draw_box = false,
bool show_times = false,
const char* save_file_name = NULL,
float thresh = DEFAULT_THREASH
);
detect_something_appear_times
Обнаружение количества появлений объекта, возвращаемое значение - int
INTELLIGENT_API int detect_something_appear_times(
cv::Mat& mat,
const char* something,
bool draw_box = false,
bool show_times = false,
const char* save_file_name = NULL,
float thresh = DEFAULT_THREASH
);
Возвращает: void: количество появлений объекта сохраняется в in_map / INTELLIGENT_API void detect_something_appear_times( cv::Mat& mat, std::vectorstd::string& something, std::map<std::string, int>& in_map, bool draw_box = false, bool show_times = false, const char save_file_name = NULL, float thresh = DEFAULT_THRESHOLD );
Параметры:
const char* image_filename: имя файла изображения
std::vector<char*>& something: набор объектов для обнаружения
std::map<std::string, int>& in_map: карта, содержащая количество появлений объектов
bool draw_box=false: флаг для отрисовки рамки вокруг объекта
bool show_times=false: флаг для отображения количества появлений объекта
const char* save_file_name=NULL: имя файла для сохранения обработанного изображения, NULL означает, что сохранение не требуется
float thresh=DEFAULT_THRESHOLD: нижний порог уверенности (то есть объект считается принадлежащим к классу, если вероятность превышает этот порог)Возвращает:
void: количество появлений объекта сохраняется в in_map
### `detect_something_appear`
Обнаружение появления объекта, возвращает значение `bool`
<details>
<summary>Функциональные объявления</summary>
```c++
/*
Параметры:
cv::Mat& mat: Матрица изображения или кадра видео
const char* something: Объект для обнаружения
bool draw_box=false: Нужно ли рисовать рамку вокруг объекта
const char* save_file_name=NULL: Имя файла для сохранения обработанного изображения, NULL означает, что сохранять не нужно
float thresh=DEFAULT_THREASH: Пороговое значение уверенности (то есть объект считается принадлежащим к классу, если значение больше этого порога)
Возвращаемое значение:
bool: Указывает, был ли обнаружен объект
*/
INTELLIGENT_API bool detect_something_appear(
cv::Mat& mat,
const char* something,
bool draw_box = false,
const char* save_file_name = NULL,
float thresh = DEFAULT_THREASH
);
```/*
Параметры:
const char* image_filename: Имя файла изображения
const char* something: Объект для обнаружения
bool draw_box=false: Нужно ли рисовать рамку вокруг объекта
const char* save_file_name=NULL: Имя файла для сохранения обработанного изображения, NULL означает, что сохранять не нужно
float thresh=DEFAULT_THRESHOLD: Пороговое значение уверенности (то есть объект считается принадлежащим к классу, если значение больше этого порога)
*/Возвращаемое значение:
bool: Указывает, был ли обнаружен объект
Параметры:
cv::Mat& mat: Матрица изображения или кадра видео
std::vector<char*>& something: Группа объектов для обнаружения
bool draw_box=false: Нужно ли рисовать рамку вокруг объекта
const char* save_file_name=NULL: Имя файла для сохранения обработанного изображения, NULL означает, что сохранять не нужно
float thresh=DEFAULT_THREASH: Пороговое значение уверенности (то есть объект считается принадлежащим к классу, если значение больше этого порога)```markdown
## Возвращаемое значение:
bool: Если хотя бы один объект из группы объектов появляется, возвращается true, если ни один объект не появляется, возвращается false
*/
INTELLIGENT_API bool detect_something_appear(
const char* image_filename,
std::vector<char*>& something,
bool draw_box = false,
const char* save_file_name = NULL,
float thresh = DEFAULT_THREASH
);
Использование dont_show
повышает эффективность использования весов.
Для более гибкого использования обученных весов можно добавить dont_show
перед названием класса в файле names_file
, чтобы указать на то, что этот объект не должен быть обнаружен, тем самым уменьшая помехи.
Например, если нужно обнаруживать только людей, можно добавить dont_show
в файл names_file
для реализации этой функции.
На этом изображении показан результат обнаружения только людей
В [darknet yolov3 - AlexeyAB версия](https://github.com/AlexeyAB/darknet) был поднят ряд **Issues**, помогая автору **исправлять ошибки**

## Цитирование
@misc{darknet13, author = {Joseph Redmon}, title = {Darknet: Открытые нейронные сети на C}, howpublished = {\url{http://pjreddie.com/darknet/}}, year = {2013--2016} }
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )