模型部署技巧(一)
模型部署技巧(一)
以下内容是参考CUDA与TensorRT模型部署内容第六章,主要针对图像的前/后处理中的trick。
参考:
1.部署分类器-int8-calibration
2. cudnn安装地址
3. 如何查找Tensor版本,与cuda 和 cudnn匹配
4. timing cache
一. 前处理 preprocess
学习目标
- 分析学习几种cv::Mat bgr2rgb 的方式,比较运行速度
1. 图像 BGR2RGB 在cpu中的方式
某些小图像
前处理部分如果放在GPU上跑,并不能充分的硬件资源吃满,导致硬件资源比较浪费。
如果这种情况出现的话,我们可能会考虑把前处理放在CPU
上,DNN的forward部分放在GPU上,进行异步的推理。
1.1 cv::cvtColor
void preprocess_cv_cvtcolor(cv::Mat src, cv::Mat tar){cv::cvtColor(src, tar, cv::COLOR_BGR2RGB);
}
1.2 .at 方式
void preprocess_cv_mat_at(cv::Mat src, cv::Mat tar){for (int i = 0; i < src.rows; i++) {for (int j = 0; j < src.cols; j++) {tar.at<cv::Vec3b>(i, j)[2] = src.at<cv::Vec3b>(i, j)[0];tar.at<cv::Vec3b>(i, j)[1] = src.at<cv::Vec3b>(i, j)[1];tar.at<cv::Vec3b>(i, j)[0] = src.at<cv::Vec3b>(i, j)[2];}}
}
1.3 cv::MatIterator_方式
void preprocess_cv_mat_iterator(cv::Mat src, cv::Mat tar){cv::MatIterator_<cv::Vec3b> src_it = src.begin<cv::Vec3b>();cv::MatIterator_<cv::Vec3b> tar_it = tar.begin<cv::Vec3b>();cv::MatIterator_<cv::Vec3b> end = src.end<cv::Vec3b>();for (; src_it != end; src_it++, tar_it++) {(*tar_it)[2] = (*src_it)[0];(*tar_it)[1] = (*src_it)[1];(*tar_it)[0] = (*src_it)[2];}
}
1.4 .data方法
void preprocess_cv_mat_data(cv::Mat src, cv::Mat tar){int height = src.rows;int width = src.cols;int channels = src.channels();for (int i = 0; i < height; i ++) {for (int j = 0; j < width; j ++) {int index = i * width * channels + j * channels;tar.data[index + 2] = src.data[index + 0];tar.data[index + 1] = src.data[index + 1];tar.data[index + 0] = src.data[index + 2];}}
}
1.5 pointer
void preprocess_cv_pointer(cv::Mat src, cv::Mat tar){for (int i = 0; i < src.rows; i ++) {cv::Vec3b* src_ptr = src.ptr<cv::Vec3b>(i);cv::Vec3b* tar_ptr = tar.ptr<cv::Vec3b>(i);for (int j = 0; j < src.cols; j ++) {tar_ptr[j][2] = src_ptr[j][0];tar_ptr[j][1] = src_ptr[j][1];tar_ptr[j][0] = src_ptr[j][2];}}
}
结论:
- 使用
cv::Mat::at
:速度最慢 - 使用
cv::MatIterator_
速度中等 - 使用
cv::Mat.data
- 使用
cv::Mat.ptr
: 速度最快
Tips.图像 BGR2RGB + norm + hwc2chw 最优方式
void preprocess_cv_pointer(cv::Mat src, float* tar, float* mean, float* std){int area = src.rows * src.cols;int offset_ch0 = area * 0;int offset_ch1 = area * 1;int offset_ch2 = area * 2;for (int i = 0; i < src.rows; i ++) {cv::Vec3b* src_ptr = src.ptr<cv::Vec3b>(i);for (int j = 0; j < src.cols; j ++) {tar[offset_ch2++] = (src_ptr[j][0] / 255.0f - mean[0]) / std[0];tar[offset_ch1++] = (src_ptr[j][1] / 255.0f - mean[1]) / std[1];tar[offset_ch0++] = (src_ptr[j][2] / 255.0f - mean[2]) / std[2];}}
}
二. 通用模型推理框架设计
2.1 worker类
根据模型的种类(分类、检测、分割)在构造函数中初始化一个模型,另外包含一个推理函数即可。
Worker::Worker(string onnxPath, logger::Level level, model::Params params) {m_logger = logger::create_logger(level);// 这里根据task_type选择创建的trt_model的子类,今后会针对detection, segmentation扩充if (params.task == model::task_type::CLASSIFICATION) m_classifier = model::classifier::make_classifier(onnxPath, level, params);}void Worker::inference(string imagePath) {if (m_classifier != nullptr) {m_classifier->load_image(imagePath);m_classifier->inference();}
}
2.2 model基类
成员变量包含模型参数集合,各类路径字符串,logger, timer等。
Model::Model(string onnx_path, logger::Level level, Params params) {m_onnxPath = onnx_path;m_enginePath = getEnginePath(onnx_path);m_workspaceSize = WORKSPACESIZE;m_logger = make_shared<logger::Logger>(level);m_timer = make_shared<timer::Timer>();m_params = new Params(params);
}
成员函数有初始化模型,加载数据,推理,构建/加载/保存引擎,几个纯虚函数
(setup
, 前/后处理cpu版本,前/后处理gpu版本)。
纯虚函数需要子类去具体实现。
setup负责分配host/device的memory, bindings, 以及创建推理所需要的上下文。由于不同task的input/output的tensor不一样,所以这里的setup需要在子类实现。
2.3 classifier 分类器子类
主要是针对model基类中的几个纯虚函数,进行具体实现。
Eg.
void Classifier::setup(void const* data, size_t size) {m_runtime = shared_ptr<IRuntime>(createInferRuntime(*m_logger), destroy_trt_ptr<IRuntime>);m_engine = shared_ptr<ICudaEngine>(m_runtime->deserializeCudaEngine(data, size), destroy_trt_ptr<ICudaEngine>);m_context = shared_ptr<IExecutionContext>(m_engine->createExecutionContext(), destroy_trt_ptr<IExecutionContext>);m_inputDims = m_context->getBindingDimensions(0);m_outputDims = m_context->getBindingDimensions(1);// 考虑到大多数classification model都是1 input, 1 output, 这边这么写。如果像BEVFusion这种有多输出的需要修改CUDA_CHECK(cudaStreamCreate(&m_stream));m_inputSize = m_params->img.h * m_params->img.w * m_params->img.c * sizeof(float);m_outputSize = m_params->num_cls * sizeof(float);m_imgArea = m_params->img.h * m_params->img.w;// 这里对host和device上的memory一起分配空间CUDA_CHECK(cudaMallocHost(&m_inputMemory[0], m_inputSize));CUDA_CHECK(cudaMallocHost(&m_outputMemory[0], m_outputSize));CUDA_CHECK(cudaMalloc(&m_inputMemory[1], m_inputSize));CUDA_CHECK(cudaMalloc(&m_outputMemory[1], m_outputSize));// //创建m_bindings,之后再寻址就直接从这里找m_bindings[0] = m_inputMemory[1];m_bindings[1] = m_outputMemory[1];
}
2.4 logger类
日志类,通过设置等级进行打印消息,相比于cout更清爽。
2.5 timer类
记录cpu和gpu的开始/结束时间,计算相应的时间差。
m_timer->start_cpu();/* 处理程序 */m_timer->stop_cpu();m_timer->duration_cpu<timer::Timer::ms>("preprocess(CPU)");
2.6 process命名空间
process 命名空间下,定义了preprocess_resize_cpu, preprocess_resize_gpu等一些函数。
三. int8量化
3.1 创建calibrator类的时候需要继承nvinfer1里的calibrator,NVIDIA官方提供了以下五种:
- nvinfer1::IInt8EntropyCalibrator2 是tensorRT 7.0引入的接口,实现基于熵的INT8量化校准器。(默认情况下优先使用它)
- nvinfer1::IInt8MinMaxCalibrator
- nvinfer1::IInt8EntropyCalibrator 是tensorRT 7.0之前的接口,实现基于熵的INT8量化校准器。(目前已被弃用)
- nvinfer1::IInt8LegacyCalibrator(percentile)
- nvinfer1::IInt8Calibrator(被弃用)
3.2 在calibrator类中需要实现的函数只需要四个:
int getBatchSize() const noexcept override {return m_batchSize;};
bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override;
const void* readCalibrationCache(std::size_t &length) noexcept override;
void writeCalibrationCache (const void* ptr, std::size_t legth) noexcept override;
getBatchSize
: 获取calibration的batch大小,需要注意的是不同的batch size会有不同的校准效果。一般而言,越大越好。getBatch
获取的图像必须要和真正推理时所采用的预处理
保持一直。不然dynamic range会不准readCalibrationCache
: 用来读取calibration table
,也就是之前做calibration统计得到的各个layer输出tensor的dynamic range。实现这个函数可以让我们避免每次做int8推理的时候都需要做一次calibrationwriteCalibrationCache
: 将统计得到的dynamic range写入到calibration table中去
3.3 实现完了基本的calibrator之后,在build引擎的时候通过config
指定calibrator就可以了。
shared_ptr<Int8EntropyCalibrator> calibrator(new Int8EntropyCalibrator(64, "calibration/calibration_list_imagenet.txt", "calibration/calibration_table.txt",3 * 224 * 224, 224, 224));
config->setInt8Calibrator(calibrator.get());
这里面的calibration_list_imagenet.txt
使用的是ImageNet2012
的test数据集的一部分。可以根据各自的情况去更改,注意batch_size 64需要改成能被calibration dataset的整除的数,否则core dump。
需要注意的是,如果calibrator改变了,或者模型架构改变了,需要删除掉calibration_table.txt
来重新计算dynamic range。否则会报错
Tips.
实操生成过程中遇到的core dump
情况,报出一个cudnn库加载版本不正确的警告。通过ldd ./bin/trt-infer 定位到libnvinfer.so.8 => /home/xx/opt/TensorRT-8.5.3.1/lib/libnvinfer.so.8 ,TensorRT版本与Makefile配置文件中指定的版本不一致
。
查看服务器动态库路径,先删除动态库其中被指定的TensorRT动态库路径,再指定自己的动态库路径
echo $LD_LIBRARY_PATH
export LD_LIBRARY_PATH="" # 先清空
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/home/xxxpersonal/others/TensorRT-8.4.0.6/lib
四. Timing Cache
主要作用:它可以加快 engine
的创建过程,为了优化和加速内核选择过程。
如何使用 Timing Cache:
- 创建和保存 Timing Cache: 在第一次构建 engine 时,TensorRT 会创建一个 timing cache。你可以将这个 timing cache
保存
到文件中,以便未来复用。 - 加载 Timing Cache: 在构建新的 engine 时,可以
加载已经保存的 timing cache
,从而避免重新进行时间消耗的内核调优过程。
五. trt-engine-explorer
trt-engine-explorer
是NVIDIA官方提供的分析TensorRT优化后的推理引擎架构的工具包。链接在这里:
TensorRT tool: trt-engine-explorer
相关文章:
模型部署技巧(一)
模型部署技巧(一) 以下内容是参考CUDA与TensorRT模型部署内容第六章,主要针对图像的前/后处理中的trick。 参考: 1.部署分类器-int8-calibration 2. cudnn安装地址 3. 如何查找Tensor版本,与cuda 和 cudnn匹配 4. ti…...
PostgreSQL中的SSL
PGSQL数据库的默认隔离级别是读提交,并且同时支持可重复读和序列化模式。但是在9.1之前的版本中,序列化模式等价于快照隔离,并非是真正的序列化模式。 这样的话就会存在一个问题,那就是写偏序(Write Skew)…...
使用 Spring Data Redis 实现 Redis 数据存储详解
使用 Spring Data Redis 实现 Redis 数据存储详解 Spring Data Redis 是 Spring 生态中操作 Redis 的核心模块,它封装了 Redis 客户端的底层细节(如 Jedis 或 Lettuce),提供了统一的 API 来操作 Redis 的数据结构。以下是详细实现…...
短视频矩阵系统贴牌开发实战:批量剪辑文件夹功能设计与实现
摘要:在短视频矩阵系统的开发中,批量处理功能是提升运营效率的关键。本文将深入探讨如何实现基于文件夹的短视频批量剪辑功能,涵盖技术选型、核心功能实现及代码示例。 一、需求背景与场景价值 在短视频矩阵运营场景中,运营者常面…...
2025年消防设施操作员考试题库及答案
一、判断题 25.防火门顺序器使用半个月后,需检查所有的螺钉,对固定螺钉进行加固拧紧,后续每月进行一次。() 答案:错误 解析:本题考查的是防火门顺序器的保养。防火门顺序器使用一周后&#x…...
ASP.NET MVC后端控制器用模型 接收前端ajax数据为空
1、前端js代码 如下: const formData {DeptName: D001,Phone: 12345678900 };$.ajax({url: "/Phone/SavePhone1",type: "POST",contentType: "application/json",data: JSON.stringify(formData), //必须要JSON.stringifysuccess:…...
ES基本使用方式
ES基本使用 文章目录 ES基本使用1.es的访问使用URL访问 2.mapping的理解Dynamic Mappingkeyword 与 text的区别基础定义与核心差异主字段,子字段 创建mapping 3.创建索引4.查看索引列表5.删除索引6.添加数据7.查询数据 重置es密码,初始用户elastic el…...
【中间件】bthread效率为什么高?
bthread效率为什么更高? 1 基本概念 bthread是brpc中的用户态线程,也是协程的一种实现。其采用M:N模型,即多个用户线程映射到少量的系统线程上。 2 高效做法 用户态调度:避免内核态和用户态之间的切换开销,上下文切…...
Transformer架构指南:从原理到实战资源全更新
🌟 什么是Transformer? 2017年Google提出的Transformer架构,彻底颠覆了传统RNN/LSTM的序列建模方式,通过自注意力机制实现全局上下文建模,成为GPT、BERT等大模型的底层基石。其核心优势在于并行化计算和长距离依赖捕捉…...
数据库规范
数据库版本相关 版本:mysql8.0 引擎:InnoDB 字符集:utf8mb4_general_ci 表名称 字段名称te 不允许使用大写字母,尽量使用英文或英文缩写,中间用下划线连接 数据表前缀为zzt_ 同一功能模块的表(特别是附表)尽量保持…...
Java 核心--泛型枚举
作者:IvanCodes 发布时间:2025年4月30日🤓 专栏:Java教程 各位 CSDN伙伴们,大家好!👋 写了那么多代码,有没有遇到过这样的“惊喜”:满心欢喜地从 ArrayList 里取出数据…...
使用skywalking进行go的接口监控和报警
安装 helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace 查看安装结果 kubectl get pod -n skywalking NAME READY STATUS RESTARTS AGE elasticsearch-6c4ccbf99f-ng6sk 1/1 …...
基于Docker的Elasticsearch ARM64架构镜像构建实践
一、前言 Elasticsearch(以下简称为ES) 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次…...
【Token系列】14|Prompt不是文本,是token结构工程
文章目录 14|Prompt不是文本,是token结构工程一、很多人写的是“自然语言”,模型读的是“token序列”二、Prompt写法会直接影响token结构密度三、token分布影响Attention矩阵的聚焦方式四、token数 ≠ 有效信息量五、Prompt结构设计建议&…...
在宝塔面板中安装OpenJDK-17的三种方法
title: 在宝塔面板中安装OpenJDK-17的三种方法 date: 2025-4-30 categories: 技术教程 tags: [Minecraft, 服务器搭建, 宝塔面板, Java] 如果你的宝塔面板软件商店中缺少 OpenJDK-17(例如搭建 Minecraft 1.17 服务器时),本文提供三种解决方…...
瑞昱点屏芯片RTD2785T带旋转功能
一、产品概述 RTD2785T是瑞昱半导体(Realtek)推出的新一代高性能显示驱动芯片,专为高端显示器、嵌入式系统、工业控制及专业影像设备设计。该芯片集成多接口输入(HDMI、DP、DVI、VGA)与多种输出接口(eDP、…...
蓝桥杯Python(B)省赛回忆
Q:为什么我要写这篇博客? A:在蓝桥杯软件类竞赛(Python B组)的备赛过程中我在网上搜索关于蓝桥杯的资料,感谢你们提供的参赛经历,对我的备赛起到了整体调整的帮助,让我知道如何以更…...
自主采集高质量三维重建数据集指南:面向3DGS与NeRF的图像与视频拍摄技巧【2025最新版!!】
一、✨ 引言 随着三维重建技术的飞速发展,NeRF(Neural Radiance Fields)与 3D Gaussian Splatting(3DGS)等方法成为重建真实场景和物体几何细节的前沿方案。这些方法在大规模场景建模、机器人感知、文物数字化、工业检…...
为Mac用户定制的云服务器Vultr 保姆级教程
以下是专为 Mac 用户 定制的 Vultr 保姆级教程,涵盖从注册、部署服务器到常见问题解决的全流程指南,配合实际案例和故障排查,确保流畅使用。 一、Vultr 基础介绍 1.Vultr 是什么? Vultr 是一家美国云计算服务商,提供…...
广州创科——湖北房县汪家河水库除险加固信息化工程
汪家河水库 汪家河水库位于湖北省房县,建于1971年,其地利可谓是天公之作,东西二山蜿蜒起伏,山峰相连,峰峰比高,无有尽头,东边陡峭,西边相对平坦,半山腰有一条乡村道路&am…...
LeetCode392_判断子序列
LeetCode392_判断子序列 标签:#双指针 #字符串 #动态规划Ⅰ. 题目Ⅱ. 示例 0. 个人方法官方题解一:双指针官方题解二:动态规划 标签:#双指针 #字符串 #动态规划 Ⅰ. 题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序…...
力扣第447场周赛
这次终于赶上力扣的周赛了, 赛时成绩如下(依旧还是三题 ): 1. 统计被覆盖的建筑 给你一个正整数 n,表示一个 n x n 的城市,同时给定一个二维数组 buildings,其中 buildings[i] [x, y] 表示位于坐标 [x, y] 的一个 唯一 建筑。 如…...
kotlin中Triple的作用
在 Kotlin 里,Triple 是标准库提供的一个类,其作用是创建一个包含三个元素的不可变容器。以下是关于它的详细介绍: 基本作用 Triple 类让你能够把三个不同类型的值组合成一个单一对象,方便在函数间传递或者存储这三个相关的值。…...
jmeter读取CSV文件中文乱码的解决方案
原因分析 CSV文件出现中文乱码通常是因为文件编码与JMeter读取编码不一致。常见场景: 文件保存为GBK/GB2312编码,但JMeter以UTF-8读取。文件包含BOM头(如Windows记事本保存的UTF-8),但JMeter未正确处理。脚本读取文…...
Mysql查询异常【Truncated incorrect INTEGER value】
文章目录 异常原因分析1、数据类型不一致2、数据长度超长3、数据格式要正确 处理方案模拟案例创建表数据查询 异常 在执行MySQL的语句时,在控制台报错如下所示。 Data truncation: Truncated incorrect INTEGER value 原因分析 1、数据类型不一致 必须要保证数据…...
vue+django农产品价格预测和推荐可视化系统[带知识图谱]
文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! ✅编号:D010 vue django 前后端分离架构搭建的系统带有推荐算法、价格预测、可视化、知识图谱数据从爬虫获取可以更新到最…...
2025年天梯题解(L1-8 + L2)
L1-112 现代战争 题目 既然是从大到小轰炸,将所有点存储为三元组(value, x, y)。 排序之后, 记录行列被轰炸的编号,进行 k 次挑选即可。 #include <bits/stdc.h> using namespace std;constexpr int MAXN 1000; struct …...
AndroidStudio生成AAR
Android Studio 2024.3 版本。如何生成 AAR 文件呢? 操作步骤 1、菜单栏,找到 Build 2、清除项目 Clean Project 3、构建项目 Assemble Project生成 AAR 路径 在 我们构建 lib 库下面。 build/outputs/aar/ xxxx下面截图为证: 我的…...
Vue3 后台管理系统模板
Vue3 后台管理系统模板 gie仓库地址 一个基于 Vue3 TypeScript Element Plus 的后台管理系统模板,集成了动态路由和权限管理功能。 技术栈 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 🚀 基于 Vue3 最新技术栈开…...
RPG4.设置角色输入
这一篇是进行玩家移动和视角移动的介绍。 1.在玩家内进行移动覆写 virtual void SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) override; 2.创建增强输入资产的变量创建 UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category "CharacterD…...
生产模块-备货生产
特点 从狭义的角度来看,备货生产场景主要出现在产品定制化需求低,产品工艺流程稳定可以大批生产,市场行情可预测的企业。为了实现订单快速交付,缩短交货周期,企业往往会结合公司历史订单数据和当前市场情况安排提前生产…...
GRE隧道
1.在锐捷网络设备中,tunnel mode gre ip 和 tunnel mode gre multipoint 是两种不同的 GRE(Generic Routing Encapsulation)隧道模式,主要区别在于连接拓扑和使用场景: 1. tunnel mode gre ip(点到点 GRE …...
ASP.NET MVC 入门与提高指南六
31. 事件驱动架构与 MVC 集成 31.1 事件驱动架构概念 事件驱动架构(Event - Driven Architecture,EDA)是一种软件设计模式,系统中的组件通过发布和订阅事件来进行通信。在这种架构中,当某个事件发生时,相…...
【MongoDB篇】MongoDB的文档操作!
目录 引言第一节:C - Create - 创建文档 (Insert) 👶➕第二节:R - Read - 读取文档 (Query) 📚👀第三节:U - Update - 更新文档 (Update) 🔄✍️第四节:D - Delete - 删除文档 (Dele…...
详解具身智能机器人开源数据集:RoboMIND
一、RoboMIND基础信息 RoboMIND 发布时间:2024年12月 创建方:国家地方共建具身智能机器人创新中心与北京大学计算机学院联合创建。 所使用的机器人:单臂机器人(Franka Emika Panda 、UR5e )、双臂机器人(…...
施磊老师rpc(一)
文章目录 mprpc项目**项目概述**:深入学习到什么**前置学习建议**:核心内容其他技术与工具**项目特点与要求**:**环境准备**: 技术栈集群和分布式理论单机聊天服务器案例分析集群聊天服务器分析分布式系统介绍多个模块的局限引入分…...
视觉问答大模型速递:Skywork-R1V2-38B
Skywork-R1V2-38B速读 一、模型概述 Skywork-R1V2-38B是一种最先进的开源多模态推理模型,在多项基准测试中表现卓越。它在MMMU测试中以73.6%的得分位居所有开源模型之首,在OlympiadBench测试中以62.6%的得分大幅领先于其他开源模型。此外,R…...
Spring Boot 中集成 Kafka 并实现延迟消息队列
在 Spring Boot 中集成 Kafka 并实现延迟消息队列,需要结合 Kafka 的基础功能与自定义逻辑来处理延迟投递。以下是完整的实现步骤和示例代码,涵盖配置、生产者、消费者、延迟队列设计和消息重试机制。 一、环境准备与依赖配置 添加依赖 在 pom.xml 中添加 Spring Kafka 依赖:…...
【算法学习】哈希表篇:哈希表的使用场景和使用方法
算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 在之前学习数据结构时我们就学习了哈希表的使用方法,这里我们主要是针对哈希表的做题方法进行讲解,都是leetcode上的经典…...
(51单片机)LCD显示红外遥控相关数据(Delay延时函数)(LCD1602教程)(Int0和Timer0外部中断教程)(IR红外遥控模块教程)
前言: 本次Timer0模块改装了一下,注意!!! 演示视频: 红外遥控 源代码: 如上图将9个文放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安…...
农产品园区展示系统——仙盟创梦IDE开发
<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>农业大数据平台</title><style>* {margi…...
Copilot:您的AI伴侣-微软50周年系列更新
回顾微软五十年来持续创新带来的深远影响,比尔盖茨当年"让每张办公桌、每个家庭都拥有电脑"的宏伟愿景至今仍激励着我们。微软AI团队正秉承同样的精神,打造属于每个人的AI伙伴——Copilot。 这意味着什么?它是什么模样?…...
【人工智能】深入探索Python中的自然语言理解:实现实体识别系统
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 自然语言理解(NLU)是人工智能(AI)领域中的重要研究方向之一,其目标是让计算机理解和处理人类语言。在NLU的众多应用中,实体识别(Nam…...
Steam安装下载及新手注册
📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由肩匣与橘编写,首发于CSDN🙉 📢生活依旧是美好而又温柔的,你也…...
Gradio全解20——Streaming:流式传输的多媒体应用(1)——流式传输音频:魔力8号球
Gradio全解20——Streaming:Streaming:流式传输的多媒体应用(1)——流式传输音频:魔力8号球 前言本篇摘要20. Streaming:流式传输的多媒体应用20.1 流式传输音频:魔力8号球20.1.1 工作原理20.1.…...
Netflix系统架构解析
Netflix系统架构解析 Netflix架构旨在高效可靠地同时为数百万用户提供内容。以下是其特性和组件的详细分析。 是否曾好奇Netflix如何让您目不转睛地享受无中断的流畅播放体验?幕后功臣正是Netflix架构,它负责提供吸引全球观众的无缝流媒体体验。Netflix的…...
宝塔面板运行docker的jenkins
1.在宝塔面板装docker,以及jenkins 2.ip:端口访问jenkins 3.获取密钥(点击日志) 4.配置容器内的jdk和maven环境(直接把jdk和maven文件夹放到jenkins容器映射的data文件下) 点击容器-->管理-->数据存储卷--.把相…...
【计算机视觉】目标检测:深度解析Detectron2:Meta开源目标检测与图像分割框架实战指南
深度解析Detectron2:Meta开源目标检测与图像分割框架实战指南 技术架构与设计哲学核心设计理念关键技术组件 环境配置与安装硬件建议配置详细安装步骤 实战流程详解1. 自定义数据集准备2. 模型配置与训练3. 模型评估与推理 核心功能扩展1. 自定义模型架构2. 混合精度…...
Notepad编辑器实现换行符替换
在不同的Note编辑器中,批量把换行替换为空的方法有所不同,以下是常见编辑器的操作方法: Notepad 打开文件后,按CtrlH打开“查找和替换”对话框,在“查找”字段中输入\r\n,在“替换为”字段中输入一个空格…...
【数据通信完全指南】从物理层到协议栈的深度解析
目录 1. 通信技术演进与核心挑战1.1 从电报到5G的技术变迁1.2 现代通信系统的三大瓶颈 2. 通信系统架构深度解构2.1 OSI七层模型运作原理2.2 TCP/IP协议栈实战解析 3. 物理层关键技术实现3.1 信号调制技术演进路线3.2 信道复用方案对比 4. 数据传输可靠性保障4.1 CRC校验算法数…...