Deep Java Library(五)DJLServing java client demo

2023-11-17

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));
    }
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Deep Java Library(五)DJLServing java client demo 的相关文章

随机推荐

  • 关于压力测试的思路

    思路 把压力测试 SQL优化 MEMCACHED优化 SQL压力测试等进行模拟样例测试 并形成一系列办法 为以后可能出现的情况准备我们的知识储备 当然 就目前而言我们的小系统不需要这样的那样的优化 可能只能提升不到一毫秒 但我们是在整理办法
  • Spring Cloud 使用 @RefreshScope 注解配置动态刷新

    一 RefreshScope动态刷新原理 在SpringIOC中 BeanScope Bean的作用域 影响了Bean的管理方式 Bean的作用域 例如创建Scope singleton的Bean时 IOC会保存实例在一个Map中 保证这个
  • Windows下编译caffe

    Windows下编译caffe 最近在windows上重新部署了下caffe 发现微软对提供的caffe做了很多改进 解决了很多编译配置的bug 程序下载caffe依赖包NugetPackages和编译速度也快了很多 现在上手caffe算是
  • QT设置引用路径问题

    在Linux中添加动态库路径可以设置LD LIBRARY PATH路径 如添加 mylib动态库路径 export LD LIBRARY PATH mylib LD LIBRARY PATH 除了上面方法外 我们还可以使用编译参数 Wl r
  • 2. 合并两个有序数组

    2 合并两个有序数组 题目描述 解题思路 代码 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums
  • 解决python脚本连接终止问题_python – MaxRetryError:HTTPConnectionPool:超出最大重试次数(由ProtocolError引起(‘连接中止.’,错误(111,...

    我有一个问题 我想测试 选择 和 输入 我可以像下面的代码一样编写它 原始代码 12 class Sinaselecttest unittest TestCase 13 14 def setUp self 15 binary Firefox
  • 在计算机“.”上没有找到服务W3SVC。(http)/在计算机上没有找到服务WAS

    在配置完Windows下的IIS服务之后 新建了一个网站 却不能启动 错误提示是 在计算机 上没有找到服务W3SVC http 和在计算机上没有找到服务WAS 解决办法 打开电脑控制面板 gt 程序 gt 程序和功能 gt 启用或关闭win
  • Solidity 文档--目录

    Solidity是一种语法类似JavaScript的高级语言 它被设计成以编译的方式生成以太坊虚拟机代码 在后续内容中你将会发现 使用它很容易创建用于投票 众筹 封闭拍卖 多重签名钱包等等的合约 注意 目前尝试Solidity的最好方式是使
  • 音乐软件案例分析

    项目 内容 这个作业属于哪个课程 2023年北航敏捷软件工程 这个作业的要求在哪里 软件案例分析 我在这个课程的目标是 学习软件工程理论 在实践中体会并运用软件工程理论 收获团队开发和软件工程实践经验 这个作业在哪个具体方面帮助我实现目标
  • Unity3D 新版动画状态机Animator中的动画速度控制

    这个问题纠结了我挺久 在网上各种找相关帖子看 一直没有找到合适的设置方法 后来终于自己在状态机里面找到了处理方法 原来的Animation动画速度是这样控制 但是现在新版动画你在点进去看你会发现这货现在是灰色的 所以特别慌是吧 但是这货不使
  • MFS高可用(pcs集群管理与fence自动跳电重启)

    server1 master server4 高可用 serever 2 3 chunk 真机 client 具体查看上片文章 server1 yum install moosefs cgi 3 0 103 1 rhsystemd x86
  • Unity3d版数字地球、谷歌地球(google earth)

    说明 这个不是GIS软件 是一个带地形的三维地球 可在线加载全球地形 也可离线运行 运行流畅无卡顿 占用内存小 最大等级可达到地图20级 本数字地球全部由作者自由开发完成 未使用任何第三方插件 拥有完全知识产权 视频Unity3d版数字地球
  • GPU计算能力远超CPU!NVIDIA Tesla技术深入解析

    CPU和操作系统是现代PC的动力提供者 并为用户解决了数值计算这个有时困难到令人无法相信的问题 在你使用电脑 一边听音乐 浏览网站 一边阅读电子邮件的同时 操作系统会跟踪记录你的所有活动 并与后台交流信息 将你使用到的信息组织起来 尽管CP
  • [2019计算机视觉]——贪心学院 学习笔记 【实验】2.2 使用逻辑函数 对垃圾短信的分类 基于数据集SMSSpamCollection

    文章目录 1 数据集介绍 1 SMSSpamCollection数据集 2 数据集的获取 2 我的实验 1 读入数据集 2 预处理 3 训练模型 4 进行测试 1 数据集介绍 1 SMSSpamCollection数据集 英文详细介绍看这里
  • Vision Transformer(vit)原理分析以及特征可视化

    目录 Vit简介 Vit model结构图 vit输入处理 图像分块 class token与position的添加 特征提取 vit代码 Vit简介 Vision Transformer ViT 是一种基于Transformer架构的深度
  • 推荐几个值得关注的技术公众号(年度精选)

    2017 马上就要过去了 2018 来了 工作 生活节奏超快的今天 想要不断提升自我 碎片化阅读学习是你最佳的选择 如果你有一颗学习的心 那这些学习型的公众号 绝对会让你受益匪浅 我们为你精选了技术领域几个精品微信订阅号 涵盖了时下最热门的
  • ansible常见错误处理

    1 failed to open a SFTP connection EOF during negotiation 修改sshd config中配置 Subsystem sftp internal sftp 2 Error ansible
  • 一.用matlab生成想要的分布数据——均匀分布

    给大家讲讲怎么用matlab生成想要分布的随机数吧 1 均匀分布 2 正态分布 3 对数正态分布 4 gumbel分布 5 weibull分布 6 指数分布 7 Raili分布 1 均匀分布 matlab的rand指令可以帮助我们生成0 1
  • C++ 把引用作为返回值

    C 把引用作为返回值 C 引用 C 引用 通过使用引用来替代指针 会使 C 程序更容易阅读和维护 C 函数可以返回一个引用 方式与返回一个指针类似 当函数返回一个引用时 则返回一个指向返回值的隐式指针 这样 函数就可以放在赋值语句的左边 例
  • Deep Java Library(五)DJLServing java client demo

    1 工具类HttpUtils package com lihao client import java io IOException import java net URI import java net URLEncoder import