介绍
https://github.com/lilanxiao/Rotated_IoU
该报告是用于2D / 3D对象检测的IoU损失的非官方实现。 它包含Pytorch函数,该函数使用GPU计算定向矩形的相交面积。
注意
CUDA扩展最近进行了修改,以涵盖一些极端情况。 请考虑更新代码并重新编译扩展。
检查清单
pytorch函数查找定向矩形的交点
pytorch函数检查一个矩形的角是否位于另一个矩形中
CUDA扩展为两个矩形的相交多边形的逆时针排序顶点
Pytorch函数使用上述函数计算矩形的面积相交
测试用例
旋转的2d / 3d GIoU和DIoU损失
演示以验证反向传播
验证对象检测中的2d / 3d IoU丢失
要求
代码已在Ubuntu 18.04上进行了测试。 需要以下依赖
cudatoolkit=10.2
pytorch=1.5 # newer version should work as well
numpy
matplotlib
argparse
用法
首先,编译CUDA扩展。
cd cuda_op
python setup.py install
然后,运行演示以验证Pytorch功能和CUDA扩展。
cd ..
python demo.py
该演示训练了一个网络,该网络使用N组box角,并预测每个旋转盒子的x,y,w,h和角度
。 为了进行反向传播,将预测的box参数和GT转换为box角的坐标。 交叉区域IOU是使用具有CUDA扩展名的Pytorch函数计算的。 然后,可以计算出GIoU Loss
或DIoU Loss
。 该演示首先生成数据,然后进行训练
。
您应该会看到一些类似以下的信息:
... generating 819200 boxes, please wait...
... generating 81920 boxes, please wait...
data saved in: ./data
[Epoch 1: 10/200] train loss: 0.6721 mean_iou: 0.3703
[Epoch 1: 20/200] train loss: 0.4931 mean_iou: 0.5211
[Epoch 1: 30/200] train loss: 0.4532 mean_iou: 0.5546
[Epoch 1: 40/200] train loss: 0.4249 mean_iou: 0.5805
[Epoch 1: 50/200] train loss: 0.4361 mean_iou: 0.5713
[Epoch 1: 60/200] train loss: 0.4148 mean_iou: 0.5910
[Epoch 1: 70/200] train loss: 0.4272 mean_iou: 0.5803
[Epoch 1: 80/200] train loss: 0.4283 mean_iou: 0.5801
[Epoch 1: 90/200] train loss: 0.4203 mean_iou: 0.5879
请注意,train loss
下降,mean_iou
增大,这表明函数是可微的。
GIoU和DIoU
此存储库为旋转的边界框实现了GIoU Loss
和DIoU Loss
。 在演示中,可以选择它们
python demo.py --loss giou
python demo.py --loss diou # [default]
这两种损失都需要两个box中最小的一个box。注意:有不同的选择来确定封闭box。
- 轴对齐框:封闭框是轴对齐的。这个版本简单快速,但理论上不是最优的。
- 旋转框(近似):封闭框也会旋转。利用主成分分析法PCA估计旋转包围box的大小。计算比较简单,但结果不准确。在演示中,这个方法似乎很有效。
- 旋转框(精确):实际最小的包围框。由于采用了残酷的力搜索来获得最小包围盒,计算量大。
三种类型的封闭box可通过以下方式选择:
python demo.py --enclosing aligned # simple and naive. bad performance.
python demo.py --enclosing pca # approximated smallest box. slightly worse performance.
python demo.py --enclosing smallest # [default]. smallest box. best performance.
致谢
本文启发了计算相交面积的想法:
@INPROCEEDINGS{8886046,
author={D. {Zhou} and J. {Fang} and X. {Song} and C. {Guan} and J. {Yin} and Y. {Dai} and R. {Yang}},
booktitle={2019 International Conference on 3D Vision (3DV)},
title={IoU Loss for 2D/3D Object Detection},
year={2019},
pages={85-94},}
CUDA扩展的一些代码从以下位置进行了修改:
@article{pytorchpointnet++,
Author = {Erik Wijmans},
Title = {Pointnet++ Pytorch},
Journal = {https://github.com/erikwijmans/Pointnet2_PyTorch},
Year = {2018}
}