From 2c8c05dedf5575599df45d77dfdbdb0650872b00 Mon Sep 17 00:00:00 2001
From: JoeAllen <2494136784@qq.com>
Date: Fri, 29 Jul 2022 09:13:20 +0800
Subject: [PATCH] =?UTF-8?q?JavaJDK1.8=E9=80=82=E9=85=8D=20=20=E5=AE=8C?=
=?UTF-8?q?=E6=88=90=E4=BB=8E=E6=91=84=E5=83=8F=E5=A4=B4=E4=B8=AD=E6=A3=80?=
=?UTF-8?q?=E6=B5=8B=E5=8A=A8=E7=89=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: JoeAllen <2494136784@qq.com>
---
pom.xml | 7 +-
src/main/java/cn/heavenlybook/Main.java | 111 ++----------------
.../utils/AnimalsClassification.java | 36 +++---
.../utils/LightAnimalsClassification.java | 6 +-
.../java/{ => cn/heavenlybook}/Tests.java | 2 +
5 files changed, 36 insertions(+), 126 deletions(-)
rename src/test/java/{ => cn/heavenlybook}/Tests.java (84%)
diff --git a/pom.xml b/pom.xml
index 0a06818..97e4b20 100644
--- a/pom.xml
+++ b/pom.xml
@@ -100,13 +100,8 @@
org.testng
testng
- 7.6.0
+ 7.5
test
-
- org.slf4j
- slf4j-nop
- 1.7.25
-
\ No newline at end of file
diff --git a/src/main/java/cn/heavenlybook/Main.java b/src/main/java/cn/heavenlybook/Main.java
index 169c29a..6fd5a17 100644
--- a/src/main/java/cn/heavenlybook/Main.java
+++ b/src/main/java/cn/heavenlybook/Main.java
@@ -1,36 +1,20 @@
package cn.heavenlybook;
import ai.djl.ModelException;
-import ai.djl.inference.Predictor;
import ai.djl.modality.Classifications;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
-import ai.djl.modality.cv.output.BoundingBox;
-import ai.djl.modality.cv.output.DetectedObjects;
-import ai.djl.modality.cv.output.Rectangle;
-import ai.djl.repository.zoo.Criteria;
-import ai.djl.repository.zoo.ModelZoo;
-import ai.djl.repository.zoo.ZooModel;
import ai.djl.translate.TranslateException;
import cn.heavenlybook.utils.AnimalsClassification;
-import cn.heavenlybook.utils.FaceDetection;
import cn.heavenlybook.utils.OpenCVImageUtil;
import lombok.extern.java.Log;
-import org.bytedeco.javacv.CanvasFrame;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.opencv.opencv_core.Mat;
-import org.bytedeco.opencv.opencv_core.Point;
-import org.bytedeco.opencv.opencv_core.Rect;
-import org.bytedeco.opencv.opencv_core.Scalar;
-import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
-import java.util.List;
-
-import static org.bytedeco.opencv.global.opencv_imgproc.*;
/**
* @author ht
@@ -38,97 +22,22 @@ import static org.bytedeco.opencv.global.opencv_imgproc.*;
@Log
public class Main {
public static void main(String[] args) throws IOException, ModelException, TranslateException {
- float shrink = 0.5f;
- float threshold = 0.7f;
-
- Criteria criteria = new FaceDetection().criteria(shrink, threshold);
-
// 开启摄像头,获取图像(得到的图像为frame类型,需要转换为mat类型进行检测和识别)
OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
-
grabber.start();
-
// Frame与Mat转换
OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
- // 新建一个预览窗口
- CanvasFrame canvas = new CanvasFrame("人脸检测");
- canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- canvas.setVisible(true);
- canvas.setFocusable(true);
- // 窗口置顶
- if (canvas.isAlwaysOnTopSupported()) {
- canvas.setAlwaysOnTop(true);
- }
Frame frame;
-
- try (ZooModel model = ModelZoo.loadModel(criteria);
- Predictor predictor = model.newPredictor()) {
- // 获取图像帧
- while (canvas.isVisible() && (frame = grabber.grab()) != null) {
-
- // 将获取的frame转化成mat数据类型
- Mat img = converter.convert(frame);
- BufferedImage buffImg = OpenCVImageUtil.mat2BufferedImage(img);
-
- Image image = ImageFactory.getInstance().fromImage(buffImg);
-
- // region 动物识别
- Classifications classifications = AnimalsClassification.predict(image);
-
- Classifications.Classification bestItem = classifications.best();
- System.out.println(bestItem.getClassName() + " : " + bestItem.getProbability());
- // List items = classifications.items();
- // List names = new ArrayList<>();
- // List probs = new ArrayList<>();
- // for (int i = 0; i < items.size(); i++) {
- // Classifications.Classification item = items.get(i);
- // names.add(item.getClassName());
- // probs.add(item.getProbability());
- // }
-
- log.info(classifications.toJson());
- // endregion
-
- int imageWidth = image.getWidth();
- int imageHeight = image.getHeight();
-
- DetectedObjects detections = predictor.predict(image);
- List items = detections.items();
-
- // 遍历人脸
- for (DetectedObjects.DetectedObject item : items) {
- BoundingBox box = item.getBoundingBox();
- Rectangle rectangle = box.getBounds();
- int x = (int) (rectangle.getX() * imageWidth);
- int y = (int) (rectangle.getY() * imageHeight);
- Rect face =
- new Rect(
- x,
- y,
- (int) (rectangle.getWidth() * imageWidth),
- (int) (rectangle.getHeight() * imageHeight));
-
- // 绘制人脸矩形区域,scalar色彩顺序:BGR(蓝绿红)
- rectangle(img, face, new Scalar(0, 0, 255, 1));
-
- int posX = Math.max(face.tl().x() - 10, 0);
- int posY = Math.max(face.tl().y() - 10, 0);
- // 在人脸矩形上面绘制文字
- putText(
- img,
- "Face",
- new Point(posX, posY),
- FONT_HERSHEY_COMPLEX,
- 1.0,
- new Scalar(0, 0, 255, 2.0));
- }
-
- // 显示视频图像
- canvas.showImage(frame);
- }
+ // 获取图像帧
+ while ((frame = grabber.grab()) != null) {
+ // 将获取的frame转化成mat数据类型
+ Mat img = converter.convert(frame);
+ BufferedImage buffImg = OpenCVImageUtil.mat2BufferedImage(img);
+ Image image = ImageFactory.getInstance().fromImage(buffImg);
+ Classifications classifications = AnimalsClassification.predict(image);
+ Classifications.Classification bestItem = classifications.best();
+ log.info(bestItem.getClassName() + " : " + bestItem.getProbability());
+ log.info(classifications.toJson());
}
-
- canvas.dispose();
- grabber.close();
}
}
diff --git a/src/main/java/cn/heavenlybook/utils/AnimalsClassification.java b/src/main/java/cn/heavenlybook/utils/AnimalsClassification.java
index 37d2740..2428630 100644
--- a/src/main/java/cn/heavenlybook/utils/AnimalsClassification.java
+++ b/src/main/java/cn/heavenlybook/utils/AnimalsClassification.java
@@ -59,25 +59,27 @@ public final class AnimalsClassification {
return new Classifications(names, probs);
}
+ static Criteria criteria;
+ static ZooModel rotateModel;
+ static Predictor classifier;
+
public static Classifications classfier(Image img)
throws IOException, ModelException, TranslateException {
- Criteria criteria =
- Criteria.builder()
- .optEngine("PaddlePaddle")
- .setTypes(Image.class, Classifications.class)
- .optModelUrls("https://aias-home.oss-cn-beijing.aliyuncs.com/models/animals.zip")
- // .optModelUrls("/Users/calvin/model/animals/")
- .optModelName("inference")
- .optTranslator(new AnimalTranslator())
- .optProgress(new ProgressBar())
- .build();
-
- try (ZooModel rotateModel = ModelZoo.loadModel(criteria)) {
- try (Predictor classifier = rotateModel.newPredictor()) {
- Classifications classifications = classifier.predict(img);
- return classifications;
- }
- }
+ criteria =
+ criteria == null
+ ? Criteria.builder()
+ .optEngine("PaddlePaddle")
+ .setTypes(Image.class, Classifications.class)
+ .optModelUrls("https://aias-home.oss-cn-beijing.aliyuncs.com/models/animals.zip")
+ // .optModelUrls("/Users/calvin/model/animals/")
+ .optModelName("inference")
+ .optTranslator(new AnimalTranslator())
+ .optProgress(new ProgressBar())
+ .build()
+ : criteria;
+ rotateModel = rotateModel == null ? ModelZoo.loadModel(criteria) : rotateModel;
+ classifier = classifier == null ? rotateModel.newPredictor() : classifier;
+ return classifier.predict(img);
}
}
diff --git a/src/main/java/cn/heavenlybook/utils/LightAnimalsClassification.java b/src/main/java/cn/heavenlybook/utils/LightAnimalsClassification.java
index aa6e7a4..5171bb8 100644
--- a/src/main/java/cn/heavenlybook/utils/LightAnimalsClassification.java
+++ b/src/main/java/cn/heavenlybook/utils/LightAnimalsClassification.java
@@ -37,7 +37,9 @@ public final class LightAnimalsClassification {
Classifications.Classification item = items.get(i);
double prob = item.getProbability();
probArr[i] = prob;
- if (prob > max) max = prob;
+ if (prob > max) {
+ max = prob;
+ }
}
for (int i = 0; i < items.size(); i++) {
@@ -69,7 +71,7 @@ public final class LightAnimalsClassification {
.optProgress(new ProgressBar())
.build();
- try (ZooModel rotateModel = ModelZoo.loadModel(criteria)) {
+ try (ZooModel rotateModel = ModelZoo.loadModel(criteria)) {
try (Predictor classifier = rotateModel.newPredictor()) {
Classifications classifications = classifier.predict(img);
return classifications;
diff --git a/src/test/java/Tests.java b/src/test/java/cn/heavenlybook/Tests.java
similarity index 84%
rename from src/test/java/Tests.java
rename to src/test/java/cn/heavenlybook/Tests.java
index 3177cee..1ad4918 100644
--- a/src/test/java/Tests.java
+++ b/src/test/java/cn/heavenlybook/Tests.java
@@ -1,3 +1,5 @@
+package cn.heavenlybook;
+
import org.testng.annotations.Test;
/**