基于深度学习技术的人员行为异常检测系统设计_第1页
基于深度学习技术的人员行为异常检测系统设计_第2页
基于深度学习技术的人员行为异常检测系统设计_第3页
基于深度学习技术的人员行为异常检测系统设计_第4页
基于深度学习技术的人员行为异常检测系统设计_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科毕业论文(设计)专用本科毕业论文(设计)专用本科毕业论文(设计)论文题目 : 基于深度学习技术的人员行为异常检测系统设计摘 要现代工厂中人员基数较大,人员行为状况复杂,发生突发意外事件的情况可能性较大,为了方便企业对员工异常行为的判断,提高工厂安防能力,本设计拟设计一款现代工厂作业人员行为异常检测系统。本设计利用深度学习技术,对数据进行训练与验证,依靠openpose框架对权重进行OpenPose在做动作识别的时候可以有效的提高动作识别度,增加视觉识别的准确性和数据交互能力。同时,利用OpenPose算法对目标进行将算法检测出的图像中人体骨架进行信息关键点标注,将骨架关键点连接形成一个类似火柴人的骨架,然后计算每一个关键点的夹角,以此来判断人体动作的姿态显示。本设计系统通过StudioCode软件搭载python3.75进行程序设计实现对人体姿态系统稳定性好,与传统人体姿态识别方法相比,数据交互性强,使用成本较低,数据量较小。关键词:Openpose;姿态识别;人体姿态;目标检测AbstractWiththecontinuousdevelopmentofartificialintelligencetechnology,thefusionapplicationofartificialintelligenceandmanufacturingindustryhasacertainbasis.Inmodernfactories,thepersonnelbaseislarge,thepersonnelbehavioriscomplex,andthepossibilityofaccidentsislarge.Inordertofacilitatetheenterprisetojudgetheabnormalbehaviorofemployeesandimprovethefactorysecurityability,thisdesignintendstodesignamodernfactorypersonnelbehaviorabnormaldetectionsystem.Thisdesignusesdeeplearningtechnologytotrainandverifydata,andreliesonopenposeframeworktosetweights,soastoachievetheeffectofvisualdetection.OpenPosecaneffectivelyimprovethedegreeofmotionrecognition,increasetheaccuracyofvisualrecognitionandtheabilityofdatainteractionwhendoingmotionrecognition.Atthesametime,theOpenPosealgorithmwasusedfortargetdetectionanddataanalysis,andthekeyinformationpointsofhumanskeletoninthedetectedimagesweredetectedanddataanalysis.Thekeyinformationpointsofhumanskeletonintheimagesdetectedbythealgorithmweremarked,andtheskeletonkeypointswereconnectedtoformaskeletonsimilartothatofamatchman,andthentheincludedAngleofeachkeypointwascalculated.judgetheposturedisplayofhumanmovement.Inthisdesignsystem,theVisualStudioCodesoftwareisequippedwithpython3.75forprogramdesigntorealizetherecognitionofhumanposture,andtheexperimentalverificationiscarriedout.Theexperimentshowsthat:Thesystemhastheadvantagesofsimplestructure,reducedequipmentdemand,stabledata,goodsystemstabilityandstrongdatarobustness.Comparedwithtraditionalhumanbodyposturerecognitionmethods,thedatainteractionisstrong,theusecostislow,andthedatavolumeissmall.Keywords:Openpose;Gesturerecognition;Thebodyposture;Targetdetection目 录1引 论 11.1研究目的及意义 11.2国内外研究现状 31.3设计的主要内容 42行为异常检测系统总体方案 52.1系统需求与分析 52.2系统总体方案设计 53系统硬件设计 63.1硬件方案设计 63.2深度相机选型 73.3视觉板卡选型 83.4声光报警装置选型 103.5光源装置选型 4行为异常检测系统通讯设计 134.1通信协议的选择 13深度相机与JETSONNANO板卡TCP/IP通讯 13深度相机与JETSONNANO板卡CSI通讯 145行为异常检测系统软件设计 165.1软件方案设计 165.2数据采集 185.3数据集收集与图片标注 185.4图片预处理 195.5手部特征算法及程序设计 225.6身体特征算法及程序设计 235.7人体姿态识别算法及程序设计 256行为异常检测 276.1识别权重准备 276.2检测系统识别准备 276.3行为异常检测系统 297结 语 33参考文献 34致 谢 35附 录 36附录一 36附录二 42PAGEPAGE11引 论1.1研究目的及意义1.1.1研究目的随着经济发展,社会体系的逐步完善,社会治安的能力得到大幅度提升,在2020年月国家信息中心提出《全观智慧城市白皮书》,首次提出全光智慧城市的发展理念。扩散。智慧城市是运用物联网、云计算、大数据、空间地理信息集成等新一代信息技术,促进城市规划、建设、管理和服务智慧化的新理念和新模式。至2010起年我国安防行业总收入已达2350亿元,并逐年快速增长态势。2013年我国安防行业总收入达到3800亿元。到了2016年我国安防行业总收入达到了5400亿元,截止至20172.16000亿元,年均增长14.4%,全行业实现增加值1960亿元,年均增长12.7%。2018年我国安防行业总收入将达到6678年我国安防行业总收入将突破80008212亿元左右,如图1.1所示。图1.1视觉市场分析智能安防市场空间广阔,视频监控高增速。AI技术赋予安防感知和认知能力,从人2020-2025年复合增PAGEPAGE2速为7.1%,2025年市场规模将达到318亿美元,如图1.2所示。图1.2视觉市场规模示意图据,但是人的精力是有限的,无法时时刻刻保持高度集中的注意力进行观察各监控数据,以辅助监控人员的工作,以此减少监控工作人员压力提高安防能力。5G带来了网络环境的全新变革,多项智慧城市的标准体系的落地、加上AI技术条数字世界转换的方式,这两大技术在安防领域的融合应用,目前正在构成“5G+AI+安防”的全新的组合,助推视频监控行业迈向超高清、AI智能的新阶段。1.1.2研究意义展,这对促进社会和谐意义重大。在社会治安方面;可以对视频监控地点进行实时监控,用在安防技术上,能减少人力物力,对群众与社会治安提供一定量的保障。所以,对针对这种行为异常检测算法的研究显得极为急迫和重要。1.2国内外研究现状1.2.1国外研究现状1.3年曾经开源Pose公布了ICCV2019论文Single-NetworkWhole-BodyPoseEstimation,提出一种在单一网络实现全人体姿态估计的算法,相对OpenPose大幅提高了速度。在OpenPose只能达到帧率1.6fps的图像上,该文提出的算法运行帧率可达到13.2姿态估计网络,速度并不快。卡内基梅隆大学在OpenPose算法框架下,使用单一网络实现全人体的姿态估计并在论文OpenPose:reatimemulti-person2DposeestimationusingPartAffinityFieldsPartAffinityFields直接合并进入人体的PartAffinityFields,进行多任务学习,实现上述功能。图1.3全球视觉市场规模分布图1.2.2国内研究现状2022OpenPose计OpenPose模型,替换其主干网络为八度卷积与MobileNet融合而成的Oct-MobileNet,并优化缩减预测阶段的重复分支。实验表明,改进模型的计算量降低为原来的12%且检测速度提升300%。应用改进OpenPose模低且适用于视频时长不一致的情况,在八段锦健身动作评估中取得了较好应用效果,具有一定的推广应用价值,如图1.4所示。1.3设计的主要内容

