djl和ljl_使用Spring Boot和DJL进行深度学习

djl和ljl

总览

这是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

djl和ljl

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

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

相关文章

java BigDecimal八种舍入模式

一、BigDecimal介绍java.math.BigDecimal不可变的immutable、任意精度的有符号十进制数。BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成。标度(scale)如果为零或正数&#xff0c;则标度是小数点后的位数。如果为负数&#xff0c;则将该数的非标度值乘以10的…

java国际化——资源包

【0】README 1&#xff09; 本文部分文字描述转自 core java volume 2 &#xff0c; 旨在理解 java国际化——资源包 的基础知识 &#xff1b; 2&#xff09; 本文源代码idea 转自&#xff1a; &#xff08;利用properties 文件进行国际化&#xff09;https://docs.oracle.co…

ui自动化测试测试报告_您需要了解的有关UI测试的所有信息

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

Tomcat解决HTTP GET中文乱码

一、中文乱码原因 Tomcat默认是按ISO-8859-1进行URL解码&#xff0c;ISO-8859-1并未包括中文字符&#xff0c;中文字符不能被正确解析了。 二、配置编码 在tomcat的conf/server.xml下的connetor属性中增加URIEncoding或者useBodyEncodingForURI属性 &#xff08;1&#xff0…

NanoHTTPD web server的一个简单荔枝

【0】README 0.1&#xff09;本文旨在演示一个简单荔枝&#xff0c;以说明如何使用 NanoHTTPD web server 和 浏览器访问 该server的效果 -------------------------------------------------------------- App.java public class App extends NanoHTTPD {public App() thr…

throwable_您想了解的所有Throwable

throwable本文是有关异常的教程。 但不是通常的一种。 其中有许多内容可以告诉您异常的含义&#xff0c;如何抛出异常&#xff0c;捕获异常&#xff0c;已检查异常和运行时异常之间的区别&#xff0c;等等。 没有必要了。 这对您来说也很无聊。 如果没有&#xff0c;那么请阅读…

Linux Tomcat安装

一、linux 安装软件的步骤 &#xff08;1&#xff09;下载软件的压缩包 &#xff08;2&#xff09;解压到指定的目录 &#xff08;3&#xff09;配置环境变量 &#xff0c;配置PATH&#xff08;在任意目录启动&#xff0c;这PATH可以省略&#xff0c;若不配置只有安装目录才…

java分布式对象(RMI+部署使用RMI的程序)

【0】README 1&#xff09;本文文字转自 core java volume 2&#xff0c; 旨在学习 java 分布式对象的相关知识&#xff1b; 2&#xff09; RMI 的实例程序为原创&#xff1b; 3&#xff09; RMI部署步骤的测试用例&#xff0c;参见 http://blog.csdn.net/pacosonswjtu/arti…

java 创建uri_使用UriBuilder快速创建URI

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

Tomcat 服务自动启动

一、配置/etc/rc.local rc.local是linux启动init之后执行的脚本。 sudo vi /etc/rc.local 添加如下一行 /home/myuser/software/apache-tomcat-7.0.29/bin/startup.sh&#xff08;脚本绝对路径&#xff09; 二、sysv-rc-conf 工具配置 1、安装 sysv-rc-conf sudo apt-get …

java分布式对象RMI应用测试用例

【0】README 0.1&#xff09;本文旨在对http://blog.csdn.net/PacosonSWJTU/article/details/50705192 中的代码进行实践&#xff08;如何部署一个使用RMI框架的程序以进行远程调用&#xff09;&#xff1b; 0.2&#xff09; for complete source code, please visit https…

neo4j 迁移_在Kubernetes中迁移Neo4j图模式

neo4j 迁移在零停机时间下运行企业应用程序时&#xff0c;我们需要能够执行数据库架构迁移而又不中断活动用户。 这不仅对于关系数据库很重要&#xff0c;而且对于诸如Neo4J之类的图数据库也很重要&#xff0c;后者不会在write上强制执行架构。 但是&#xff0c;重构图形并使图…

Windows访问Linux的Tomcat,显示无法连接

一、端口占用 先查看tomcat下的logs日志文件&#xff0c;如果现实地址已被占用&#xff0c;则需重新修改端口。 tomcat默认启动的是8080&#xff0c;如果你想修改为80&#xff0c;则需要修改server.xml文件:vim $CATALINA_HOME/conf/server.xml #如果没有配置$CATALINA_HOME&am…

java分布式对象——远程方法中的参数和返回值+远程对象激活

【0】README 1&#xff09;本文文字描述转自 core java volume 2&#xff0c; 旨在学习 java分布式对象——远程方法中的参数和返回值远程对象激活 的相关知识&#xff1b; 【1】远程方法中的参数和返回值 1&#xff09; 在开始进行远程方法调用时&#xff0c;调用参数需要从…

wcf:rest_REST:管理多对多关系

wcf:rest介绍 管理多个资源之间的关系可能是RESTful API的重要组成部分。 在这篇文章中&#xff0c;我们将看到使用REST API可以管理多对多关系。 我们以一个简单的用户 / 组关系为例。 假设用户和组是两个单独的资源&#xff08;例如/ users和/ groups &#xff09;&#xff…

java安全——类加载器+字节码校验+安全管理器与访问权限

【0】README 0.1&#xff09;本文文字描述转自 core java volume 2&#xff0c;旨在学习 java安全 的相关知识&#xff1b; 【1】类加载器 1&#xff09;java 技术提供了以下3种确保安全的机制&#xff08;mechanism&#xff09;&#xff1a; m1&#xff09;语言设计特性&am…

Tomcat的web项目部署方式

一、host配置Context 在tomcat中的conf目录中&#xff0c;在server.xml中的&#xff0c;<host/>节点中添加&#xff1a; <Context path"/app" docBase"D:/myeclipse/firstapp/WebRoot" debug"0" privileged"true" reloadab…

java.rmi.UnmarshalException:errorunmarshalling return; java.lang.ClassNotFoundException的解决方法

1&#xff09;problem 出现 java.rmi.UnmarshalException: error unmarshalling return; nested exception is: java.lang.ClassNotFoundException 异常的原因是&#xff0c;在命令行执行 rmiregistry&#xff0c;并没有指定好 绑定时查找的类文件的路径。 …

javafx 图标_JavaFX技巧32:需要图标吗? 使用Ikonli!

javafx 图标动机 自2013年以来&#xff0c;我一直在编写JavaFX应用程序和库的代码&#xff0c;它们的共同点是&#xff0c;我需要找到可以用于它们的良好图标/图形。 作为前Swing开发人员&#xff0c;我首先使用图像文件&#xff0c;GIF或PNG。 通常&#xff0c;我会从IconExpe…

java安全 ——JAAS(Java 认证和授权服务)开发指南

以下内容转自&#xff1a; http://lyb520320.iteye.com/blog/720478【0】README1&#xff09;本文翻译自&#xff1a;http://java.sun.com/developer/technicalArticles/Security/jaasv2/2&#xff09;传统的JAVA安全机制没有提供必要的架构支持传统的认证和授权&#xff1b;在…