javascript
使用Spring Boot和DJL进行深度学习
總覽
這是Spring Boot上的另一篇文章 ,該文章將展示如何使用Deep Java Library (DJL)構建示例Web應用程序, Deep Java Library (DJL)是Java的開源深度學習庫,用于診斷X射線圖像上的COVID-19。
該示例應用程序是DJL的類似COVID-19 示例的基于Spring Boot的版本,它具有一個使用Twitter Bootstrap和JQuery構建的簡單靜態HTML頁面,用戶可以將圖像URL提交到REST api,DJL庫將在其中下載圖像和預測是否是被COVID-19感染的肺部的X射線圖像。
到源代碼的鏈接包含在這篇文章的結尾。
免責聲明 :這只是基于https://github.com/ieee8023/covid-chestxray-dataset上的數據集的演示應用程序,不應將其用于實際醫學診斷。
深度Java庫
如前所述, DJL是基于Java的庫,支持多個
深度學習框架,例如Apache MxNet , PyTorch和Tensorflow 。 由于大多數深度學習引擎都是使用Python而不是Java構建的,因此DJL內置了引擎適配器來訪問這些引擎的本機共享庫。
DJL以一種優雅的方式做到了這一點,使得根據用例從一個框架切換到另一個框架變得非常簡單。
依存關系
該應用程序需要Spring Boot Web Starter:
<code> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency></code>還有commons-io庫,用于一些基本的I / O操作:
<code> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency></code>Lombok庫也是如此,因為我懶得編寫getter和setter方法:
<code> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency></code>最后是此示例應用程序的DJL依賴項:
<code> <dependency> <groupId>ai.djl</groupId> <artifactId>api</artifactId> <version>${ai.djl.version}</version> </dependency> <dependency> <groupId>ai.djl.tensorflow</groupId> <artifactId>tensorflow-api</artifactId> <version>${ai.djl.version}</version> </dependency> <dependency> <groupId>ai.djl.tensorflow</groupId> <artifactId>tensorflow-engine</artifactId> <version>${ai.djl.version}</version> </dependency> <dependency> <groupId>ai.djl.tensorflow</groupId> <artifactId>tensorflow-native-auto</artifactId> <version>${tensorflow-native-auto.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>${jna.version}</version> <!-- overrides default spring boot version to comply with DJL --> </dependency></code>這是DJL依賴版本所需的Maven屬性列表:
<code> <properties> <java.version>1.8</java.version> <ai.djl.version>0.5.0</ai.djl.version> <jna.version>5.3.0</jna.version> <tensorflow-native-auto.version>2.1.0</tensorflow-native-auto.version> </properties></code>XRayApplication類
此類的main()方法將啟動Spring Boot應用程序,并且看起來像大多數其他Application類文件:
<code>@SpringBootApplication public class XRayApplication {public static void main(String[] args) { SpringApplication.run(XRayApplication.class, args); }}</code>組態
為了配置DJL庫,讓我們創建一個帶有@Configuration批注的DjlConfig類。
此類將定義一個ZooModel Spring Bean,它將幫助預測所提交的圖像URL是否屬于受COVID-19感染的肺:
<code> @Bean public ZooModel xrayModel() throws Exception { Criteria<BufferedImage, Classifications> criteria = Criteria.builder() .setTypes(BufferedImage.class, Classifications.class) .optTranslator(new XrayTranslator()) .build();return ModelZoo.loadModel(criteria); }</code>這段代碼說明的是,我們創建了一個帶BufferedImage輸入和Classifications (稍后會詳細介紹)輸出類型的XrayTranslator對象,并且它使用XrayTranslator對象將輸入圖像轉換為深度學習模型正常運行所需的格式。
下面是該代碼XrayTranslator這是內一個內部類DjlConfig :
Covid19服務
<code> public static final class XrayTranslator implements Translator<BufferedImage, Classifications> {private static final List<String> CLASSES = Arrays.asList("covid-19", "normal");@Override public NDList processInput(TranslatorContext ctx, BufferedImage input) { NDArray array = BufferedImageUtils.toNDArray( ctx.getNDManager(), input, NDImageUtils.Flag.COLOR); array = NDImageUtils.resize(array, 224).div(255.0f); return new NDList(array); }@Override public Classifications processOutput(TranslatorContext ctx, NDList list) { NDArray probabilities = list.singletonOrThrow(); return new Classifications(CLASSES, probabilities); } } </code>Covid19服務
Covid19Service類將處理診斷X射線圖像的業務邏輯,并且您會發現,令人驚訝的是,實際上只有幾行代碼:
<code>@Service public class Covid19Service {@Autowired private ZooModel xrayModel;public String diagnose(String imageUrl) { try (Predictor<BufferedImage, Classifications> predictor = xrayModel.newPredictor()) { Classifications result = predictor.predict(BufferedImageUtils.fromUrl(imageUrl)); return "Diagnose: " + result.best().getClassName() + " , probability: " + result.best().getProbability(); } catch (Exception e) { throw new RuntimeException("Failed to diagnose", e); } } }</code>在DjlConfig類中創建的ZooModel bean是自動裝配的,并在具有imageUrl參數的imageUrl diagnose()方法中使用。
在該方法中,我們使用try-resource塊創建Predictor對象(因為在執行后需要關閉預測變量),并使用它通過預先訓練的Tensorflow模型運行BufferedImage(使用imageUrl參數創建)。
有關該模型的更多詳細信息,請訪問:https://www.pyimagesearch.com/2020/03/16/detecting-covid-19-in-x-ray-images-with-keras-tensorflow-and-deep-learning/ 。
一旦運行diagnostic diagnose()方法, Classifications結果對象將顯示X射線圖像上的肺部是否被COVID-19感染,以及感染的可能性是多少。
Covid19控制器
控制器類定義了REST API來診斷X射線圖像,這些圖像將由我們的簡單前端應用程序消耗:
<code>@RestController @RequestMapping(value = "/api/v1", produces = MediaType.APPLICATION_JSON_VALUE) public class Covid19Controller { private final Covid19Service covid19Service;public Covid19Controller(Covid19Service covid19Service) { this.covid19Service = covid19Service; }@GetMapping("/covid19/diagnose") public ResponseEntity diagnose(@RequestParam String imageUrl) { String answer = covid19Service.diagnose(imageUrl); return ResponseEntity.ok(Collections.singletonMap("result", answer)); } }</code>@RestController注釋告訴Spring在我們的MVC設計中,這是一個定義REST API的C ontroller bean。
@RequestMapping注釋告訴Spring此類中所有REST /api/v1路徑都應以/api/v1作為前綴,并且所有REST /api/v1將返回application\json響應。
我們之前討論的Covid19Service在構造函數中自動裝配,隨后由REST diagnose api在GET /api/v1/covid19/diagnose路徑中使用。
診斷api使用imageUrl請求參數,并返回帶有結果字符串表示形式的JSON文檔。
前端
Spring Boot應用程序具有一個簡單的靜態index.html文件作為診斷REST api的前端客戶端,它使用Twitter Bootstrap進行響應式設計,并使用JQuery進行REST api調用:
<code><head> <link rel="stylesheet" href="/css/bootstrap.min.css"/> <script src="/js/jquery.min.js"></script> </head></code>該文件具有HTML表單,可以捕獲用戶的X射線圖像URL:
<code> <form id="diagnoseForm" class="mb-4"> <div class="input-group"> <input type="url" id="imageUrl" class="form-control" required placeholder="Enter a image url" aria-label="Image URL"> <div class="input-group-append"> <button class="btn btn-outline-primary">Submit</button> </div> </div> </form></code>提交表單后,REST API可能需要一段時間才能做出響應。 同時,頁面將顯示微調器,一旦收到響應,文本將顯示在diagnose div中:
<code> <div class="row ml-1"> <div id="spinnerDiagnose" class="text-primary" role="status"> <span class="sr-only">Loading...</span> </div> <div id="diagnose"></div> </div></code>參見下面的javascript代碼:
<code>$( "#diagnoseForm" ).submit(function( event ) { const imageUrl = $('#imageUrl').val(); $('#spinnerDiagnose').addClass('spinner-border'); $('#diagnose').html('');$.ajax('/api/v1/covid19/diagnose?imageUrl='+imageUrl) .done(data => { $('#spinnerDiagnose').removeClass('spinner-border'); $('#diagnose').html(data.result); }) .fail(err => { $('#spinnerDiagnose').removeClass('spinner-border'); $('#diagnose').html('Failed to get answer'); }); event.preventDefault(); });</code>觸發表單的imageUrl事件時,代碼獲取imageUrl值,顯示微調器,從先前的運行中清除diagnose div的內容,并使用imageUrl調用診斷REST api。
如果響應成功,代碼將隱藏微調框并在diagnose div中顯示結果。
發生錯誤時,代碼還將隱藏微調框并顯示一般錯誤消息。
運行應用
該應用需要先下載Tensorflow才能運行。
在項目的根文件夾中運行以下命令:
<code>mkdir models cd models curl https://djl-tensorflow-javacpp.s3.amazonaws.com/tensorflow-models/covid-19/saved_model.zip | jar xv cd .. ./mvnw spring-boot:run -Dai.djl.repository.zoo.location=models/saved_model</code>然后訪問http:// localhost:8080 / index.html進行X射線圖像URL的診斷。 要使用的示例圖像:
- COVID-19感染的肺
- 正常肺
總覽
在本教程中,我們回顧了如何使用Spring Boot,DJL和Tensorflow創建示例深度學習Java應用程序。
該帖子的源代碼位于https://github.com/davidkiss/djl-spring-boot-xray 。
翻譯自: https://www.javacodegeeks.com/2020/05/deep-learning-with-spring-boot-and-djl.html
總結
以上是生活随笔為你收集整理的使用Spring Boot和DJL进行深度学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 化妆品非特殊备案查询(化妆品非特殊备案)
- 下一篇: java ee的小程序_Java EE