Deep Java Library(四)使用DJL Serving部署JAVA模型 For Windows

1.下载Windows版DJL Serving

Windows版DJL Serving下载地址:
https://publish.djl.ai/djl-serving/serving-0.23.0.zip
下载下来是一个zip压缩包,大约50M左右,目前最新版本为0.23.0

2.安装DJL Serving

解压serving-0.23.0.zip后目录如下
在这里插入图片描述
(1)bin目录是DJL Serving的主目录,里面serving.bat是启动脚本
(2)conf目录是DJL Serving的配置目录,里面我们主要看一下config.properties
这是初始化的config.properties配置

# debug=false
# inference_address=http://127.0.0.1:8080
# management_address=http://127.0.0.1:8080
# management_address=unix:/tmp/management.sock
model_store=models
load_models=ALL
# model_url_pattern=.*
# number_of_netty_threads=0
# job_queue_size=1000
# cors_allowed_origin=*
# cors_allowed_methods=*
# cors_allowed_headers=*
# keystore=conf/keystore.p12
# keystore_pass=changeit
# keystore_type=PKCS12
# private_key_file=conf/key.pem
# certificate_file=conf/certs.pem
# max_request_size=2000485760
# batch_size=1
# max_batch_delay=100

debug=false : 配置debug模式是否开启
inference_address:配置服务API接口访问地址
management_address:配置服务UI界面的访问地址
model_store:配置模型加载位置
load_models:配置模型具体加载路径,具体格式为如下:

[EndpointData]=modelUrl
其中[EndpointData]格式支持四种
1,[modelName]只配置一个模型名称
2,[modelName:version]配置模型名称,模型版本
3,[modelName:version:engine]配置模型名称,模型版本,模型引擎
4,[modelName:version:engine:deviceNames]配置模型名称,模型版本,模型引擎,模型驱动GPU或者CPU
例如:
load_models=[person:v1:MXNet:*]=file:///D:/LIHAOWORK/serving-0.23.0/person.zip
多个模型之间用逗号隔开

本次demo只应用的上述几个配置,剩余的配置说明可以具体查看官网:
https://docs.djl.ai/docs/serving/serving/docs/configuration.html
(3)lib目录是DJL Serving的类包目录
(4)plugins目录是DJL Serving是插件目录
由于DJL Serving默认启动加载插件的位置为bin目录下的plugins目录里面的插件文件,我们可以直接将plugins目录以及里面的插件直接复制到bin目录下
在这里插入图片描述plugins目录里面
在这里插入图片描述

3.启动DJL Serving

Windows下打开cmd
在这里插入图片描述
切换到DJL Serving的bin目录下
在这里插入图片描述
使用serving 启动DJL Serving
在这里插入图片描述
启动日志里面会显示所有的插件已经加载,并且API和UI的地址都是
http://127.0.0.1:8080

4.访问DJL Serving

打开浏览器访问http://127.0.0.1:8080
在这里插入图片描述

5.添加模型引擎依赖jar包

点击系统—>依赖
在这里插入图片描述
点击添加依赖
在这里插入图片描述
选择类型为JAR,方式是file或者maven
在这里插入图片描述
由于本次测试的模型为OnnxRuntime引擎,需要两个依赖包
onnxruntime-1.15.0.jar
onnxruntime-engine-0.23.0.jar
maven的具体依赖为

<dependency><groupId>ai.djl.onnxruntime</groupId><artifactId>onnxruntime-engine</artifactId><version>0.23.0</version><scope>runtime</scope>
</dependency>
<dependency><groupId>com.microsoft.onnxruntime</groupId><artifactId>onnxruntime</artifactId><version>1.15.1</version>
</dependency>

由于公司的网络非常的烂,并且好像这个UI插件的上传对于较大点的jar包有问题,可以直接将需要的jar包拷贝到bin目录下的deps目录,如果没有deps目录就新建一个。
在这里插入图片描述
刷新查看
在这里插入图片描述

