《嵌入式人工智能技术应用》课件 2.3-基于人体骨骼点检测算法实现人体检测_第1页
《嵌入式人工智能技术应用》课件 2.3-基于人体骨骼点检测算法实现人体检测_第2页
《嵌入式人工智能技术应用》课件 2.3-基于人体骨骼点检测算法实现人体检测_第3页
《嵌入式人工智能技术应用》课件 2.3-基于人体骨骼点检测算法实现人体检测_第4页
《嵌入式人工智能技术应用》课件 2.3-基于人体骨骼点检测算法实现人体检测_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

项目二使用计算机视觉算法实现图像识别嵌入式人工智能技术应用基于人体骨骼点检测算法实现人体检测任务三职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务三基于人体骨骼点检测算法实现人体检测了解人体骨骼点检测算法原理;理解如何使用多线程的方式实现图像采集和人体骨骼检测。掌握利用OpenCV实现图像的采集;掌握调用算法接口,进行人体骨骼关键点检测。职业能力目标01知识目标技能目标职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务三基于人体骨骼点检测算法实现人体检测

本实验将实现用人体骨骼点检测算法库对USB摄像头实时采集并显示在jupyterlab的画面进行人体骨骼点检测。任务描述任务要求使用人体骨骼点检测算法对单张图像进行人体骨骼点检测;基于多线程使用人体骨骼点检测算法对视频流进行人体骨骼点检测;标注人体骨骼点并进行显示。任务描述与要求02职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务三基于人体骨骼点检测算法实现人体检测任务分析根据自己的了解说说人体骨骼点检测有哪些应用有哪些?实现人体骨骼点检测可能会涉及到哪些步骤?任务分析与计划03任务计划表项目名称使用计算机视觉算法实现图像识别任务名称基于人体骨骼点检测算法实现人体检测计划方式自主设计计划要求请用6个计划步骤来完整描述出如何完成本次任务序号任务计划1

2

3

4

5

6通过上面的思考,你是否对本任务要完成的工作有所了解?让我们一起来制订完成本次任务的实施计划吧!任务分析与计划03职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务三基于人体骨骼点检测算法实现人体检测04知识储备人脸骨骼点检测1行为识别2人脸骨骼点检测04人体骨骼关键点检测也称为PoseEstimation,主要检测人体的关节、五官等,通过关键点描述人体骨骼信息。人脸骨骼点检测04人体骨架点检测是对图像或者视频中的人体进行主要关节点定位的过程,其作用是服务于人体动作的分类或识别,安全监控,人机交互,数字娱乐,体育分析等领域都离不开对人体动作的分析。因此,对人体骨架点检测的深入研究,有着广阔的应用前景。人脸骨骼点检测04实现人体检型,通常采用人体姿态估计(HumanPostureEstimation),即将图片中已经检测到的人体关键点正确联系起来从而实现人体姿态的估计,实现人体的检测。人体关键点通常对应人体上有一定自由度的关节,比如颈、肩、肘、腕、腰、膝、踝等。人脸骨骼点检测04

