持续创造,加快成长!这是我参与「日新计划 10 月更文挑战」的第19天,点击查看活动详情

导读

旋转框比较矩形框能够更好的拟合物体,一起标注起来比切割要便利的多,运用来自NVIDIA的ODTK能够便利的练习,施行和布置旋转框物体检测模型,一起具有多种扩展功能。

ODTK:来自NVIDIA的旋转框物体检测工具箱

图1,国际遥感和摄影测量学会(ISPRS)波茨坦数据集,运用切割掩码标签核算的车辆的旋转围住盒显现为绿色。

运用深度神经网络(DNNs)和卷积神经网络(CNNs)对图画进行方针检测和分类是一个研讨很广泛的领域。关于一些运用,这些人工智能办法被认为是满足可靠的,在生产中运用根本不需求干涉。流行的办法包括YOLO、SSD、Faster-RCNN、MobileNet、RetinaNet等。

在大多数运用环境中,图画是从一个以自己为中心的视角收集的(比如手机摄像头),大多数方针是笔直对齐的(一个人)或水平对齐的(一辆车)。这意味着图画中的大部分物体能够认为是轴向的,能够用四个围住框参数来描绘:xmin、ymin、width和height。

可是,在许多状况下,物体或特征不与图画轴对齐。在这种状况下,这四个参数不能很好地描绘物体概括。

ODTK:来自NVIDIA的旋转框物体检测工具箱

图2,两个COCO的验证图画。轴对齐框(a)包括了许多天空。旋转框(b)更适合

例如,测验运用四个鸿沟框参数来描绘一个旋转了45度的正方形。鸿沟框的面积是你试图描绘的正方形面积的两倍。自己核算一下吧!

关于矩形物体,或许任何高长宽比的物体(又高又瘦,又矮又胖),不同甚至更大。因此,需求一个额外的参数来减少方针的面积和描绘它的鸿沟框之间的差异, 物体相关于笔直轴的视点,。现在你能够用xmin,ymin,width,height和来描绘一个方针的边框。

在实际国际中,有些方针不能被描绘为一个简略的矩形,需求更多的参数。增加视点参数有助于描绘其方位和概括,比轴对齐框更精确。

ODTK:来自NVIDIA的旋转框物体检测工具箱

图3,ODTK检测旋转框的比如。轴对齐的ground truth框(a)相互堆叠,每个框都是(person和motorcycle)的混合。ODTK (b)检测到的旋转框处理了这个问题,而且更好地拟合了方针的概括。

旋转物体和特征的检测的运用包括遥感(图1)、 “in the wild” 文本检测、医学和工业检测。当你运用轴对齐的边框来练习模型背景时,每个旋转的方针都会包括一些特征,从而下降了模型从背景图画中区别感兴趣的方针的能力。此外,假如方针是近距离的,例如停车场的汽车,背景和附近的方针也包括在方针实例中。

其成果是,当一群方针中存在相同或类似类别时,检测器可能会高估或轻视方针的数量。关于依赖于精确值的运用,这明显不是最优的。旋转框能够缓解这些问题,并供给更高的精度和召回率。例如,图3中围绕人物的轴对齐框包括了许多天空和一些摩托车。旋转框里包括了更少的天空和几乎没有摩托车。

旋转方针检测模型和办法

常用的检测旋转物体的DNN办法可分为两类:

  • 从切割蒙版核算旋转框
  • 直接揣度旋转框

关于第一种办法,切割掩模一般运用Mask-RCNN核算,这是一个根据Faster-RCNN的网络,在分类和轴对齐的围住框之外还有一个额外的切割头。与Faster-RCNN一样,Mask-RCNN是一个两级检测器,它能揣度出建议区域,然后在检测成果中细化。

虽然这种办法能够对轴对齐方针进行高精度的揣度,但这种两阶段办法的性能(每秒处理图画)相对较低。此外,运用揣度切割掩模核算旋转的围住框,一般运用后处理和OpenCV等规范包,会产生不精确和虚假的成果。

第二种办法,直接揣度旋转框,更有吸引力。与切割掩码办法不同,不需求增加低功率和一般会下降精度的后处理。另外,大多数直接揣度旋转框的办法都是单阶段检测器,而不是像Faster-RCNN这样的多阶段检测器。

