欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;

本篇概览

  • 检测照片中的物体,用Java可以实现吗?
  • 可以,今天咱们用最少的时间、最简单的操作来体验这个实用的功能,您提交一张普通照片后,会看到下图效果,原照片上的狗子、人、马都被识别出来,每个识别框的左上角是类别和置信度,最后,图片左上角还有本次识别所用时间:

  • 接下来请随本文一起动手来实现上述效果,整个过程分三步完成:
  1. 下载模型和配置文件
  2. 运行docker容器,这是个web服务,咱们用浏览器访问此服务,提交照片完成检测
  3. 验证效果(在浏览器上打开web页面,提交图片,等待检测结果)

风险提前告知

  • 为了简化操作,接下来会用到docker,对应的镜像体积巨大,达到了恐怖的1.57G,建议您为自己的docker做好加速配置,可以减少下载等待时间;
  • 由于opencv体积庞大,再加上javacv的依赖库也不小,这才导致超大镜像的出现,还望您多多海涵,标题中的《三分钟》是要去掉镜像的等待时间的,您要是觉得欣宸的标题起得很无耻,我觉得您是对的…

环境信息

  • 本次实战推荐的环境信息如下:
  1. 操作系统:Ubuntu 16(MacBook Pro也可以,版本是11.2.3,macOS Big Sur)
  2. docker:20.10.2 Community
  • 不多说了,立即动手!

下载模型和配置文件

  • 本次实战所需要的文件有两种下载方式,您二选一即可
  • 第一种是从官方下载,从下面这三个地址分别下下载:
  1. YOLOv4配置文件: https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4.cfg
  2. YOLOv4权重: https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
  3. 分类名称: https://raw.githubusercontent.com/AlexeyAB/darknet/master/data/coco.names
  • 第二种是从csdn下载(无需积分),上述三个文件我已打包放在此:https://download.csdn.net/download/boling_cavalry/33229838
  • 上述两种方式无论哪种,最终都会得到三个文件:yolov4.cfg、yolov4.weights、coco.names,请将它们放在同一目录下,我是放在这里:/home/will/temp/202110/19/model
  • 新建一个目录用来存放照片,我这里新建的目录是:/home/will/temp/202110/19/images,注意要确保该目录可以读写
  • 最终目录结构如下所示:
/home/will/temp/202110/19/
├── images
└── model
├── coco.names
├── yolov4.cfg
└── yolov4.weights

运行docker容器

  • 执行以下命令即可完成服务部署(注意刚才提到的两个目录都被映射到容器中了):
sudo docker run \
--rm \
--name yolodemo \
-p 8080:8080 \
-v /home/will/temp/202110/19/images:/app/images \
-v /home/will/temp/202110/19/model:/app/model \
bolingcavalry/yolodemo:0.0.1
  • 控制台会输出springboot的启动信息:
  .   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.4.8) 2021-10-19 07:39:20.112 INFO 1 --- [ main] c.b.yolodemo.YoloDemoApplication : Starting YoloDemoApplication using Java 1.8.0_292 on 06e6b68f43ca with PID 1 (/app started by root in /)
2021-10-19 07:39:20.115 INFO 1 --- [ main] c.b.yolodemo.YoloDemoApplication : No active profile set, falling back to default profiles: default
2021-10-19 07:39:20.997 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-10-19 07:39:21.010 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-10-19 07:39:21.010 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.48]
2021-10-19 07:39:21.083 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-10-19 07:39:21.084 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 915 ms
2021-10-19 07:39:21.157 ERROR 1 --- [ main] c.b.y.controller.YoloServiceController : file.encoding is utf-8
2021-10-19 07:39:23.449 INFO 1 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page template: index
2021-10-19 07:39:23.627 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-10-19 07:39:23.640 INFO 1 --- [ main] c.b.yolodemo.YoloDemoApplication : Started YoloDemoApplication in 3.893 seconds (JVM running for 4.329)
2021-10-19 07:39:49.872 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-10-19 07:39:49.872 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-10-19 07:39:49.873 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
  • 部署完成,接下来体验服务验证效果

验证效果

  • 浏览器访问http://192.168.50.27:8080,这里的192.168.50.27请改成docker宿主机IP(要关闭防火墙!),可见操作页面如下图(欣宸的前端开发水平渣到令人发指,果然不是空穴来风):

  • 按照上图红框的提示,选择一张照片并点击提交按钮,短暂等待后展示如下页面:

  • 去看docker的控制台,也输出了识别的日志:
2021-10-19 07:39:57.830   : 文件 [person.jpg], 大小 [113880]
2021-10-19 07:39:59.303 : 一共检测到3个目标
2021-10-19 07:39:59.306 : 类别[person],置信度[99.78939%]
2021-10-19 07:39:59.307 : 类别[dog],置信度[99.45358%]
2021-10-19 07:39:59.307 : 类别[horse],置信度[98.37547%]
  • 动物识别效果挺好:

  • 至此,Java版目标检测的体验已完成,也就三分钟的事情,咱们足够高效(下载超大镜像的时间不能算,不敢算…)
  • 此刻您应该能感受到Java在目标识别领域的魅力了,聪明的您当然会有很多疑问,例如:
  • 用了啥技术?(别告诉我只用springboot,不信)
  • 写了啥代码?
  • 运行环境好不好配置?只要jar依赖吗?还需要其他操作吗?
  • 有坑么?
  • 其实从标题就可以看出,和YOLO有关,java与YOLO4,有点小期待了吗?
  • 这些疑问在接下来的文章中会完全揭秘,然后您也能轻易做出集成了目标识别的SpringBoot应用了,敬请期待,欣宸原创不会辜负您。

    https://github.com/zq2599/blog_demos

三分钟:极速体验JAVA版目标检测(YOLO4)的更多相关文章

  1. 三分钟极速体验:Java版人脸检测

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  2. Java版人脸检测详解上篇:运行环境的Docker镜像(CentOS+JDK+OpenCV)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. Java版人脸检测详解下篇:编码

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. 10分钟内基于gpu的目标检测

    10分钟内基于gpu的目标检测 Object Detection on GPUs in 10 Minutes 目标检测仍然是自动驾驶和智能视频分析等应用的主要驱动力.目标检测应用程序需要使用大量数据集 ...

  5. 分布式调用链跟踪工具Jaeger?两分钟极速体验

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Protocol Buffer序列化/反序列化---初体验(java版)

    今天闲遐时学习了 Protocol Buffer 在网上看到了许多资料,其中不泛精品,想要详细了解的请看文章结尾的友情链接,我这里就做加深印象,快速入门的一个完整的demo,仅此而已. 学完你可以得到 ...

  7. Jaeger的客户端采样配置(Java版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. Jaeger开发入门(java版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

随机推荐

  1. UVA294 约数 Divisors 题解

    Content 给定 \(n\) 个区间 \([l,r]\),求出每个区间内约数个数最大的数. 数据范围:\(1\leqslant l<r\leqslant 10^{10}\),\(r-l\le ...

  2. Oracle使用数据泵导入/导出数据(expdp/impdp)

    Oracle使用数据泵导入/导出数据(expdp/impdp) A电脑上的操作(expdp数据导出) 运行cmd: 登录数据库,输入命令:sqlplus 使用管理员角色登录需要在用户名后加" ...

  3. JAVA中Base64和byte数组(byte[]) 相互转换

    Base64转byte[] byte[] bytes = DatatypeConverter.parseBase64Binary("base64字符串"); byte[]转base ...

  4. JAVA将Byte数组(byte[])转换成文件

    /** * 将Byte数组转换成文件 * @param bytes byte数组 * @param filePath 文件路径 如 D://test/ 最后"/"结尾 * @par ...

  5. js(jQuery)获取自定义data属性的值

    有时候因为需要在标签上设置自定义data属性值, <div class="col-sm-6 col-md-4" id="get_id" data-c_id ...

  6. 【LeetCode】NO.376 摆动序列 (Python) [贪心算法]

    376. 摆动序列 题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 .第一个差(如果存在的话)可能是正数或负数.仅有一个元素或者含两个不等元素的序列也视作摆动序列. 例 ...

  7. C++字符串常量跨平台编译问题

    C++字符串常量跨平台编译问题(与字符串编码相关),有需要的朋友可以参考下. 1. 问题 在C++代码中,给一个string类型的变量赋值一个中文字符串常量,例如: string s = " ...

  8. App调试的几个命令实践

    1.logcat命令这个命令最简单常用,可查看帮助 第一种事例:adb logcat > /sdcard/mylogcat.txt 第二种事例:adb logcat > D:/Temp/1 ...

  9. 【九度OJ】题目1203:IP地址 解题报告

    [九度OJ]题目1203:IP地址 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1203 题目描述: 输入一个ip地址串,判断是否合 ...

  10. 【LeetCode】940. Distinct Subsequences II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...