图1.4姿态估计建空连接布局。通过运用Openpose算法对读取的图像进行关键点识别方法,该方法通过轻量化Openpose对视频流进行骨骼图像提取,中间通过对得到的图像进行姿态数据集标注,最后再通过COCO模型对标注图像进行分类训练,将训练出来的权重文件进行分类。根据所需要的识别状态更换合适的权重文件,然后利用Python3.75结合StudioCode编获取,以检测人体姿态。2行为异常检测系统总体方案2.1系统需求与分析时预警管控。区域或指定的安装位置进行数据采集,根据分析数据自动检测区域内是否存在异常行为,现不同类型的异常行为识别。2.2系统总体方案设计通过在各工作地点内安装高清视觉摄像头,实时监控工作人员的工作状态。通过以太JetsonNano学习将视频中的人分为若干个点,在拼合运用模型将人体进行姿态估计,形成一个由多个关键点合成的人体骨架并更具视频传输回来的画面进行实时更新用以检测,当工作人员出现异常行为,身体姿态发生变化,JetsonNano视觉处理检测到行为异常的姿态输出信号。声光报警器接收到信号后报警触发,人体姿态示意实时在PC端显示。方案如图2.1所示图2.1系统方案示意图3系统硬件设计3.1硬件方案设计本设计主要由4首先通过摄像头进行目标进行图像检测,然后通过通讯进行数据交互,将数据给于视觉板卡进行视觉处理。视觉板卡将得到的数据图像通过openpose算法框架进行算法识别数据通过对比已经训练好的权重进行数据验证,然后通过显示设备将图像处理处理,图片中每一个都变成了一幅幅由多个关键目标数据信息点组成的一副火柴人形状的人体骨架,然后JetsonNano内置I/O3.1~3.2所示。通过本方案的设计与需求的分析结合设计需求主要硬件产品表3.1所示;表3.1硬件设计产品序列表产品名称产品型号产品数量海康威视双目行为分析摄像机DS-2CD8426F/B-I4英伟达视觉板卡JetsonNano1联想TF高速存储卡专业版128G1施耐SchneiderElectric信号灯带蜂鸣器SchneiderXVR多功能LED信号灯1图3.1硬件设备整体连接示意图3.2深度相机选型

图3.2硬件设备控制连接示意图传统相机,仅支持普通监控功能,脱离不了人员值守监控范畴,不能减少人员疲劳,像机采集到的海量视频图像传输到监控中心后,值班人员很可能没看到重要的异常情况。全部信息。海康威视DS-2CD8426F/B-I200万深眸双目行为分析摄像机,内置高性能常检测、剧烈运动检测、离岗检测、倒地检测、滞留检测等9项人工智能视觉检测技术。立体识别图像而不是简单的二维平面识别,如图3.3所示。当设备供电开始工作时一对双目镜头实时获取同一目标检测的场景并各自独立生成用以来定位该目标场景的深度,通过数据算法对图片的目标检测图像进行生成一种立体结构的视图,在双目摄像头在工作过程中识别到需要检测的目标后,通过计算图像对应点间位置偏差,获取目标的三维信息,瞬间完成图像获取,大大提高了行为分析检测的准确性。支持手动标定、自动标定、智能标定三种标定方式可满足不同场景下的参数标定并且支持单次报警或者定时循环报警功能和多种协议接入,方便和第三方系统集成。DC36V10M/100M自适应以太网口以及1路报警输入/输出、1路音频输入/输出,实测中功耗最大27W,无需复杂的接线和配置,安装简单便捷。通过传统相机与深度相机进行对比,如表3.2所示。表3.2传统相机与深度相机传统相机深度相机功能普通监控功能视频监控,多传感器协调应用脱离不了人员值守监控范畴不能减少带有计算机人工智能分析功能无需人人员疲劳,松懈,短时间离开员值守,所有值守均由计算机执行报警实时预警出现警况第一时间进行自动能及时预警报警回放回放视频只能播放全部时刻录像费时可以根据多种条件线索智能检索录像,费力快速定位储存录像只能无差别存放大量无效数据占报警数据和无效数据分类存放可以根用空间,储存服务器投资大据需要自动清理无效数据资料来源:辰启智科所以本论文工业相机选型选择海康威视DS-2CD8426F/B-I高,能实现本设计需求。3.3视觉板卡选型