关于这个主题的学术论文很少,公开的repos就更少了。为了在一次检测中揣度旋转框,许多技术依赖于比较ground truth和锚(有时称为先验框)。关于轴对齐的检测器,锚的巨细、长宽比和份额在进行练习之前由用户界说。

练习期间,假如核算的anchor框和gt框之间的IOU高于0.5,那么这个anchor就用来回归这个和这个gt之间的不同(xmin,ymin,width,height)。关于轴对齐框,IoU核算非常简略,能够运用NVIDIA GPU以端到端方法加快。下面的PyTorch比如显现了轴对齐框和anchor之间IoU的核算:

inter=torch.prod((xy2-xy1+1).clamp(0),2)
boxes_area=torch.prod(boxes[:,2:]-boxes[:,:2]+1,1)
anchors_area=torch.prod(anchors[:,2:]-anchors[:,:2]+1,1)
overlap=inter/(anchors_area[:,None]+boxes_area-inter)

在这个代码示例中:

  • boxes是ground truth的注解
  • anchors是锚框
  • xy2xy1分别是标注框和anchor中左上角最大的和右下角最小的角的坐标
  • interboxesanchors的堆叠区域面积
  • boxes_areaanchors_area分别是ground truth和锚框的面积
  • overlap是IoU

关于旋转框,状况就不同了。首要,为额外的参数angle指定一个或多个值,这增加一个anchor的参数。图4显现了图画特征空间中的单个方位上轴对齐的锚框(蓝色),具有三种份额和三种纵横比。旋转的锚框(赤色和蓝色)在三个旋转视点上运用相同的份额和长宽比来显现:-/6, 0 and /6其次,最重要的是,IoU的核算不能像前面所示的轴对齐框那样简略地进行。

ODTK:来自NVIDIA的旋转框物体检测工具箱

图4,轴对齐锚框(蓝色),旋转的锚框(赤色和蓝色),旋转视点:-/6, 0和/6

旋转框的IOU核算

ODTK:来自NVIDIA的旋转框物体检测工具箱

图5,两个旋转矩形的堆叠区域为多边形。

图5显现了旋转框交叉点要比轴对齐的框交叉点复杂得多。当两个旋转框堆叠时,会构建出一个新的多边形(不一定是四边形),由赤色和绿色的极点描绘。赤色的极点表示两个框的边相交的当地,而绿色的极点包括在两个框内。你有必要能够为一切的框都核算出这些点,然后履行IoU核算。

大多数论文依赖于框的光栅化(例如,创立一个图画或mask)来核算这个新的多边形,然后核算IoU。这是一种低效且不精确的办法,由于框所占有的空间有必要离散化以进行一切的比较。需求运用精确的剖析处理方案来最大化功率和精确性。

为了处理这个问题,咱们转向几何办法,次序切割是一种递归办法,运用一个比较框界说初始多边形。关于每条边,它核算与第二个被比较框的边是否有交集。假如是这样,这些极点就会被保存下来,并构成新的边,然后这些边会再次与被比较的方框进行比较,直到没有边剩余为止。伪代码如下:

Intersectionoftworotatedboxes/polygons(p1,p2):

1.Initializethebox_intersection,settingitastheverticesofp1.

2.Foreachedge(specifiedbythelineequationax+by+c=0)ofp2,findlineintersectionwithboxintersectionusinghomogeneouscoordinateswhere;

intersectionx=(p1.b*p2.c-p1.c*p2.b)/w

intersectiony=(p1.c*p2.a-p1.a*p2.c)/w

where;w=p1.a*p2.b-p1.b*p2.a

2a.Ifintersectionoccursontheedge,addittotemp_intersection.

2b.Ifintersectionoccurswithintheboundaryoftwoedgecalculations,addittotemp_intersection.

3.Setbox_intersection=temp_intersection.

4.Repeatfrom2.untilnomoreedges.

假如在比较两个框时存在一个有两条边以上的多边形,现在能够核算IoU,不然,IoU为零。再一次,为精确核算,其中不规则多边形的面积是由以下公式给出:

ODTK:来自NVIDIA的旋转框物体检测工具箱

