# 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个数值 ![](README.assets/label-sample.png) 标注工具:在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%的误检几乎都为闸机停留事件。 尾随正样本: 2021-09-21 14_10_51Original 误检样本: 2021-09-20 16_49_15Original #### 六、TODO ##### 相对面积筛除部分小孩尾随 小孩尾随严格来说并不算逃票。但是模型的检测框其实并不是很准,常出现小孩框画大的情况,如图例。 另一方面有的小孩的身高较高,相对面积并不明显。实际上能够用相对面积约束筛除的小孩尾随案例不到20%,虽然筛除的能力不够但是也可以在后续版本代码中加上 image-20210921182704045 ##### 报警数据优化 实测8帧的报警数据偶尔不足以判断是否为尾随事件,需要更多的上下文,后续优化中需要增加报警推送的图像序列,后续可尝试16帧、24帧等 ##### 非尾随误检筛除优化 当前轨迹判定能够筛除一部分非尾随,但是还剩余少量负样本,需要后续研究优化轨迹判定的规则