5分鐘!用Java實現目標檢測 | PyTorch

2021-01-11 澎湃新聞

魚羊 編輯整理

量子位 報導 | 公眾號 QbitAI

編者按:作為一個Java開發者,你是否曾為在PyTorch上部署模型而苦惱?這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。

5分鐘,用Java實現目標檢測

文 / 知乎用戶@Lanking

PyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。很多論文都選擇使用PyTorch去實現也證明了它在訓練方面的效率以及易用性。

在PyTorch領域,儘管部署一個模型有很多選擇,可為Java開發人員準備的選項卻屈指可數。

在過去,用戶可以用PyTorch C++ 寫JNI (Java Native Interface) 來實現這個過程。最近,PyTorch 1.4 也發布了試驗性的Java 前端。

可是這兩種解決方案都沒有辦法能讓Java開發者很好的使用:用戶需要從易於使用和易於維護中二選一。

針對於這個問題,亞馬遜雲服務 (AWS)開源了 Deep Java Library (DJL),一個為Java開發者設計的深度學習庫。它兼顧了易用性和可維護性,一切運行效率以及內存管理問題都得到了很好的處理。

DJL使用起來異常簡單。只需幾行代碼,用戶就可以輕鬆部署深度學習模型用作推理。那麼我們就開始上手用DJL部署一個PyTorch 模型吧。

前期準備

用戶可以輕鬆使用maven或者gradle等Java常用配置管理包來引用DJL。下面是一個示例:

plugins {

id 'java'

}

repositories {

jcenter()

}

dependencies {

implementation "ai.djl:api:0.4.0"

implementation "ai.djl:repository:0.4.0"

runtimeOnly "ai.djl.pytorch:pytorch-model-zoo:0.4.0"

runtimeOnly "ai.djl.pytorch:pytorch-native-auto:1.4.0"

}

然後只需gradle build,基本配置就大功告成了。

開始部署模型

我們用到的目標檢測模型來源於NVIDIA在torchhub發布的預訓練模型。我們用下面這張圖來推理幾個可以識別的物體(狗,自行車以及皮卡)。

可以通過下面的代碼來實現推理的過程:

public static void main(String[] args) throws IOException, ModelException, TranslateException {

String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";

BufferedImage img = BufferedImageUtils.fromUrl(url);

Criteria criteria =

Criteria.builder()

.optApplication(Application.CV.OBJECT_DETECTION)

.setTypes(BufferedImage.class, DetectedObjects.class)

.optFilter("backbone", "resnet50")

.optProgress(new ProgressBar())

.build();

try (ZooModel model = ModelZoo.loadModel(criteria)) {

try (Predictor predictor = model.newPredictor()) {

DetectedObjects detection = predictor.predict(img);

System.out.println(detection);

}

}

}

然後,就結束了。相比於其他解決方案動輒上百行的代碼,DJL把所有過程簡化到了不到30行完成。那麼我們看看輸出的結果:

[

class: "dog", probability: 0.96709, bounds: [x=0.165, y=0.348, width=0.249, height=0.539]

class: "bicycle", probability: 0.66796, bounds: [x=0.152, y=0.244, width=0.574, height=0.562]

class: "truck", probability: 0.64912, bounds: [x=0.609, y=0.132, width=0.284, height=0.166]

]

你也可以用我們目標檢測圖形化API來看一下實際的檢測效果:

你也許會說,這些代碼都包裝的過於厲害,真正的小白該如何上手呢?

讓我們仔細的看一下剛才的那段代碼:

// 讀取一張圖片

String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";

BufferedImage img = BufferedImageUtils.fromUrl(url);

// 創建一個模型的尋找標準

Criteria criteria =

Criteria.builder()

// 設置應用類型:目標檢測

.optApplication(Application.CV.OBJECT_DETECTION)

// 確定輸入輸出類型 (使用默認的圖片處理工具)

.setTypes(BufferedImage.class, DetectedObjects.class)

// 模型的過濾條件

.optFilter("backbone", "resnet50")

.optProgress(new ProgressBar())

.build();

// 創建一個模型對象

try (ZooModel model = ModelZoo.loadModel(criteria)) {

// 創建一個推理對象

try (Predictor predictor = model.newPredictor()) {

// 推理

DetectedObjects detection = predictor.predict(img);

System.out.println(detection);

}

}

這樣是不是清楚了很多?DJL建立了一個模型庫(ModelZoo)的概念,引入了來自於GluonCV, TorchHub, Keras 預訓練模型, huggingface自然語言處理模型等70多個模型。所有的模型都可以一鍵導入,用戶只需要使用默認或者自己寫的輸入輸出工具就可以實現輕鬆的推理。我們還在不斷的添加各種預訓練模型。

了解DJL

DJL是亞馬遜雲服務在2019年re:Invent大會推出的專為Java開發者量身定製的深度學習框架,現已運行在亞馬遜數以百萬的推理任務中。

如果要總結DJL的主要特色,那麼就是如下三點:

DJL不設限制於後端引擎:用戶可以輕鬆的使用 MXNet, PyTorch, TensorFlow和fastText來在Java上做模型訓練和推理。