6.添加模型包zip文件

在这里插入图片描述
synset文件是模型的ArtifactName文件具体内容如下

person

person.onnx是训练好的模型文件
libs目录里面是包含classes目录最里面是自定义的translator和translatorFactory
在这里插入图片描述

PersonTranslatorFactory类代码如下

import ai.djl.modality.Input;
import ai.djl.modality.Output;
import ai.djl.translate.TranslatorFactory;
import ai.djl.Model;
import ai.djl.translate.Translator;
import ai.djl.util.Pair;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;public class PersonTranslatorFactory implements TranslatorFactory, Serializable {private static final long serialVersionUID = 1L;private static final Set<Pair<Type, Type>> SUPPORTED_TYPES = new HashSet<>();static {SUPPORTED_TYPES.add(new Pair<>(Input.class, Output.class));}/** {@inheritDoc} */@Overridepublic Set<Pair<Type, Type>> getSupportedTypes() {return SUPPORTED_TYPES;}/** {@inheritDoc} */@Override@SuppressWarnings("unchecked")public <I, O> Translator<I, O> newInstance(Class<I> input, Class<O> output, Model model, Map<String, ?> arguments) {if (isSupported(input, output)) {System.out.println("1");return (Translator<I, O>) new PersonTranslator();}throw new IllegalArgumentException("Unsupported input/output types.");}
}

PersonTranslator类代码如下

import ai.djl.modality.Input;
import ai.djl.modality.Output;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
import ai.djl.modality.cv.output.BoundingBox;
import ai.djl.modality.cv.output.DetectedObjects;
import ai.djl.modality.cv.output.Rectangle;
import ai.djl.modality.cv.transform.CenterCrop;
import ai.djl.modality.cv.transform.Resize;
import ai.djl.modality.cv.transform.ToTensor;
import ai.djl.modality.cv.translator.YoloV5Translator;
import ai.djl.ndarray.NDArray;
import ai.djl.ndarray.NDList;
import ai.djl.translate.*;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class PersonTranslator implements ServingTranslator {private final Integer width = 640;private final Integer height = 640;private  final float threshold = 0.2f;//初始化转换器private Translator<Image, DetectedObjects> translator = YoloV5Translator.builder().optThreshold(threshold).optSynsetArtifactName("synset.txt").build();@Overridepublic NDList processInput(TranslatorContext ctx, Input input) throws Exception {byte[] data = input.getAsBytes(0);ImageFactory factory = ImageFactory.getInstance();Image image = factory.fromInputStream(new ByteArrayInputStream(data));NDArray array = image.toNDArray(ctx.getNDManager());Pipeline pipeline = new Pipeline();pipeline.add(new CenterCrop());pipeline.add(new Resize(width, height));pipeline.add(new ToTensor());return pipeline.transform(new NDList(array));}@Overridepublic Output processOutput(TranslatorContext ctx, NDList list) throws Exception {DetectedObjects output = translator.processOutput(ctx, list);List<String> classList = new ArrayList<>();List<Double> probList = new ArrayList<>();List<BoundingBox> rectList = new ArrayList<>();final List<DetectedObjects.DetectedObject> items = output.items();items.forEach(item -> {classList.add(item.getClassName());probList.add(item.getProbability());Rectangle b = item.getBoundingBox().getBounds();Rectangle newBox = new Rectangle(b.getX() / width, b.getY() / height, b.getWidth() / width, b.getHeight() / height);rectList.add(newBox);});Output out = new Output(200, "OK");out.add(new DetectedObjects(classList, probList, rectList).toJson());return out;}@Overridepublic void prepare(TranslatorContext ctx) throws Exception {translator.prepare(ctx);}@Overridepublic Batchifier getBatchifier() {return translator.getBatchifier();}@Overridepublic void setArguments(Map<String, ?> arguments) {}
}

