javascript
djl和ljl_使用Spring Boot和DJL进行深度学习
djl和ljl
總覽
這是Spring Boot上的另一篇文章 ,該文章將展示如何使用Deep Java Library (DJL)構(gòu)建示例Web應(yīng)用程序, Deep Java Library (DJL)是Java的開源深度學(xué)習(xí)庫,用于診斷X射線圖像上的COVID-19。
該示例應(yīng)用程序是DJL類似的COVID-19 示例的基于Spring Boot的版本,它具有一個使用Twitter Bootstrap和JQuery構(gòu)建的簡單靜態(tài)HTML頁面,用戶可以將圖像URL提交到REST api,DJL庫將在其中下載圖像和預(yù)測是否是被COVID-19感染的肺部的X射線圖像。
到源代碼的鏈接包含在這篇文章的結(jié)尾。
免責(zé)聲明 :這只是基于https://github.com/ieee8023/covid-chestxray-dataset上的數(shù)據(jù)集的演示應(yīng)用程序,不應(yīng)將其用于實(shí)際醫(yī)學(xué)診斷。
深度Java庫
如前所述, DJL是基于Java的庫,支持多個
深度學(xué)習(xí)框架,例如Apache MxNet , PyTorch和Tensorflow 。 由于大多數(shù)深度學(xué)習(xí)引擎都是使用Python而不是Java構(gòu)建的,因此DJL內(nèi)置了引擎適配器來訪問這些引擎的本機(jī)共享庫。
DJL以一種優(yōu)雅的方式做到了這一點(diǎn),這使得根據(jù)用例從一個框架切換到另一個框架變得非常簡單。
依存關(guān)系
該應(yīng)用程序需要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庫也是如此,因?yàn)槲覒械镁帉慻etter和setter方法:
<code> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency></code>最后是此示例應(yīng)用程序的DJL依賴項(xiàng):
<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應(yīng)用程序,并且看起來像大多數(shù)其他Application類文件:
<code>@SpringBootApplication public class XRayApplication {public static void main(String[] args) { SpringApplication.run(XRayApplication.class, args); }}</code>組態(tài)
為了配置DJL庫,讓我們創(chuàng)建一個帶有@Configuration批注的DjlConfig類。
此類將定義一個ZooModel Spring Bean,它將幫助預(yù)測所提交的圖像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>這段代碼說明的是,我們創(chuàng)建了一個具有BufferedImage輸入和Classifications (稍后會詳細(xì)介紹)輸出類型的XrayTranslator對象,并且它使用XrayTranslator對象將輸入圖像轉(zhuǎn)換為深度學(xué)習(xí)模型正常運(yùn)行所需的格式。
下面是該代碼XrayTranslator這是內(nèi)一個內(nèi)部類DjlConfig :
Covid19服務(wù)
<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服務(wù)
Covid19Service類將處理診斷X射線圖像的業(yè)務(wù)邏輯,令人驚訝的是,它實(shí)際上只有幾行代碼:
<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類中創(chuàng)建的ZooModel bean是自動裝配的,并在具有imageUrl參數(shù)的imageUrl diagnose()方法中使用。
在該方法中,我們使用try-resource塊創(chuàng)建Predictor對象(因?yàn)樵趫?zhí)行后需要關(guān)閉預(yù)測變量),并使用它通過預(yù)先訓(xùn)練的Tensorflow模型運(yùn)行BufferedImage(使用imageUrl參數(shù)創(chuàng)建)。
有關(guān)該模型的更多詳細(xì)信息,請?jiān)L問:https://www.pyimagesearch.com/2020/03/16/detecting-covid-19-in-x-ray-images-with-keras-tensorflow-and-deep-learning/ 。
一旦運(yùn)行diagnostic diagnose()方法, Classifications結(jié)果對象將顯示X射線圖像上的肺部是否被COVID-19感染,以及感染的可能性是多少。
Covid19控制器
控制器類定義了REST API來診斷X射線圖像,這些圖像將由我們的簡單前端應(yīng)用程序消耗:
<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設(shè)計(jì)中,這是一個定義REST API的C ontroller bean。
@RequestMapping注釋告訴Spring此類中所有REST /api/v1路徑都應(yīng)以/api/v1作為前綴,并且所有REST /api/v1將返回application\json響應(yīng)。
我們之前討論的Covid19Service在構(gòu)造函數(shù)中自動裝配,隨后由REST diagnose api在GET /api/v1/covid19/diagnose路徑中使用。
診斷api接受imageUrl請求參數(shù),并返回帶有結(jié)果字符串表示形式的JSON文檔。
前端
Spring Boot應(yīng)用程序具有一個簡單的靜態(tài)index.html文件作為診斷REST api的前端客戶端,它使用Twitter Bootstrap進(jìn)行響應(yīng)式設(shè)計(jì),并使用JQuery進(jìn)行REST api調(diào)用:
<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可能需要一段時間才能做出響應(yīng)。 同時,頁面將顯示一個微調(diào)器,一旦收到響應(yīng),該文本將顯示在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>觸發(fā)表單的imageUrl事件時,代碼獲取imageUrl值,顯示微調(diào)器,從以前的運(yùn)行中清除diagnose div的內(nèi)容,并使用imageUrl調(diào)用診斷REST api。
如果響應(yīng)成功,代碼將隱藏微調(diào)框并在diagnose div中顯示結(jié)果。
發(fā)生錯誤時,代碼還將隱藏微調(diào)框并顯示一般錯誤消息。
運(yùn)行應(yīng)用
該應(yīng)用需要先下載Tensorflow才能運(yùn)行。
在項(xiàng)目根文件夾中運(yùn)行以下命令:
<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進(jìn)行X射線圖像URL的診斷。 要使用的示例圖像:
- COVID-19感染的肺
- 正常肺
總覽
在本教程中,我們回顧了如何使用Spring Boot,DJL和Tensorflow創(chuàng)建示例深度學(xué)習(xí)Java應(yīng)用程序。
該帖子的源代碼位于https://github.com/davidkiss/djl-spring-boot-xray 。
翻譯自: https://www.javacodegeeks.com/2020/05/deep-learning-with-spring-boot-and-djl.html
djl和ljl
總結(jié)
以上是生活随笔為你收集整理的djl和ljl_使用Spring Boot和DJL进行深度学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7电脑出现蓝屏现象并提示nvldd
- 下一篇: 如何提高电脑运行速度如何提高电脑的速度