java通过opencv运行yolo4

简介: java通过opencv运行yolo4

获取yolo4的模型文件



yolov4.cfg
yolov4.weights
coco.names
复制代码


示例


public static void testYOLO(Mat image) throws IOException {
String config = "E:/opencv4.4.0/age-and-gender-classification/yolo/yolov4.cfg";
String weights = "E:/opencv4.4.0/age-and-gender-classification/yolo/yolov4.weights";
String classesFile = "E:/opencv4.4.0/age-and-gender-classification/yolo/coco.names";
List<String> classes = new ArrayList<String>(); // 存放类别的列表
InputStream in = new FileInputStream(classesFile);
int iAvail = in.available(); // 适用于本地一次读取多个字节时,返回得到的字节数。
byte[] bytes = new byte[iAvail];
in.read(bytes);
String allContent = new String(bytes); // 文件中的所有内容
String[] tempContent = allContent.trim().split("\n"); // allContent去除首尾空格,再按换行符分割。
// 遍历tempContent,添加到保存类别名的列表classes里。
for (int i = 0; i < tempContent.length; i++) {
  classes.add(tempContent[i]);
}
System.out.println(classes.size());
Net net = Dnn.readNetFromDarknet(config, weights);
net.setPreferableBackend(Dnn.DNN_BACKEND_OPENCV);
//  Don't understand command line argument "-cl-no-subgroup-ifp"
//  net.setPreferableTarget(Dnn.DNN_TARGET_OPENCL);
// 改为cpu
net.setPreferableTarget(Dnn.DNN_TARGET_CPU);
Mat im = image.clone();
if (im.empty()) {
  System.out.println("图片加载失败");
}
Size sz = new Size(416, 416);
List<Mat> outs = new ArrayList<>();
Mat blob = Dnn.blobFromImage(image, 0.00392, sz, new Scalar(0), true, false);
net.setInput(blob);
net.forward(outs, getOutputNames(net));
float confThreshold = 0.8f;
List<Rect2d> boxes = new ArrayList<Rect2d>(); // 矩形框列表
List<Integer> classIds = new ArrayList<Integer>(); // 类的序号列表
List<Float> confidences = new ArrayList<Float>(); // 置信度列表
for (int i = 0; i < outs.size(); ++i) {
  Mat level = outs.get(i);
  for (int j = 0; j < level.rows(); ++j) {
    Mat row = level.row(j);
    // [x,y,h,w,c,class1,class2] 所以是标号5
    Mat scores = row.colRange(5, level.cols());
    Core.MinMaxLocResult mm = Core.minMaxLoc(scores);
    float confidence = (float) mm.maxVal;
    Point classIdPoint = mm.maxLoc;
    int size = (int) (level.cols() * level.channels());
    float[] data = new float[size];
    level.get(j, 0, data);
    if (confidence > confThreshold) {
      float x = data[0]; // centerX 矩形中心点的X坐标
      float y = data[1]; // centerY 矩形中心点的Y坐标
      float width = data[2]; // 矩形框的宽
      float height = data[3]; // 矩形框的高
      float xLeftBottom = (x - width / 2) * im.cols(); // 矩形左下角点的X坐标
      float yLeftBottom = (y - height / 2) * im.rows(); // 矩形左下角点的Y坐标
      float xRightTop = (x + width / 2) * im.cols(); // 矩形右上角点的X坐标
      float yRightTop = (y + height / 2) * im.rows(); // 矩形右上角点的Y坐标
      // boxes列表填值 Rect对象,参数是两个点
      boxes.add(new Rect2d(new Point(xLeftBottom, yLeftBottom), new Point(xRightTop, yRightTop)));
      confidences.add(confidence);
      classIds.add((int) classIdPoint.x);
//              Imgproc.rectangle(image, new Point(xLeftBottom, yLeftBottom),
//            new Point(xRightTop, yRightTop), new Scalar(255, 0, 0));
//              Imgproc.putText(image, classes.get((int)classIdPoint.x)+" "+confidence, new Point(xLeftBottom, yLeftBottom),Imgproc.FONT_HERSHEY_PLAIN,0.8, new Scalar(255, 0, 0));
    }
  }
}
System.out.println(classIds);
System.out.println(confidences);
System.out.println(boxes.size());
System.out.println(boxes);
float nmsThresh = 0.5f;
MatOfFloat confidences2 = new MatOfFloat(Converters.vector_float_to_Mat(confidences));
//    Rect2d[] boxesArray = boxes.toArray(new Rect2d[0]);
//    MatOfRect boxes2 = new MatOfRect(boxesArray);
MatOfRect2d m = new MatOfRect2d();
m.fromList(boxes);
MatOfInt indices = new MatOfInt();
/**
 * NMS(Non Maximum Suppression),又名非极大值抑制 删除高度冗余的Rect2d
 */
Dnn.NMSBoxes(m, confidences2, confThreshold, nmsThresh, indices); // We draw the bounding boxes for objects
                                  // here//
int[] ind = indices.toArray();
for (int i = 0; i < ind.length; ++i) {
  int index = ind[i];
  Rect2d box = boxes.get(index);
  int idGuy = classIds.get(index);
  float conf = confidences.get(index);
  Imgproc.rectangle(image, box.tl(), box.br(), new Scalar(255, 0, 0));
  Imgproc.putText(image, classes.get(idGuy) + " " + conf, box.tl(), Imgproc.FONT_HERSHEY_PLAIN, 0.8,
      new Scalar(255, 0, 0));
}
HighGui.imshow("yolo", image);
}
复制代码



效果


网络异常,图片无法展示
|


遇到问题


报错-cl-no-subgroup-ifp 修改为cpu
net.setPreferableTarget(Dnn.DNN_TARGET_CPU);
复制代码


匹配模型过多
NMS(Non Maximum Suppression),又名非极大值抑制 删除高度冗余的Rect2d
复制代码


再NMS需要的是Rect2d
直接从Rect,修改为Rect2d即可


相关文章
|
3月前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
192 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
2月前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
180 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
2月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
65 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
3月前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
85 2
|
4月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
2月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
43 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
2月前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
197 5
|
2月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
155 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
2月前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
262 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
2月前
|
Java Maven Spring
用Spring导致的无法运行Java文件的问题的解决方案
本文提供了解决在IntelliJ IDEA社区版中使用Spring Initializr插件创建Spring项目后,Java文件无法运行的问题的方法,主要是通过加载Maven项目来解决。
88 0