在PersonTranslator中主要是实现ServingTranslator接口,里面我们重写了
processInput和processOutput,其中processInput我们将image处理为NDList,processOutput中我们将结果转为DetectedObjects。
后面我们会专门总结写一下自定义模型上传的形式和种类以及注意事项。
最后将person文件打包成zip包

7.指定自定义模型启动

具体命令如下:
serving -m “person::OnnxRuntime=file:///D:/LIHAOWORK/serving-0.23.0/person.zip”
在这里插入图片描述
在这里插入图片描述
其中标红的地方显示使用我们自定义的工厂。

8.模型测试

点击model
在这里插入图片描述
我们自定义的模型已经READY就绪,点击READY下面三角图标测试,
Data type选择raw,点击上传图片,点击推理
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

测试图片如下:
在这里插入图片描述

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

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

相关文章

StarRocks数据库FE——Catalog层

​仓外挂湖是指以 MPP 数据库为基础&#xff0c;使用可插拔架构&#xff0c;通过开放接口对接外部存储实现统一存储&#xff0c;在存储底层共享一份数据&#xff0c;计算、存储完全分离&#xff0c;实现从强管理到兼容开放存储和多引擎。实现方向为增加存储能力&#xff0c;提升…

微信小程序实现连续签到七天

断签之后会从第一天重新开始 <template><view class"content" style"height: 100vh;background: white;"><view class"back"><view style"position: absolute;bottom: 200rpx;left: 40rpx;width: 90%;"><i…

MySQL 连接查询和存储过程

一、连接查询 mysql的连接查询&#xff0c;通常都是将来自两个或多个表的记录行结合起来&#xff0c;基于这些表之间的共同字段&#xff0c;进行数据的拼接 首先&#xff0c;要确定一个主表作为结果集&#xff0c;然后将其它表的行有选择性的连接到选定的主表结果上&#xff…

stride与padding对输出尺寸的计算

公式&#xff1a; 练习&#xff1a; 图1&#xff1a; input4&#xff0c;filter3&#xff0c;padding0&#xff0c;stride1 output2 图2&#xff1a; input5&#xff0c;filter3&#xff0c;padding0&#xff0c;stride2 output2 图3&#xff1a; input6&#xff0c;filter3&am…

go语言基本操作---五

error接口的使用 Go语言引入了一个关于错误处理的标准模式&#xff0c;即error接口&#xff0c;它是Go语言内建的接口类型 type error interface {Error() string }package mainimport ("errors""fmt" )type Student struct {name stringid int }func …

elementui表格自定义表头的两种方法

表格自定义表头的方式 多选框表头换文字 请查看上篇博客&#xff1a;http://t.csdn.cn/69De2 文字换按钮 render-header render-header方法详情 Table-column Attributes 参数说明类型可选值默认值render-header列标题 Label 区域渲染使用的 FunctionFunction(h, { column, $in…

异常的顶级理解

目录 1.异常的概念与体系结构 1.1异常的体系结构 1.2异常的举例 1.3错误的举例 2.异常的分类 2.1编译时异常 2.2运行时异常 3.异常的处理 3.1异常的抛出throw 3.2try-catch捕获并处理 3.3finally 3.4 异常声明throws 4.自定义异常类 1.异常的概念与体系结构 1.1异常的…

springboot项目实现helloworld

使用Spring官方源创建项目&#xff08;推荐&#xff09; 缺陷&#xff1a;镜像在国外下载速度有点慢 选择配置 选择版本 实现HelloWorld 删除部分不重要的文件 idea隐藏文件 使用云原生的方式创建项目&#xff08;spring官方源&#xff09; 访问地址&#xff1a;Spring Init…

深入理解联邦学习——纵向联邦学习

分类目录&#xff1a;《深入理解联邦学习》总目录 假设进行联邦学习的数据提供方为 A A A和 B B B&#xff0c;第三方为 C C C&#xff0c;则纵向联邦学习步骤如下&#xff1a; 在系统级做加密样本对齐&#xff0c;在企业感知层面不会暴露非交叉用户对齐样本进行模型加密训练&…

