目录
1.开发背景
面对的用户是长期在野外从事油气勘探开发的钻井公司,他们从事的野外作业环境存在环境安全性差,人与设备、设备与设备交互性多,容易发生安全事故。
传统统油田安全管理采用两种方式:第一种设置规章制度要求人的主观管理,如专人看管、操作员自我监督和互相监督等。
第二种针对特殊位置安装传感器来实现管理。这样存在两个问题,前者受人的主观影响较大,不容易控制;后者有很大局限性,考虑到安全冗余和故障,同一个位置还要成组布置,这种方式仅实现了对设备的自动化控制(传感器触发设备停止动作,来保护人员与设备安全),无法上升到“智能化”的高度。
同时传统的安防视频监控系统很难做到连续视频画面监控,这必然会造成异常信息的遗漏,而一些异常信息可能会导致严重后果,比如钻机作业现场中存在设备提升、旋转、伸缩等多种风险源,分布于井场的不同区域,如果人员违规进入这些高风险区域容易产生安全隐患;另外,钻井现场人员流动性大,作业不规范行为时常发生,如果没有及时预警将增加导致严重后果的概率,如果员工及时发现异常信息并做出了及时处理会降低损失,但这种响应一般都是事件发生后才能发生,无法起到预警作用。
传统民用的视觉安防技术无法解决勘探行业频发搬家带来的背景环境变化,导致智能识别准确率下降的问题,因此需要专项开发,并在各种光照野外环境下测试。
2.整体架构流程
该“野外可变环境下空间智能安全管理系统”开发依据
发明专利“一种石油钻机空间安全管理系统”申请公布号:CN112145129A,完成设计开发。
主要思想架构如下图所示:
2.1.输入部分:
2.1.1)视觉输入:经过编写相关算法实现“图像识别单元”对特定对象(人员或设备)在复杂野外环境下的识别(可选择对象),通过训练还可针对特定目标实现部分识别(如设备的机械臂等)。同时完成用户额外要求的定制开发。
2.1.2)第三方设备采集信号输入:通过传感器采集第三方设备位置、工作状态等信息,并控制输出。
2.2.控制单元判断:
判断以上两组输入信号是否达到特定阈值要求,满足则触发相应GPIO模块输出,完成对特定空间区域的安全智能管理。
2.3.输出报警:
报警定制开发:由于环境复杂,存在被检测对象被遮挡的可能,导致部分时间的识别中断,因此需要开发报警信号延时关闭功能(时间可设)。
2.4.其它要求:
用户期望是黑盒管理,设备供电后自动运行,不需要现场人员额外进行设置,后期通过GPIO中控制DI(按钮实现)输入关机。因此我们前期完成自启动、DI控制、和相关GPIO程序关机代码开发。
3.技术细节
这里主要针对涉及NVIDIA的部分展开描述,剩余部分不做详细讨论。
3.1硬件配置
- 本技术方案采用西门子提供的边缘盒子,型号:IPC520A,内置英伟达的 NVIDIA® Jetson™ Xavier NX 模块。
- 摄像头配置信息是:网络摄像头,像素不少于400万W像素。
- 算法训练用YOLOV5-5.0在笔记本上完成,笔记本安装pycharm(社区免费版)。
- 算法部署在边缘盒子上完成
- 边缘盒子输出部分:基于边缘盒子自带的GPIO,支持 4 路 DI 和 2 路 DQ 数字信号。
边缘盒子接口信息如下图所示:
我们采用单摄像头和双摄像头输入视频信号,分别开展系统开发和测试。
整个连接流程图如下:
3.2.输入部分:
为实现“图像识别单元”对特定对象(人员或设备)在复杂野外环境下的识别(可选择对象),通过训练还可针对特定目标实现部分识别(如设备的机械臂等)。同时完成用户额外要求的定制开发(特定区域闯入的识别与报警)。
注本文件重点是介绍与NVIDIA边缘盒子相关的内容,剩余内容只是将主干进行介绍。
3.2.1笔记本上开发内容
首先在笔记本上:基于同一摄像头采集相关目标视频数据,然后通过标注训练并生成对应的模型。
克隆tensorrtx
从该位置git clone https://github.com/wang-xinyu/tensorrtx.git
将文件tensorrtx/yolov5/gen_wts.py 复制到对应文件夹下。
cd 进入该文件夹下
执行命令生成 对应.wts 文件
3.2.2边缘盒子上开发内容
边缘盒子做如下配置,详见下图:
- 安装相关数据包
将相关信息倒入到边缘盒子内(.wts文件),并完成相关的设置,主要是4大件如:主要四大件, 已经在前面安装可以不再安装,具体版本是numpy==1.19.5, pandas==1.1.5, Pillow==8.4.0, scipy==1.5.4,matplotlib==3.3.4
安装文件的路径:/opt/nvidia/deepstream/deepstream/sources/
例程如下:
git clone -b v1.1.5 https://github.com/pandas-dev/pandas.git
cd pandas/
python3 setup.py install --user
pip3 install Pillow==8.4.0
注:如果安装不成功,要把源文件移除,再安装新的
rm -fr matplotlib#移除命令
剩下的参考教材走https://github.com/marcoslucianops/DeepStreamYolo/blob/master/docs/然后反复执行,直到全部安装到位。
缺少什么包就通过pip3 install安装即可
2)对应文件倒入
将/opt/nvidia/deepstream/deepstream/sources/
这个路径下的.wts和.cfg拷贝到需要使用的文件夹下
- 测试
重新运行以下文件
deepstream-app -c deepstream_app_config.txt#用这个是测试是否可以完成视频推理
测试视频路径是:uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4#源测试存储路径
3.3****区域入侵检测装载
关于区域入侵检测的代码存储位置如下opt/nvidia/deepstream/deepstream/samples/streams/
具体修改文件的位置:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/deepstream-test1
采用的命令:vi deepstream_test_1.py#对这里展开编辑
输入:python3 eepstream_test_1.py ../../../../samples/sample_720p.h264
然后在位置:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/deepstream-rtsp-in-rtsp-out
运行以下命令:
sudo apt update
sudo apt-get install gobject-introspection gir1.2-gst-rtsp-server-1.0 -y
3.3.1调用deepstream模块并进行测试
进入该位置:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/
执行以下命令,调用对应的deepstream相关模块:
mv ../deepstream_nvdsanalytics.py
mv ../config_nvdsanalytics.txt ./
cp ../deepstream-nvdsanalytics/config_tracker_NvDCF_perf.yml ./
3.3.2运行以下视频文件,测试是否能执行起来
python3 deepstream_nvdsanalytics.py file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4#这时报了一个错所以检查原因
这时要把deepstream-test1中的文件复制到customer中
cd ..
cd deepstream-test1
cp ../customer/model_b1_gpu0_fp32.engine ./
vi ../deepstream_test_1.py
进去后输入:/pgie#快速查找对应位置替换文件
重新运行以下命令:
deepstream-app -c deepstream_app_config.txt#通过这个调用了相关的视频检测
回到所在位置:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/deepstream-test1
vi dsnvanalytics_pgie_yolo_config.txt#再次查看,
把对应的cfg和wts改到使用文件的路径下
在位置:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/customer
opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/customer下运行
python3 deepstream_nvdsanalytics.py file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4#
成功运行,可以进行下一步了
3.4调整区域检测的区域位置和大小:
下面是调整划线外形尺寸的各个坐标
所在位置:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/customer下运行以下命令
rm deepstream_nvdsanalytics.py
cp ~/gpio/dsnv_new.py ./
vi config_nvdsanalytics.txt
roi-RF=XXX#这里是四个坐标点,分别代表圆心,圆心向外平移XX的距离,两个是一组,通过修改对应值可以修改入侵检测区域在视频画面中的位置和大小。
然后运行
python3 dsnv_new.py file:///opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/customer/123.mp4#这时报错了,查找发现是缺少GPIO库
3.5安装GPIO库
git clone https://github.com/vitiral/gpio.git
cd gpio/
sudo python3 setup.py install
python3 dsnv_new.py file:///opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/customer/123.mp4
3.6联调测试
由于在边缘盒子录屏会占用算力,所以采用从笔记本电脑通过VNC远程连接的方式。
设置边缘盒子的网口IP地址
边缘盒子端口如下图所示:
注意边缘盒子4个LAN端口设置(图中序1)时,存在区别X1和X2是有POE端口的,使用该端口的摄像头不需要额外供电。因此将X1和X2设置成摄像头接口,X3设置成备用,X4设置成与笔记本连接端口。这里将X1和X2端口设置成192.168.10.64和192.168.20.64。
注意:设备有线的端口和要链接的网络摄像头要处于同一网段,也就是192.168.xx(这个XX要保持一致,由于仅连接2~3个摄像头所以就没有用交换机)。
连接网络摄像头的命令是在所在位置:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps/customer
运行以下代码
sudo python3 dsnv_new.py rtsp://admin:a123456789@192.168.20.64/Streaming/Channels/2#注意最后结束的地方,这时已经调出来画面了,开始制作延时报警。
vi dsnv_new.py #这里的思路是取了个反,当人员不在时取断(信号断开),人员闯入取通(有信号输出),具体做法是增加如下命令
sink.set_property("sync",0)在后面
然后根据边缘盒子说明书寻找对应端口
厂家说明文件如下:
从上图可以看出GPIO编号为266和267对应的是两个DQ输出端口。
然后根据这两个编号,编写对应命令,测试编写的PYTHON激活GPIO高低电平是否能工作,代码内容如下图所示,这里根据边缘盒子的规定,采用266端口,然后指向对应的高电平(为1,有输出)和低电平(为0,没有输出)。并设置退出快捷键“CTRL+C”
然后将我编写的代码复制到对应文件夹下
这时直接运行GPIO代码。这里的目的是测试高低电平输出在这种模式下能不能自动运行,如果可以就说明输入没有问题,只要更换输入源就可以。
在对应文件夹下输入命令python3 test_gpio.py
测试结果,可以输出高低电平,并完成自动切换
然后在dsnv_new.py中进行编辑,指向对应的nx.gpio.py(为了区分测试和使用,这里将文件重新复制了一个test_gpio.py,并更换名字)
vi dsnv_new.py #
这里以266端DQ为例说明,267端DQ也是一样处理
根据编码规则首先增加输入信息两组import,然后给与最高权限777,及手动停止命令。具体如下
然后在代码最末增加指向性命令
最终源文件中名字是“customer”
安装路径是:/opt/nvidia/deepstream/deepstream/sources/deepstream_python_apps/apps下
**3.7.**开机自动启动的开发过程
这里要用到.sh脚本(最终源文件中名字是“project.sh”),在边缘盒子启动后,自动运行相应的代码。
vi deepstream_start.sh#新建的自启动脚本文件
1.指向对应文件夹位置
2.用echo #echo命令是linux中最基础的命令,也是很常用的命令,特别是在写shell脚本的时候,可能会经常被用到,虽然echo命令非常基础,但是功能还算丰富,此处对echo命令的常用方法进行总结,并给出示例,方便记忆与回顾。echo命令的基本用法,很简单,就是echo命令后面跟上要输出的文本。
这里注意有个位置的命令要激活
该路径下输入:crontab -e
确保下面内容没有被注销,然后保存,即可重启测试
3.8 DI输入关机的开发
通过DI信号触发自动关机设置:由于用户期望黑盒操作(不需要额外的鼠标和键盘,设置好以后不需要现场修改),且设备要频繁断电搬家,所以设置脚本实现通过DI输入实现自动关机。
最终源文件中名字是“gpio-trace”
注意这里测试需要外加一路DI输入。
******4.**小结
我们进行了各种光照条件下和各种环境下的测试,均满足野外使用的工业要求。
1)响应时间小于等于1秒
2)识别准确度超过95%
3)在雨天、强光、阴天均没有发生误判
4)连续运行半年,均运行稳定。
版权归原作者 babylon3000 所有, 如有侵权,请联系我们删除。