Skip to content

Commit

Permalink
fix getIOU bug (#2674)
Browse files Browse the repository at this point in the history
* fix getIOU bug

* refactor Rectangle

---------

Co-authored-by: Frank Liu <frankfliu2000@gmail.com>
  • Loading branch information
lanking520 and frankfliu committed Jul 3, 2023
1 parent 326f176 commit 1e57ad2
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public interface BoundingBox extends Serializable {
Point getPoint();

/**
* Gets the Intersection over Union (IoU) value between bounding boxes.
* Returns the Intersection over Union (IoU) value between bounding boxes.
*
* <p>Also known as <a href="https://en.wikipedia.org/wiki/Jaccard_index">Jaccard index</a>
*
Expand Down
29 changes: 20 additions & 9 deletions api/src/main/java/ai/djl/modality/cv/output/Rectangle.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,15 +86,26 @@ public Point getPoint() {
/** {@inheritDoc} */
@Override
public double getIoU(BoundingBox box) {
Rectangle rec = (Rectangle) box;
// caculate intesection lrtb
double left = Math.max(getX(), rec.getX());
double top = Math.max(getY(), rec.getY());
double right = Math.min(getX() + getWidth(), rec.getX() + rec.getWidth());
double bottom = Math.min(getY() + getHeight(), rec.getY() + rec.getHeight());
double intersection = (right - left) * (bottom - top);
return intersection
/ (getWidth() * getHeight() + rec.getWidth() * rec.getHeight() - intersection);
Rectangle rect = box.getBounds();

// computing area of each rectangles
double s1 = (width + 1) * (height + 1);
double s2 = (rect.getWidth() + 1) * (rect.getHeight() + 1);
double sumArea = s1 + s2;

// find each edge of intersect rectangle
double left = Math.max(getX(), rect.getX());
double top = Math.max(getY(), rect.getY());
double right = Math.min(getX() + getWidth(), rect.getX() + rect.getWidth());
double bottom = Math.min(getY() + getHeight(), rect.getY() + rect.getHeight());

// judge if there is a intersect
if (left > right || top > bottom) {
return 0.0;
}

double intersect = (right - left + 1) * (bottom - top + 1);
return intersect / (sumArea - intersect);
}

/**
Expand Down
31 changes: 31 additions & 0 deletions api/src/test/java/ai/djl/modality/cv/output/RectangleTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
* with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
package ai.djl.modality.cv.output;

import org.testng.Assert;
import org.testng.annotations.Test;

public class RectangleTest {

@Test
public void testIoU() {
BoundingBox box = new Rectangle(1, 3, 4, 5);
Rectangle rect = new Rectangle(1, 2, 3, 4);
double iou = box.getIoU(rect);
Assert.assertEquals(iou, 0.47058823529411764, 0.00001);

rect = new Rectangle(6, 2, 3, 4);
iou = box.getIoU(rect);
Assert.assertEquals(iou, 0);
}
}
14 changes: 14 additions & 0 deletions api/src/test/java/ai/djl/modality/cv/output/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
* with the License. A copy of the License is located at
*
* http://aws.amazon.com/apache2.0/
*
* or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
* and limitations under the License.
*/
/** Contains tests for {@link ai.djl.modality.cv.output}. */
package ai.djl.modality.cv.output;

0 comments on commit 1e57ad2

Please sign in to comment.