Add File
This commit is contained in:
118
src/main/java/org/dromara/easyai/tools/NMS.java
Normal file
118
src/main/java/org/dromara/easyai/tools/NMS.java
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
package org.dromara.easyai.tools;
|
||||||
|
|
||||||
|
import org.dromara.easyai.entity.Box;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param
|
||||||
|
* @DATA
|
||||||
|
* @Author LiDaPeng
|
||||||
|
* @Description
|
||||||
|
*/
|
||||||
|
public class NMS {
|
||||||
|
private final float iouTh;//iou阈值
|
||||||
|
|
||||||
|
public NMS(float iouTh) {
|
||||||
|
this.iouTh = iouTh;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Box> start(List<Box> pixelPositions) {
|
||||||
|
//先进行排序
|
||||||
|
if (pixelPositions.isEmpty()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<Box> pixels = new ArrayList<>();
|
||||||
|
ConfidenceSort2 confidenceSort = new ConfidenceSort2();
|
||||||
|
pixelPositions.sort(confidenceSort);
|
||||||
|
screen(pixelPositions, pixels);
|
||||||
|
return pixels;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getSRatio(Box box1, Box box2, boolean first) {
|
||||||
|
IouMessage iouMessage = getMyIou(box1, box2);
|
||||||
|
if (first) {
|
||||||
|
return iouMessage.intersectS / iouMessage.s1;
|
||||||
|
}
|
||||||
|
return iouMessage.intersectS / iouMessage.s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IouMessage getMyIou(Box box1, Box box2) {
|
||||||
|
int minX1 = box1.getX();
|
||||||
|
int minY1 = box1.getY();
|
||||||
|
int maxX1 = minX1 + box1.getxSize();
|
||||||
|
int maxY1 = minY1 + box1.getySize();
|
||||||
|
float s1 = box1.getxSize() * box1.getySize();
|
||||||
|
int minX2 = box2.getX();
|
||||||
|
int minY2 = box2.getY();
|
||||||
|
int maxX2 = minX2 + box2.getxSize();
|
||||||
|
int maxY2 = minY2 + box2.getySize();
|
||||||
|
float s2 = box2.getxSize() * box2.getySize();
|
||||||
|
float[] row = new float[]{minX1, maxX1, minX2, maxX2};
|
||||||
|
float[] col = new float[]{minY1, maxY1, minY2, maxY2};
|
||||||
|
Arrays.sort(row);
|
||||||
|
Arrays.sort(col);
|
||||||
|
float rowSub = row[3] - row[0];
|
||||||
|
float colSub = col[3] - col[0];
|
||||||
|
float width = box1.getySize() + box2.getySize();
|
||||||
|
float height = box1.getxSize() + box2.getxSize();
|
||||||
|
float widthSub = width - colSub;
|
||||||
|
float heightSub = height - rowSub;
|
||||||
|
if (widthSub < 0) {
|
||||||
|
widthSub = 0;
|
||||||
|
}
|
||||||
|
if (heightSub < 0) {
|
||||||
|
heightSub = 0;
|
||||||
|
}
|
||||||
|
IouMessage iouMessage = new IouMessage();
|
||||||
|
iouMessage.intersectS = widthSub * heightSub;
|
||||||
|
iouMessage.s1 = s1;
|
||||||
|
iouMessage.s2 = s2;
|
||||||
|
return iouMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isOne(Box box1, Box box2, float iouTh) {
|
||||||
|
boolean isOne = false;
|
||||||
|
IouMessage iouMessage = getMyIou(box1, box2);
|
||||||
|
float mergeS = iouMessage.s1 + iouMessage.s2 - iouMessage.intersectS;
|
||||||
|
float iou = iouMessage.intersectS / mergeS;
|
||||||
|
if (iou > iouTh) {
|
||||||
|
isOne = true;
|
||||||
|
}
|
||||||
|
return isOne;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void screen(List<Box> pixelPositions, List<Box> boxes) {
|
||||||
|
do {
|
||||||
|
Box maxPixelPosition = pixelPositions.get(0);
|
||||||
|
boxes.add(maxPixelPosition);
|
||||||
|
pixelPositions.remove(0);
|
||||||
|
for (int i = 0; i < pixelPositions.size(); i++) {
|
||||||
|
Box box = pixelPositions.get(i);
|
||||||
|
if (isOne(maxPixelPosition, box, iouTh)) {//要移除
|
||||||
|
pixelPositions.remove(i);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (pixelPositions.size() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ConfidenceSort2 implements Comparator<Box> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(Box o1, Box o2) {
|
||||||
|
if (o1.getConfidence() > o2.getConfidence()) {
|
||||||
|
return -1;
|
||||||
|
} else if (o1.getConfidence() < o2.getConfidence()) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class IouMessage {
|
||||||
|
float intersectS;
|
||||||
|
float s1;
|
||||||
|
float s2;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user