1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/shengqipeng-IntelligentMonitor

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 41 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 02.06.2025 01:21 9d6dcbc

IntelligentMonitor

Содержание

  1. Введение
  2. Цели
  3. Демонстрация
  4. Описание предоставляемых функций API
  5. Быстрое использование
  6. Как собрать
  7. Внимание
  8. TODO
  9. Отступление

Введение

Проект основан на 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(...);

Описание API#### 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**
![](ProgressDiary/ProgressImage/2019-03-26-21-05-34.png)
2. Добавьте файл `IntelligentMonitor.lib` в ваш проект
![](ProgressDiary/ProgressImage/2019-03-26-21-07-32.png)
3. В вашем коде используйте `#include "intelligent_monitoring.h"` и добавьте `#pragma comment(lib, "IntelligentMonitor.lib")`
![](ProgressDiary/ProgressImage/2019-03-26-21-09-16.png)
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
  • Добавьте переменные окружения, как показано на рисунке (одна для пути CUDA, другая для пути OpenCV)

Выполнение компиляции

  1. Visual Studio 2015 открывает IntelligentMonitor.sln
  2. Изменяет проект на Release x64
  3. Добавляет CUDA Toolkit Custom Dir директорию (в зависимости от своей ситуации)
  4. Может изменить C/C++ - Дополнительно - Компиляция на Компиляция в C++ код (/TP)
  5. Нажимает Сборка - Пересборка IntelligentMonitor (E), чтобы сгенерировать IntelligentMonitor.dll

Успешная компиляция, поздравляю тебя, я прошел через множество препятствий! Если ты выполнил все вышеуказанное, то ты готов к работе.

Подробное описание параметров API

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
);
``` /* Параметры: const char* image_filename: Имя изображения const char* something: Объект для обнаружения bool draw_box=false: Флаг для отрисовки рамок вокруг объектов bool show_times=false: Флаг для отображения количества появлений объектов const char* save_file_name=NULL: Имя файла для сохранения обработанного изображения, NULL означает, что сохранение не требуется float thresh=DEFAULT_THREASH: Пороговое значение уверенности (т.е. объект будет классифицирован как принадлежащий к определенному классу, если значение уверенности превышает это значение) */ */ INTELLIGENT_API int detect_something_appear_times( const char* image_filename, const char* something, bool draw_box = false, bool show_times = false, const char* save_file_name = NULL, float thresh = DEFAULT_THREASH ); `````` /* Параметры: cv::Mat& mat: матрица изображения или кадра видео std::vector& something: набор объектов для обнаружения std::map& in_map: карта, содержащая количество появлений объектов bool draw_box=false: флаг для отрисовки рамки вокруг объекта bool show_times=false: флаг для отображения количества появлений объекта const char* save_file_name=NULL: имя файла для сохранения обработанного изображения, NULL означает, что сохранение не требуется float thresh=DEFAULT_THRESHOLD: нижний порог уверенности (то есть объект считается принадлежащим к классу, если вероятность превышает этот порог)

Возвращает: 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` ```markdown ## Параметры: const char* image_filename: Имя изображения std::vector& something: Группа объектов для обнаружения bool draw_box=false: Нужно ли рисовать рамку вокруг объекта const char* save_file_name=NULL: Имя файла для сохранения обработанного изображения, NULL означает, что сохранение не требуется float thresh=DEFAULT_THREASH: Пороговое значение уверенности (то есть объект будет классифицирован как принадлежащий к данной категории только если уверенность превышает это значение) ```### Описание `dont_show` Для вызова этого API требуется наличие следующих файлов: > - `names_file` -> Файл, в котором записаны все названия классов, используемые при обучении весов YOLO, например `coco.names` ![](ProgressDiary/ProgressImage/2019-03-25-14-23-19.png) > - `cfg_file` -> Файл конфигурации, используемый при обучении весов YOLO, например `yolov3-tiny.cfg` ![](ProgressDiary/ProgressImage/2019-03-25-14-24-28.png) > - `weights_file` -> Файл весов, полученный в результате обучения YOLO, например `yolov3-tiny.weights` ![](ProgressDiary/ProgressImage/2019-03-25-14-25-08.png)

Использование dont_show повышает эффективность использования весов. Для более гибкого использования обученных весов можно добавить dont_show перед названием класса в файле names_file, чтобы указать на то, что этот объект не должен быть обнаружен, тем самым уменьшая помехи. Например, если нужно обнаруживать только людей, можно добавить dont_show в файл names_file для реализации этой функции.

На этом изображении показан результат обнаружения только людей

## Внимание - Директория `ProgressDiary/` содержит **историю прогресса** проекта - Директория `IntelligentMonitor_console_demo_src` содержит исходный код командной строки демонстрационного приложения `IntelligentMonitor_console_demo.sln` - Директория `src` содержит исходный код проекта `IntelligentMonitor.sln`, а также директории `include` и `3rdparty` - Директория `x64` содержит файлы, сгенерированные при компиляции проекта, а также директории `cfg` и `data`, необходимые для **YOLO**. Файлы весов **YOLO** можно скачать с https://pjreddie.com/darknet/yolo/## TODO - Следующие задачи: * [x] Успешная компиляция `darknet.exe` * [X] Исправление `darknet.exe`, чтобы он успешно поддерживал **распознавание изображений**, **распознавание видео** и **распознавание с камеры** (потому что я компилировал его, и он всегда падал или выдавал ошибки) * [X] Исправление проблемы сохранения **результатов распознавания видео/камеры** * [X] Завершение разработки DLL для интеллектуального модуля * [ ] Создание демонстрационного приложения MFC с красивым интерфейсом * [ ] Получение данных для обучения нового модели весов для распознавания
В [darknet yolov3 - AlexeyAB версия](https://github.com/AlexeyAB/darknet) был поднят ряд **Issues**, помогая автору **исправлять ошибки**
![](ProgressDiary/ProgressImage/2019-03-26-20-57-54.png)

## Цитирование

@misc{darknet13, author = {Joseph Redmon}, title = {Darknet: Открытые нейронные сети на C}, howpublished = {\url{http://pjreddie.com/darknet/}}, year = {2013--2016} }


Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/shengqipeng-IntelligentMonitor.git
git@api.gitlife.ru:oschina-mirror/shengqipeng-IntelligentMonitor.git
oschina-mirror
shengqipeng-IntelligentMonitor
shengqipeng-IntelligentMonitor
master