5分鐘!用Java實(shí)現(xiàn)目標(biāo)檢測(cè)
本文經(jīng)AI新媒體量子位(公眾號(hào)ID:QbitAI)授權(quán)轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)聯(lián)系出處。
編者按:作為一個(gè)Java開發(fā)者,你是否曾為在PyTorch上部署模型而苦惱?這篇來自AWS軟件工程師的投稿,結(jié)合實(shí)例,詳細(xì)介紹了DJL這個(gè)為Java開發(fā)者設(shè)計(jì)的深度學(xué)習(xí)庫:5分鐘,你就能在PyTorch上,用Java實(shí)現(xiàn)目標(biāo)檢測(cè)。

PyTorch在深度學(xué)習(xí)領(lǐng)域中的應(yīng)用日趨廣泛,得益于它獨(dú)到的設(shè)計(jì)。無論是數(shù)據(jù)的并行處理還是動(dòng)態(tài)計(jì)算圖,一切都為Python做出了很多簡(jiǎn)化。很多論文都選擇使用PyTorch去實(shí)現(xiàn)也證明了它在訓(xùn)練方面的效率以及易用性。
在PyTorch領(lǐng)域,盡管部署一個(gè)模型有很多選擇,可為Java開發(fā)人員準(zhǔn)備的選項(xiàng)卻屈指可數(shù)。
在過去,用戶可以用PyTorch C++ 寫JNI (Java Native Interface) 來實(shí)現(xiàn)這個(gè)過程。最近,PyTorch 1.4 也發(fā)布了試驗(yàn)性的Java 前端。
可是這兩種解決方案都沒有辦法能讓Java開發(fā)者很好的使用:用戶需要從易于使用和易于維護(hù)中二選一。
針對(duì)于這個(gè)問題,亞馬遜云服務(wù) (AWS)開源了 Deep Java Library (DJL),一個(gè)為Java開發(fā)者設(shè)計(jì)的深度學(xué)習(xí)庫。它兼顧了易用性和可維護(hù)性,一切運(yùn)行效率以及內(nèi)存管理問題都得到了很好的處理。
DJL使用起來異常簡(jiǎn)單。只需幾行代碼,用戶就可以輕松部署深度學(xué)習(xí)模型用作推理。那么我們就開始上手用DJL部署一個(gè)PyTorch 模型吧。
前期準(zhǔn)備
用戶可以輕松使用maven或者gradle等Java常用配置管理包來引用DJL。下面是一個(gè)示例:
- 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,基本配置就大功告成了。
開始部署模型
我們用到的目標(biāo)檢測(cè)模型來源于NVIDIA在torchhub發(fā)布的預(yù)訓(xùn)練模型。我們用下面這張圖來推理幾個(gè)可以識(shí)別的物體(狗,自行車以及皮卡)。

可以通過下面的代碼來實(shí)現(xiàn)推理的過程:
- 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<BufferedImage, DetectedObjects> criteria =
- Criteria.builder()
- .optApplication(Application.CV.OBJECT_DETECTION)
- .setTypes(BufferedImage.class, DetectedObjects.class)
- .optFilter("backbone", "resnet50")
- .optProgress(new ProgressBar())
- .build();
- try (ZooModel<BufferedImage, DetectedObjects> model = ModelZoo.loadModel(criteria)) {
- try (Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()) {
- DetectedObjects detection = predictor.predict(img);
- System.out.println(detection);
- }
- }
- }
然后,就結(jié)束了。相比于其他解決方案動(dòng)輒上百行的代碼,DJL把所有過程簡(jiǎn)化到了不到30行完成。那么我們看看輸出的結(jié)果:
- [
- 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]
- ]
你也可以用我們目標(biāo)檢測(cè)圖形化API來看一下實(shí)際的檢測(cè)效果:

你也許會(huì)說,這些代碼都包裝的過于厲害,真正的小白該如何上手呢?
讓我們仔細(xì)的看一下剛才的那段代碼:
- // 讀取一張圖片
- String url = "https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";
- BufferedImage img = BufferedImageUtils.fromUrl(url);
- // 創(chuàng)建一個(gè)模型的尋找標(biāo)準(zhǔn)
- Criteria<BufferedImage, DetectedObjects> criteria =
- Criteria.builder()
- // 設(shè)置應(yīng)用類型:目標(biāo)檢測(cè)
- .optApplication(Application.CV.OBJECT_DETECTION)
- // 確定輸入輸出類型 (使用默認(rèn)的圖片處理工具)
- .setTypes(BufferedImage.class, DetectedObjects.class)
- // 模型的過濾條件
- .optFilter("backbone", "resnet50")
- .optProgress(new ProgressBar())
- .build();
- // 創(chuàng)建一個(gè)模型對(duì)象
- try (ZooModel<BufferedImage, DetectedObjects> model = ModelZoo.loadModel(criteria)) {
- // 創(chuàng)建一個(gè)推理對(duì)象
- try (Predictor<BufferedImage, DetectedObjects> predictor = model.newPredictor()) {
- // 推理
- DetectedObjects detection = predictor.predict(img);
- System.out.println(detection);
- }
- }
這樣是不是清楚了很多?DJL建立了一個(gè)模型庫(ModelZoo)的概念,引入了來自于GluonCV, TorchHub, Keras 預(yù)訓(xùn)練模型, huggingface自然語言處理模型等70多個(gè)模型。所有的模型都可以一鍵導(dǎo)入,用戶只需要使用默認(rèn)或者自己寫的輸入輸出工具就可以實(shí)現(xiàn)輕松的推理。我們還在不斷的添加各種預(yù)訓(xùn)練模型。
了解DJL

DJL是亞馬遜云服務(wù)在2019年re:Invent大會(huì)推出的專為Java開發(fā)者量身定制的深度學(xué)習(xí)框架,現(xiàn)已運(yùn)行在亞馬遜數(shù)以百萬的推理任務(wù)中。
如果要總結(jié)DJL的主要特色,那么就是如下三點(diǎn):
- DJL不設(shè)限制于后端引擎:用戶可以輕松的使用 MXNet, PyTorch, TensorFlow和fastText來在Java上做模型訓(xùn)練和推理。
- DJL的算子設(shè)計(jì)無限趨近于numpy:它的使用體驗(yàn)上和numpy基本是無縫的,切換引擎也不會(huì)造成結(jié)果改變。
- DJL優(yōu)秀的內(nèi)存管理以及效率機(jī)制:DJL擁有自己的資源回收機(jī)制,100個(gè)小時(shí)連續(xù)推理也不會(huì)內(nèi)存溢出。
James Gosling (Java 創(chuàng)始人) 在使用后給出了贊譽(yù):

對(duì)于PyTorch的支持
DJL現(xiàn)已支持PyTorch 1.5。我們深度整合了PyTorch C++ API,開發(fā)了一套JNI提供Java的底層支持。DJL提供各類PyTorch原生算子算法,現(xiàn)在支持所有的 TorchScript模型。
現(xiàn)在可以在 Mac/Linux/Windows全平臺(tái)運(yùn)行DJL PyTorch。DJL具有自檢測(cè)CUDA版本的功能,也會(huì)自動(dòng)采用對(duì)應(yīng)的CUDA版本包來運(yùn)行g(shù)pu任務(wù)。

