人体骨骼关键点检测是计算机视觉的基础性算法之一,在计算机视觉的其他相关领域的研究中都起到了基础性的作用,如行为识别、人物跟踪、步态识别等相关领域。具体应用主要集中在智能视频监控,病人监护系统,人机交互,虚拟现实,人体动画,智能家居,智能安防,运动员辅助训练等等。人脸骨骼点检测041、人类行为识别:人类行为识别是指在给定的图片或者图片序列中识别出人体的动作意图。人类行为识别是计算机视觉领域一个极其重要的研究方向。人体骨骼关键点应用场景人脸骨骼点检测04动作识别常见的几个应用场景:(1)用于检测儿童或者老人是否突然摔倒,人体是否由于碰撞或疾病造成摔倒;(2)用于体育、健身和舞蹈等肢体相关的教学和核对;(3)用于理解人体的明确的肢体信号和指示(如机场跑道信号、交警信号、航海旗语等);(4)用于协助进行姿态保持和保证(如学生课堂听讲和学情报告);(5)用于增强安保和监控人体行为(如识别校园学生追打和上下楼梯推搡等行为)。人体骨骼关键点应用场景人脸骨骼点检测042、人机交互:人机交互是指设计一种计算机和用户进行信息传递的接口程序。人机交互处于计算机科学,行为科学,设计,媒体研究的交叉点。人体骨骼关键点应用场景人脸骨骼点检测043、服装解析:服装解析是指在一张图像中解析出人体上不同的服装。解析服装的视觉算法具有各种各样的潜在应用价值,更好的理解图像,人物服饰识别,或基于内容的图像检索等。人体骨骼关键点应用场景人脸骨骼点检测044、运动捕捉和增强现实(CGI):通过检测出人体关键点,将人体姿态应用到图形、特效增强、艺术造型等,使用计算机合成技术将相关数据加载在电影人物上。人体骨骼关键点应用场景人脸骨骼点检测045、虚拟游戏:在交互游戏中追踪人体对象的运动,使用人体关键点检测技术来追踪人类玩家的运动,从而利用它来渲染虚拟人物的动作。人体骨骼关键点应用场景人脸骨骼点检测046、训练机器人:人类教练通过演示特定的动作,来教机器人学习这一动作,机器人识别人体关键点,计算如何移动自己的活动关节,来进行相同的动作。人体骨骼关键点应用场景人脸骨骼点检测04图片的数量未知;图片中人与人之间的接触会极大影响识别效率,比如追挡、接触、掩盖;图片中的人数的增加会直接导致计算的复杂度提高;由于人体具有相当的柔性,会出现各种姿态和形状,而且还面临着遮挡、光照、雾等环境的影响。人体骨骼关键点检测难点人脸骨骼点检测04人体骨骼关键点检测方法主要分两周:自上而下和自下而上。自上而下:先检测人体,在检测单人人体关键点;自下而上:先将图片中所有的关键点检测出来,再进行关键点聚类。人体骨骼关键点检测方法04知识储备人脸骨骼点检测1行为识别2行为识别04我们可以通过深度学习,检测到一个人,但是那个人在做什么我们不知道。所以我们就想让神经网络既检测到人,又知道他在做什么。也就是对这个人的行为进行识别。行为识别——骨架提取/人体关键点估计行为识别041.openposeopenpose是自下而上的人体姿态估计算法,也就是先得到关键点位置,再获得骨架。因此计算量不会因为图片上人物的增加而显著增加,能保证时间基本不变。2D人体关键点估计算法:行为识别042.AlphaposeAlphapose是自上而下的算法,也就是先检测倒人体,再得到关键点和骨架。因此他的准确率、Ap值要比openpose高。但是缺点就是随着图片上的人数增加,他的计算量增大,速度变慢。2D人体关键点估计算法:行为识别043.MobileposemobilePose就是用轻量级网络来识别人体关键点,而且大部分都是单人姿态估计。因此可以先加上人体的侦测,如用yolo侦测到人的位置,然后在接上mobilepose,这样速度可以非常的快,而且准确性也比较好。2D人体关键点估计算法:行为识别04总结:骨架提取如果要在移动端部署,那么就得用轻量级版本。受限于复杂背景,人物可能被遮挡,或者多人重叠的情况就无法很准确的识别骨架。因此在移动端可以实现的只有单人的时候,做单人的行为识别、动作匹配等作用。对于大场景的行为识别,就要用到比较大的模型,才能有较高的精确度。2D人体关键点估计算法:职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务三基于人体骨骼点检测算法实现人体检测职业能力目标01任务描述与要求02任务分析与计划03知识储备04任务实施05任务检查与评价06任务小结07任务拓展08任务三基于人体骨骼点检测算法实现人体检测05任务实施利用多线程方式实现视频流的人体骨骼检测2调用人体骨骼关键点算法接口12图片加载与人体骨骼点检测1模型加载与配置3显示算法处理的图像调用人体骨骼关键点算法接口05调用人体骨骼关键点算法接口算法接口的调用,不但要进行识别检测,还要把结果显示在图片上,比如说把人体关节点和关节点的连线,全部描绘在图片上等等。调用人体骨骼关键点算法接口05importcv2fromlib.posePointimportNLPose,gColors,gPosePairs1.模型加载与配置(1)导入算法接口库该人体骨骼关键点算法接口库是底层由C写的算法库,集成在核心开发板上,在经过python的对接后,形成了一套python的接口库,可以直接调用。libNamePath="/usr/local/lib/libNL_ACTIONENC.so"#指定库文件路径nlPose=NLPose(libNamePath)#实例化算法类(2)实例化算法接口对象加载库,以及指定函数参数类型和返回值类型,并初始化结构体变量,libNamePath是固定库文件路径,执行没有报错,表示实例化成功。configPath=b"/usr/local/lib/rk3399_AI_model"#指定模型以及配置文件路径nlPose.NL_Pose_ComInit(configPath)#加载模型并初始化(3)加载模型和配置初始化配置,加载模型,configPath是模型和配置文件路径,执行没有报错,表示加载成功。调用人体骨骼关键点算法接口05importipywidgetsaswidgets#jupyter画图库fromIPython.displayimportdisplay#jupyter显示库image1=cv2.imread("./exp/body.jpg")imgbox=widgets.Image()#定义一个图像盒子,用于装载图像数据display(imgbox)#将盒子显示出来imgbox.value=cv2.imencode('.jpg',image1)[1].tobytes()#把图像值转成byte类型的值2.加载图片数据人体骨骼点检测(1)显示原始的目标图像将采集到的图片数据,加载到算法中(image为图片数据),返回0表示加载成功因为算法中,采用的是1280*960的分辨率,需要把图片放大或者缩小成该分辨率的图像。height=image1.shape[0]width=image1.shape[1]ifheight!=960orwidth!=1280:image=cv2.resize(image1,(1280,960),interpolation=cv2.INTER_CUBIC)ret1=nlPose.NL_Pose_InitVarIn(image)(2)加载图片到算法person_num=nlPose.NL_Pose_Process_C()#返回值是目标个数(3)调用人体骨骼点检测主函数处理图像返回人体的个数,并输出骨骼点的位置信息,在人体骨骼点输出结构体,可以获取相关信息。调用人体骨骼关键点算法接口05lineType=8#线条的类型threshold=0.05#阈值,用于判断是否为骨骼点foriinrange(int(nlPose.djACTVarOut.dwPersonNum)):djActionInfors=nlPose.djACTVarOut.pdjActionInfors[i]#获取人体信息

