├── .gitignore
├── CMakeLists.txt
├── LICENSE
├── README.md
├── asserts
├── clientInstance.gif
├── clientInstanceLogin.jpg
├── clientInstanceRegister.jpg
├── clientInstanceSplash.jpg
├── crossed.png
├── gitlink&&mmdeploy.png
├── glccWorkflow.png
├── ic_launcher.png
├── logoWithText.png
├── serverInstance.gif
└── weixing.jpg
├── bytetrack
├── CMakeLists.txt
├── include
│ ├── BYTETracker.h
│ ├── STrack.h
│ ├── dataType.h
│ ├── kalmanFilter.h
│ └── lapjv.h
└── src
│ ├── BYTETracker.cpp
│ ├── STrack.cpp
│ ├── kalmanFilter.cpp
│ ├── lapjv.cpp
│ └── utils.cpp
├── configs
└── config.json
├── include
├── common.h
├── dealtor.h
├── loguru.hpp
└── server.h
├── models
└── yolox_tiny_cat_dynamic_fp16_trt
│ ├── deploy.json
│ ├── detail.json
│ ├── end2end.engine
│ ├── end2end.onnx
│ ├── output_pytorch.jpg
│ ├── output_tensorrt.jpg
│ └── pipeline.json
└── src
├── common.cpp
├── dealtor.cpp
├── loguru.cpp
├── main.cpp
└── server.cpp
/.gitignore:
--------------------------------------------------------------------------------
1 | __pycache__/
2 | *.py[cod]
3 | *$py.class
4 | # C extensions
5 | .ssl/
6 | *.so
7 | build/
8 | eggs/
9 | lib/
10 | lib64/
11 | wheels
12 | *.egg-infos/
13 | *.egg
14 | MANIFEST
15 | *.log
16 | tmp/
17 |
18 | # model
19 | *.pkl
20 |
21 | # envs
22 | .env
23 | .venv
24 | env/
25 | venv/
26 |
27 | # data
28 |
29 | data/
30 |
31 | # idel
32 | .vscode
33 | .cache
34 |
35 | # experiments
36 | my_exps/
37 | work_dir/
38 | log/
39 |
40 | # extra libs
41 | tags
--------------------------------------------------------------------------------
/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.22)
2 | project(glcc_server)
3 | set(CMAKE_BUILD_TYPE Debug)
4 | set(CMAKE_CXX_STANDARD 14)
5 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fconcepts --std=c++14")
6 |
7 | find_package(OpenCV REQUIRED)
8 | include_directories($(OpenCV_INCLUDE_DIRS))
9 | set(EXTRA_LIBS ${EXTRA_LIBS} ${OpenCV_LIBS})
10 | if (FOUND_OpenCV)
11 | message(STATUS "OpenCV Library status: ")
12 | message(STATUS " version: {OpenCV_VERSION}" \n)
13 | endif()
14 |
15 | # mmdeploy
16 | find_package(MMDeploy REQUIRED)
17 |
18 | # custom
19 | include_directories(${PROJECT_SOURCE_DIR}/include)
20 | aux_source_directory(${PROJECT_SOURCE_DIR}/src DIR_SRCS)
21 |
22 | add_executable(${CMAKE_PROJECT_NAME} ${DIR_SRCS})
23 | add_subdirectory(bytetrack)
24 | include_directories(${bytetrack_SOURCE_DIR}/include)
25 |
26 | # eigen3
27 | find_package(Eigen3 REQUIRED)
28 | include_directories(${EIGEN3_INCLUDE_DIRS})
29 |
30 | set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
31 | set(EXTRA_LIBS ${EXTRA_LIBS} jsoncpp workflow bytetrack)
32 |
33 | target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE -Wl,--disable-new-dtags)
34 | mmdeploy_load_static(${CMAKE_PROJECT_NAME} MMDeployStaticModules)
35 | mmdeploy_load_dynamic(${CMAKE_PROJECT_NAME} MMDeployDynamicModules)
36 | target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE MMDeployLibs ${EXTRA_LIBS})
37 |
38 |
39 | add_definitions(-O0 -pthread)
40 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 DDGRCF
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
15 |
16 |
17 | Cat Cat | MMDeply $\times$ GLCC 开源项目 | MMDeploy 实践
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | # 介绍
30 |
31 | ✨ 本项目是发起于[CCF GitLink开源编程夏令营](https://www.gitlink.org.cn/)(GitLink Code Camp, 简称GLCC). CCF GitLink 开源编程夏令营(GitLink Code Camp,简称 GLCC),是在 CCF 中国计算机学会指导下,由 GitLink 社区联合 CCF 开源发展委员会(CCF ODC)共同举办的面向全国高校学生的暑期开源项目实习计划。活动将联合各大开源企业、开源基金会、开源社区及开源领域专家,旨在鼓励高校学生通过参与真实的开源软件开发,感受开源文化,提升自身技术能力,进而达到为开源企业和社区输送优秀人才的目的。作为此次活动的特邀合作单位,OpenMMLab 设置了 12 个项目方向共 15 个课题
32 |
33 | ✨ 本项目基于[OpenMMLab](https://github.com/open-mmlab)下的子开源项目[MMDeploy](https://github.com/open-mmlab/mmdeploy)🔥🔥🔥实现的。MMDeploy 是 OpenMMLab 模型部署工具箱,为各算法库提供统一的部署体验。基于 MMDeploy,开发者可以轻松从训练 repo 生成指定硬件所需 SDK,省去大量适配时间。目前 MMDeploy 支持的算法 repo 有:mmcls、mmdet、mmdet3d、mmedit、mmocr、mmpose、mmseg、mmrazor。MMDeploy 同时支持超多推理后端:ONNX Runtime、TensorRT、ppl.nn、ncnn、OpenVINO,目前新版已经发布,快去体验一下吧🔥🔥🔥
34 |
35 | ✨ 针对如今猫猫饲养普及,但人们工作越来越忙碌,不能够照看猫猫的问题,本项目基于MMDeploy,实现了猫猫的检测识别、跟踪、视频记录、视频推送等服务,该服务主要具有以下两个功能:
36 |
37 | * 能够对猫猫进行检测和跟踪,并将检测结果进行推流,可通过手机App播放
38 | * 能够对猫猫进行划线检测,对于猫猫进入一定区域的时间点的视频进行记录并推送给用户
39 |
40 | 实际上通过简单的修改配置文件,能够很容易将本服务拓展到其他宠物的检测识别、跟踪服务,请根据后面章节修改[配置文件](configs/config.json)
41 |
42 | 目前,该项目包括两个部分:
43 |
44 | * **能够响应Http请求,完成检测跟踪的服务器** 👈 **目前位置**
45 | * [能够发起Http请求,完成实现播放的客服端](https://github.com/DDGRCF/GLCC_AndroidApplication)
46 |
47 | **✨服务器目前支持的功能:**
48 |
49 | - [x] 响应基础的Http请求
50 | - [x] 猫猫检测和跟踪
51 | - [x] 猫猫的越线检测
52 | - [x] 猫猫的越线时间点视频的记录
53 | - [x] 猫猫监控的直播视频流的推送
54 | - [x] 记录视频的文件视频流的推送
55 | - [x] 提供配置文件可拓展其他类别
56 | - [x] 猫猫记录视频的定时删除
57 | - [ ] 加载SSL证书
58 |
59 | **✨客服端目前完成的功能:**
60 |
61 | - [x] 发起基础的Http请求
62 | - [x] 用户登录注册
63 | - [x] 视频源注册删除
64 | - [x] 猫猫监控的直播视频流的拉取
65 | - [x] 猫猫记录的文件视频流的拉取
66 | - [x] 支持服务器配置端口,IP等信息
67 | - [ ] 加载SSL证书
68 |
69 |
70 | # 预览
71 |
72 | ## 服务器
73 |
74 | 
75 |
76 | ## 客服端
77 |
78 |
79 |
80 | ## 说明
81 |
82 | | 类型
| 说明
|
83 | |---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
84 | | **服务端**
| 在上面的预览中,我们可以看到服务端运行后,(在客服端发送播放后)跳出来了一个视频界面,视频上两只猫猫被检测出来,并进行了跟踪。另外,我们可以注意到,外面有一个不规则的红色的框。这红色框就代表我们预先设置的栅栏,围栏之类的。猫猫进入了该区域就代表进入了危险区域,那么该红色框就变为实心,并发送通知给用户。这里为了方便演示,我直接将危险框放置在目标中心。值得一提的是,只有猫猫在该区域待够一定时间(可通过配置文件修改),服务器才会将猫猫识别为进入该危险区域 |
85 | | **客户端**
| 在上面的预览中,我们可以看到在客服端登录后,客服端向服务器发送一个拉流请求并播放相关视频(视频播放界面的纵横比为4/3,如果拉取视频流的纵横比大于或小于这个尺寸,会使用灰色进行填充),视频下有一个工具栏,工具栏上有**REGISTER**、**DELETE**、**DRAW**、**SOURCE**等字样,分别代表视频流的注册,视频流的删除,放置边界框(栅栏,围栏之类),目前的播放源功能的按钮(可通过旁边的下拉栏可切换播放源)。然后工具栏下面,有一个可滑动的视频栏目,这个视频栏目就猫猫进入危险时所记录的视频,点击每一个视频栏目可实现视频的播放 |
86 |
87 |
88 |
89 | # 工作流程
90 |
91 |
92 | # 安装与运行
93 | ### 环境依赖
94 | * **MMDeploy**(OpenMMLab下部署工作包) ➡️ [点击进入](https://github.com/open-mmlab/mmdeploy.git)
95 | * **Eigen**(C/C++的矩阵计算库) ➡️ [点击进入](https://eigen.tuxfamily.org/index.php?title=Main_Page)
96 | * **FFmpeg**(包含视频、音频处理工具包和开发库) ➡️ [点击进入](https://ffmpeg.org/)
97 | * **Mysql**(开放源码的数据库) ➡ [点击进入](https://www.mysql.com/)
98 | * **JsonCpp**(基于C/C++的Json格式解析库) ➡ [点击进入](https://github.com/open-source-parsers/jsoncpp)
99 | * **Lal**(基于Go开发的高性能流服务器) ➡ [点击进入](https://github.com/q191201771/lal)
100 | ### 安装命令
101 | 上面的依赖都具有详细的安装文档,安装完所有依赖后,再进行下面的操作:
102 |
103 | 1. 设置相关变量
104 | ```bash
105 | MMDeploy_DIR=/path/to/your/mmdeploy/install
106 | e.g. MMDeploy_DIR=mmdeploy/build/install/cmake/MMDeploy
107 |
108 | OpenCV_DIR=/path/to/your/opencv/install
109 | e.g. OpenCV_DIR=/usr/local/opencv/lib/cmake/opencv4
110 |
111 | DEigen3_DIR=/path/to/your/Eigen/install
112 | e.g. DEigen3_DIR=/usr/local/eign/share/eigen3/cmake
113 | ```
114 |
115 | 2. 生成MakeFile
116 | ```bash
117 | mkdir -p build && cd build && cmake .. -DMMDeploy_DIR=${MMDeploy_DIR} -DOpencv_DIR=${Opencv_DIR} -DEigen3_DIR=${Eigen3_DIR}
118 | ```
119 | 3. 编译
120 | ```bash
121 | make -j$(nproc)
122 | ```
123 | ### 运行命令
124 | 运行之前请确保Lal流服务器以及Mysql数据服务器启动,并按照章节修改配置
125 | ```bash
126 | cd build
127 | config=/path/your/config # it just put in configs/configs.json
128 | SPDLOG_LEVEL=error ./glcc_server ${config}
129 | ```
130 |
131 | # 服务器配置
132 | ```json
133 | {
134 | "Server": {
135 | "server_ip": "0.0.0.0", // 服务器的IP地址
136 | "server_port": 9999, // 服务器的Port
137 | "work_dir": "work_dir", // 服务器的工作目录,用于储存用户资源[default: ./work_dir]
138 | "ssl_crt_path": "/path/your/server.crt", // ssl 证书路径[must]
139 | "ssl_key_path": "/path/your/server_rsa_private.pem.unsecure" // ssl 私钥路径[must]
140 | },
141 | "Log": {
142 | "log_dir": "log", // log保存的目录[default: ./log]
143 | "log_file_time_format": "%Y-%m-%d_%H:%M:%S", // log保存的格式
144 | "log_add_file_verbosity": "INFO", // 新的log保存的等级
145 | "log_all_file_verbosity": "INFO" // 所有log保存的等级
146 | },
147 | "Detector": {
148 | "mode": "TrackerDetector", // Detector的模式,默认为跟踪模式
149 | "ObjectDetector": { // 检测模型配置
150 | "model": "/path/to/your/model", // 模型所在位置[must]
151 | "device": "cuda", // 模型运行设备
152 | "device_id": 0, // 模型运行设备id
153 | "extra_config": {
154 | "score_thre": 0.3, // 检测框的得分阈值
155 | "into_contour_time_gap_second": 5, // 宠物进预设框的阈值
156 | "out_contour_time_gap_second": 20, // 宠物出预设框的阈值
157 | "imshow_result_image": true, // 是否在播放时可视化结果(服务端)
158 | "class_names": ["cat"] // 检测的类别
159 | }
160 | },
161 | "TrackerDetector": { // 跟踪模型配置
162 | "model": "/path/your/model", // 模型所在位置[must]
163 | "device": "cuda", // 模型运行设备
164 | "device_id": 0, // 模型运行设备id
165 | "extra_config": {
166 | "score_thre": 0.3, // 检测框的得分阈值
167 | "tracker_buffer": 30, // 跟踪的时所存储的最大帧数
168 | "into_contour_time_gap_second": 5, // 宠物进预设框的阈值
169 | "out_contour_time_gap_second": 20, // 宠物出预设框的阈值
170 | "imshow_result_image": true, // 是否在播放时可视化结果(服务端)
171 | "wh_ratio_thre_to_show": 1.6, // 可视化框的纵横比阈值(1.6>)
172 | "wh_multiply_thre_to_show": 20, // 可视化框的面积阈值(20<)
173 | "class_names": ["cat"] // 检测类别
174 | }
175 | }
176 | },
177 | "LiveGo": {
178 | "camera_push_port": 5544, // 推流视频源端口,推流本地摄像头: ffmpeg -re -framerate 25 -video_size 640x480 -i /dev/video0 -vcodec h264 -f rtsp rtsp://127.0.0.1:5544/live/test
179 | "dect_push_port": 1935, // 检测结果推送端口
180 | "state_check_port": 8083 // 流服务器状态查询端口
181 | },
182 | "DB": {
183 | "user_name": "root", // 数据库用户名
184 | "user_password": "9696", // 数据库密码
185 | "db_server_ip": "127.0.0.1", // 数据库的IP
186 | "db_server_port": 3306 // 数据库的端口
187 | },
188 | "Timer": {
189 | "interval_to_watch_detector_second": 60, // 间隔多少时间对直播视频流进行检查(检查是否过期)
190 | "interval_to_watch_file_second":5, // 间隔多少时间对文件视频进行检测(检查是否过期)
191 | "max_video_file_save_day": 2, // 保存视频文件最大储存天数
192 | "max_detector_live_day": 365 // 直播视频流最大存在天数
193 | }
194 | }
195 |
196 | ```
197 |
198 | # 开源许可证
199 | 本项目采用 [MIT](./LICENSE) 开源许可证
200 |
201 | # 感谢以下项目
202 | * [MMDeploy](https://github.com/open-mmlab/mmdeploy.git)
203 | * [MMDetection](https://github.com/open-mmlab/mmdetection)
204 | * [YOLOX](https://github.com/Megvii-BaseDetection/YOLOX)
205 | * [Workflow](https://github.com/sogou/workflow/blob/master)
206 | * [Lal](https://github.com/q191201771/lal)
207 | * [MegFlow](https://github.com/MegEngine/MegFlow)
208 | * [ByteTrack](https://github.com/ifzhang/ByteTrack)
209 | * [loguru](https://github.com/emilk/loguru)
210 | * [Eigen](https://gitlab.com/libeigen/eigen)
211 | * [FFmpeg](https://github.com/FFmpeg/FFmpeg)
212 | * [JsonCpp](https://github.com/open-source-parsers/jsoncpp)
213 |
214 |
215 | # 技术交流
216 |
217 |
--------------------------------------------------------------------------------
/asserts/clientInstance.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/clientInstance.gif
--------------------------------------------------------------------------------
/asserts/clientInstanceLogin.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/clientInstanceLogin.jpg
--------------------------------------------------------------------------------
/asserts/clientInstanceRegister.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/clientInstanceRegister.jpg
--------------------------------------------------------------------------------
/asserts/clientInstanceSplash.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/clientInstanceSplash.jpg
--------------------------------------------------------------------------------
/asserts/crossed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/crossed.png
--------------------------------------------------------------------------------
/asserts/gitlink&&mmdeploy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/gitlink&&mmdeploy.png
--------------------------------------------------------------------------------
/asserts/glccWorkflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/glccWorkflow.png
--------------------------------------------------------------------------------
/asserts/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/ic_launcher.png
--------------------------------------------------------------------------------
/asserts/logoWithText.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/logoWithText.png
--------------------------------------------------------------------------------
/asserts/serverInstance.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/serverInstance.gif
--------------------------------------------------------------------------------
/asserts/weixing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DDGRCF/GLCC_Server/8aa41355b01830b1a6003ea222a4dfd8794c6396/asserts/weixing.jpg
--------------------------------------------------------------------------------
/bytetrack/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.22)
2 |
3 | project(bytetrack)
4 |
5 | add_definitions(-std=c++14)
6 |
7 | option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
8 | set(CMAKE_CXX_STANDARD 14)
9 | set(CMAKE_BUILD_TYPE Debug)
10 |
11 | find_package(Eigen3 REQUIRED)
12 | include_directories(${EIGEN3_INCLUDE_DIRS})
13 |
14 | find_package(OpenCV REQUIRED)
15 | include_directories(${OpenCV_INCLUDE_DIRS})
16 |
17 | include_directories(${PROJECT_SOURCE_DIR}/include)
18 | link_directories(${PROJECT_SOURCE_DIR}/include)
19 |
20 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Ofast -Wfatal-errors")
21 |
22 |
23 | file(GLOB mSOURCE_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)
24 | add_library(bytetrack SHARED ${mSOURCE_FILES})
25 | target_link_libraries(bytetrack ${OpenCV_LIBS})
26 | add_definitions(-O2 -pthread)
--------------------------------------------------------------------------------
/bytetrack/include/BYTETracker.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include "STrack.h"
4 |
5 | struct Object
6 | {
7 | Object(cv::Rect_ _rect, int _label, float _prob): rect(_rect), label(_label), prob(_prob){}
8 | cv::Rect_ rect;
9 | int label;
10 | float prob;
11 | };
12 |
13 | class BYTETracker
14 | {
15 | public:
16 | BYTETracker(int frame_rate = 30, int track_buffer = 30);
17 | ~BYTETracker();
18 |
19 | vector update(const vector