results = this.predictYolo(mat);
+ mat.release();
+ return results;
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/yolo/YoloInstanceFactory.java b/autojs/src/main/java/com/stardust/autojs/yolo/YoloInstanceFactory.java
new file mode 100644
index 00000000..8d30dd93
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/YoloInstanceFactory.java
@@ -0,0 +1,19 @@
+package com.stardust.autojs.yolo;
+
+/**
+ * yolo实例抽象工厂,用于创建不同类型的yolo实例 目前支持ncnn和onnx的yolov8版本实例
+ *
+ * @param 模型初始化参数
+ * @author TonyJiangWJ
+ * @since 2025/1/5
+ */
+public interface YoloInstanceFactory
{
+ /**
+ * 创建yolo实例
+ *
+ * @param initParams 初始化参数
+ * @return 返回yolo实例
+ */
+ YoloInstance createInstance(P initParams);
+
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/YoloPredictor.java b/autojs/src/main/java/com/stardust/autojs/yolo/YoloPredictor.java
similarity index 83%
rename from autojs/src/main/java/com/stardust/autojs/runtime/api/YoloPredictor.java
rename to autojs/src/main/java/com/stardust/autojs/yolo/YoloPredictor.java
index c4b62723..2e64bc09 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/api/YoloPredictor.java
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/YoloPredictor.java
@@ -1,8 +1,11 @@
-package com.stardust.autojs.runtime.api;
+package com.stardust.autojs.yolo;
import android.util.Log;
import com.stardust.autojs.core.opencv.OpenCVHelper;
+import com.stardust.autojs.yolo.onnx.domain.DetectResult;
+
+import org.opencv.core.Mat;
import java.util.List;
@@ -10,7 +13,7 @@ import java.util.List;
* @author TonyJiangWJ
* @since 2024/6/1
*/
-public class YoloPredictor {
+public abstract class YoloPredictor {
static {
OpenCVHelper.initIfNeeded(null, () -> {
@@ -54,6 +57,8 @@ public class YoloPredictor {
return init;
}
+ public abstract List predictYolo(Mat image) throws Exception;
+
public void release() {
}
diff --git a/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnInitParams.java b/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnInitParams.java
new file mode 100644
index 00000000..4c831d86
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnInitParams.java
@@ -0,0 +1,34 @@
+package com.stardust.autojs.yolo.ncnn;
+
+import com.stardust.autojs.yolo.ModelInitParams;
+
+public class NcnnInitParams extends ModelInitParams {
+ private String paramPath;
+ private String binPath;
+
+ private boolean useGpu;
+
+ public String getParamPath() {
+ return paramPath;
+ }
+
+ public void setParamPath(String paramPath) {
+ this.paramPath = paramPath;
+ }
+
+ public String getBinPath() {
+ return binPath;
+ }
+
+ public void setBinPath(String binPath) {
+ this.binPath = binPath;
+ }
+
+ public boolean isUseGpu() {
+ return useGpu;
+ }
+
+ public void setUseGpu(boolean useGpu) {
+ this.useGpu = useGpu;
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnYoloInstanceFactory.java b/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnYoloInstanceFactory.java
new file mode 100644
index 00000000..26ac9bd0
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnYoloInstanceFactory.java
@@ -0,0 +1,27 @@
+package com.stardust.autojs.yolo.ncnn;
+
+import android.os.Build;
+import android.util.Log;
+
+import com.stardust.autojs.yolo.BaseYoloInstance;
+import com.stardust.autojs.yolo.YoloInstance;
+import com.stardust.autojs.yolo.YoloInstanceFactory;
+
+import androidx.annotation.RequiresApi;
+
+public class NcnnYoloInstanceFactory implements YoloInstanceFactory {
+
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ @Override
+ public YoloInstance createInstance(NcnnInitParams initParams) {
+ NcnnYoloV8Predictor predictor = new NcnnYoloV8Predictor(initParams.getParamPath(),
+ initParams.getBinPath(),
+ initParams.getLabels());
+ predictor.setShapeSize(initParams.getImageSize());
+ predictor.setUseGpu(initParams.isUseGpu());
+ Log.d("NcnnYoloInstanceFactory", "ncnnYoloV8 instance initializer: " + predictor.init());
+ return new BaseYoloInstance(predictor);
+ }
+
+}
+
diff --git a/autojs/src/main/java/com/stardust/autojs/ncnn/NcnnYoloV8Predictor.java b/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnYoloV8Predictor.java
similarity index 97%
rename from autojs/src/main/java/com/stardust/autojs/ncnn/NcnnYoloV8Predictor.java
rename to autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnYoloV8Predictor.java
index 0e4444a9..899fa910 100644
--- a/autojs/src/main/java/com/stardust/autojs/ncnn/NcnnYoloV8Predictor.java
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/ncnn/NcnnYoloV8Predictor.java
@@ -1,16 +1,15 @@
-package com.stardust.autojs.ncnn;
+package com.stardust.autojs.yolo.ncnn;
import android.os.Build;
import android.util.Log;
import com.google.android.gms.common.util.CollectionUtils;
-import com.stardust.autojs.onnx.domain.DetectResult;
-import com.stardust.autojs.runtime.api.YoloPredictor;
-import com.tony.yolov8ncnn.PredictResult;
+import com.stardust.autojs.yolo.YoloPredictor;
+import com.stardust.autojs.yolo.onnx.domain.DetectResult;
import com.tony.yolov8ncnn.NcnnPredictorNative;
+import com.tony.yolov8ncnn.PredictResult;
import org.opencv.core.Mat;
-import org.opencv.imgproc.Imgproc;
import java.util.Collections;
import java.util.List;
@@ -22,6 +21,8 @@ import java.util.stream.Collectors;
import androidx.annotation.RequiresApi;
/**
+ * Ncnn YoloV8推理器
+ *
* @author TonyJiangWJ
* @since 2024/6/1
*/
diff --git a/autojs/src/main/java/com/stardust/autojs/yolo/onnx/OnnxYoloInstanceFactory.java b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/OnnxYoloInstanceFactory.java
new file mode 100644
index 00000000..f854b90e
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/OnnxYoloInstanceFactory.java
@@ -0,0 +1,34 @@
+package com.stardust.autojs.yolo.onnx;
+
+
+import android.os.Build;
+
+import com.stardust.autojs.yolo.BaseYoloInstance;
+import com.stardust.autojs.yolo.ModelInitParams;
+import com.stardust.autojs.yolo.YoloInstance;
+import com.stardust.autojs.yolo.YoloInstanceFactory;
+
+import androidx.annotation.RequiresApi;
+
+/**
+ * OnnxYoloV8实例创建工厂
+ *
+ * @author TonyJiangWJ
+ * @since 2025/1/5
+ */
+public class OnnxYoloInstanceFactory implements YoloInstanceFactory {
+ /**
+ * 创建YoloInstance实例
+ *
+ * @param modelInitParams 初始化参数
+ * @return
+ */
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ @Override
+ public YoloInstance createInstance(ModelInitParams modelInitParams) {
+ OnnxYoloV8Predictor predictor = new OnnxYoloV8Predictor(modelInitParams.getModelPath());
+ predictor.setLabels(modelInitParams.getLabels());
+ predictor.setShapeSize(modelInitParams.getImageSize(), modelInitParams.getImageSize());
+ return new BaseYoloInstance(predictor);
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/yolo/onnx/OnnxYoloV8Predictor.java b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/OnnxYoloV8Predictor.java
new file mode 100644
index 00000000..5daf5741
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/OnnxYoloV8Predictor.java
@@ -0,0 +1,375 @@
+package com.stardust.autojs.yolo.onnx;
+
+import android.os.Build;
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.stardust.autojs.yolo.YoloPredictor;
+import com.stardust.autojs.yolo.onnx.domain.DetectResult;
+import com.stardust.autojs.yolo.onnx.domain.Detection;
+import com.stardust.autojs.yolo.onnx.util.Letterbox;
+
+import org.opencv.core.CvType;
+import org.opencv.core.Mat;
+import org.opencv.core.Size;
+import org.opencv.imgcodecs.Imgcodecs;
+import org.opencv.imgproc.Imgproc;
+
+import java.nio.FloatBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import ai.onnxruntime.OnnxTensor;
+import ai.onnxruntime.OrtEnvironment;
+import ai.onnxruntime.OrtException;
+import ai.onnxruntime.OrtSession;
+import ai.onnxruntime.providers.NNAPIFlags;
+import androidx.annotation.RequiresApi;
+
+/**
+ * @author TonyJiangWJ
+ * @since 2023/8/20
+ * transfer from https://gitee.com/agricultureiot/yolo-onnx-java
+ */
+@RequiresApi(api = Build.VERSION_CODES.N)
+public class OnnxYoloV8Predictor extends YoloPredictor {
+ private static final String TAG = "YoloV8Predictor";
+ private static final Pattern IMG_SIZE_PATTERN = Pattern.compile("\\[(\\d+), \\d+]");
+ private static final Pattern LABEL_PATTERN = Pattern.compile("'([^']*)'");
+
+ private final String modelPath;
+
+ private boolean tryNpu;
+ private Size shapeSize = new Size(640, 640);
+ private Letterbox letterbox;
+
+ private List apiFlags = Arrays.asList("CPU_DISABLED");
+
+ public OnnxYoloV8Predictor(String modelPath) {
+ this.modelPath = modelPath;
+ init = true;
+ }
+
+ public OnnxYoloV8Predictor(String modelPath, float confThreshold, float nmsThreshold) {
+ this.modelPath = modelPath;
+ this.confThreshold = confThreshold;
+ this.nmsThreshold = nmsThreshold;
+ init = true;
+ }
+
+
+ public void setShapeSize(double width, double height) {
+ this.shapeSize = new Size(width, height);
+ }
+
+ public void setTryNpu(boolean tryNpu) {
+ this.tryNpu = tryNpu;
+ }
+
+ public void setApiFlags(List apiFlags) {
+ this.apiFlags = apiFlags;
+ }
+
+ private OrtSession session;
+ private OrtEnvironment environment;
+
+ private void prepareSession() throws OrtException {
+ if (environment != null) {
+ return;
+ }
+ // 加载ONNX模型
+ environment = OrtEnvironment.getEnvironment();
+ OrtSession.SessionOptions sessionOptions = new OrtSession.SessionOptions();
+ addNNApiProvider(sessionOptions);
+
+ session = environment.createSession(modelPath, sessionOptions);
+ // 输出基本信息
+ session.getInputInfo().keySet().forEach(x -> {
+ try {
+ System.out.println("input name = " + x);
+ System.out.println(session.getInputInfo().get(x).getInfo().toString());
+ } catch (OrtException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ // 如果入参labels无效或未定义,使用模型内置labels
+ if (labels == null || labels.size() == 0) {
+ labels = initLabels(session);
+ }
+ initShapeSize(session);
+ }
+
+ private List initLabels(OrtSession session) throws OrtException {
+ String meteStr = session.getMetadata().getCustomMetadata().get("names");
+ if (meteStr == null) {
+ Log.d(TAG, "initLabels: 读取names失败 无法自动修正labels");
+ return Collections.emptyList();
+ }
+ String[] labels = new String[meteStr.split(",").length];
+
+ Matcher matcher = LABEL_PATTERN.matcher(meteStr);
+
+ int h = 0;
+ while (matcher.find()) {
+ labels[h] = matcher.group(1);
+ h++;
+ }
+ return Arrays.asList(labels);
+ }
+
+ private void initShapeSize(OrtSession session) throws OrtException {
+ String meteStr = session.getMetadata().getCustomMetadata().get("imgsz");
+ Log.d(TAG, "initShapeSize: " + meteStr);
+ if (meteStr == null) {
+ Log.d(TAG, "initShapeSize: 读取imgsz失败 无法自动修正输入大小");
+ return;
+ }
+ Matcher matcher = IMG_SIZE_PATTERN.matcher(meteStr);
+ if (matcher.find()) {
+ String shapeSize = matcher.group(1);
+ if (shapeSize == null) {
+ Log.d(TAG, "initShapeSize: 读取imgsz格式异常 无法自动修正输入大小");
+ return;
+ }
+ this.shapeSize = new Size(Double.parseDouble(shapeSize), Double.parseDouble(shapeSize));
+ Log.d(TAG, "set shape size: " + shapeSize);
+ } else {
+ Log.d(TAG, "initShapeSize: 读取imgsz格式异常 无法自动修正输入大小");
+ }
+ }
+
+
+ private void addNNApiProvider(OrtSession.SessionOptions sessionOptions) {
+ if (!tryNpu) {
+ return;
+ }
+ try {
+ List flags = new ArrayList<>();
+ if (apiFlags.contains("USE_FP16")) {
+ flags.add(NNAPIFlags.USE_FP16);
+ }
+ if (apiFlags.contains("USE_NCHW")) {
+ flags.add(NNAPIFlags.USE_NCHW);
+ }
+ if (apiFlags.contains("CPU_ONLY")) {
+ flags.add(NNAPIFlags.CPU_ONLY);
+ }
+ if (apiFlags.contains("CPU_DISABLED")) {
+ flags.add(NNAPIFlags.CPU_DISABLED);
+ }
+ Log.d(TAG, "addNNApiProvider: 当前启用nnapiFlags:" + new Gson().toJson(apiFlags));
+ sessionOptions.addNnapi(EnumSet.copyOf(flags));
+ Log.d(TAG, "prepareSession: 启用nnapi成功");
+ } catch (Exception e) {
+ Log.e(TAG, "prepareSession: 无法启用nnapi");
+ }
+ }
+
+ private HashMap preprocessImage(Mat img) throws OrtException {
+
+ // 读取 image
+ Mat image = img.clone();
+ // 将四通道转换为三通道
+ if (image.channels() == 4) {
+ Imgproc.cvtColor(image, image, Imgproc.COLOR_RGBA2RGB);
+ }
+ Log.d(TAG, "preprocessImage: image's channels: " + image.channels());
+ // 更改 image 尺寸
+ letterbox = new Letterbox();
+ letterbox.setNewShape(this.shapeSize);
+ image = letterbox.letterbox(image);
+
+ int rows = letterbox.getHeight();
+ int cols = letterbox.getWidth();
+ int channels = image.channels();
+ // 转换Mat对象的数据类型为CV_64F,即64位浮点型
+ Mat convertedImage = new Mat();
+ image.convertTo(convertedImage, CvType.CV_64F);
+
+ // 获取整个像素数据
+ double[] pixelData = new double[rows * cols * channels];
+ convertedImage.get(0, 0, pixelData);
+
+ float[] pixels = new float[channels * rows * cols];
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ for (int k = 0; k < channels; k++) {
+ // 这样设置相当于同时做了image.transpose((2, 0, 1))操作
+ // 重新组织内存访问模式,提高缓存效率
+ pixels[k * rows * cols + i * cols + j] = (float) (pixelData[(i * cols + j) * channels + k] / 255.0);
+ }
+ }
+ }
+ image.release();
+ convertedImage.release();
+ // 创建OnnxTensor对象
+ long[] shape = {1L, (long) channels, (long) rows, (long) cols};
+ OnnxTensor tensor = OnnxTensor.createTensor(environment, FloatBuffer.wrap(pixels), shape);
+ HashMap stringOnnxTensorHashMap = new HashMap<>();
+ stringOnnxTensorHashMap.put(session.getInputInfo().keySet().iterator().next(), tensor);
+ return stringOnnxTensorHashMap;
+ }
+
+ private List postProcessOutput(OrtSession.Result output) throws OrtException {
+ float[][] outputData = ((float[][][]) output.get(0).getValue())[0];
+
+ outputData = transposeMatrix(outputData);
+ Map> class2Bbox = new HashMap<>();
+
+ for (float[] bbox : outputData) {
+ int label = argmax(bbox, 4); // 直接在原数组上进行操作
+ float conf = bbox[label + 4];
+ if (conf < confThreshold) {
+ continue;
+ }
+
+ bbox[4] = conf;
+
+ // xywh to (x1, y1, x2, y2)
+ xywh2xyxy(bbox);
+
+ // skip invalid predictions
+ if (bbox[0] >= bbox[2] || bbox[1] >= bbox[3]) {
+ continue;
+ }
+
+ class2Bbox.computeIfAbsent(label, k -> new ArrayList<>()).add(bbox);
+ }
+
+ List detections = new ArrayList<>();
+ for (Map.Entry> entry : class2Bbox.entrySet()) {
+ int label = entry.getKey();
+ List bboxes = entry.getValue();
+ bboxes = nonMaxSuppression(bboxes, nmsThreshold);
+ for (float[] bbox : bboxes) {
+ String labelString = "";
+ if (labels.size() - 1 < label) {
+ labelString = String.valueOf(label);
+ } else {
+ labelString = labels.get(label);
+ }
+ detections.add(new Detection(labelString, entry.getKey(), Arrays.copyOfRange(bbox, 0, 4), bbox[4]));
+ }
+ }
+ return detections;
+ }
+
+ public List predictYolo(String imagePath) throws OrtException {
+ return predictYolo(Imgcodecs.imread(imagePath));
+ }
+
+ public List predictYolo(Mat image) throws OrtException {
+ prepareSession();
+ long start_time = System.currentTimeMillis();
+ Map inputMap = preprocessImage(image);
+ // 运行推理
+ try (OrtSession.Result output = session.run(inputMap)) {
+ Log.d(TAG, "predictYolo: onnx run cost " + (System.currentTimeMillis() - start_time) + "ms");
+ List detections = postProcessOutput(output);
+ Log.d("YoloV8Predictor", String.format("onnx predict cost: %d ms", (System.currentTimeMillis() - start_time)));
+ return detections.stream().map(detection -> new DetectResult(detection, letterbox))
+ .collect(Collectors.toList());
+ } finally {
+ // 释放资源
+ inputMap.values().forEach(OnnxTensor::close);
+ }
+ }
+
+ public static void xywh2xyxy(float[] bbox) {
+ float x = bbox[0];
+ float y = bbox[1];
+ float w = bbox[2];
+ float h = bbox[3];
+
+ bbox[0] = x - w * 0.5f;
+ bbox[1] = y - h * 0.5f;
+ bbox[2] = x + w * 0.5f;
+ bbox[3] = y + h * 0.5f;
+ }
+
+ public static float[][] transposeMatrix(float[][] m) {
+ float[][] temp = new float[m[0].length][m.length];
+ for (int i = 0; i < m.length; i++) {
+ for (int j = 0; j < m[0].length; j++) {
+ temp[j][i] = m[i][j];
+ }
+ }
+ return temp;
+ }
+
+ public static List nonMaxSuppression(List bboxes, float iouThreshold) {
+ long start = System.currentTimeMillis();
+ List bestBboxes = new ArrayList<>();
+
+ bboxes.sort(Comparator.comparing(a -> a[4]));
+
+ while (!bboxes.isEmpty()) {
+ float[] bestBbox = bboxes.remove(bboxes.size() - 1);
+ bestBboxes.add(bestBbox);
+ bboxes.removeIf(bbox -> computeIOU(bbox, bestBbox) >= iouThreshold);
+ }
+ Log.d(TAG, "nonMaxSuppression: cost " + (System.currentTimeMillis() - start) + "ms");
+ return bestBboxes;
+ }
+
+ public static float computeIOU(float[] box1, float[] box2) {
+
+ float area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]);
+ float area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]);
+
+ float left = Math.max(box1[0], box2[0]);
+ float top = Math.max(box1[1], box2[1]);
+ float right = Math.min(box1[2], box2[2]);
+ float bottom = Math.min(box1[3], box2[3]);
+
+ // 计算交集区域的宽度和高度
+ float width = Math.max(right - left, 0);
+ float height = Math.max(bottom - top, 0);
+
+ // 计算交集面积和并集面积
+ float interArea = width * height;
+ float unionArea = area1 + area2 - interArea;
+
+ // 计算交并比
+ return Math.max(interArea / unionArea, 1e-8f);
+ }
+
+
+ //返回最大值的索引
+ // 优化后的 argmax 函数
+ public static int argmax(float[] a, int start) {
+ float re = -Float.MAX_VALUE;
+ int arg = -1;
+ for (int i = start; i < a.length; i++) {
+ if (a[i] >= re) {
+ re = a[i];
+ arg = i - start;
+ }
+ }
+ return arg;
+ }
+
+ @Override
+ public void release() {
+ this.init = false;
+ if (session != null) {
+ try {
+ session.close();
+ session = null;
+ } catch (OrtException e) {
+ Log.e(TAG, "close session failed" + e);
+ }
+ environment.close();
+ environment = null;
+ }
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/onnx/domain/DetectResult.java b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/domain/DetectResult.java
similarity index 91%
rename from autojs/src/main/java/com/stardust/autojs/onnx/domain/DetectResult.java
rename to autojs/src/main/java/com/stardust/autojs/yolo/onnx/domain/DetectResult.java
index b34e44af..c568fbe4 100644
--- a/autojs/src/main/java/com/stardust/autojs/onnx/domain/DetectResult.java
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/domain/DetectResult.java
@@ -1,12 +1,13 @@
-package com.stardust.autojs.onnx.domain;
+package com.stardust.autojs.yolo.onnx.domain;
import android.graphics.Rect;
-import com.stardust.autojs.onnx.util.Letterbox;
+
+import com.stardust.autojs.yolo.onnx.util.Letterbox;
/**
* @author TonyJiangWJ
* @since 2023/8/20
- * transfer from https://gitee.com/agricultureiot/yolo-onnx-java
+ * transfer from yolo-onnx-java
*/
public class DetectResult {
diff --git a/autojs/src/main/java/com/stardust/autojs/onnx/domain/Detection.java b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/domain/Detection.java
similarity index 65%
rename from autojs/src/main/java/com/stardust/autojs/onnx/domain/Detection.java
rename to autojs/src/main/java/com/stardust/autojs/yolo/onnx/domain/Detection.java
index 72842c7c..0ca537f4 100644
--- a/autojs/src/main/java/com/stardust/autojs/onnx/domain/Detection.java
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/domain/Detection.java
@@ -1,4 +1,4 @@
-package com.stardust.autojs.onnx.domain;
+package com.stardust.autojs.yolo.onnx.domain;
/**
* @author TonyJiangWJ
@@ -15,14 +15,14 @@ public class Detection {
public float confidence;
- public Detection(String label,Integer clsId, float[] bbox, float confidence){
+ public Detection(String label, Integer clsId, float[] bbox, float confidence) {
this.clsId = clsId;
this.label = label;
this.bbox = bbox;
this.confidence = confidence;
}
- public Detection(){
+ public Detection() {
}
@@ -52,12 +52,12 @@ public class Detection {
@Override
public String toString() {
- return " label="+label +
- " \t clsId="+clsId +
- " \t x0="+bbox[0] +
- " \t y0="+bbox[1] +
- " \t x1="+bbox[2] +
- " \t y1="+bbox[3] +
- " \t score="+confidence;
+ return " label=" + label +
+ " \t clsId=" + clsId +
+ " \t x0=" + bbox[0] +
+ " \t y0=" + bbox[1] +
+ " \t x1=" + bbox[2] +
+ " \t y1=" + bbox[3] +
+ " \t score=" + confidence;
}
}
diff --git a/autojs/src/main/java/com/stardust/autojs/onnx/util/Letterbox.java b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/util/Letterbox.java
similarity index 94%
rename from autojs/src/main/java/com/stardust/autojs/onnx/util/Letterbox.java
rename to autojs/src/main/java/com/stardust/autojs/yolo/onnx/util/Letterbox.java
index 98fc6855..44123979 100644
--- a/autojs/src/main/java/com/stardust/autojs/onnx/util/Letterbox.java
+++ b/autojs/src/main/java/com/stardust/autojs/yolo/onnx/util/Letterbox.java
@@ -1,4 +1,4 @@
-package com.stardust.autojs.onnx.util;
+package com.stardust.autojs.yolo.onnx.util;
import org.opencv.core.Core;
import org.opencv.core.Mat;
@@ -8,7 +8,7 @@ import org.opencv.imgproc.Imgproc;
/**
* @author TonyJiangWJ
* @since 2023/8/20
- * transfer from https://gitee.com/agricultureiot/yolo-onnx-java
+ * transfer from yolo-onnx-java
*/
public class Letterbox {