# Gate Detection
**Repository Path**: seekerrc/gate-detection
## Basic Information
- **Project Name**: Gate Detection
- **Description**: No description available
- **Primary Language**: Python
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-09-22
- **Last Updated**: 2022-10-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 研究生
## README
# Gate Detection
#### 一、简介
闸机尾随检测系统的算法服务端代码仓库,功能概览:
1、摄像头实时流的解码取流,具体包含:检测图像缓存队列维护、断流重连
2、基于tensorrt加速(c++底层)的yolo模型实现行人检测
3、根据闸机顺序编号维护一组后处理数据,并利用轨迹约束进行误报筛除
4、对筛除后的最终确认报警进行数据封装,以json格式和POST方式提交到报警处理的后台管理系统
5、为方便调试,附加了存图和存视频的相关代码段,利用布尔值类型的flag变量实现开关
#### 二、系统架构
测试硬件:agx、tx2
测试系统及软件:ubuntu18.04+opencv+tensorrt+yolov5
#### 三、tensorrt参数设置及编译
1. 输入尺寸设置在yololayer.h文件中,示例如下:
```c++
static constexpr int INPUT_H = 480;
static constexpr int INPUT_W = 480;
```
2. NMS阈值、预测边界框置信度、batch_size以及GPU id设置均在yolov5.cpp文件中,示例如下:
```cpp
#define DEVICE 0 // GPU id
#define NMS_THRESH 0.5
#define CONF_THRESH 0.7
#define BATCH_SIZE 1
```
3. 如何编译和运行yolov5l模型:
- 将pytorch模型文件yolov5l.pt转化为yolov5l.wts
```shell
cd gate-detection
python gen_wts.py -w yolov5l.pt -o yolov5.wts # 会生成yolov5l.wts文件
```
- build tensorrt/yolov5
```shell
mkdir build
cp yolov5l.wts build
cmake ..
make
sudo ./yolov5 -s yolov5l.wts yolov5l.engine l # 会生成yolov5l.engine文件
```
#### 四、使用说明
代码实现了算法和配置项的分离,将需要的配置项提取成json格式的配置文件,并在代码运行时读取。实际运行时修改配置文件后启动检测程序即可。
##### 配置
以配置文件config1.json为例,其具体内容如下
```json
[
{
"cameraID": "2",
"cameraIPAddress": "rtsp://127.0.0.1:5554/dev_cddz001_2",
"uploadAddress": "http://127.0.0.1:7102/fws-core/event/add",
"gateRegion1": "32 310 6 490 55 505 133 313",
"gateRegion2": "170 310 84 513 236 542 298 324",
"gateRegion3": "352 323 260 550 475 586 514 339",
"gateRegion4": "571 337 512 596 764 614 763 364",
"gateRegion5": "820 353 800 610 1031 621 1000 360",
"gateRegion6": "1047 362 1069 612 1236 591 1189 376"
}
]
```
配置项的解释:
| 配置项 | 样例 | 备注 |
| --------------- | ------------------------------------------ | ------------------------- |
| cameraID | "2" | 摄像头编号 |
| cameraIPAddress | "rtsp://127.0.0.1:5554/dev_cddz001_2" | 摄像头IP |
| uploadAddress | "http://127.0.0.1:7102/fws-core/event/add" | 报警后台系统的存储API接口 |
| gateRegion1 | "32 310 6 490 55 505 133 313" | 闸机区域坐标 |
闸机区域(gateRegion)标注信息:
- 六个红色四边形框从左到右依次对应gateRegion1到gateRegion6
- 闸机区域的坐标读取顺序(参考图例中1,2,3,4的顺序):左上角为第1个点,左下为第2个点,右下为第3个点,右上为第4个点。每个点需读取x坐标和y坐标,以(x, y)的顺序写成字符串。每个闸机字符串包含4个点的xy坐标,共计8个数值

标注工具:在linux系统上可以选择mtPainter graphic editor,界面如上图所示,左下角椭圆红框处可以直接读取xy坐标
##### 运行
首先激活环境,然后运行主程序
```shell
conda activate ${your_conda_environment}
python camera1.py
```
查看进程及资源占用
```shell
ps -aux | grep camera1
top
jtop
```
##### 开机自启动
由于不同的硬件开机自启动的具体配置内容不同,仅给出相关参考,具体内容可查看startup-ref文件夹。如果遇到无法成功自启动,可能是因为conda环境变量没有预加载,参考startup-ref/rc.local中的export命令进行导入。
为了保证程序能够长时间运行,提供了自启动监测的shell脚本autorun.sh,具体内容如下
```shell
#!/bin/sh
cd /projects/tensorrtx/yolov5
while true
do
ps -ef | grep "camera1.py" | grep -v "grep"
if [ "$?" -eq 1 ]
then
nohup /home/agx/archiconda3/envs/py36/bin/python /projects/tensorrtx/yolov5/camera1.py &
echo "process has been restarted!"
else
echo "process already started!"
fi
sleep 600
done
```
功能描述:每隔10分钟进行进程检查,如果不存在对应的进程则对程序进行重新启动。案例中的启动命令为绝对路径,需要根据实际情况更改。
#### 五、检测能力
实测在agx开发板下,同时开启报警后台系统,可以实现3路摄像头的实时检测,尾随事件的精度经过统计约为80%。剩下20%的误检分为两人闸机停留和行人区域误检两种情形。
备注:如果不加轨迹约束,尾随事件检测的精度约为60%,剩下40%的误检几乎都为闸机停留事件。
尾随正样本:
误检样本:
#### 六、TODO
##### 相对面积筛除部分小孩尾随
小孩尾随严格来说并不算逃票。但是模型的检测框其实并不是很准,常出现小孩框画大的情况,如图例。
另一方面有的小孩的身高较高,相对面积并不明显。实际上能够用相对面积约束筛除的小孩尾随案例不到20%,虽然筛除的能力不够但是也可以在后续版本代码中加上
##### 报警数据优化
实测8帧的报警数据偶尔不足以判断是否为尾随事件,需要更多的上下文,后续优化中需要增加报警推送的图像序列,后续可尝试16帧、24帧等
##### 非尾随误检筛除优化
当前轨迹判定能够筛除一部分非尾随,但是还剩余少量负样本,需要后续研究优化轨迹判定的规则