Java实现darknet+yolov4的目标检测

本文介绍了如何使用Java结合OpenCV的DNN模块调用darknet和yolov4进行目标检测。详细阐述了darknet与yolov4的基本概念,以及在Java中实现目标检测的步骤,包括内存管理、模型加载、图片预处理和结果去重等关键环节。
摘要由CSDN通过智能技术生成

目录

1、darknet 简介

2、yolov4

3、java 如何实现

3.1、OpenCV 原理和内存管理

3.2、实现详解

3.3、完整代码

 4、结语


1、darknet 简介

darknet 是 c 语言实现的开源 AI 深度学习框架,一般用于物体分类识别。他的优点就是轻量级、开源、没有什么依赖、支持 CPU 和 GPU 两种计算模式。官网默认的网络模型能够支持80种常见物体的分类识别。当然也可以使用自己的数据集进行训练自己的网络模型,实现自定义的场景。具体的请看darknet 官网文档

2、yolov4

YOLO(you only look once)的第4个版本。是非常优秀的卷积神经网络,对象检测和定位的实现算法,优点就是速度快,精度高。github 项目网址,上面对 yolov4 的环境和训练做了详细的说明。

3、java 如何实现

darknet 框架是 c 语言的,是可以通过 JNI 或者 JNA 来实现调用,但是很有幸,java openCV 在 3.x 版本后推出了 DNN(深度学习)模块,已经内置实现了 darknet、torch、ONNX、caffe、tensorflow 等常见的深度学习框架,直接使用即可,非常简单。

当然实现之前,需要下载 3 个 yolov4 的文件(需要科学上网下载,不然贼慢或打不开)

配置文件:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4.cfg

权重文件:https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights​​​​​​

类别名称:darknet/coco.names at master · AlexeyAB/darknet · GitHub (能够检测的对象)

我的百度网盘:https://pan.baidu.com/s/1tREeprjsq3mYGuCJ_vMnmg 
                         提取码:1pia

3.1、OpenCV 原理和内存管理

java OpenCV 的原理是借助 javaCPP 包(底层依然是 JNI)实现 C 代码的调用;

(非常重要)只要涉及到 java 调用 C/C++ 这种情况,就一定要注意内存管理,因为 C/C++ 是 JVM 堆外内存,GC 是无法自动管理的,所以一定要记得手动释放 C/C++ 内存、一定要记得手动释放 C/C++ 内存、一定要记得手动释放 C/C++ 内存(重要的事情说3遍)。

java OpenCV 已经很人性化的帮我们封装了 release 和 delete 这两个释放 C/C++ 内存的方法了,所以只要使用 OpenCV 包中的类,就一定要记得看看有没有这两个方法,如果有的,在使用完这个对象一定调用下。

3.2、实现详解

  • maven 依赖
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>opencv-platform</artifactId>
    <version>4.5.3-1.5.6</version>
</dependency>

只需要依赖 opencv-platform 即可,不需要依赖 java-opencv,后者依赖了很多平台,下载大量的包。

  • 加载网络

使用前面下载的配置文件、权重文件初始化 darknet,注意,文件最终都是在 C 代码中加载的,所以要绝对路径才能加载到。

// 加载 opencv
Loader.load(opencv_java.class);

// 指定配置文件和模型文件加载网络
String cfgFile = "D:\\xxx\\ai-demo\\src\\main\\resources\\yolov4.cfg";
String weights = "D:\\xxx\\ai-demo\\src\\main\\resources\\yolov4.weights";
// opencv 的 Dnn 模块初始化网络
Net net = Dnn.readNetFromDarknet(cfgFile, weights);
if(net.empty){
    System.out.println("init net fail");
    return;
}

// 设置计算后台:如果电脑有GPU,可以指定为:DNN_BACKEND_CUDA
net.setPreferableBackend(Dnn.DNN_BACKEND_OPENCV);
// 指定为 CPU 模式,如果电脑有 GPU,指定CUDA模式
net.setPreferableTarget(Dnn.DNN_TARGET_CPU);

// 读取类别名称
String[] names = new String[80];
try (BufferedReader reader = new BufferedReader(new InputStreamReader(DarknetMain.class.getClassLoader().getResourceAsStream("coco.names")))) {
	for (int i = 0; i < names.length; i++) {
		names[i] = reader.readLine();
	}
}
  • 输入检测图片

现在就输入一张我们

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值