龙空技术网

如何在物体检测代码中使用ROI Pool和ROI Align(PyTorch 1.0)

AI公园 3629

前言:

而今同学们对“pythonroi”都比较关切,朋友们都想要学习一些“pythonroi”的相关内容。那么小编也在网络上汇集了一些对于“pythonroi””的相关资讯,希望兄弟们能喜欢,小伙伴们一起来了解一下吧!

作者:Andrew Jong

编译:ronghuaiyang导读如果你想做一个与计算机视觉或图像处理相关的深度学习项目,你可能会用到ROI Pool和ROI Align层。虽然最初是为目标检测而构建的,但是ROI Pool的变体对于从图像的局部区域提取信息也很有用。

如果你想做一个与计算机视觉或图像处理相关的深度学习项目,你可能会用到ROI Pool和ROI Align层。虽然最初是为目标检测而构建的,但是ROI Poll的变体对于从图像的局部区域提取信息也很有用。例如,你可能想从一个人身上提取特定的身体部位:

在此图中,ROI Pool用来从图像中的六个任意大小的区域提取纹理信息。ROI Pooling将矩形转换成一个漂亮的方形的张量。

我发现了许多有用的文章,解释了ROI Pool和ROI Align在概念上是如何工作的,然而,我没有找到任何关于如何将ROI Pooling/Aglign层在我的神经网络中编写代码的清晰教程。

不幸的是,PyTorch没有内置ROI Pool(及其变体)。当然,你可以自己实现这些层。但是要实现一个实际的与gpu兼容的实现,你必须花时间在CUDA中编写代码。更实际的选择是使用第三方库。然而,这些库大多数都没有文档。

因此,这篇文章总结了我从几周的探索、实验和与无文档库的斗争中学到的东西。我将解释如何安装和编译第三方实现以供你的项目使用,以及如何使用所提供的ROI层的API。希望有了这个指南,我可以节省别人很多时间!

安装

我使用了来自的ROI层实现。这是GitHub上最流行的fast-rcnn PyTorch库,因此提供了一个可靠的选择。另外,我认为这里的一些ROI层代码受Facebook的maskrcnn-benchmark库的影响很大。(Maskrcnn介绍了改进的变体,ROI Align!)

注意:我使用的是Python 3.7,但是这应该适用于任何Python版本(2.7或以上)。我还使用了PyTorch 1.0,但是PyTorch 0.4的用户应该能够进行一些小的调整。

首先,克隆jwyang的fast -rcnn.pytorch库。然后确保check out出pytorch-1.0分支。这是很重要的!编译步骤在master分支(对于PyTorch 0.4)和PyTorch -1.0分支之间有所不同。

git clone  faster-rcnn.pytorchgit checkout pytorch-1.0

复制自述文件中的说明,使用pip安装requirements ,然后使用Python安装使用setup tools安装和编译:

jwyang/fast -rcnn截图。pytorch-1.0分支上的自述,显示编译指令。

pip install -r requirements.txtcd libpython setup.py build develop

要点:要能够使用ROI-Pool和ROI-Align层,必须在Python环境中安装 requirements.txt。否则会遇到segfault错误。如果使用conda,请确保激活的环境与用于编译库的环境相同。

要确保安装成功,打开Python提示符并键入:

>>> import sys>>> sys.path.append(“/[location_to]/faster-rcnn.pytorch/lib”)>>> from model.roi_layers import ROIPool # PyTorch 1.0 specific!>>> roi_pool = ROIPool((2,2), 1)

[location_to]是fast -rcnn所在的位置。sys.path语句将编译后的库附加到Python的路径中,这样我们就可以导入“ROIPool”。

如果一切顺利,应该不会出现导入错误。如果导入失败,则说明编译出错或路径不正确。

注意:import语句是特定于PyTorch 1.0的。如果你使用PyTorch 0.4,正确的导入语句是:> from model.roipooling.modules import roipool # PyTorch 0.4

基本用法

好!既然我们已经编译了这个库并验证了它是可以工作的,那么我们如何使用在实际项目中使用ROI Pool和ROI Align呢?

用法如下:

如果你已经对如何加载ROI文件以及spatial_scale和sampling_ratio的含义很有信心,那么你就可以往下走了!只是需要注意一下sampling_ratio的值意味着ROI Align将会对每个bin采样sampling_ratio²个点,例如sampling_ratio=2将通过双线性插值对每个bin采样4个点,然后对这些点进行平均。

如果你不知道这些词的意思,那就继续读下去!

细节

首先,如果你还不知道ROI Pool的概念,请阅读教程:()。

ROI Pool 需要 1)图像,2)感兴趣区域(ROI)进行提取。这个图像很简单—就是标准的张量。你的DataLoader的输出生成一个(batch×channel×height×width)形状的张量。但是我们如何来用ROI呢?ROIs长什么样呢?

ROI Data长什么样子?

按照实际标准,ROIs是用第一列中的image-ID进行格式化的。其余四列包含边框左上角和右下角的坐标。

在上面的示例中,对于image-ID 0有两个roi,对于image-ID为1有两个roi。

通常,所有roi都存储在一个csv文件中。我们可以使用pandas将它加载到一个numpy数组中,然后将该数组转换为一个PyTorch张量。最后,创建一个自定义数据集和DataLoader将图像+ roi输入到你的神经网络。

当我们向ROI层提供数据时,输入维度必须如下所示:

ROI维度和图像id的问题

但是,你可能会注意到,dataloader总是为批大小添加额外的维度。例如,如果你的minibatch处理大小为4,那么DataLoader将生成一个 (4×n×5)的ROI张量。但是roipool和roialign 只适用于(n×5)张量。我们该怎么办?

解决方法是用PyTorch的view()函数重新构造ROI张量:

# turn our (batch_size×n×5) ROI into just (n×5)rois = rois.view(-1, 5)

另一个问题是图像id将不会与批处理索引对齐。这是因为数据集中的每个图像id都是惟一的,但是批处理索引是0~batch_size。因此,我们必须手动“重置”图像id:

# reset ROI image-ID to align with the 0-indexed minibatchrois[:, 0] = rois[:, 0] - rois[0, 0]

ROI层初始化参数

我们构建如下所示的ROI层,但是这些参数都是什么意思呢?

# init the layersroi_pool = ROIPool((width, height), spatial_scale)roi_align = ROIAlign((width, height), spatial_scale, sampling_ratio)

让我们从一个典型的CNN开始。下面是VGG16的示意图:

CNN在网络中的传播中可以有效的对图像进行下采样。这个比例因子是空间缩放比例。例如,第4层(28×28)相对于输入(224×224)的空间尺度为28/224=0.125。如果我们要在第4层进行ROI池,我们将向spatial_scale参数传递0.125。

在ROI align中sampling_ratio是什么?为了理解这一点,我们需要了解一下ROI是如何对齐的。()的第3页提供了一个很好的解释。

每个“bin”在ROI Align 层输出大小中的值由双线性插值样本的平均确定。在左边的图像中,每个bin有4个样本(蓝色的点)。

参数sampling_ratio决定采样的“宽度”。例如,如果sampling_ratio=2,采样将有2×2=4个点。(如果你想自己验证这一点,请查看实现的底层C源代码。)

总结

希望现在你已经了解了如何在PyTorch中为你自己的神经网络添加ROI层。我们介绍了如何从jwyang的库中安装ROI实现,如何在代码中使用层和ROI,并解释了初始化参数。如果你有任何问题,请在评论中告诉我。编程快乐!

英文原文:

请长按或扫描二维码关注本公众号

标签: #pythonroi