当前位置: 首页 > news >正文

WebRTC服务质量(11)- Pacer机制(03) IntervalBudget

WebRTC服务质量(01)- Qos概述
WebRTC服务质量(02)- RTP协议
WebRTC服务质量(03)- RTCP协议
WebRTC服务质量(04)- 重传机制(01) RTX NACK概述
WebRTC服务质量(05)- 重传机制(02) NACK判断丢包
WebRTC服务质量(06)- 重传机制(03) NACK找到真正的丢包
WebRTC服务质量(07)- 重传机制(04) 接收NACK消息
WebRTC服务质量(08)- 重传机制(05) RTX机制
WebRTC服务质量(09)- Pacer机制(01) 流程概述
WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue
WebRTC服务质量(11)- Pacer机制(03) IntervalBudget
WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

一、前言:

先想想,我们其实已经有了目标码率了,为什么还要控制码率?

因为,我们获取的目标码率是以秒为单位的,比如每秒钟发送300k,这是我们通过webrtc的网络拥塞控制可以获得的。 但是,具体到每个时间分片,我们前面看了pacer是5ms作为一个时间分片,IntervalBudget就是控制每个时间分片内应该发送的数据大小。

二、概念:

IntervalBudget 是 WebRTC 中的一个数据流速率控制工具,目的是在固定时间间隔内,根据目标码率动态管理和分配可以发送的字节数(预算字节)。它类似一个预算系统,平衡上一时间间隔的欠载(underuse)和过载(overuse)情况,确保整体码率维持在目标值,同时允许一定程度的积累和补偿。

