• (一)Mask R-CNN in Detectron2 for Key Point Detect



    欢迎访问个人网络日志🌹🌹知行空间🌹🌹


    1.COCO数据集中定义的人体关键点检测任务

    在这里插入图片描述

    人体关键点检测常用于人体姿态估计,不仅需要找到人的bounding box,还需要找出其中关键点的位置。cocohuman这个类别每个对象定义了17种关键点,依次是['nose', 'left_eye', 'right_eye', 'left_ear', 'right_ear', 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist', 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle'],此外还有skeleton骨架字段,表示各个种类关键点之间的连接信息,如[6, 7]表示left_shoulderleft_elbow相连。具体的关系如下:

    {
    	1: {
    		'supercategory': 'person',
    		'id': 1,
    		'name': 'person',
    		'keypoints': ['nose', 'left_eye', 'right_eye', 'left_ear', 'right_ear', 'left_shoulder', 'right_shoulder', 'left_elbow', 'right_elbow', 'left_wrist', 'right_wrist', 'left_hip', 'right_hip', 'left_knee', 'right_knee', 'left_ankle', 'right_ankle'],
    		'skeleton': [
    			[16, 14],
    			[14, 12],
    			[17, 15],
    			[15, 13],
    			[12, 13],
    			[6, 12],
    			[7, 13],
    			[6, 7],
    			[6, 8],
    			[7, 9],
    			[8, 10],
    			[9, 11],
    			[2, 3],
    			[1, 2],
    			[1, 3],
    			[2, 4],
    			[3, 5],
    			[4, 6],
    			[5, 7]
    		]
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    coco的标注文件中,keypoints检测数据集的标注信息类别如以上介绍的17种,另外在annotation中增加了num_keypointskeypoints字段,分别表示当前实例中包含了几个关键点和关键点的具体位置信息。keypoints是长度为3k的数组,其中k是关键点的类别数目,cocok=173表示的是关键点的(x,y,v),x,y是关键点在原图上的坐标,v0,1,2,定义的是关键点是否可见,其中v=0表示关键点没有标注,表示为(x=0,y=0,v=0),v=1表示标注但被遮挡,v=2表示标注且可见。

    coco中只标注了图像中非拥挤场景中级以上大小的humankeypoints,训练/验证/测试数据包括超过200000张图像,250000个人体图像标注了关键点,训练/验证数据中有超过150000个人体图像,标注了超过1 700 000个关键点,keypoints标注文件的字段如下

    annotations[{
         "id": int, 
         "image_id": int, 
         "category_id": int, 
         "segmentation": RLE or [polygon], 
         "area": float, 
         "bbox": [x,y,width,height], 
         "iscrowd": 0 or 1,
         "keypoints": [x1,y1,v1,...], 
         "num_keypoints": int
    }]
    
    categories[{
         "id": int, 
         "name": str, 
         "supercategory": str,
         "keypoints": [str], 
         "skeleton": [edge],
    }]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.Detectron2中实现的Mask R-CNN用于Keypoints关键点检测

    前面介绍了RPNRoI Pooler,通过RPN网络可以找到可能包含物体的proposal bounding boxes,RoI Pooler可以对proposal bounding boxes的选定区域进行特征提取,以这两个技术为基础,Mask R-CNN可用来实例分割和关键点检测

    在这里插入图片描述

    Mask R-CNN中实现的key points检测如上图所示,使用的是heatmap概率图的方式,keypoint_headroi_head中的一个分支,其输入的features是对backbone提取的图像特征featuresRoI Pooler后得到的, 输入keypoint_head中的proposals已经没有了层级信息,在做RoI Pooler时有一个assign_boxes_to_levels的过程,其原理参考FPN论文中的方程1。 keypoint_head的结构如上图,由8CNN组成,后跟1Transposed CNN1个向上2xinterpolation操作,用来输出key points heatmap prediction。若输入keypoint_headfeature shapeNxCxHxW,则输出feature shapeNxKx(4*H)x(4*W),其中K表示的是实例中定义的key point总的类别,N表示的是batch中所有的instance个数,其和图片的对应关系,保存在keypoint_head的另一个输入instances中。

    keypoint_head的最终预测输出kp_heatmap predNxKx(4*H)x(4*W)的特征图,在训练时,根据gt_keypoints将其先转到(4*H)x(4*W)尺度上得坐标(x,y),再取y*kp_heatmap pred.cols+x作为此点的目标值,在K个通道取有效点与kp_heatmap pred上对应valid通道的(4*H)x(4*W)概率图计算交叉熵损失函数cross_entropy。其原理是对每个(4*H)x(4*W)的概率图上的元素做分类,target就是当前类别keypointheatmap尺度上的位置。推理时,对每个instanceK通道(4*H)x(4*W)heatmaps,在每个通道heatmap上做softmax,求得概率最大的元素位置,即对应通道上keypoint的位置和评分,如此得到N个实例在K种关键点上预测的结果,NxKx(x,y,score)。最后,可以根据score的大小过滤掉K个通道上评分比较低的点。


    欢迎访问个人网络日志🌹🌹知行空间🌹🌹


    参考资料

  • 相关阅读:
    java计算机毕业设计家居体验平台的设计与实现源码+系统+数据库+lw文档
    go版本1.16.5 运行项目出现undefined: math.MaxInt报错
    【简单介绍下Sass,什么是Sass?】
    MYSQL的高阶语句
    C# Onnx Yolov8 Detect 手势识别
    【NGINX入门指北】 基础篇
    北京程序员的真实一天!!!!!
    通过核密度分析工具建模,基于arcgis js api 4.27 加载gp服务
    AD20基本原理图的设计
    漏洞复现-蓝凌LandrayOA系列
  • 原文地址:https://blog.csdn.net/lx_ros/article/details/126694646