#绘制关节点

forposeinrange(djActionInfors.dwPoseNum):#循环关节点的数量

djfPosePos=djActionInfors.fPosePos[pose]#获取关节点的信息

ifdjfPosePos.p_score>threshold:#判断关节点位置坐标的置信度,取大于0.05的值

colorIndex=pose*3#每三个值为一种颜色

centerPoint=(int(djfPosePos.x),int(djfPosePos.y))#关节点坐标

color=(gColors[colorIndex+2],gColors[colorIndex+1],gColors[colorIndex])#设置颜色

cv2.circle(image,centerPoint,10,color,-1,lineType)#画出圆点

#绘制关节点连线

forpairinrange(0,len(gPosePairs),2):#依据设定好的关键点连线,循环每条线

fPosePos1=djActionInfors.fPosePos[gPosePairs[pair]]#取出连线两端的点的坐标

fPosePos2=djActionInfors.fPosePos[gPosePairs[pair+1]]if(fPosePos1.p_score>threshold)and(fPosePos2.p_score>threshold):#判断两个点的置信度都达标

colorIndex=gPosePairs[pair+1]*3#每三个值为一种颜色,根据点位来获取颜色值

color=(gColors[colorIndex+2],gColors[colorIndex+1],gColors[colorIndex])#设置颜色

LineScaled=5keypoint1=(int(fPosePos1.x),int(fPosePos1.y))#起始点

keypoint2=(int(fPosePos2.x),int(fPosePos2.y))#终点

cv2.line(image,keypoint1,keypoint2,color,LineScaled,lineType)#画线

#绘制头部矩形框

RectPoint1=(nlPose.djACTVarOut.pdjUpBodyPos[i].x,nlPose.djACTVarOut.pdjUpBodyPos[i].y)#头部左上角坐标