DJL的算子設計無限趨近於numpy:它的使用體驗上和numpy基本是無縫的,切換引擎也不會造成結果改變。

DJL優秀的內存管理以及效率機制:DJL擁有自己的資源回收機制,100個小時連續推理也不會內存溢出。

James Gosling (Java 創始人) 在使用後給出了讚譽:

對於PyTorch的支持

DJL現已支持PyTorch 1.5。我們深度整合了PyTorch C++ API,開發了一套JNI提供Java的底層支持。DJL提供各類PyTorch原生算子算法,現在支持所有的 TorchScript模型。

現在可以在 Mac/Linux/Windows全平臺運行DJL PyTorch。DJL具有自檢測CUDA版本的功能,也會自動採用對應的CUDA版本包來運行gpu任務。

想了解更多,請參見下面幾個連結:

https://djl.ai

https://github.com/awslabs/djl

也歡迎加入我們slack論壇:

https://app.slack.com/client/TPX8YGQTW

— 完 —

本文系網易新聞•網易號特色內容激勵計劃籤約帳號【量子位】原創內容,未經帳號授權,禁止隨意轉載。

報名 | 智慧生活行業私享會

歡迎報名,與峰瑞資本、石頭科技、網易有道、思必馳、九號機器人、視感科技、雲丁科技等企業高管,共同探討如何借力資本市場、把握行業趨勢,打造全場景智慧生活:

量子位 QbitAI · 頭條號籤約作者

վ'ᴗ' ի 追蹤AI技術和產品新動態

原標題:《5分鐘!用Java實現目標檢測 | PyTorch》

閱讀原文

