Deep Java Library(五)DJLServing java client demo

news2024/11/18 9:43:36

1.工具类HttpUtils

package com.lihao.client;
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.Map;

public class HttpUtils {

    /**
     *
     * @param url API地址
     * @param params 参数
     * @param contentType 响应类型
     * @param data 二进制参数
     * @param file 文件参数
     * @return
     * @throws IOException
     * @throws InterruptedException
     */
    public static String postRequest(String url, Map<String,String> params, String contentType, byte[] data, Path file) throws IOException, InterruptedException {

        //初始化client
        HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();

        //初始化builder
        HttpRequest.Builder builder = HttpRequest.newBuilder();

        //处理自定义参数
        if (params != null) {
            int i = 0;
            StringBuilder sb = new StringBuilder(url);
            sb.append("?");
            for (Map.Entry<String, String> entry : params.entrySet()) {
                if (i > 0) {
                    sb.append("&");
                }
                sb.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8));
                sb.append("=");
                sb.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
                i++;
            }
            url = sb.toString();
        }
        //构造请求url+参数
        builder.uri(URI.create(url));

        //设置响应类型
        if (contentType != null) {
            builder.header("Content-Type", contentType);
        }

        if (data != null) {//处理二进制参数
            builder.POST(HttpRequest.BodyPublishers.ofByteArray(data));
        } else if (file != null) {//处理文件参数
            builder.POST(HttpRequest.BodyPublishers.ofFile(file));
        } else {
            builder.POST(HttpRequest.BodyPublishers.noBody());
        }

        //初始化request
        HttpRequest request = builder.build();
        //发送请求
        HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
        //处理响应
        String result = new String(response.body(), StandardCharsets.UTF_8);
        //结果返回
        return result;

    }
}

2.注册模型RegisterDemo

package com.lihao.client;

import java.util.Map;

public class RegisterDemo {
    public static void main(String[] args) throws Exception {
        // 模型地址
        String url = "file:///D://LIHAOWORK//serving-0.23.0//person-test.zip";
        //构造参数
        Map<String, String> params = Map.of("url", url, "modelName","person-test","engine", "OnnxRuntime");
        //注册模型
        String response = HttpUtils.postRequest("http://127.0.0.1:8080/models", params, null, null, null);
        System.out.println(response);
    }
}

运行结果,显示"status": "Model “person_test” registered."模型已经注册
在这里插入图片描述
查看模型状态和访问地址
在这里插入图片描述

3.模型推理PredictDemo

package com.lihao.client;

import java.nio.file.Path;

public class PredictDemo {
    public static void main(String[] args) throws Exception {
        String url = "http://127.0.0.1:8080/predictions/person_test/";
        String response = HttpUtils.postRequest(
                                                url,
                                                null,
                                                "application/octet-stream",
                                                null,
                                                Path.of("D:\\LIHAOWORK\\serving-0.23.0\\ren.jpg"));
        System.out.println(response);
    }
}

推理结果
在这里插入图片描述
通过结果绘制原图片

4.模型推理PredictDemo

将PredictDemo更改了一下,增加了随机抽帧一张图片,进行推理,将推理结果进行绘制,最后将绘制后的图片展示出来。

package com.lihao.client;

