三分鐘:極速體驗JAVA版目標檢測(YOLO4)

程式設計師欣宸發表於2022-01-12

歡迎訪問我的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

相關文章