详细分主要作用是:

  1. 维持目标码率(target_rate_kbps 根据目标速率(如 300 kbps),动态调整每段时间的字节发送目标。
  2. 处理过载和欠载 若某次时间片中没有充分利用发送预算,是否允许将未用的预算累积到后续时间片(由 can_build_up_underuse 决定)。
  3. 预算限制 限制过载和欠载的值,最高不能超过特定的预算范围(max_bytes_in_budget_)。
  4. 字节消耗管理 随着数据发送,会减少预算,维持运行中实时的发送和控制。

三、类定义:

class IntervalBudget {public:explicit IntervalBudget(int initial_target_rate_kbps);IntervalBudget(int initial_target_rate_kbps, bool can_build_up_underuse);// 用于设置目标码率void set_target_rate_kbps(int target_rate_kbps);// TODO(tschumim): Unify IncreaseBudget and UseBudget to one function.// 用于计算我们这个时间分片,有多少数据可以发送void IncreaseBudget(int64_t delta_time_ms);void UseBudget(size_t bytes);size_t bytes_remaining() const;double budget_ratio() const;int target_rate_kbps() const;private:// 通过带宽评估算法评估出的目标码率(也就是1s内发送多少数据)int target_rate_kbps_;// 在budget中最大可以存放多少字节int64_t max_bytes_in_budget_;// 在一个时间分片内,还有多少数据可以发送int64_t bytes_remaining_;bool can_build_up_underuse_;
};

四、Pacer中两个重要的IntervalBudget:

  IntervalBudget media_budget_; // 用于计算可以发送媒体的数据量IntervalBudget padding_budget_; // 用于计算可以发送padding的数据量

五、设置目标码率:

要使用IntervalBudget,就需要先设置目标码率。两种设置目标码率的途径:

  • 周期执行RtpTransportControllerSend::UpdateControllerWithTimeInterval ;
  • 通过收到对方发送来的transport-cc,然后使用OnTransportPacketsFeedback函数来分析,并更新目标码率;

5.1、调用UpdateControllerWithTimeInterval过程:

在这里插入图片描述

红框中的都属于RepeatingTask,进行任务的反复执行。

// 周期执行当前任务
bool RepeatingTaskBase::Run() {// 执行当前任务TimeDelta delay = RunClosure();// ...// 然后再把this打包成任务,放入线程的任务队列当中,之后这个线程又会执行Run,反复如此// delay.ms()是每隔多长时间执行这个任务task_queue_->PostDelayedTask(absl::WrapUnique(this), delay.ms());return false;
}// 在其父类 RepeatingTaskBase 当中会通过Run来执行任务
template <class Closure>
class RepeatingTaskImpl final : public RepeatingTaskBase {public:RepeatingTaskImpl(TaskQueueBase* task_queue,TimeDelta first_delay,Closure&& closure,Clock* clock): RepeatingTaskBase(task_queue, first_delay, clock),closure_(std::forward<Closure>(closure)) {static_assert(std::is_same<TimeDelta, typename std::result_of<decltype (&Closure::operator())(Closure)>::type>::value, "");}private:// 执行当前任务TimeDelta RunClosure() override { return closure_(); }typename std::remove_const<typename std::remove_reference<Closure>::type>::type closure_;
};

5.2、根据Transport-cc执行:

当我们收到transport-cc反馈后,会执行下面函数:

// 每当我们收到transport-cc之后,就会调用下面的方法
void RtpTransportControllerSend::OnTransportFeedback(const rtcp::TransportFeedback& feedback) {feedback_demuxer_.OnTransportFeedback(feedback);auto feedback_time = Timestamp::Millis(clock_->TimeInMilliseconds());// 生成一个匿名函数任务,这个任务当中通过 OnTransportPacketsFeedback 来解析transport-cc中的内容// 解析完这个内容之后,就会计算我们当前的带宽是多少,拿到带宽就可以为budget设置目标码率了// 将返回值(也就是目标码率)传给PostUpdates,这里面会设置给budget目标码率task_queue_.PostTask([this, feedback, feedback_time]() {RTC_DCHECK_RUN_ON(&task_queue_);absl::optional<TransportPacketsFeedback> feedback_msg =transport_feedback_adapter_.ProcessTransportFeedback(feedback, feedback_time);if (feedback_msg && controller_) {PostUpdates(controller_->OnTransportPacketsFeedback(*feedback_msg));}pacer()->UpdateOutstandingData(transport_feedback_adapter_.GetOutstandingData());});
}

就是解析出人家反馈给我们的内容,根据这个计算我们自己的目标码率,并设置给budget;

六、使用media_budget:

看下ProcessPackets如何使用media_budget的:

// 周期处理包的发送
void PacingController::ProcessPackets() {if (mode_ == ProcessMode::kPeriodic) {// 将前面设置给pacer的目标码率设置给media_budgetmedia_budget_.set_target_rate_kbps(target_rate.kbps());UpdateBudgetWithElapsedTime(elapsed_time);} else {media_rate_ = target_rate;}
}

其中,elapsed_time就是逝去的时间,在UpdateBudgetWithElapsedTime当中会使用:

/*** 使用逝去的时间更新media_budget_*/
void PacingController::UpdateBudgetWithElapsedTime(TimeDelta delta) {if (mode_ == ProcessMode::kPeriodic) {// 获取较小者(kMaxProcessingInterval是30ms)delta = std::min(kMaxProcessingInterval, delta);// 将delta时间传给media_budgetmedia_budget_.IncreaseBudget(delta.ms());padding_budget_.IncreaseBudget(delta.ms());} else {media_debt_ -= std::min(media_debt_, media_rate_ * delta);padding_debt_ -= std::min(padding_debt_, padding_rate_ * delta);}
}

再看看传进去IncreaseBudget怎么使用的:

void IntervalBudget::IncreaseBudget(int64_t delta_time_ms) {// target_rate_kbps_是我们之前传入的目标码率// 加入我们现在目标码率target_rate_kbps_是300,delta是10ms,那么bytes约等于300字节,// 也就是说我们接下来这段时间可以发送的数据是300字节int64_t bytes = target_rate_kbps_ * delta_time_ms / 8;if (bytes_remaining_ < 0 || can_build_up_underuse_) {// We overused last interval, compensate this interval.// 这种情况说明过载了(比如上次要求发100,最终发了150,多发了50)// 那么我们就用本次应该发送的数据量减去(因为bytes_remaining_为负数,下面看着是加)上次多出来的50,就是本次要发送的// 当然如果大于我们budget可以发送的最大值max_bytes_in_budget_,那么,只能允许发送max_bytes_in_budget_bytes_remaining_ = std::min(bytes_remaining_ + bytes, max_bytes_in_budget_);} else {// If we underused last interval we can't use it this interval.// 如果没有过载,使用当前计算的结果bytes_remaining_ = std::min(bytes, max_bytes_in_budget_);}
}

我尝试再好好解释下:

IncreaseBudget 增加新的字节预算,用于下一时间片发送。

核心逻辑:
  1. 计算新增预算字节:

    bytes = target_rate_kbps_ * delta_time_ms / 8
    

    此预算决定时间间隔 delta_time_ms 内允许发送的字节数。

  2. 判断是否存在欠载积累(bytes_remaining_ 为负值),以及是否允许保留欠载(can_build_up_underuse_)。两种情况:

    • 允许欠载/欠载存在:补偿上一次过载,同时加入当前新增预算,更新剩余字节。
    • 不允许欠载/无欠载:仅允许当前时间段的预算。
  3. 使用 std::min() 限制最终预算,确保预算总值不超过 max_bytes_in_budget_

示例:
  • 目标码率:300 kbps,时间段:10 ms

    bytes = 300 * 10 / 8 = 375 字节
    
  • 欠载情况:假设 bytes_remaining_ = -100can_build_up_underuse = true

    bytes_remaining_ = min(-100 + 375, max_bytes_in_budget_)= min(275, 375)= 275 字节
    
  • 正常情况:没有欠载,直接按当前时间段计算:

    bytes_remaining_ = min(375, 375) = 375 字节
    

七、总结:

本文主要介绍了Pacer模块中怎么根据目标码率,然后通过IntervalBudget来完成动态调整每段时间的字节预算,使整体码率稳定在设计的目标值附近,同时平衡欠载和过载的情况。

相关文章:

WebRTC服务质量(11)- Pacer机制(03) IntervalBudget

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…...

22.跳过报错(最简) C#例子

这是一个跳过报错的例子&#xff0c;如果代码出错了会自动跳过&#xff0c;代码正确了就正常执行。 然而这不是一种推荐的做法&#xff0c;正确的做法应该是使用bool类型的值去检测代码运行结果&#xff0c;然后分支判断&#xff0c;在代码内部解决错误。 这只是一种好玩的做…...

windows 本地node版本快速升级

文章目录 前言一、前置条件二、使用步骤1.查看node 安装位置2.下载指定的node 版本3.下载后进行解压缩4. 删除覆盖原来的node文件夹内容5. 验证 总结 前言 Node.js 是一个开源、跨平台的JavaScript运行时环境&#xff0c;它允许开发者在服务器端运行JavaScript代码。Node.js 基…...

windows安装mongodb

一.安装包准备 1.服务端下载 https://www.mongodb.com/try/download/communitya 按需选择&#xff0c;我们这里选择社区版 直接点download浏览器下载可能比较慢&#xff0c;可以尝试copy link后用三方下载软件&#xff0c;会快很多。 2.命令行客户端下载 https://www.mong…...

一文读懂混合专家模型(MoE)

一文读懂混合专家模型&#xff08;MoE&#xff09; 概述 混合专家模型&#xff08;Mixture of Experts&#xff0c;MoE&#xff09;是一种机器学习和深度学习中的模型架构&#xff0c;它通过多个“专家”子模型来处理不同类型的输入数据或任务。在MoE模型中&#xff0c;输入数…...

自然语言处理(NLP)中的事件检测和事件抽取

事件检测和事件抽取是自然语言处理&#xff08;NLP&#xff09;中的两个重要任务&#xff0c;主要用于从文本中识别和提取事件及其相关信息。这两个任务在信息检索、情报分析、新闻摘要等应用中具有重要意义。 事件检测&#xff08;Event Detection&#xff09; 事件检测的目…...

深度学习:基于MindSpore NLP的数据并行训练

什么是数据并行&#xff1f; 数据并行&#xff08;Data Parallelism, DP&#xff09;的核心思想是将大规模的数据集分割成若干个较小的数据子集&#xff0c;并将这些子集分配到不同的 NPU 计算节点上&#xff0c;每个节点运行相同的模型副本&#xff0c;但处理不同的数据子集。…...

unity NAudio 获取电脑是否静音

测试&#xff0c;这两个办法都可以 打包出来也可以hu 想获取电脑是否静音出现编辑器模式下正常 打包出来失败 需要把 Api Compatibility Level改成.NET 4.x...

SemiDrive E3 MCAL 开发系列(6)– Icu 模块的使用

一、 概述 本文将会介绍 SemiDrive E3 MCAL Icu 模块的简介以及基本配置&#xff0c;其中还会涉及到 Xtrg 模块的配置。此外会结合实际操作的介绍&#xff0c;帮助新手快速了解并掌握这个模块的使用&#xff0c;文中的 MCAL 是基于 PTG3.0 的版本&#xff0c;开发板是官方的 …...

leetCode322.零钱兑换

题目&#xff1a; 给你一个整数数组coins,表示不同面额的硬币&#xff1b;以及一个整数amount,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回-1。 你可以认为每种硬币的数量是无限的。 示例1&#xff1…...

【Python】什么是元组(Tuple)?

什么是元组&#xff08;Tuple&#xff09;&#xff1f; 元组&#xff08;Tuple&#xff09;是 Python 中的一种 不可变 的数据结构&#xff0c;用于存储多个元素。它类似于列表&#xff08;List&#xff09;&#xff0c;但与列表不同的是&#xff0c;元组一旦创建&#xff0c;…...

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz&#xff08;https://www.zentao.net/downloads.html&#xff09; https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…...

文档解析丨高效准确的PDF解析工具,赋能企业非结构化数据治理

在数据为王的时代浪潮中&#xff0c;企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速&#xff0c;企业所积累的数据量呈爆炸式增长&#xff0c;数据类型也愈发多样化&#xff0c;这些数据构成了现代企业数据资产的重要组成部分。 然而&#xff0c;传…...

Unity 实现Canvas显示3D物体

新建一个UI相机&#xff0c;选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体&#xff0c;并将3D物体的层级设置为UI层 适当的放缩3DObjParent&#xff0c;让3D物体能显示出来…...

OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载

在人工智能的浪潮中&#xff0c;OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始&#xff0c;OpenAI连续12天每天发布一个新应用或功能&#xff0c;标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布&#xff0c;带你一探究竟。 OpenAI发布会概览 Ope…...

cellphoneDB进行CCI以及可视化

除了cellchat&#xff0c;在单细胞转录组或者空间组的分析中&#xff0c;cellphoneDB也是一个常用的细胞通讯软件&#xff0c;这个数据库更注重配受体关系&#xff0c;对于有明确先验知识的配受体研究比较友好。 但值得注意的是&#xff0c;它的数据库只包括人的基因名称信息&…...

Facebook 上的社群文化:连接与共享

随着社交媒体的普及&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;不仅改变了人们的沟通方式&#xff0c;还塑造了独特的社群文化。在Facebook上&#xff0c;用户可以轻松地与朋友、家人保持联系&#xff0c;同时也能加入兴趣相投的群组、参与讨论和共享内容。社…...

数据库的概念和操作

目录 1、数据库的概念和操作 1.1 物理数据库 1. SQL SERVER 2014的三种文件类型 2. 数据库文件组 1.2 逻辑数据库 2、数据库的操作 2.1 T-SQL的语法格式 2.2 创建数据库 2.3 修改数据库 2.4 删除数据库 3、数据库的附加和分离 1、数据库的概念和操作 1.1 物理数据库…...

word运行时错误‘-2147221164(80040154)’ 没有注册类的解决办法

目录 问题描述解决方案 问题描述 解决方案 打开C盘找到路径C:\Users\Administrator\AppData\Roaming\Microsoft\Word\STARTUP或者在everything中搜索“Microsoft\Word\STARTUP”删除NEWebWordAddin.dotm文件即可正确打开word。...

Oracle数据库高级应用与优化策略

Oracle数据库高级应用与优化策略 在数据驱动的时代,Oracle数据库作为企业级数据库管理的佼佼者,以其强大的数据处理能力、高可用性和安全性,在众多行业领域中扮演着不可或缺的角色。本文旨在深入探讨Oracle数据库的高级应用与优化策略,通过具体代码使用案例,帮助开发者和…...

笔记:使用python对飞书用户活跃度统计的一个尝试

说明 一个python练习 代码 import json import time import openpyxl from openpyxl import load_workbook from datetime import datetime, timedelta import lark_oapi as lark from lark_oapi.api.admin.v1 import *def data_r(start_date, end_date):r_data []client la…...

讲解substr函数

substr JavaScript 中的 substr语法示例注意 PHP 中的 substr语法示例 Python 中的等价方法语法示例 其他语言Java 补充 substr 是编程中用于截取字符串的一个方法或函数&#xff0c;其功能是从一个字符串中提取出一部分子字符串。不同的编程语言中&#xff0c;这个功能的实现方…...

宏任务和微任务的区别

在 JavaScript 的异步编程模型中&#xff0c;宏任务&#xff08;Macro Task&#xff09;和微任务&#xff08;Micro Task&#xff09;是事件循环&#xff08;Event Loop&#xff09;机制中的两个重要概念。它们用于管理异步操作的执行顺序。 1. 宏任务 (Macro Task) 宏任务是较…...

设计模式介绍

设计模式是软件开发中常见问题的经典解决方案。它们是经过验证的、可重用的设计经验&#xff0c;可以帮助程序员构建可维护、可扩展和可靠的对象导向软件。 设计模式通常分为三大类&#xff1a;创建型、结构型和行为型。以下是每种类型中一些常见的设计模式&#xff0c…...

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…...

Ubuntu 中安装 RabbitMQ 教程

简介 RabbitMq作为一款消息队列产品&#xff0c;它由Erlang语言开发&#xff0c;实现AMQP&#xff08;高级消息队列协议&#xff09;的开源消息中间件。 应用场景 异步处理 场景说明&#xff1a;用户注册后&#xff0c;注册信息写入数据库&#xff0c;再发邮件、短信通知。 …...

【开源免费】基于SpringBoot+Vue.JS网上摄影工作室系统(JAVA毕业设计)

本文项目编号 T 103 &#xff0c;文末自助获取源码 \color{red}{T103&#xff0c;文末自助获取源码} T103&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Metricbeat安装教程——Linux——Metricbeat监控ES集群

Metricbeat安装教程——Linux 一、安装 下载安装包&#xff1a; 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/beats/metricbeat 上传包到linux 切换到安装目录下 解压&#xff1a;tar -zxvf metricbeat-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv met…...

torch.nn.Embedding模块介绍

torch.nn.Embedding 是 PyTorch 中的一个嵌入层模块,用于将离散的整数索引(如单词或标记的 ID)映射到连续的密集向量空间中。常用于自然语言处理(NLP)中的词嵌入,但也适用于任何需要将类别数据转换为密集向量表示的场景。 参数说明 torch.nn.Embedding(num_embeddings, …...

<数据集>风力发电机损伤识别数据集<目标检测>

数据集下载链接 &#xff1c;数据集&#xff1e;风力发电机损伤识别数据集&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90187097数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2527张 标注数量(xml文件个数)&#xff1a;252…...

【Python运维】自动化备份与恢复系统的实现:Python脚本实战

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息化进程的加速,数据的重要性日益增加,数据丢失的风险也随之增加。为了保证数据安全,定期备份和及时恢复数据是必不可少的操作。本…...

PTA数据结构编程题7-1最大子列和问题

我参考的B站up的思路 题目 题目链接 给定K个整数组成的序列{ N 1 ​ , N 2 ​ , …, N K ​ }&#xff0c;“连续子列”被定义为{ N i ​ , N i1 ​ , …, N j ​ }&#xff0c;其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 1…...

Elasticsearch-模糊查询

模糊查询 前缀搜索&#xff1a;prefix 概念&#xff1a;以xx开头的搜索&#xff0c;不计算相关度评分。 注意&#xff1a; 前缀搜索匹配的是term&#xff0c;而不是field。 前缀搜索的性能很差 前缀搜索没有缓存 前缀搜索尽可能把前缀长度设置的更长 语法&#xff1a; GET &…...

C#学习1:C#初接触,一些基础内容备忘和相关报错说明

目录 1 C#基本语法格式 1.1 基础规则 1.2 以if为例子 2 一些写法 2.1 时间相关 2.2 对数写法 2.3 关于使用random 2.4 UnityEngine.Random.value 2.5 PerlinNoise 函数 PerlinNoise 函数本身的输出范围 3 各种报错 3.0 unity里对C#报错内容超级详细 3.1 error cs1…...

机器学习的方法

机器学习方法主要分为三种&#xff1a;监督学习、无监督学习、半监督学习。 1.监督学习 神经网络、朴素贝叶斯、线性回归、逻辑回归、随机森林、支持向量机&#xff08;SVM&#xff09;都是典型的监督学习方法。 监督学习&#xff0c;即监督机器学习&#xff0c;之所以叫监督…...

el-pagination 为什么只能展示 10 条数据(element-ui@2.15.13)

好的&#xff0c;我来帮你分析前端为什么只能展示 10 条数据&#xff0c;以及如何解决这个问题。 问题分析&#xff1a; pageSize 的值&#xff1a; 你的 el-pagination 组件中&#xff0c;pageSize 的值被设置为 10&#xff1a;<el-pagination:current-page"current…...

vulhub-wordpress靶场

一.主题上传漏洞 来到靶场点击主题选择add new 这里有一个上传主题的地方 我们可以去网上找到wordpress主题下载一个 wordpress模板 网页设计模板 免费 免费下载 - 爱给网 下载完成后对我们有用的东西只有这一个目录&#xff0c;把它拖出来 点开moban目录后&#xff0c;创建…...

Docker 默认安装位置迁移

一、找到 Docker 默认安装位置 [roothost-192-168-0-1 ~]# docker info Client:Version: 26.1.0Context: defaultDebug Mode: falseServer:Containers: 31Running: 31Paused: 0Stopped: 0Images: 128Server Version: 26.1.0Storage Driver: overlay2Backing Filesystem:…...

【机器学习】SVM支持向量机(一)

介绍 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种监督学习模型&#xff0c;广泛应用于分类和回归分析。SVM 的核心思想是通过找到一个最优的超平面来划分不同类别的数据点&#xff0c;并且尽可能地最大化离该超平面最近的数据点&#xff08;支持向量…...

无需配置设备,借助GitHub快速编译项目并直接运行!

引言 你是否曾经有过类似的烦恼&#xff0c;发现了一个有趣的项目&#xff0c;想要测试一下&#xff0c;但是自己的设备没有对应的开发环境或者受制于自己的设备&#xff0c;不想或者不能去配置对应的开发环境&#xff0c;应该怎么办呢&#xff1f;这种情况下&#xff0c;其实…...

【C#联合halcon实现绘制ROI功能】

前言 C#联合halcon实现绘制ROI功能&#xff1a; C#联合Halcon&#xff0c;使用HDrawingObject、HDrawingObjectXld&#xff0c;绘制矩形、方向矩形、圆形、椭圆、自定义ROI。支持拖动、重设大小、选中&#xff0c;右键复制、粘贴、删除功能。 运行结果 代码 代码结构 MainFo…...

语言模型的革命:大型概念模型(LCM)的崛起

在人工智能领域&#xff0c;Meta最近推出的一项重大突破正在引起研究人员和开发者的广泛关注&#xff1a;大型概念模型&#xff08;Large Concept Models&#xff0c;简称LCM&#xff09;。这一创新彻底改变了我们对语言模型的理解&#xff0c;并为未来AI技术的进展指明了新的方…...

在C#中获取程序的命令行参数

实现此目的的一种方法是重写程序的Main方法并赋予其一个字符串数组参数&#xff0c;如下面的代码所示。 static void Main(string[] args) {foreach (string arg in args){lstArguments.Items.Add(arg);} } 这种方法是从 C 编程语言继承而来的。 我更喜欢下面的方法&#xf…...

R基于贝叶斯加法回归树BART、MCMC的DLNM分布滞后非线性模型分析母婴PM2.5暴露与出生体重数据及GAM模型对比、关键窗口识别

全文链接&#xff1a;https://tecdat.cn/?p38667 摘要&#xff1a;在母婴暴露于空气污染对儿童健康影响的研究中&#xff0c;常需对孕期暴露情况与健康结果进行回归分析。分布滞后非线性模型&#xff08;DLNM&#xff09;是一种常用于估计暴露 - 时间 - 响应函数的统计方法&am…...

小程序基础 —— 08 文件和目录结构

文件和目录结构 一个完整的小程序项目由两部分组成&#xff1a;主体文件、页面文件&#xff1a; 主体文件&#xff1a;全局文件&#xff0c;能够作用于整个小程序&#xff0c;影响小程序的每个页面&#xff0c;主体文件必须放到项目的根目录下&#xff1b; 主体文件由三部分组…...

bishengjdk-8

title: 深入探索 BishengJDK-8&#xff1a;技术魅力与优势尽显 date: 2024-12-29 category: blog tags:- BishengJDK-8- Java 开发- 性能优化- 技术剖析 sig: BishengJDK archives: 2024-12 author:- way_back summary: BishengJDK-8 作为一款备受瞩目的 JDK 版本&#xff0c;以…...

Android9.x SurfaceView源码分析

前言 本文是继Android 深入理解SurfaceView再次对SurfaceView进行源码分析。 看了下代码,上篇文章是基于Android7.x的,本篇基于Android9.x再次进行分析, Android从7.0开始支持SurfaceView动画,并建议7.0之后使用SurfaceView替代TextureView,这里主要在Android9.0上分析Su…...

分布式 IO 模块助力冲压机械臂产线实现智能控制

在当今制造业蓬勃发展的浪潮中&#xff0c;冲压机械臂产线的智能化控制已然成为提升生产效率、保障产品质量以及增强企业竞争力的关键所在。而分布式 IO 模块的应用&#xff0c;正如同为这条产线注入了一股强大的智能动力&#xff0c;开启了全新的高效生产篇章。 传统挑战 冲压…...

解决VMware的ubuntu22虚拟机没有网络

解决步骤 1.在 Windows 系统中&#xff0c;按 “WinR” 键&#xff0c;输入 “services.msc” 并回车&#xff0c;在服务列表中找到 “VMware DHCP Service” 和 “VMware NAT Service”&#xff0c;确保这两个服务已启动&#xff0c;若未启动则右键点击选择 “启动”&#xf…...

Linux arm 编译安装glibc-2.29

重要的话说三遍&#xff1a; &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不要轻易自己去安装glibc&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不要轻易自己去安装glibc&a…...