图3.3深度相机树莓派3B+是在2018年pi日(3月14日)发售的目前为止树莓派家族当中最新,性能最强,也是功耗最高的一款产品=,RaspberryPi3ModelB+作为RaspberryPi3系列的最64位4核64位4核overUSB支持(Power-over-Ethernet,withPoEPXE网络与USB大容量存储启动,如图3.4所示。图3.4树莓派3B+板卡JetsonNano是一款功能强大的人工智能(AI)开发板,可助你快速入门学习AI技术,Cortex-A57核MaxwellGPU及4GBLPDDR内存,拥有足够的AI算力,可以并行运行多个神经网络,适用于需要图像分类、目标检测、分割、语音处理等功能的AI应用。它支持NVIDIAJetPack,其中包括用于深度学习,计算机视觉,GPU计算,多媒体处理,CUDA,CUDNN和等软件库,以及其他一系列流行的AI/MXNet等,如图3.5所示。图3.5JetsonNano视觉板卡PAGESD卡插槽;2-40针膨胀针头;3-MicroUSB接口;4-以太网口;5-USB3.0接口;6-HDMI输出端口;7-视频接口;8-供电口;9-摄像头连接口;10-Poe接口首先主板正中上面是一个很大的散热片1是主存储SD卡插槽2是40引脚的CPO;3是个5V2A的MicroUSBPC是一个RJ45千兆以太网接口;5是4个USB3.0接口;6是1个HDMI2.0视频接口;7是显示端口连接器;8是5V的DC供电口;9是MIPICSI摄像头连接口;10是Poe接口。一般看视频是推荐使用5V4A的DC供电方式(使用DC电源需要短接J48跳线帽),因为电源连接这里可以开启15w2.9A下角的电源口,会让Nano板不断地发热和重启。通过市场常用的几款板卡进行参数对比可知,如表3.3所示。表3.3板卡参数对比表型号树莓派3B+IntelNCS2神经计算棒(仅模块)JetsonNano算力(INTB)-4TOPS7TOPS功耗1.4W2W10W算力/功耗-20.7重量42g77.8g249.47价格8509001500资料来源:芯板坊Nano开发板是我目前主打深度学习方向的开发板。所以经过对比分析我选择JetsonNano开发板。3.4声光报警装置选型SchneiderXVR多功能LED他的功能不容置疑,尤其是HarmonyXVR系列电动机旋转信号灯及蜂鸣器是可视音频信号装置,设计用于工厂应用、建筑车辆和公共区域。该蜂鸣器信号灯提供4种不同的颜色,并随附可扩展照明区域的有小面的透镜。带蜂鸣器的XVR信号灯独特且美观的设计已获得2014年RedDot工业设计大奖。由于灵活的电压输入、光模式选择器和允许直向和侧面布线的集成橡胶基座,可以轻松安装这些可视音频信号装置。且依托于电动机LED技术,使得使用寿命更长且免维护,可实现旋转、闪光和闪烁LED等工作状态。10种照明模式使其易于使用且易于选择宽电压输入,可满足不同应用可以进行直向和侧面布线,如图3.6所示。图3.6SchneiderXVR多功能LED信号灯时可调节90dB蜂鸣器外部蜂鸣器音量在70dB至90dB透镜可扩展照明区域,集成橡胶基座可提高IP等级,高达IP65保护等级,取决于蜂鸣器选项。7.1G的高抗振性,CE认证,且符合ROHS400mm飞线连接,截面为0.57mm2。报警信号灯主要参数如表3.4所示。表3.4报警信号灯参数属性数值电源电压12→24V直流光效闪光,旋转1m距离外分贝90dB最小分贝70dB最大分贝90dB安装样式基座安装透镜颜色红色资料来源:Schneider官网3.5光源装置选型扰。常用光源及相关特性如表3.5所示。表3.5主要光源类型及其特性类型光效(lm/W)平均寿命/(h)色温/K特点卤素灯12~2410002800~3000发热量大,价格便宜,形体小荧光灯50~1201500~30003000~6000价格便宜,适用于大面积照射LED灯110~250100000全系列宜,使用范围广氙灯150~33010005500~12000光照强度高,可连续快速点亮激光50000全系列具有良好的方向性、单色性与相干性其中荧光灯光源作为工厂中主要照明光源具有价格便宜,适用于大面积照射等优点,光源。如图3.7所示荧光灯。图3.7大功率LED荧光灯T5LED荧光灯T8LED荧光灯4行为异常检测系统通讯设计4.1通信协议的选择根据实际设计需求,本设计针对相机类型自主选择TCP/IP通讯协议或MIPICSI-2CSI(CameraSerialInterface)通讯协议。(1)CSI(CameraSerialInterface)是MIPI定义的规范,用于连接摄像头和CPU,传输摄像头的视频信号,最新的规范是2012发布的CSI-3,使用的物理层为M-PHY。而这里要介绍的规范在2005D同样基于D-PHY,不同的是,它主要用于host将图像传输给显示设备。通讯协议TCP/IP是用于因特网(Internet)的通信协议。TCP/IP通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。原本就是为使用互联网而开发制定的协议族。因此,互联网的协议就是TCP/IP,TCP/IP就是互联网的协议。深度相机与JETSONNANO板卡TCP/IP通讯连接nano网卡槽进行以太网通讯,对以太网通过IP地址mac码进行更改后进行连接通信,当电脑与nano处于同一个网段时,即可实现通信。该通讯模式中,前面字节为08,后面的字节为00或06,表示IP包或ARP包,通过网线进连接设置每个设备的与和中的nano收到该数据。通过每一个设备对应的IP和mac去对应每一个相机传输的数据对nano读取相机的内容进行深度学习并通过网口反馈给显示端口,如图4.1所示。图4.1TCP/IP模型图深度相机与JETSONNANO板卡CSI通讯此行业标准化的接口由此而生。CSIclocklane和一到四个的datalane用D-PHY物理层协议。在物理层之上,即是CSI协议层,由三层构成,每一层有着明确在接收端,解包来自LLP层的数据并传输到应用层。该层的主要目的是将不同像素格式(例如RGBA等)都转换成为8bit字节格式,为24bit,pixel为16RGB444,大小为12bit,需要通过padding变成RGB565格式,为两个字节,如图4.2所示。图4.2CSI协议层示意图LowLevelProtocol(LLP)层为CSI协议的主要功能层,不仅定义了包格式,还定义了增加同步包,发送到下一层;在接收端首先校验包的完整性,并解析各个字段,根据包类处理的playload数据为经过转换后的纯字JetsonNano与海康视觉相机通讯代码如下;importcv2importmultiprocessingasmpnum=0defimage_put(q,name,pwd,ip,channel):#dWindow(ip,cv2.WINDOW_NORMAL)globalurlurl="rtsp://%s:%s@%s:%s//Streaming/Channels/1"\ %(name,pwd,ip,channel)cap=cv2.VideoCapture(url)#获取视频帧率fps=cap.get(cv2.CAP_PROP_FPS)print('fps:',fps)#打印fps内容ifcap.isOpened():print('camera'+ip+"connected.")whilecap.isOpened():ret,frame=cap.read()#抓取图片不成功再重新抓取ifnotret:cap=cv2.VideoCapture("rtsp://%s:%s@%s:%s//Streaming/Channels/1"\%(name,pwd,ip,channel))print('HIKVISION2')ret,frame=cap.read()frame=cv2.resize(frame,(800,600))cv2.imshow(ip,frame)#Pressesconkeyboardto exitifcv2.waitKey(1)&0xFF==27:breakcap.release()#解决进程问题defrun_multi_camera():user_name,user_pwd="admin","a12345678"camera_ip_l=["51",]ports=['556']#initqueues=[mp.Queue(maxsize=2)for_incamera_ip_l]processes=[]forqueue,camera_ip,portinzip(queues,camera_ip_l,ports):user_pwd,camera_ip,port)))forprocessinprocesses:process.daemon=process.start()forprocessinprocesses:process.join()ifname =='main':run_multi_camera()5行为异常检测系统软件设计本基于深度学习技术的现代工厂作业人员行为异常检测系统设计通过StudioCode软件搭载python3.75进行程序设计,实现对人体姿态识别。5.1软件方案设计本软件设计主要由编译器,依赖包,库环境,GPU算力驱动组成。首先在Github上下载pytorch-openpose压缩包进行openposeOpencv-python,Scipy,Scikit-image,Tqdm等依赖包文件对电脑库环境进行配置,最后搭载python3.75编译器进行程序编译与调试。通过在系统中安装VS与StudioCode作为程序设计软件,配置软件pip下载源地址使StudioCode可以搜寻到所需要文件因为程序中需要调用多种工具包和库文件,所以需要针对openpose去安装对应的工具包与库文件,使程序能正常运转。当程序开始运前时需要根据处理器选择版本与的时候需要很强的算力,所以需要安装CUDNN来配置torch提高计算机算力,加快识别进程。CUDNN启动后数据方式将会从CPU处理转为GPU处理,理论上运行速度会提高5倍,如图5.1所示。图5.1CUDA示意图针对目前行为异常检测这方面,常用的姿态估计算法Alphapose与openpose。首先Alphapose是自上而下的算法,也就是先检测倒人体,再得到关键点和骨架。因此他的准确率、Ap值要比openpose高。但是缺点就是随着图片上的人数增加,他的计算量增大,速度变慢。这一缺点注定他无法应用于多人的实时姿态识别,更适用于单人的精确识别,从而不符合本设计需要满足的工作条件。OpenPose是基于卷积神经网络和监督学习并以caffe为框架写成的开源库,可以实现好的鲁棒性。最终结合两则优缺点选择更贴合设计的openpose算法。软件设计流程如图5.2所示。图5.2软件设计流程图5.2数据采集也将对后期的识别造成一定的影响。采集的图片是否正常。以此来保障后期的权重训练,提高精确度。举例如图5.3所示。图5.3姿态动作举例需要避免这些问题。5.3数据集收集与图片标注打开标注精灵软件,修改标注类别,如何开始标注,并保存在指定文件夹,如图5.4所示。所需的数据。主要实现代码如下:importos,glob #调用库,查找glob下的文件LabelPaths=glob.glob('整合/*.json') #查找路径文件forLabelPathinLabelPaths:#打印的结果Name=os.path.basename(LabelPath).split('.')[0]cmd='labelme_json_to_dataset{0}-o{1}'.format(LabelPath,Name)os.system(cmd)5.4图片预处理

图5.4标注精灵标注示意图处理。由于刚处理的图片还是一个空图片,没有进行特征提取,如图5.5~5.6所示,所以主要运行程序代码如下;importcv2importnumpyasnpimportmathimporttimefromscipy.ndimage.filtersimportgaussian_filterimportmatplotlib.pyplotaspltimportmatplotlibimporttorchfromtorchvisionimporttransforms#importutilfromsrcimportutilfromsrc.modelimportbodypose_modelclassBody(object):definit(self,model_path):self.model=bodypose_model()iftorch.cuda.is_available():self.model=self.model.cuda()PAGEPAGE20model_dict=util.transfer(self.model,torch.load(model_path))self.model.load_state_dict(model_dict)self.model.eval()defcall(self,oriImg):#scale_search=[0.5,1.0,1.5,2.0]scale_search=[0.5]boxsize=368stride=8=128thre1=0.1thre2=0.05multiplier=[x*boxsize/oriImg.shape[0]forxinscale_search]heatmap_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],19))paf_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],38))forpartinrange(18):map_ori=heatmap_avg[:,:,part]one_heatmap=gaussian_filter(map_ori,sigma=3)map_left=np.zeros(one_heatmap.shape)map_left[1:,:]=one_heatmap[:-1,:]map_right=np.zeros(one_heatmap.shape)map_right[:-1,:]=one_heatmap[1:,:]map_up=np.zeros(one_heatmap.shape)map_up[:,1:]=one_heatmap[:,:-1]map_down=np.zeros(one_heatmap.shape)map_down[:,:-1]=one_heatmap[:,1:]peaks_binary=np.logical_and.reduce((one_heatmap>=map_left,one_heatmap>=map_right,one_heatmap>=map_up,one_heatmap>=map_down,one_heatmap>thre1))peaks=list(zip(np.nonzero(peaks_binary)[1],np.nonzero(peaks_binary)[0])) #notereverse

peaks_with_score=[x+(map_ori[x[1],x[0]],)forxinpeaks]peak_id=range(peak_counter,peak_counter+len(peaks))peaks_with_score_and_id=[peaks_with_score[i]+(peak_id[i],)foriinrange(len(peak_id))]all_peaks.append(peaks_with_score_and_id)peak_counter+=len(peaks)#findconnectioninthespecifiedsequence,center29isintheposition15#按指定顺序查找连接,中心29位于位置15limbSeq=[[2,3],[2,6],[3,4],[4,5],[6,7],[7,8],[2,9],[9,10],\[10,[2,12],[12,13],[13,14],[2,1],[1,15],[15,17],\[1,16],[16,18],[3,17],[6,18]]#中间关节热图相关性mapIdx=[[31,32],[39,40],[33,34],[35,36],[41,42],[43,44],[19,20],[21,22],\[23,24],[25,26],[27,28],[29,30],[47,48],[49,50],[53,54],[51,52],\[55,56],[37,38],[45,46]]图5.5手部特征关键点图5.6身体特征关键点5.5手部特征算法及程序设计手部关键点检测,旨在找出给定图片中手指上的关节点及指尖关节点,一共21个关键点,如图5.7所示。其类似于面部关键点检测(FacialLandmarkDetection)和人体关键点检测(HumanBodyPoseEstimation)。手部关键点检测的应用场景包括:手势识别、手语识别与理解和手部的行为识别等。程序主要代码如下;importcv2importjsonimportnumpyasnpimportmathimporttimefromscipy.ndimage.filtersimportgaussian_filterimportmatplotlib.pyplotaspltimportmatplotlibimporttorchfromskimage.measureimportlabelfromsrc.modelimporthandpose_modelfromsrcimportutilclassHand(object):definit(self,model_path):self.model=handpose_model()iftorch.cuda.is_available():self.model=self.model.cuda()model_dict=util.transfer(self.model,torch.load(model_path))self.model.load_state_dict(model_dict)self.model.eval()defcall(self,oriImg):scale_search=[0.5,1.0,1.5,2.0]#scale_search=[0.5]boxsize=368stride=8=128thre=0.05multiplier=[x*boxsize/oriImg.shape[0]forxinscale_search]heatmap_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],22))#paf_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],38))ifname =="main":hand_estimation=Hand('../model/hand_pose_model.pth')#test_image='../images/hand.jpg'test_image='../images/hand.jpg'oriImg=cv2.imread(test_image) #B,G,Rorderpeaks=hand_estimation(oriImg)canvas=util.draw_handpose(oriImg,peaks,True)cv2.imshow('',canvas)cv2.waitKey(0)5.6身体特征算法及程序设计

图5.7手部提取点身体关键点检测,采用的的是主流的coco模型,因此身体的关键点被分为18个。根据给定的图像中的身体关节及躯干,进行特征提取连接,一共有19个关键点,就会生成19注的关键点生成的heatmap所有值都为0。一共19个heatmap,其中最后一个代表背景,如图5.8所示。识别主要代码如下;importcv2importnumpyasnpimportmathimporttimefromscipy.ndimage.filtersimportgaussian_filterimportmatplotlib.pyplotaspltimportmatplotlibimporttorchfromtorchvisionimporttransforms#importutilfromsrcimportutilfromsrc.modelimportbodypose_modelclassBody(object):definit(self,model_path):self.model=bodypose_model()iftorch.cuda.is_available():self.model=self.model.cuda()model_dict=util.transfer(self.model,torch.load(model_path))self.model.load_state_dict(model_dict)self.model.eval()defcall(self,oriImg):#scale_search=[0.5,1.0,1.5,2.0]scale_search=[0.5]boxsize=368stride=8=128thre1=0.1thre2=0.05multiplier=[x*boxsize/oriImg.shape[0]forxinscale_search]heatmap_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],19))paf_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],38))图5.8身体提取点5.7人体姿态识别算法及程序设计OpenPose人体姿态识别项目是世界上首个基于深度学习的实时多人二维姿态估计应用,基于它的实例如雨后春笋般涌现。通过检测所有的关键点,再group成不同的人,Pose首先5.9所示。展示了OpenPose模型的架构。图5.9Openpose模型框架图(1)输入一幅图像,经过VGG19卷积网络提取特征,得到一组特征图,然后分成两个岔路Branch1&2,分别使用CNN网络提取PartConfidenceMaps(置信度)和PartAffinityFields(关联度);Bipartite求出Part很正确,最终合并为一个人的整体骨架;(3)最后基于求Multi-PersonParsing—>把Multi-personparsing问题转换成graphs问题—>HungarianAlgorithm(匈牙利算法)(匈牙利算法是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法。)基础识别代码如下;importcv2importmatplotlib.pyplotaspltimportcopyimportnumpyasnp#调用CV2库fromsrcimportmodelfromsrcimportutilfromsrc.bodyimportBodyfromsrc.handimportHandbody_estimation=Body('model/body_pose_model.pth')#关联身体权重路径hand_estimation=Hand('model/hand_pose_model.pth')#关联手部权重路径test_image='images/output1.jpg'#测试图片读取路径oriImg=cv2.imread(test_image)#B,G,Rordercandidate,subset=body_estimation(oriImg)canvas=copy.deepcopy(oriImg)canvas=util.draw_bodypose(canvas,candidate,subset)#detecthandhands_list=util.handDetect(candidate,subset,oriImg)all_hand_peaks=[]forx,is_leftinhands_list:peaks=hand_estimation(oriImg[y:y+w,:])peaks[:,0]=np.where(peaks[:,0]==0,peaks[:,0],peaks[:,0]+x)peaks[:,1]=np.where(peaks[:,1]==0,peaks[:,1],peaks[:,1]+y)#else:# peaks=hand_estimation(cv2.flip(oriImg[y:y+w,:],1))# peaks[:,0]=np.where(peaks[:,0]==0,peaks[:,0],w-peaks[:,0]-1+x)# peaks[:,1]=np.where(peaks[:,1]==0,peaks[:,1],peaks[:,1]+y)# print(peaks)all_hand_peaks.append(peaks)canvas=util.draw_handpose(canvas,all_hand_peaks)plt.imshow(canvas[:,:,[2,1,0]])plt.show()6.1识别权重准备

6行为异常检测修改权重参数进行训练将训练好的权重文件pth格式放入demo_camera.py直接去开源库下载的文件,权重如图6.1所示。通过深度学习后的物体进行采取不同特征提高工作站的工作效率,并能减轻相机运算的等待时间。6.2检测系统识别准备

图6.1权重文件由于openpose算法识别对终端要求过高所以我们选用轻羽量级权重文件作为识别输StudioCode软件对姿态进行识别后,应用C#语言编写程序,实现识别结果的界面显示,运行主要代码如下:importcv2importmatplotlib.pyplotasplt## plt.ion()importcopyimportnumpyasnpimporttorchprint(torch.version)print(torch.cuda.is_available())fromsrcimportmodelfromsrcimportutilfromsrc.bodyimportBodyfromsrc.handimportHandbody_estimation=Body('model/body_pose_model.pth')#身体模型hand_estimation=Hand('model/hand_pose_model.pth')#手部模型print(f"Torchdevice:{torch.cuda.get_device_name()}")#打印torch版本与CUDA版本号cap=cv2.VideoCapture(0)#视频照片读取位置,设置为0就是实时读取#输出若是图片或者视频,就放入名字与路径cap.set(3,640)#窗口尺寸cap.set(4,480)#窗口尺寸whileTrue:ret,oriImg=cap.read()candidate,subset=body_estimation(oriImg)canvas=copy.deepcopy(oriImg)canvas=util.draw_bodypose(canvas,candidate,subset)#detecthand手在下面hands_list=util.handDetect(candidate,subset,oriImg)all_hand_peaks=[]forx,is_leftinhands_list:peaks=hand_estimation(oriImg[y:y+w,:])peaks[:,0]=np.where(peaks[:,0]==0,peaks[:,0],peaks[:,0]+x)peaks[:,1]=np.where(peaks[:,1]==0,peaks[:,1],peaks[:,1]+y)all_hand_peaks.append(peaks)canvas=util.draw_handpose(canvas,all_hand_peaks)cv2.imshow('demo',canvas) #一个窗口用以显示原视频ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()6.3行为异常检测系统视频输出结果如图6.2~6.4,图片输出结果如图6.5~6.8,实时输出结果如图6.9,手势识别如图6.10~6.11所示。图6.2视频输出姿态识别1图6.3视频输出姿态识别2PAGEPAGE30图6.4视频输出姿态识别3 图6.5图片输出姿态识别1 图6.6图片输出姿态识别2 图6.7图片输出姿态识别3 图6.8图片输出姿态识别4图6.9实时输出姿态识别图6.10手势识别1图6.11手势识别2于openpose对终端与训练集需求较大,所以选取的openpose轻羽量级而导致姿态识别能要进一步提升姿态识别能力还需要继续增加训练集,从目前的50张采集图片增加1000张或者10000张采集图片加以训练,或者选择重量级的openpose的权重文件。因此,神经一步提高。7结 语由于人体骨架识别视觉检测可以有效避免视觉检测的光线痛点,且鲁棒性较高,不易使其得到了广泛的研究与应用。人体姿态识别的姿态情况较为复杂多样,因此姿态识别的本设计使用深度学习的方法,采用openpose轻羽量级算法,从神经网络入手到构建图卷积网络结构,针对人体骨架关键点信息进行提取来进行深入研究,提出一种基于深度学习技术的现代工厂作业人员行为异常检测系统设计。本文研究内容及研究成果如下:(1)阐述本文的研究背景与意义,并分别分析基于深度学习人体姿态识别的国内外研究现状,以及对本文的结构进行说明。(2)介绍本设计系统的整体方案,针对软硬件设计方案,给出示意图和流程图与方案描述,对系统设计组成部件进行,设备选型,与选型依据。(3)训练权重或者下载权重文件(4)首先对3D骨架序列进行旋转变换和几何变换,通过扩展视角增强其空间表达能力和鲁棒性。(5)输出姿态识别结果。参考文献[1] 陈曦.黄昌正.周言明.吴宇浩,基于骨架的视觉动捕姿态优化计算方法[J].广州科技,2022,7(12):16-17.[2] 俞跃华.基于机器视觉的人体骨架识别技术研究与应用[D].四川:电子科技大学,2021.[3] 何少聪.基于深度学习的多模态人体动作识别研究[D].广东:广东工业大学,2021.[4] 深度学习方法在二维人体姿态估计的研究进展[J].计算机科学,2022,8(7):204-208.[5] 刘帅,基于深度学习的3D骨架人体行为识别研究[D]2021(02).[6] 王欢,基于深度学习的骨架提取步态识别[D].西安:西安工业大学,2022.[7] 苏波;柴自强;王莉.基于改进OpenPose的视频动作评分方法研究[J].软件工程,2022,[8] 杨君;张素君;张创豪;黄晶晶基于OpenPose的人体动作识别对比研究[Z]2021(01).[9] 范鹏生;吴贵军;陈浩辰.基于轻量化Openpose的跌倒算法识别研究[J].无线互联科技,2022,(4).[10]学立壮于动测人骨关点测法[J].业制算.202年06期第62-63页.[11]张军鹏,基于OpenPose的考场异常行为检测研究,[D],青岛,青岛大学,2021.[12]OpenPose的学生行为识别研究[J]计算机应用研究.2021年10期第3183-3188页.[13]杨君;张素君;张创豪;黄晶晶,基于OpenPose的人体动作识别对比研究,[J]传感器与微系统.2021年01期第5-8页.[14]陈汝峰;谢鹏飞;彭成;谭玉林,基于OpenPose的人体姿态检测系统设计与实现,[J]电子世界.2020年17期,第183-184页.[15]HuanyuZengWanmiChen,AnEvaluationApproachofMulti-personMovementSynchronizationLevelusingOpenPose,[C]第40届中国控制会议论文集(7).2021年.致 谢围。然后诚挚的感谢我的论文指导老师,从我入学起十分照顾我的学习,对我认真教导,他武大大学,华中科技大学等名校学生进行专业知识的PK与交流,通过竞赛锻炼自身让在忙碌教学工作中挤出时间给我审查修改论文。当然也十分感谢所有教过我的老师们,你们将复杂难懂的知识通过你们的理解对然后接着感谢我的朋友,同学们。你们在我的无助的时候给予我无限的包容与陪伴,在生活中和我一同在学校的学习时光中互帮互助,在我论文对进行设计时给了我不少点子,对我起到了很大帮助。感谢你们的陪伴让我过的很开心,使我可以不断的成长与前进。助,感谢你们的陪伴与教导,感谢你们的支持。附 录附录一importcv2importnumpyasnpimportmathimporttimefromscipy.ndimage.filtersimportgaussian_filterimportmatplotlib.pyplotaspltimportmatplotlibimporttorchfromtorchvisionimporttransforms#importutilfromsrcimportutilfromsrc.modelimportbodypose_modelclassBody(object):definit(self,model_path):self.model=bodypose_model()iftorch.cuda.is_available():self.model=self.model.cuda()model_dict=util.transfer(self.model,torch.load(model_path))self.model.load_state_dict(model_dict)self.model.eval()defcall(self,oriImg):#scale_search=[0.5,1.0,1.5,2.0]scale_search=[0.5]boxsize=368stride=8=128thre1=0.1thre2=0.05multiplier=[x*boxsize/oriImg.shape[0]forxinscale_search]heatmap_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],19))paf_avg=np.zeros((oriImg.shape[0],oriImg.shape[1],38))forminrange(len(multiplier)):scale=multiplier[m]= cv2.resize(oriImg, (0, 0), fx=scale, fy=scale,interpolation=cv2.INTER_CUBIC)imageToTest_padded,pad=util.padRightDownCorner(imageToTest,stride,im=np.transpose(np.float32(imageToTest_padded[:,:,:,np.newaxis]),(3,2,0,1))/256-0.5im=np.ascontiguousarray(im)data=torch.from_numpy(im).float()iftorch.cuda.is_available():data=data.cuda()#data=data.permute([2,0,1]).unsqueeze(0).float()withtorch.no_grad():Mconv7_stage6_L1,Mconv7_stage6_L2=self.model(data)Mconv7_stage6_L1=Mconv7_stage6_L1.cpu().numpy()Mconv7_stage6_L2=Mconv7_stage6_L2.cpu().numpy()#extractoutputs,resize,andremovepadding#heatmap=np.transpose(np.squeeze(net.blobs[output_blobs.keys()[1]].data),(1,2,0)) #output1isheatmapsheatmap=np.transpose(np.squeeze(Mconv7_stage6_L2),(1,2,0)) #output1isheatmapsheatmap=cv2.resize(heatmap,(0,0),fx=stride,fy=stride,interpolation=cv2.INTER_CUBIC)heatmap=heatmap[:imageToTest_padded.shape[0]-pad[2],:imageToTest_padded.shape[1]-pad[3],:]heatmap = cv2.resize(heatmap, (oriImg.shape[1], oriImg.shape[0]),interpolation=cv2.INTER_CUBIC)is

#paf=np.transpose(np.squeeze(net.blobs[output_blobs.keys()[0]].data),(1,2,0)) #output0paf=np.transpose(np.squeeze(Mconv7_stage6_L1),(1,2,0)) #output0ispaf=cv2.resize(paf,(0,0),fx=stride,fy=stride,interpolation=cv2.INTER_CUBIC)paf=paf[:imageToTest_padded.shape[0]-pad[2],:imageToTest_padded.shape[1]-pad[3],:]paf=cv2.resize(paf,(oriImg.shape[1],oriImg.shape[0]),interpolation=cv2.INTER_CUBIC)heatmap_avg+=heatmap_avg+heatmap/len(multiplier)paf_avg+=+paf/len(multiplier)all_peaks=[]peak_counter=0forpartinrange(18):map_ori=heatmap_avg[:,:,part]one_heatmap=gaussian_filter(map_ori,sigma=3)map_left=np.zeros(one_heatmap.shape)map_left[1:,:]=one_heatmap[:-1,:]map_right=np.zeros(one_heatmap.shape)map_right[:-1,:]=one_heatmap[1:,:]map_up=np.zeros(one_heatmap.shape)map_up[:,1:]=one_heatmap[:,:-1]map_down=np.zeros(one_heatmap.shape)map_down[:,:-1]=one_heatmap[:,1:]peaks_binary=np.logical_and.reduce((one_heatmap>=map_left,one_heatmap>=map_right,one_heatmap>=map_up,one_heatmap>=map_down,one_heatmap>thre1))peaks=list(zip(np.nonzero(peaks_binary)[1],np.nonzero(peaks_binary)[0])) #notereversepeaks_with_score=[x+(map_ori[x[1],x[0]],)forxinpeaks]peak_id=range(peak_counter,peak_counter+len(peaks))peaks_with_score_and_id=[peaks_with_score[i]+(peak_id[i],)foriinrange(len(peak_id))]all_peaks.append(peaks_with_score_and_id)peak_counter+=len(peaks)#findconnectioninthespecifiedsequence,center29isintheposition15limbSeq=[[2,3],[2,6],[3,4],[4,5],[6,7],[7,8],[2,9],[9,10],\[10,11],[2,12],[12,13],[13,14],[2,1],[1,15],[15,17],\[1,16],[16,18],[3,17],[6,18]]#themiddlejointsheatmapcorrepondencemapIdx=[[31,32],[39,40],[33,34],[35,36],[41,42],[43,44],[19,20],[21,22],\[23,24],[25,26],[27,28],[29,30],[47,48],[49,50],[53,54],[51,52],\[55,56],[37,38],[45,46]]connection_all=[]special_k=[]mid_num=10forkinrange(len(mapIdx)):score_mid=paf_avg[:,:,[x-19forxinmapIdx[k]]]candA=all_peaks[limbSeq[k][0]-1]candB=all_peaks[limbSeq[k][1]-1]nA=len(candA)nB=len(candB)indexA,indexB=limbSeq[k]if(nA!=0andnB!=0):connection_candidate=[]foriinrange(nA):forjinrange(nB):vec=np.subtract(candB[j][:2],candA[i][:2])norm=math.sqrt(vec[0]*vec[0]+vec[1]*vec[1])norm=max(0.001,norm)vec=np.divide(vec,norm)num=mid_num)))

startend=list(zip(np.linspace(candA[i][0],candB[j][0],num=mid_num),\np.linspace(candA[i][1], candB[j][1],int(round(startend[I][0])),0]\int(round(startend[I][0])),1]\len(score_midpts)candB[j][2]])

vec_x = np.array([score_mid[int(round(startend[I][1])),forIinrange(len(startend))])vec_y = np.array([score_mid[int(round(startend[I][1])),forIinrange(len(startend))])score_midpts=np.multiply(vec_x,vec[0])+np.multiply(vec_y,vec[1])score_with_dist_prior=sum(score_midpts)/len(score_midpts)+min(0.5*oriImg.shape[0]/norm-1,0)criterion1 = len(np.nonzero(score_midpts > thre2)[0]) > 0.8 *criterion2=score_with_dist_prior>0ifcriterion1andcriterion2:connection_candidate.append([i,j,score_with_dist_prior,score_with_dist_prior+candA[i][2]+connection_candidate=sorted(connection_candidate,key=lambdax:x[2],reverse=True)connection=np.zeros((0,5))forcinrange(len(connection_candidate)):i,j,s=connection_candidate[c][0:3]if(inotinconnection[:,3]andjnotinconnection[:,4]):connection=np.vstack([connection,[candA[i][3],candB[j][3],s,i,j]])if(len(connection)>=min(nA,nB)):breakelse:

connection_all.append(connection)special_k.append(k)connection_all.append([])#lastnumberineachrowisthetotalpartsnumberofthatperson#thesecondl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论