然后,IoU经过切割多边形区域来核算,正如前面核算的框和锚的区域的IoU。

与与之对应的轴对齐办法比较,这种递归办法更加复杂。可是,与光栅化框和锚比较,它的核算要求更少,也不那么费事。

IoU有必要在每幅图画上核算,由于它是经过DNN前向传播的。在练习过程中,IoU用于衡量损失,在推理过程中,IoU需求进行非最大抑制(NMS)。因此,函数有必要尽可能快。

这是经过运用grid-striding在CUDA core的多个GPU线程上并行地进行每次比较来完成的。

Grid-striding能够让你在GPU设备上以灵活的方法并行履行这些核算,而不是按次序核算一切的ground truth box到anchor box的比较(每个图画batch的核算量从100ks到数百万)。

图6展现了在CUDA core(绿色条)上的完成和在cpu上履行次序核算(蓝色条)时的加快图。CUDA core比Python供给了10k的加快,比PyTorch供给了100k的加快,比c++供给了500的加快。这个图没有考虑GPU到CPU之间的数据传输时刻,假如旋转IoU核算在GPU设备上在模型练习期间履行。在练习和揣度过程中,将一切的数据和核算都保存在GPU上,这进一步增加了GPU和CPU性能的差异,如图6所示。

ODTK:来自NVIDIA的旋转框物体检测工具箱

图6,旋转IoU核算比较20个方针框和900个锚框。CPU = 1x Xeon(R) CPU E5-2698 v4 @ 2.20GHz, GPU = 1x NVIDIA V100 16gb

IoU核算好了之后,假如肯定视点不是必需的,你能够最小化(xmin, ymin, width, height, )。假如肯定视点和方向需求已知(文本框取向、车辆方向/轴承等等),这些信息在gt中是一致的,能够最小化(xmin, ymin, width, height, sin(), cos()),捕获肯定视点差异的投影到单位圆上。

一切特性(轴对齐和旋转框检测)在NVIDIA物体检测东西包:github.com/NVIDIA/reti… (ODTK)中都能够运用。

运用ODTK

NVIDIA具有一套丰富的东西来加快方针检测模型的练习和揣度。开源ODTK是一个如何一起运用一切这些东西的比如。运用RetinaNet演示检测pipeline是作为现代物体检测器的一个很好的比如。

ODTK演示了如何集成5个NVIDIA东西:

  • Mixed precision training,咱们在FP32保存一个网络权重的主副本,但咱们在FP16核算更新每批。这使得练习时的速度提高了3倍。咱们运用NVIDIA APEX库完成主动混合精度(AMP)。
  • NVIDIA数据加载库(DALI)将预处理(图画resize和归一化)移动到GPU。这能够将练习和推理速度提高到1.2到1.5倍,这取决于你选择哪种骨干。
  • NVIDIA TensorRT创立高度优化的推理引擎,在FP32, FP16,和INT8精度上都能够运用。这些引擎能够在推理期间供给显著的加快(比如5x)。ODTK还能够生成ONNX文件,供给更大的框架灵活性。
  • NVIDIA DeepStream SDK是英伟达智能视频剖析处理方案(IVA)。它是非常高效的,由于DeepStream将视频数据的整个pipeline保持在GPU中。NVIDIA供给了一个解析器,以便能够在DeepStream pipeline中运用ODTK推理引擎(运用TensorRT生成)。
  • NVIDIA Triton Inference Server是TensorRT模型的另一种服务方法。Triton揣度服务器能够注册ODTK PyTorch、ONNX和TensorRT模型,Triton客户端能够恳求该服务器。假如你运用静态图画而不是视频流,此办法可能更适合。

预备数据

ODTK运用COCO方针检测格式,但咱们修改了边框,使其包括theta参数。首要运用[xmin, ymin, width, height]参数构建边框(图7,左)。然后,将框逆时针旋转theta 弧度,在本例中为-0.209。假如旋转的方框包括了图片框之外的区域,没有关系。

ODTK:来自NVIDIA的旋转框物体检测工具箱

图7,首要创立一个轴对齐的框(左),然后旋转(右)来构造鸿沟框