import ai.djl.modality.cv.BufferedImageFactory;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.output.BoundingBox;
import ai.djl.modality.cv.output.DetectedObjects;
import ai.djl.modality.cv.output.Point;
import ai.djl.modality.cv.output.Rectangle;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.bytedeco.ffmpeg.global.avutil;
import org.bytedeco.javacv.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class PredictDemo {
    public static void main(String[] args) throws Exception {
        String path = getImage();
        String url = "http://127.0.0.1:8080/predictions/person_test/";
        String response = HttpUtils.postRequest(
                url,
                null,
                "application/octet-stream",
                null,
                Path.of(path));
        System.out.println(response);


        DetectedObjects result = str2DetectedObjects(response);
        Image image = BufferedImageFactory.getInstance().fromFile(Path.of(path));
        image.drawBoundingBoxes(result);
        CanvasFrame canvasFrame = new CanvasFrame("摄像机");
        canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvasFrame.setAlwaysOnTop(true);
        canvasFrame.showImage(image2Frame(image));
    }

    /**
     * 获取一张图片,返回图片路径
     * @return
     */
    private static String  getImage() {
        FFmpegFrameGrabber grabber = null;
        try {
            grabber = FFmpegFrameGrabber.createDefault("rtsp://admin:admin1234@192.168.66.150:554/cam/realmonitor?channel=12&subtype=1");
            grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式
            grabber.setOption("stimeout", "5000000");
            grabber.setPixelFormat(avutil.AV_PIX_FMT_RGB24);  // 像素格式
            grabber.setImageWidth(640);
            grabber.setImageHeight(640);
            grabber.setFrameRate(30);
            grabber.start();
            Frame frame = grabber.grabFrame();//抽取一帧
            Image image = frame2Image(frame);
            String name = UUID.randomUUID().toString();
            String path = "D:\\LIHAOWORK\\serving-0.23.0\\"+ name+".jpg";
            OutputStream os = new FileOutputStream(new File(path));
            image.save(os,"jpg");
            return path;
        } catch (FFmpegFrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * str2DetectedObjects
     *
     * @param str
     * @return
     */
    private static DetectedObjects str2DetectedObjects(String str) {
        List<JSONObject> jsons = JSONObject.parseArray(str, JSONObject.class);
        List<String> classList = new ArrayList<>();
        List<Double> probList = new ArrayList<>();
        List<BoundingBox> rectList = new ArrayList<>();
        jsons.forEach(item -> {
            classList.add(item.getString("className"));
            probList.add(item.getDouble("probability"));
            JSONObject b = item.getJSONObject("boundingBox");
            List<Point> corners = JSON.parseArray(b.getString("corners"), Point.class);
            Rectangle newBox = new Rectangle(corners.get(0), b.getDouble("width"), b.getDouble("height"));
            rectList.add(newBox);
        });
        DetectedObjects r = new DetectedObjects(classList, probList, rectList);
        return r;
    }

    /**
     * image2Frame
     *
     * @param image
     * @return
     */
    private static Frame image2Frame(Image image) {
        BufferedImage temp = (BufferedImage) image.getWrappedImage();
        Frame frame = Java2DFrameUtils.toFrame(temp);
        return frame;
    }

    /**
     * frame2Image
     *
     * @param frame
     * @return
     */
    private static Image frame2Image(Frame frame) {
        BufferedImage temp = Java2DFrameUtils.toBufferedImage(frame);
        Image image = BufferedImageFactory.getInstance().fromImage(temp);
        return image;
    }
}

5.模型注销UnregisterDemo

package com.lihao.client;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;

public class UnregisterDemo {
    public static void main(String[] args) throws Exception {
        String url = "http://127.0.0.1:8080/models/person_test/";
        HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1).build();
        HttpRequest.Builder builder = HttpRequest.newBuilder();
        builder.uri(URI.create(url));
        builder.DELETE();
        HttpRequest request = builder.build();
        HttpResponse<byte[]> response =
                client.send(request, HttpResponse.BodyHandlers.ofByteArray());
        System.out.println(new String(response.body(), StandardCharsets.UTF_8));
    }
}

在这里插入图片描述

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

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

相关文章

2023 年高教社杯全国大学生数学建模竞赛题目 A 题 定日镜场的优化设计

A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c;是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站&#xff08;以下简称塔式电站&#xff09;收集太阳能的基…

WorkPlus Meet白板和文档共享功能上线,私有化视频会议全新升级

在迅猛发展的数字化时代&#xff0c;私有化视频会议成为企业高效沟通和协作的关键工具。WorkPlus Meet作为领先品牌&#xff0c;倾力打造私有化视频会议平台&#xff0c;并且最新上线了全新的白板和文档共享模块。本文将重点介绍WorkPlus Meet如何通过创新功能和稳定性&#xf…

金蝶迷路“云”丛中

​ 来源 | 科技新知 作者 | 樟稻 在云转型的浪潮中&#xff0c;金蝶曾一度领先用友数年&#xff0c;如今却在大模型上出现被逆转的迹象。 8月&#xff0c;金蝶推出自主研发的金蝶云苍穹GPT大模型&#xff0c;号称填补了国内第一个财务大模型的空白。而此前&#xff0c;用友…

【Axure教程】中继器网格拖动摆放

拖动摆放图标在移动端操作中扮演了重要的角色&#xff0c;允许用户自定义其设备的界面&#xff0c;使其更符合其偏好和使用习惯。这可以提高用户对设备的满意度和舒适度&#xff0c;将最常用的应用放置在易于访问的位置&#xff0c;从而提高使用效率。所以拖动摆放这类型操作不…

【区块链 | IPFS】IPFS节点搭建、文件上传、节点存储空间设置、节点上传文件chunk设置

一、创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点 本文有些命令已经执行过了&#xff0c;就没有重新初始化。部分图片拷贝自先前文档&#xff0c;具体信息应以实物为准 ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2048-bit RSA keypair.…

Android Room数据库LiveData与ViewModel结合使用详解

Android Room是Android开发中的一个持久性库处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的使用场景是缓存相关的数据&#xff0c;这样一来&#xff0c;当设备无法访问网络时&#xff0c;用户仍然可以在离线状态下浏览该内容。 Room 持久性库在 SQLite …

使用vlookup函数将数据复制粘贴进筛选后的表中

1、待筛选表A 2、待复制的数据表B 3、筛选表A(性别男)。点击表A内的任意单元格&#xff0c;然后按下筛选的快捷键是ctrlshiftL 4、这是如果复制表B的奖金列&#xff0c;然后粘贴进表A的奖金列&#xff0c;出现这样情况 明显不对&#xff0c;而且少了一个(其实是453顺序粘贴到女…

uni-app 折叠自定义

uni-app的uni-collapse折叠组件样式修改 下面是修改后的样式 <uni-collapse accordion class"ze" v-model"isCollapse" click"toggleCollapse"><!-- 因为list默认带一条分隔线&#xff0c;所以使用 titleBorder"none" 取消…

windows打包uniapp应用p12证书和证书profile文件的制作方法

参考文章1&#xff1a; uniapp打包ios app所需的证书的制作流程-腾讯云开发者社区-腾讯云使用uniapp进行开发&#xff0c;既可以打包小程序&#xff0c;也可以打包app&#xff0c;假如需要打包app&#xff0c;需要p12格式的证书和一个证书profile文件&#xff0c;这个在uniapp…

算法通关村17关 | 盘点面试大热门之区间问题

1. 判断区间是否重叠 题目 LeetCode252 给定一个会议时间安排的数组intervals&#xff0c;每个会议时间都包括开始和结束时间&#xff0c;intervals[i] [start, endi],请你判断一个人是否能参加这里面的全部会议。 思路 遍历所有区间&#xff0c;判断下个区间开始是否小于上…

极轨气象卫星数据中的蝴蝶结(BOW-TIE)处理

李国春 极轨气象卫星多为多扫描单元&#xff08;比方10个SCAN&#xff09;与卫星轨道垂直方向并行扫描。这就像冬天下雪我们拿个笤帚扫院子&#xff0c;一边往前走一边往两边扫。由于极轨气象卫星扫描刈幅&#xff08;SWATH&#xff09;宽、探测距离越往边缘越长&#xff0c;加…

便捷高效的电能管理:利用PLC远程控制网关实时监控配电箱

配电箱是工业生产过程中必不可少的设备&#xff0c;其中的PLC&#xff08;可编程逻辑控制器&#xff09;是实现自动化控制的重要组成部分。为了实时监控配电箱的数据&#xff0c;并进行远程调试上下载与管理控制&#xff0c;我们可以使用PLC数据采集与远程控制网关。 PLC数据采…

RK3588烧录和环境部署

RK3588相关烧录固件请到firefly官网下载&#xff0c;firefly下载地址&#xff0c;环境配置步骤详细说明&#xff1a; 第1步&#xff1a;在win10下安装DriverAssitant目录下的名为DriverInstall.exe的驱动助手&#xff1b; 第2步&#xff1a;运行在RKDevTool目录下的RKDevTool.e…

monkey命令的使用

一、monkey的概念 Monkey是Android中的一个命令行工具&#xff0c;可以运行在模拟器里或者现实设备中&#xff0c;向系统发送伪随机的用户事件流&#xff08;点击、滑动、Application切换、横竖屏、应用关闭&#xff09;实现对正在开发的应用程序进行压力测试。monkey测试是一…

智慧公厕是将数据、技术、业务深度融合的公共厕所敏捷化“操作系统”

文明社会的进步离不开公共设施的不断创新和提升。而在这些公共设施中&#xff0c;公共厕所一直是一个备受关注和改善的领域。近年来&#xff0c;随着智慧城市建设的推进&#xff0c;智慧公厕成为了城市管理的重要一环。智慧公厕不仅仅是为公众提供方便和舒适的便利设施&#xf…

效率翻倍:使用 ERP 系统自动执行这 5 项任务

现代商业的特点是企业各个方面都在快速发展&#xff0c;几乎每个想要成功的企业都会面临集成软件解决方案以改善其运营的必要性。保持竞争优势并减少生产所需的资源量对于成功很关键。这就是为什么在业务流程自动化方面&#xff0c;**ERP系统**大有可为。 以下是企业可以从 ER…

安卓应用的MD5、SHA1值和公钥可以这样知道

安卓应用的MD值、SHA1和android公钥&#xff0c;对于没有了解过非对称对称加密&#xff0c;不了解数字证书原理的运维工程师或者前端工程师来说&#xff0c;简直是天书&#xff0c;摸索半天都不知道是什么东西&#xff0c;特别是现在上架需要备案&#xff0c;而备案又要求填写这…

深信服应用交付管理系统远程命令执行漏洞复现

文章目录 深信服应用交付管理系统远程命令执行漏洞复现0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 深信服应用交付管理系统远程命令执行漏洞复现 0x01 前言 本次测试仅供学习使用&#xff0c;如若非法他用&#xff0c;与本…

London Dock丨伦敦一区的房产明星,拥揽泰晤士河美景,尽享都市奢华生活

生活在伦敦一区&#xff0c;似乎就意味跻身上流阶层 皆是精英环绕&#xff0c;也为下一代创造了极好的社区氛围 所谓“一方水土养一方人”&#xff0c;泰晤士河穿过的伦敦 也孕育着伦敦人的礼貌绅士与严谨认真。 河流&#xff0c;是城市发展的源头。 源远流长的塞纳河&…

极坐标转化

在数学中&#xff0c;极坐标系是一个二维坐标系统。该坐标系统中任意位置可由一个夹角和一段相对原点—极点的距离来表示。极坐标系的应用领域十分广泛&#xff0c;包括数学、物理、工程、航海、航空以及机器人领域。两点间的关系用夹角和距离很容易表示时&#xff0c;极坐标系…