相關焦點

  • 5分鐘!用Java實現目標檢測|PyTorch
    這篇來自AWS軟體工程師的投稿,結合實例,詳細介紹了DJL這個為Java開發者設計的深度學習庫:5分鐘,你就能在PyTorch上,用Java實現目標檢測。5分鐘,用Java實現目標檢測文 / 知乎用戶@LankingPyTorch在深度學習領域中的應用日趨廣泛,得益於它獨到的設計。無論是數據的並行處理還是動態計算圖,一切都為Python做出了很多簡化。
  • 從零開始PyTorch項目:YOLO v3目標檢測實現
    機器之心編譯目標檢測是深度學習近期發展過程中受益最多的領域。隨著技術的進步,人們已經開發出了很多用於目標檢測的算法,包括 YOLO、SSD、Mask RCNN 和 RetinaNet。在本教程中,我們將使用 PyTorch 實現基於 YOLO v3 的目標檢測器,後者是一種快速的目標檢測算法。該教程一共有五個部分,本文包含其中的前三部分。
  • Facebook 發布 Detectron2:基於 PyTorch 的新一代目標檢測工具
    雷鋒網 AI 開發者按:Detectron 是 FAIR 在 2018 年初公開的目標檢測平臺,包含了大量業內最具代表性的目標檢測、圖像分割、關鍵點檢測算法,該框架主要基於 python 和 caffe2 實現,開源項目已獲得了超 2.2w 的星標數。
  • 使用PyTorch實現目標檢測與跟蹤
    本文將展示如何使用預訓練的分類器檢測圖像中的多個對象,並在視頻中跟蹤它們。 圖像中的目標檢測 目標檢測的算法有很多,YOLO跟SSD是現下最流行的算法。在本文中,我們將使用YOLOv3。
  • 雲計算學習:用PyTorch實現一個簡單的分類器
    主要流程分為以下三個部分:1,自定義生成一個訓練集,具體為在二維平面上的一些點,分為兩類;2,構建一個淺層神經網絡,實現對特徵的擬合,主要是明白在 pytorch 中網絡結構如何搭建;3,完成訓練和測試部分的工作,熟悉 pytorch 如何對網絡進行訓練和測試。1.
  • 從R-CNN到YOLO,一文帶你了解目標檢測模型(附論文下載)
    大數據文摘作品編譯:Yanruo、小魚這是一份詳細介紹了目標檢測的相關經典論文、學習筆記、和代碼示例的清單,想要入坑目標檢測的同學可以收藏了!在大數據文摘後臺回復「目標檢測」可打包下載全部論文~R-CNNR-CNN是2014年出現的。
  • PyTorch實現TPU版本CNN模型
    為此,PyTorch一直在通過提供最先進的硬體加速器來支持機器學習的實現。PyTorch對雲TPU的支持是通過與XLA(加速線性代數)的集成實現的,XLA是一種用於線性代數的編譯器,可以針對多種類型的硬體,包括CPU、GPU和TPU。本文演示了如何使用PyTorch和TPU實現深度學習模型,以加快訓練過程。
  • 60分鐘入門深度學習工具PyTorch
    要防止跟蹤歷史記錄(和使用內存),您還可以使用torch.no_grad包裝代碼塊:在評估模型時,這可能特別有用,因為模型可能具有requires_grad = True的可訓練參數,但我們不需要梯度。還有一個類對於autograd實現非常重要 - Function。
  • 《PyTorch中文手冊》來了
    PyTorch 是一個深度學習框架,旨在實現簡單靈活的實驗。自 2017 年初首次推出,PyTorch 很快成為 AI 研究人員的熱門選擇並受到推崇。這是一本開源的書籍,目標是幫助那些希望和使用 PyTorch 進行深度學習開發和研究的朋友快速入門,其中包含的 Pytorch 教程全部通過測試保證可以成功運行。
  • PyTorch實現,GitHub4000星:微軟開源的CV庫
    而這些應用的核心部分是視覺識別任務,如圖像分類、目標檢測和圖像相似度。在各種計算機視覺模型和應用層出不窮的當下,如何把握髮展脈絡,跟進領域前沿發展呢?微軟創建了一個庫,提供構建計算機視覺系統的大量示例和最佳實踐指導原則。
  • Java類隔離加載實現原理是什麼?
    只要Java 代碼寫得足夠多就一定會出現這種情況:系統新引入了一個中間件的 jar 包,編譯的時候一切正常,一運行就報錯:java.lang.NoSuchMethodError,然後就哼哧哼哧的開始找解決方法,最後在幾百個依賴包裡面找的眼睛都快瞎了才找到衝突的 jar,把問題解決之後就開始吐槽中間件為啥搞那麼多不同版本的 jar,寫代碼五分鐘,排包排了一整天。
  • mmdetection使用目標檢測工具箱訓練,測試
    技術細節—手把手教你如何實現一個新的網絡https://zhuanlan.zhihu.com/p/101222759mmdetection的configs中的各項參數具體解釋https://zhuanlan.zhihu.com/p/102072353目標檢測比賽中的tricks(已更新更多代碼解析)https://zhuanlan.zhihu.com
  • Pytorch框架安裝方法(基於Anaconda環境和Pycharm IDE)
    1.Anaconda安裝下載連結:https://www.anaconda.com/1.1 點擊Next1.2 點擊同意1.3 點擊Next1.4 選擇目標文件夾,點擊下一步1.5 將Anaconda加入到系統變量安裝成功後,在CMD中檢查Anaconda時候加入到環境變量中。
  • 用經典案例來幫助初學者解析Java的「多態」
    我這裡還是用我13年前給我們公司新員工做內部培訓時用到的看起來似乎有點老掉牙的、但是仍然十分經典的案例來重新給有需要的java愛好者呈現一下「多態」的奧秘所在!這裡給大家帶來以下幾個類、接口:接口Shape.java2.實現接口Shape.java的實現類之一 Circle.java即圓形類:如上,Circle類實現了接口Shape.java中的若干抽象方法
  • Pytorch 0.3.0 發布,實現多方面提速,增加對ONNX支持
    根據官方文檔的介紹,此次增加了多個函數和功能,多方面的性能均實現提升。重大變更0.3 版本中刪掉了 Variable.reinforce() 等隨機函數,因為它們的功能有限,並且會影響到性能。設置隨機函數的初衷是為了避免採樣值的 book-keeping,在實際中,由於各種各樣的原因,用戶的代碼中仍然會包括 book-keeping。
  • (提高Java代碼質量)|25個優化Java代碼的小技巧
    任何 Collection.isEmpty() 實現的時間複雜度都是 O(1) ,但是某些 Collection.size() 實現的時間複雜度可能是O(n)。反例:4.集合初始化儘量指定大小java 的集合類用起來十分方便,但是看源碼可知,集合也是有大小限制的。每次擴容的時間複雜度很有可能是 O(n) ,所以儘量指定可預知的集合大小,能減少集合的擴容次數。
  • PyTorch更新!谷歌幫助開發,正式支持TensorBoard | 5大開源項目
    關於本次更新,Pytorch在下面的GitHub文檔中進行了詳細的解釋,請收好傳送門:https://github.com/pytorch/pytorch/releases/tag/v1.1.0對於這次更新,PyTorch的產品經理Joe Spisa表示,他們並不是要將PyTorch
  • 福利,PyTorch中文版官方教程來了
    教程作者來自 pytorchchina.com。教程網站:http://pytorch123.com教程裡有什麼教程根據 PyTorch 官方版本目錄,完整地還原了所有的內容。教程的一部分內容,使用 torch.view 改變 tensor 的大小或形狀用教程設計一個聊天機器人,以上為部分對話。
  • 目標檢測必須要OpenCV?10行Python代碼也能實現,親測好用!
    大數據文摘出品編譯:朱一輝、雪清、小魚短短10行代碼就可以實現目標檢測?!本文作者和他的團隊構建了一個名為ImageAI 的Python庫,集成了現今流行的深度學習框架和計算機視覺庫。本文將手把手教你構建自己的第一個目標檢測應用,而且文摘菌已經幫你踩過坑了,親測有效!
  • Deep CARs:使用Pytorch學習框架實現遷移學習
    全文共13449字,預計學習時長26分鐘或更長圖片來源:https://www.pexels.com/photo/vehicles-parked-inside-elevated-parking-lot-63294/如何讓電腦識別不同的汽車品牌?想用手機拍任何一輛車就能知道車的牌子嗎?本文將介紹一個能識別196種類型汽車的模型。