RectPoint2=(nlPose.djACTVarOut.pdjUpBodyPos[i].x+nlPose.djACTVarOut.pdjUpBodyPos[i].width,nlPose.djACTVarOut.pdjUpBodyPos[i].y+nlPose.djACTVarOut.pdjUpBodyPos[i].height)#头部右下角坐标

cv2.rectangle(image,RectPoint1,RectPoint2,(200,0,125),5,8)#画出矩形框3.显示算法处理的图像(1)结果画在图片上循环取出人体骨骼关键点的位置信息和骨骼点连线,画在图片上,并打印出结果。调用人体骨骼关键点算法接口05importipywidgetsaswidgets#jupyter画图库fromIPython.displayimportdisplay#jupyter显示库importcv2fromlib.posePointimportNLPose,gColors,gPosePairsimporttimeimgbox=widgets.Image()#定义一个图像盒子,用于装载图像数据display(imgbox)#将盒子显示出来imgbox.value=cv2.imencode('.jpg',image)[1].tobytes()#把图像值转成byte类型的值nlPose.NL_Pose_Exit()#释放算法内存和模型3.显示算法处理的图像(2)结果可视化利用jupyter的画图库和显示库将经过算法处理的图像显示,并释放内存和模型。05任务实施利用多线程方式实现视频流的人体骨骼检测2调用人体骨骼关键点算法接口142定义摄像头采集线程1引入相关的库3定义算法识别线程启动与停止线程利用多线程方式实现视频流的人体骨骼检测05利用多线程方式实现视频流的人脸属性分析利用多线程,使图像采集和算法识别同时运行,从而实现视频流的人脸检测,并且可以避免一些因花时间太久,导致的视频卡顿。利用多线程方式实现视频流的人脸属性分析05importtime#时间库importcv2#引入opencv图像处理库importthreading#这是python的标准库,线程库importipywidgetsaswidgets#jupyter画图库fromIPython.displayimportdisplay#jupyter显示库fromlib.posePointimportNLPose,gColors,gPosePairs#引入骨骼秒点算法库1.引入相关的库threading线程库多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理;用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度;程序的运行速度可能加快;在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。利用多线程方式实现视频流的人脸属性分析05classCameraThread(threading.Thread):def__init__(self,camera_id,camera_width,camera_height):threading.Thread.__init__(self)self.working=Trueself.cap=cv2.VideoCapture(camera_id)#打开摄像头

self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,camera_width)#设置摄像头分辨率宽度

self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,camera_height)#设置摄像头分辨率高度

defrun(self):globalcamera_img#定义一个全局变量,用于存储获取的图片,以便于算法可以直接调用

camera_img=Nonewhileself.working:ret,image=self.cap.read()#获取新的一帧图片

ifret:camera_img=imagedefstop(self):self.working=Falseself.cap.release()2.定义摄像头采集线程结合上面的opencv采集图像的内容,利用多线程的方式串起来,形成一个可传参,可调用的通用类。这里定义了一个全局变量camera_img,用作存储获取的图片数据,以便于其他线程可以调用。init初始化函数实例化该线程的时候,会自动执行初始化函数,在初始化函数里面,打开摄像头,并设置分辨率。run函数该函数是在实例化后,执行start启动函数的时候,会自动执行。在该函数里,实现了循环获取图像的内容。利用多线程方式实现视频流的人脸属性分析053.定义算法识别线程结合调用算法接口的内容和图像显示内容,利用多线程的方式整合起来,循环识别,对摄像头采集线程中获取的每一帧图片进行识别,并显示,形成视频流的画面。init初始化函数实例化该线程的时候,会自动执行初始化函数,在初始化函数里面,定义了显示内容,并实例化算法和加载模型。run函数该函数是在实例化后,执行start启动函数的时候,会自动执行。在该函数是一个循环,实现了对采集的每一帧图片进行算法识别,然后将结果绘画在图片上,并将处理后的图片显示出来。利用多线程方式实现视频流的人脸属性分析053.定义算法识别线程利用多线程方式实现视频流的人脸属性分析05camera_th=CameraThread(0,1280,960)pose_detect_th=PoseDetectThread()camera_th.start()pose_detect_t

温馨提示

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

评论

0/150

提交评论