`box_iou` doesn't work with degenerated boxes
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 17.9k
- Forks
- 7.3k
- Avg merge
- 1d 15h
- Merged PRs (30d)
- 13
Description
🐛 Bug
torchvision.ops.boxes.box_iou works only if (x1,y1) < (x2,y2) and calculates zero IoU otherwise
To Reproduce
Steps to reproduce the behavior:
- Consider a hypothetical bbox array:
hboxes = torch.arange(5,5*25,5).view(-1,4).float(); hboxes
tensor([[ 5., 10., 15., 20.],
[ 25., 30., 35., 40.],
[ 45., 50., 55., 60.],
[ 65., 70., 75., 80.],
[ 85., 90., 95., 100.],
[105., 110., 115., 120.]])
As all the (x1,y1) are less than (x2,y2) in this case, the box_iou output with itself is a perfect identity matrix
from torchvision.ops.boxes import box_iou
box_iou(hboxes,hboxes)
tensor([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.]])
- However, if the said condition doesn't hold (x1y1 > x2y2)
hboxes[[2,4],:] = torch.cat([hboxes[[2,4],2:],hboxes[[2,4],:2]],dim=1); hboxes
tensor([[ 5., 10., 15., 20.],
[ 25., 30., 35., 40.],
[ 55., 60., 45., 50.],
[ 65., 70., 75., 80.],
[ 95., 100., 85., 90.],
[105., 110., 115., 120.]])
like the row 2nd and 4th in this case
The box_iou output is 0
box_iou(hboxes,hboxes)
tensor([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1.]])
Expected behavior
The coordinates should be handled beforehand and output for the 2nd case mentioned above should also be an Identity Matrix
Environment
PyTorch version: 1.6.0
Is debug build: No
CUDA used to build PyTorch: 10.2
OS: Manjaro Linux
GCC version: (GCC) 10.1.0
Clang version: Could not collect
CMake version: version 3.17.3
Python version: 3.8 (64-bit runtime)
Is CUDA available: Yes
CUDA runtime version: Could not collect
GPU models and configuration: GPU 0: GeForce 940MX
Nvidia driver version: 440.100
cuDNN version: Could not collect
Versions of relevant libraries:
[pip3] numpy==1.19.1
[pip3] pytorch-lightning==0.7.6
[pip3] torch==1.6.0
[pip3] torchvision==0.7.0
[conda] blas 1.0 mkl
[conda] cudatoolkit 10.2.89 hfd86e86_1
[conda] mkl 2020.1 217
[conda] mkl-service 2.3.0 py38he904b0f_0
[conda] mkl_fft 1.1.0 py38h23d657b_0
[conda] mkl_random 1.1.1 py38h0573a6f_0
[conda] numpy 1.19.1 py38hbc911f0_0
[conda] numpy-base 1.19.1 py38hfa32c7d_0
[conda] pytorch 1.6.0 py3.8_cuda10.2.89_cudnn7.6.5_0 pytorch
[conda] pytorch-lightning 0.7.6 pypi_0 pypi
[conda] torchvision 0.7.0 py38_cu102 pytorch
Willing to work
I'd be glad to fix this behaviour 🙂
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in torchvision/ops/boxes.py at box_iou and reproduce the provided Python examples with valid and degenerate boxes. Determine how degenerate coordinates should be handled, then add coverage for both cases and verify that self-comparison produces the expected identity values.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- computer-vision
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100