许多数据集(例如COCO和ISPRS)都带有切割掩码。这些掩码能够转换为旋转框。

运用shapelyminimum_rotated_rectangle函数创立旋转矩形,并将四个角输入函数以生成边框值。calc_bearing是一个用arctan求的简略函数。你有必要把函数封装起来以保证w和h是正的,而且theta在-pi/2到pi/2或许-pi到pi的范围内。

def_corners2rotatedbbox(corners):
centre=np.mean(np.array(corners),0)
theta=calc_bearing(corners[0],corners[1])
rotation=np.array([[np.cos(theta),-np.sin(theta)],
[np.sin(theta),np.cos(theta)]])
out_points=np.matmul(corners-centre,rotation)+centre
x,y=list(out_points[0,:])
w,h=list(out_points[2,:]-out_points[0,:])
return[x,y,w,h,theta]

练习,推理,导出ODTK模型

ODTK坐落最新的NVIDIA NGCPyTorch容器中。这保证安装了正确版本的PyTorch和其他先决条件。

gitclonehttps://github.com/nvidia/retinanet-examples
dockerbuild-todtk:latestretinanet-examples/
dockerrun--gpusall--rm--ipc=host-it-v/your/data/dir:/dataodtk:latest

现在,练习ODTK用于旋转检测。在这篇文章中,咱们运用了ResNet50PFN骨干。下面的指令每7000次迭代生成一个验证分数。

odtktrainmodel.pth--backboneResNet50FPN\
--images/data/train/--annotations/data/train.json\
--val-images/data/val--val-annotations/data/val.json--rotated-bbox

你能够运用PyTorch来推理模型:

odtkinfermodel.pth--images/data/test--outputdetections.json

可是,假如首要导出到TensorRT(这里是FP16),能够获得更快的揣度性能,可是INT8精度也可用。

odtkexportmodel.pthengine.plan

你能够运用odtk揣度指令、Triton服务器或编写一个c++揣度运用程序进行揣度。

ODTK:来自NVIDIA的旋转框物体检测工具箱

表1,对80个类COCO的各种骨干的揣度推迟和吞吐量,图画巨细调整(resize)设置为800,批处理巨细(batch)设置为1。轴对齐和旋转框模型推迟和吞吐量之间的差异能够忽略不计

对份额子

ODTK:来自NVIDIA的旋转框物体检测工具箱

图8,轴对齐模型(左)和旋转框模型(右)的揣度框(赤色)和gt框(绿色)

图8显现了在ISPRS波茨坦数据集上练习的轴对齐和旋转框模型的比如,这些比如是从在运用ResNet18骨干的COCO数据集上预练习的轴对齐模型上进行微调的。这两个模型在相同的练习和验证数据集上进行练习直到收敛(90k迭代)。

从推理图画能够看出,旋转模型比轴对齐模型更符合ground truth。当运用轴对齐模型时,会出现每辆车有多个检测成果的状况,但关于旋转框模型则不是这样。

与轴对齐模型比较,旋转框模型获得了更高的均匀IoU:0.60对0.29。由于轴对齐模型得到的IoU较低,IoU≥0.5时的规范COCO均匀精度核算值在模型之间存在差异:0.86和0.01。你有必要为这个比较运用一个更公平的衡量,一个能够用来比较揣度的成果与ground truth框的匹配程度的衡量。

在这篇文章中,咱们运用了在Cityscapes dataset challenge中界说的实例级语义标记衡量。精度和召回率是按类和像素级别核算的。当运用这些指标时,旋转模型的精度和召回率分别为0.77和0.76,轴对齐模型的精度和召回率分别为0.37和0.55。旋转检测比轴对齐模型能够更清楚地匹配ground truth。

ODTK:来自NVIDIA的旋转框物体检测工具箱

表2,运用ISPRS波茨坦数据集建模时,将轴对齐模型与旋转框模型的实例级精度、召回率和F1得分进行比较

总结

能够测验运用ODTK检测自己数据会集的旋转方针。你会发现它直接练习,验证,施行,并供给模型服务,最大话GPU资源的功率。并持续为高性能,端到端掩模练习和推理,多边形检测,和高效的多方针盯梢集成进行调优。

英文原文:developer.nvidia.com/blog/detect…