CenterNet姿势估计网培训时间 MS-COCO数据

检测并定位图像中的人体关节和物体

2019年发布的这一系列模型估计了图像中人类关节的位置。与CenterNet对象检测模型类似,这些模型为每个人类关节类生成热图,然后通过回归的关节偏移校正热图。为了将预测的关键点按不同的人体实例分组,模型还分别检测整个人体,并通过从身体中心的位移将每个关键点参数化。最后,从对象中心回归的关键点与从人体姿势热图中提取的最近关键点对齐。请注意,CenterNet MobileNetV2仅检测人员实例,而ResNet模型检测MS-COCO数据集中的所有80个类。

训练集信息

型号信息

示例

资源检索

获取预先训练过的网:

在[1]中:=
NetModel[“基于MS-COCO数据训练的CenterNet姿势估计网络”]
输出[1]=

NetModel参数

该模型由一系列单独的网络组成,每个网络由特定的参数组合标识。检查可用参数:

在[2]中:=
NetModel[“基于MS-COCO数据训练的CenterNet姿势估计网络”,“参数信息”]
输出[2]=

通过指定参数选择非默认网络:

在[3]中:=
NetModel[{“基于MS-COCO数据训练的CenterNet姿态估计网络”,“架构”->“ResNetV1-50”}]
输出[3]=

选择一个非默认的未初始化网络:

在[4]中:=
NetModel[{“基于MS-COCO数据训练的CenterNet姿态估计网”,“架构”->“ResNetV1-50”},“未初始化评估网”]
输出[4]=

评估功能

定义此模型的标签列表:

在[5]中:=
标签={顺序[“人”、“自行车”、“汽车”、“摩托车”、“飞机”、“公共汽车”、“火车”、“卡车”、“小船”、“红绿灯”、“消防栓”、“停车标志”、“计价器”、“长椅”、“鸟”、“猫”、“狗”、“马”、“羊”、“牛”、“大象”、“熊”、“斑马”、”长颈鹿“背包”、“伞”、“手提包”、“领带”、“行李箱”、“飞盘”、“滑雪板”、“运动球”、,“风筝”、“棒球棒”、“垒球手套”、“滑板”、“冲浪板”、“网球拍”、“瓶子”、“酒杯”、“杯子”、“叉子”、“刀”、“汤匙”、“碗”、“香蕉”、“苹果”、“三明治”、“橙色”、“西兰花”、“胡萝卜”、“热狗”、“披萨”、“甜甜圈”、“蛋糕”、“椅子”、“沙发”、“盆栽植物”、“床”、“餐桌”、“厕所”、“电视”、“笔记本”、“鼠标”、,“遥控器”、“键盘”、“手机”、“微波炉”、“烤箱”、“烤面包机”、“水槽”、“冰箱”、“书”、“钟”、“花瓶”、“剪刀”、“泰迪熊”、“吹风机”、”牙刷“]};

定义netevaluate的帮助器实用程序:

在[6]中:=
(*评估此单元格以获取示例输入*)CloudGet[“https://www.wolframcloud.com/obj/96ac21ef-3eb3-460b-8ae9-31fa3977a291"]

编写评估函数以估计对象和人体关键点的位置:

在[7]中:=
Options[netevaluate]=加入[Options[alignKeypoints],Options[decode]];netevaluate[net_,img_Image,opts:OptionsPattern[]]:=块[{比例,预测},预测=解码[net,img,Sequence@@DeleteCase[{opts},“NeighborhoodRadius”|“FilterOutsideDetections”->_]];比例=最大值@N[图像尺寸[img]/反向@静止@NetExtract[net,NetPort[“PosePeaks”]]];alignKeypoints[预测,“FilterOutsideDetections”->OptionValue[“FilterOffsideDeections”],“NeighborhoodRadius”->选项值[“NeighborhoodRadius”]*比例]]

基本用法

获取检测到的边界框及其对应的类别和置信度,以及给定图像的人体关节位置:

在[8]中:=
(*评估此单元格以获取示例输入*)CloudGet[“https://www.wolframcloud.com/obj/1ac8b227-06bb-4acf-bf64-123358367291"]
在[9]中:=
预测=净评估[NetModel[“基于MS-COCO数据训练的CenterNet姿态估计网络”],测试图像];

检查预测键:

在[10]中:=
按键[预测]
输出[10]=

这个“对象检测”键包含检测到的对象的坐标及其信任关系和类:

在[11]中:=
预测[“目标检测”]
输出[11]=

检查检测到的类别:

在[12]中:=
类=删除副本@扁平@预测[[“ObjectDetection”,全部,2]]
输出[12]=

这个“关键点估计”key包含预测的主要关键点的位置以及它们对每个人的信任:

在[13]中:=
尺寸@预测[“关键点估计”]
输出[13]=

检查预测的关键点位置:

在[14]中:=
keypoints=预测[“KeypointEstimation”];

可视化关键点:

在[15]中:=
HighlightImage[testImage,DeleteMissing[keypoints,2]]
输出[15]=

可视化按人员分组的关键点:

在[16]中:=
HighlightImage[testImage,AssociationThread[Range[Length[#]]->#]&@DeleteMissing[keypoints,2],ImageLabels->无]
输出[16]=

可视化按关键点类型分组的关键点:

在[17]中:=
HighlightImage[testImage,AssociationThread[Range[Length[#]]->#]&@删除丢失[Transpose[keypoints],2],图像标签->无]
输出[17]=

定义一个函数以将关键点合并为骨架形状:

在[18]中:=
{{1, 2}, {1, 3}, {2, 4}, {3, 5}, {1, 6}, {1, 7}, {6, 8}, {8, 10}, {7, 9}, {9, 11}, {6, 7}, {6, 12}, {7, 13}, {12, 13}, {12, 14}, {14, 16}, {13, 15}, {15, 17}};getSkeleton[personKeypoints_]:=行[DeleteMissing[地图[personKeypoints[[#]]&,{{1,2},{1,3},}2,4],{3,5},13}, {12, 13}, {12, 14}, {14, 16}, {13, 15}, {15, 17}}], 1, 2]]

可视化姿势关键点、对象检测和人体骨骼:

在[19]中:=
HighlightImage[测试图像,追加[AssociationThread[Range[Length[#]]->#]&/@{keypoints,Map[getSkeleton,keypoints]},GroupBy[预测[“ObjectDetection”][[全部,;2]],最后->第一]],图像标签->无]
输出[19]=

高级可视化

在[20]中:=
(*评估此单元格以获取示例输入*)CloudGet[“https://www.wolframcloud.com/obj/2e67ed23-827d-4440-a269-cb17a44084bb"]

获取检测到的边界框及其对应的类和置信度,以及给定图像的人体关节位置:

在[21]中:=
预测=净评估[NetModel[“基于MS-COCO数据训练的CenterNet姿态估计网络”],testImage2,“ObjectDetectionThreshold”->0.28,“HumanPoseThreshold->0.2”,“FilterOutsideDetections”->True];keypoints=预测[“KeypointEstimation”];

可视化姿势关键点、对象检测和人体骨骼。请注意,某些关键点未对齐:

在[22]中:=
突出显示图像[testImage2,AssociationThread[Range[Length[#]]->#]&/@{keypoints,Map[getSkeleton,keypoints],predictions[[“ObjectDetection”,All,1]]}关联线程[Range[长度[#]]->#]],图像标签->无]
输出[22]=

检查由可选参数定义的半径的各种影响“邻居半径”以下为:

在[23]中:=
网格@列表@表[预测=净评估[NetModel(网络模型)[“在MS-COCO数据上训练的CenterNet姿势估计网”],testImage2,“ObjectDetectionThreshold”->0.28,“HumanPoseThreshold”->0.2,“NeighborhoodRadius”->r,“FilterOutsideDetections”->错误];突出显示图像[testImage2,AssociationThread[Range[Length[#]]->#]和/@{predictives[“关键点估计”],地图[getSkeleton,预测[“关键点估算”]],预测[[“ObjectDetection”,All,1]]},图像标签->无],{r,{1,5,8}}]
输出[23]=

网络对象检测结果

对于默认输入大小512x512,网络生成128x128个边界框,其中心大多遵循方形网格。对于每个边界框,网络生成框大小和框中心相对于方形网格的偏移:

在[24]中:=
res=网络模型[“利用MS-COCO数据训练的CenterNet姿态估计网络”][测试图像];
在[25]中:=
地图[尺寸,分辨率]
输出[25]=

将坐标系更改为图形域:

在[26]中:=
res=映射[Transpose[#,{3,2,1}]&,res];res[“BoxOffsets”]=映射[Reverse,res[“盒偏移”],{2}];res[“BoxSizes”]=映射[Reverse,res[“盒子大小”],{2}];

计算并可视化长方体中心位置:

在[27]中:=
网格=表格[{i,j},{i,128},};centers=grid+res[“BoxOffsets”];

将长方体中心位置可视化。它们遵循带有偏移的方形网格:

在[28]中:=
图形@{PointSize[0.005],点@扁平[中心,1]}
输出[28]=

计算方框'协调:

在[29]中:=
boxes=转置@压扁[{中心-0.5*res[“BoxSizes”],中心+0.5*res[“BoxSizes”]},{{1,4},}2,3}}];
在[30]中:=
尺寸[框]
输出[30]=

定义一个函数,将方框坐标重缩放为原始图像大小:

在[31]中:=
方框解码器[{a_,b_,c_,d_},{w_,h},scale_]:=矩形[{a*刻度,h-b*刻度},}c*刻度,h-d*刻度}];

可视化网络预测的所有框,按其比例缩放“反对”措施:

在[32]中:=
图形[贴图线程[{EdgeForm[Opacity[Total[#1]*0.5]],#2}&,{展平@映射[Max,res[“ObjectHeatmas”],{2}],映射[boxDecoder[#,{128,128},1]&,boxes]}],BaseStyle->{FaceForm[],EdgeForm[{Thin,Black}]}]
输出[32]=

可视化所有按包含狗的概率缩放的框:

在[33]中:=
idx=位置[labels,“dog”][[1,1]]
输出[33]=
在[34]中:=
图形[MapThread[{EdgeForm[Opacity[#1]],矩形@@#2}&,{扁平[res[“ObjectHeatmaps”][[All,All,idx]]],映射[boxDecoder[#,{128,128},1]&,boxes]}],BaseStyle->{FaceForm[],EdgeForm[{Thin,Black}]}]
输出[34]=

将cat预测叠加在网络接收到的缩放输入之上:

在[35]中:=
HighlightImage[testImage,图形[映射线程[{EdgeForm[{不透明度[#1]}],#2}&,{展平[res[“ObjectHeatmaps”][[All,All,idx]]],映射[boxDecoder[#,ImageDimensions[testImage],最大值@N[ImageDimensions[testImage]/{128,128}]]&,boxes]}]],BaseStyle->{FaceForm[],EdgeForm[{Thin,Red}]}]
输出[35]=

热图可视化

在[36]中:=
(*评估此单元格以获取示例输入*)CloudGet[“https://www.wolframcloud.com/obj/cb65e6fb-7b1b-49ea-af60-8df89bc2ec56"]

每个框都与标量强度值相关联,指示面片包含对象的可能性:

在[37]中:=
objectHeatmaps=NetModel[“根据MS-COCO数据训练的CenterNet姿势估计网络”][testImage][“ObjectHeatmaps”];
在[38]中:=
尺寸[对象热图]
输出[38]=

每个补丁的强度是所有类中聚集的最大元素。获取每个补丁的强度:

在[39]中:=
strongthArray=贴图[Max,Transpose[objectHeatmaps,{3,1,2}],{2}];尺寸[strongthArray]
输出[40]=

将每个补丁的强度可视化为热图:

在[41]中:=
heatmap=图像应用[{#,1-#,1-#}&,ImageAdjust@图像[strongthArray]]
输出[41]=

将热贴图拉伸并取消铺装到原始图像域:

在[42]中:=
heatmap=图像拍摄[图像大小调整[heatmap,{Max[#]}],{1,Last[#]{,{1&@图像尺寸[testImage]
输出[42]=

在图像上覆盖热图:

在[43]中:=
图像Compose[testImage,{ColorConvert[heatmap,“RGB”],0.4}]
输出[43]=

获取并可视化每个补丁的强度“狗”类别:

在[44]中:=
idx=位置[labels,“dog”][[1,1]];strengthArray=对象热图[[idx]];heatmap=ImageApply[{#,1-#,1-#}和,ImageAdjust@图像[strongthArray]];heatmap=图像拍摄[图像大小调整[heatmap,{Max[#]}],{1,Last[#]{,{1&@图像尺寸[testImage]
退出[47]=

在图像上覆盖热图:

在[48]中:=
图像Compose[testImage,{ColorConvert[heatmap,“RGB”],0.4}]
输出[48]=

定义一个通用函数来可视化图像上的热图:

在[49]中:=
可视化热图[img_Image,heatmap_]:=块[{strongthArray,w,h},{w,h}=图像尺寸[img];strongthArray=贴图[Max,Transpose[heatmap,{3,1,2}],{2}];strongthArray=图像应用[{#,1-#,1-#}&,图像调整@图像[strongthArray]];strongthArray=ImageTake[ImageResize[strongtharray,{Max[w,h]}],{1,h},{1、w}];图像合成[img,{ColorConvert[strongthArray,“RGB”],0.4}]];
在[50]中:=
地图[visualizeHeatmap[testImage,#]&,NetModel[“在MS-COCO数据上训练的CenterNet姿势估计网络”][testImage,{“对象热图”,“姿势热图”}]]
输出[50]=

适合任何尺寸

替换网络编码器.首先获得网络编码器以下为:

在[51]中:=
编码器=NetExtract[NetModel[“根据MS-COCO数据训练的CenterNet姿势估计网”],“输入”]
输出[51]=

请注意网络编码器通过保持纵横比来调整图像大小,然后将结果填充为512x512的固定形状。可视化的输出网络编码器调整亮度:

在[52]中:=
显示[ImageAdjust@图像[编码器[testImage],交错->错误],图像大小->280]
输出[52]=

创建新的网络编码器具有所需尺寸:

在[53]中:=
newEncoder=NetEncoder[{“Image”,{320,320},Method->“Fit”,Alignment->{Left,Top},“MeanImage”->NetExtract[encoder,“Mean Image”],“VarianceImage”->NetExtract[编码器,“VaranceImage”]}]
退出[53]=

附加新的网络编码器以下为:

在[54]中:=
resizedNet=网络替换部件[NetModel[“在MS-COCO数据上训练的CenterNet姿势估计网络”],“Input”->newEncoder]
输出[54]=

获取检测到的边界框及其对应的类和给定图像的置信度:

在[55]中:=
检测=netevaluate[resizedNet,testImage];

可视化检测:

在[56]中:=
HighlightImage[testImage,GroupBy[detection[[“ObjectDetection”,All,;;2]],Last->First]]突出显示图像
输出[56]=

请注意,尽管与原始网络相比,本地化结果和盒子信任度稍差,但调整后的网络运行速度要快得多:

在[57]中:=
净评估[NetModel[“基于MS-COCO数据训练的CenterNet姿态估计网络”],测试图像];//绝对计时
退出[57]=
在[58]中:=
netevaluate[resizedNet,testImage];//绝对计时
退出[58]=

净信息

检查网络中所有阵列的参数数量:

在[59]中:=
信息[NetModel(网络模型)[“在MS-COCO数据上训练的CenterNet姿态估计网络”],“ArraysElementCounts”]
输出[59]=

获取参数总数:

在[60]中:=
信息[NetModel(网络模型)[“在MS-COCO数据上训练的CenterNet姿态估计网络”],“ArraysTotalElementCount”]
输出[60]=

获取层类型计数:

在[61]中:=
信息[NetModel(网络模型)[“在MS-COCO数据上训练的CenterNet姿态估计网”],“LayerTypeCounts”]
输出[61]=

显示摘要图形:

在[62]中:=
信息[NetModel(网络模型)[“基于MS-COCO数据训练的CenterNet姿势估计网”],“SummaryGraphic”]
输出[62]=

资源历史记录

参考