Hadoop:HDFS--分布式文件存储系统

目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系&#xff1a; 创建文件夹 -mkdir 查看目录内容 -ls 上传文件到hdfs -put 查看HDFS文件内容 -cat 下载HDFS文件 -get 复制HDFS文件 -cp 追加数据到HDFS文件中 -appendTo…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述

【FusionInsight 迁移】HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述 HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述迁移范围迁移前的准备HDFS文件检查确认HBase迁移目录确保数据落盘停止老集群HBase服务停止新集群HBase服务 HBase从C50迁移到6.5.1&a…

设计模式之观察者模式、访问者模式与模板方法模式

目录 观察者模式 简介 优缺点 结构 实现 运用场景 访问者模式 简介 优缺点 结构 实现 运用场景 模板方法模式 简介 优缺点 结构 实现 运用场景 观察者模式 简介 又叫发布-订阅模式&#xff0c;定义对象间一种一对多的依赖关系&#xff0c;使得每当一个对象改…

vue3自定义指令

自定义指令是用来增强与扩展元素功能的 在vue官方文当中写的很明白,这里我就不在赘述官方文档.只记录在项目中的实际应用. 局部定义 <template><h4>指令</h4><p v-color-red>字体固定颜色的指令</p><p v-color-value"blue">可…

【List篇】ArrayList 详解(含图示说明)

Java中的ArrayList是一个动态数组&#xff0c;可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据&#xff0c;例如String&#xff0c;Integer&#xff0c;Boolean等。ArrayList实现了List接口&#xff0c;可以进行常见的List操作&#xff0c;例如添加、插…

Gridea+GitPage+Gittalk 搭建个人博客

&#x1f44b;通过GrideaGitPage 搭建属于自己的博客&#xff01; &#x1f47b;GitPage 负责提供 Web 功能&#xff01; &#x1f63d;Gridea 作为本地编辑器&#xff0c;方便 push 文章&#xff01; &#x1f3f7;本文讲解如何使用 GrideaGitPage 服务域名&#xff08;可选&a…

原生Js Canvas去除视频绿幕背景

Js去除视频背景 注&#xff1a; 这里的去除视频背景并不是对视频文件进行操作去除背景 如果需要对视频扣除背景并导出可以使用ffmpeg等库&#xff0c;这里仅作播放用所以采用这种方法 由于uniapp中的canvas经过封装&#xff0c;且 uniapp 的 drawImage 无法绘制视频帧画面&…

TOWE雷达光敏感应开关,让生活更智能、更安全

现代生活中&#xff0c;智能家居成为人们追求品质生活的必备之选。其中&#xff0c;照明控制的智能化已然成为一种趋势&#xff0c;传统的灯光开关需要人们手动操作&#xff0c;既不方便&#xff0c;有时候也会造成资源的过度浪费&#xff0c;而雷达光敏感应开关的出现&#xf…

QT之形态学操作

形态学操作包含以下操作&#xff1a; 腐蚀 (Erosion)膨胀 (Dilation)开运算 (Opening)闭运算 (Closing)形态梯度 (Morphological Gradient)顶帽 (Top Hat)黑帽(Black Hat) 其中腐蚀和膨胀操作是最基本的操作&#xff0c;其他操作由这两个操作变换而来。 腐蚀 用一个结构元素…

【MySQL】MySQL的安装,登录,配置和相关命令

文章目录 前言一. 卸载不需要的环境二. 获取MySQL的yum源三. 安装MySQL和启动四. 尝试登录MySQL方法1&#xff1a;获取临时root密码方法2&#xff1a;没有密码方法3&#xff1a;配置文件 五. 简单配置结束语 前言 本篇文章是基于云服务器&#xff1b;Linux&#xff1a;Centos7…

Leetcode.174 地下城游戏

题目链接 Leetcode.174 地下城游戏 hard 题目描述 恶魔们抓住了公主并将她关在了地下城 d u n g e o n dungeon dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公…