使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ad域管理与维护_U-Mail邮件系统LDAP/AD同步极大提升办公效率

每一位办公族&#xff0c;可能都遇到过这样的问题&#xff1a;1、随着信息化高速发展和企业“互联网”的深入&#xff0c;越来越多的办公平台和软件被开发出来&#xff0c;正如移动互联网端APP应用层出不穷一样&#xff0c;给人们带来了极大地便利性。2、凡事有利有弊&#xff…

r java_如何在R中使用JAVA写的程序包?

不过我对 Java 真的不太熟悉&#xff0c;按照教程调用这个 LLDA 包之后只会使用 inferencer。如果你不嫌麻烦可以考虑先用 Java 计算出结果&#xff0c;然后在 R 中载入这些结果.具体步骤如下&#xff1a;0 - 文件夹 JGibbLDA-v.1.0 放在 R 的工作目录下。1 - 用 JDK 和他提供的…

c语言c99标准_C语言的灵魂指针,配合这个新增的关键字,能够生成更高效的程序...

正如我前面的文章提到的&#xff0c;C语言虽然已经比较成熟&#xff0c;但是近些年来也是有所发展的——比如增加了许多新特性。遗憾的是&#xff0c;可能因为C语言程序员的工资比不过互联网程序员&#xff0c;国内很多教材比较老旧&#xff0c;几乎不涉及近些年来C语言新增的新…

java ee的小程序_Java EE 8 –为更多设备提供更多应用程序

java ee的小程序如果我不喜欢夏天的一件事&#xff0c;那就是事实是没有太多要分享或谈论的新闻。 谁决定将Java Day Tokyo置于今年的这个无聊的时间里&#xff0c;做得很好&#xff0c;并给了我一个写关于新的和即将到来的Java EE 8规范的博客帖子的机会&#xff0c;其中丰富了…

java随机姓名_Java生成随机姓名、性别和年龄的实现示例

一、定义实体类Person&#xff0c;封装生成的数据package net.dc.test;public class Person {private String name;private String sex;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public String getSex() {r…

matlab 图像 幅度谱 低通滤波_数字图像处理期末复习2018-12-21

数字图像处理期末复习2018-12-21愉快先生0.204字数 5547 阅读 18342018-12-22 19:35(数字图像冈萨雷斯第二版教材)一、基本原理图像的读取、存储操作&#xff1a;i imread(filename) ; imwrite(i,’image.jpg’); 图像显示的⽅法及区别&#xff1a;imshow(i); imshow(i,[]);%0…

带有HttpClient的自定义HTTP标头

在Apache HTTPClient请求中设置自定义HTTP标头的快速指南。 在HttpRequest上&#xff0c;调用setHeader&#xff08;&#xff09;方法以将HttpHeaders内容类型设置为JSON。 适用于各种版本的HttpClient&#xff08;4.3之前和之后&#xff09;。 1.简介 在本教程中&#xff0c;…

java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

package com.yc.test;import java.util.ArrayList;import java.util.List;import com.yc.tree.ThreeLinkBinTree;import com.yc.tree.ThreeLinkBinTree.Node;/**** author wb**遍历二叉树指的是按某种规律依次访问二叉树的每个节点&#xff0c;对二叉树的遍历过程就是将非线性结…

大话oraclerac集群、高可用性、备份与恢复_Oracle RAC结构

Oracle RAC结构Oracle真正集群的出现是在Oracle公司收购Rdb并吸收了相关技术优势后&#xff0c;才正在推出了属于自己的RAC集群解决方案。RAC​和集群分类章节提到的集群系统有很多相似之处&#xff0c;从下图我们大概了解一下RAC集群的层次结构和所需的软硬件环境。Oracle Rac…

java obix_obix协议在java中的配置和使用详解

前言本文主要给大家介绍的是关于obix协议在java中的配置和使用&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说了&#xff0c;来一起看看详细的介绍吧。什么是 oBIX?简单来讲&#xff0c;obix是一种 XML 通讯协议&#xff0c;使用Http Request/Post方式进行数据通…

java7和java8切换_仍不切换到Java 8的6个理由

java7和java8切换Java 8很棒。 期。 但是……在我们有机会玩耍并玩弄它之后&#xff0c;就该退出了&#xff0c;避免吃盐。 所有的好东西都是有代价的&#xff0c;在这篇文章中&#xff0c;我将分享Java 8的主要痛点。请确保在升级和释放7之前您已经意识到了这些痛点。 1.并行…

python求阶乘之和_python计算阶乘前n项和

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 知道公式后就很简单了&#xff0c;利用for循环&#xff0c;第几行i1就等于几&#xff0c;当然python中是没有…

您需要了解的有关UI测试的所有信息

让我们从一个问题开始。 用户在网站上进行互动的第一件事是什么&#xff1f; 接口&#xff0c;当然。 网站的外观是在用户身上产生“第一印象”的第一件事。 交互式Web应用程序可以为用户带来成败&#xff0c;这就是为什么越来越多的人选择对其Web应用程序进行UI测试的原因。 …

python docx库使用样例_Python docx库用法示例分析

本文实例分析了Python docx库用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 打开及保存文件&#xff1a; from docx import Document document Document(test.docx) document.save(test.docx) 添加文本&#xff1a; document.add_paragraph(test text) 调整文本…

使用java理解程序逻辑试卷_《使用Java理解程序逻辑》试题分析

1、在Java中&#xff0c;一下方法属于String类的有()A&#xff1a;insert(int offset,char [] c);B&#xff1a;replace(int start,int end String str);C&#xff1a;split(String regex);D&#xff1a;endsWith(String suffix);正确答案&#xff1a;C、D解析&#xff1a;A&am…

python合并word单元格_python之DataFrame实现excel合并单元格_python

这篇文章主要为大家详细介绍了python之DataFrame实现excel合并单元格&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 在工作中经常遇到需要将数据输出到excel&#xff0c;且需要对其中一些单元格进行合并&#xff0c;比如如下表表格&#xff0c;需要…

java做服务器端给客户端传数据包_java 服务器怎样给客户端传输数据

展开全部服务器端源码&#xff1a;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.Se…

pooled-jms_Hibernate隐藏的宝石:pooled-lo优化器

pooled-jms介绍 在这篇文章中&#xff0c;我们将揭示一个序列标识符生成器&#xff0c;​​它结合了标识符分配效率和与其他外部系统的互操作性&#xff08;同时访问底层数据库系统&#xff09;。 传统上&#xff0c;有两种序列标识符策略可供选择。 序列标识符&#xff0c;对…

apache geode项目结构_Apache Flink-基于Java项目模板创建Flink应用(流计算和批计算)...

Apache Flink创建模板项目有2种方式&#xff1a;1. 通过Maven archetype命令创建&#xff1b;2. 通过Flink 提供的Quickstart shell脚本创建&#xff1b;关于Apache Flink的环境搭建&#xff0c;请参考相关链接&#xff1a;Apache Flink快速入门-基本架构、核心概念和运行流程A…

使用UriBuilder快速创建URI

如果您有权访问JAX-RS API和项目中的实现&#xff08;很多这样做&#xff09;&#xff0c;则可以使用JAX-RS的UriBuilder通过使用可解析占位符的构建器模式方便地创建URI。 看下面的例子&#xff1a; String host System.getProperty( "host" , "localhost&qu…