OpenCv高阶(九)——背景建模

news2025/4/26 3:23:13

目录

一、背景建模的核心目标与核心挑战

1. 核心目标

2. 核心挑战

​二、背景建模模型

1、帧差法原理

2. 概率模型(Parametric Models)

(1)高斯混合模型(Gaussian Mixture Model, GMM)

(2)单高斯模型(Single Gaussian Model)

3. 非参数模型(Non-Parametric Models)

(1)K 近邻(K-Nearest Neighbors, KNN)

(2)ViBe 算法(Visual Background Extractor)

三、主流背景建模算法对比与解析

1. MOG2(Gaussian Mixture-Based Background Subtraction)

(1)算法原理

(2)OpenCV 实现

(3)优缺点

2. KNN 背景减除

(1)算法原理

(2)OpenCV 实现

(3)优缺点

3. GMG(Gaussian Mixture-based Background Subtraction with GMG)

(1)算法原理

(2)OpenCV 实现(需手动实现核心逻辑)

(3)优缺点

4. CNT(Codebook Background Subtraction)

(1)算法原理

(2)OpenCV 实现(需安装opencv-contrib-python)

(3)优缺点

5. ViBe 算法(Visual Background Extractor)

(1)算法原理

(2)手动实现核心逻辑

(3)优缺点

四、背景建模的完整实现流程(以 MOG2 为例)

1. 输入预处理

2. 背景模型初始化

3. 前景提取与后处理

4. 背景模型更新

五、背景建模代码逐步分解

1. 初始化环境与读取视频

2. 预处理工具准备

3. 逐帧处理主循环

(1) 读取视频帧

(2) 显示原始帧

(3) 背景减除获取前景掩膜

(4) 形态学开运算去噪

(5) 轮廓检测与筛选

(6) 显示检测结果

4. 资源释放

完整代码展示

六、总结:如何选择合适的背景建模算法


在计算机视觉中,背景建模(Background Modeling) 是从视频序列中分离动态前景与静态背景的核心技术,广泛应用于运动检测、目标跟踪、视频监控等领域。它通过学习场景的统计特性构建背景模型,并实时更新以适应环境变化。在视频中,背景通常被定义为相对稳定的部分,例如墙壁、地面或天空等。背景建模的目标是将动态的前景对象与静态的背景进行分离,以便进一步分析和处理。

一、背景建模的核心目标与核心挑战

1. 核心目标
  • 动态分割:实时区分前景(运动物体)与背景(静态或缓慢变化的场景)。
  • 环境适应:处理光照变化、动态背景(如晃动的树叶、水流)、相机抖动等干扰。
  • 高效稳定:在计算效率(实时性)与分割精度之间平衡,适应不同硬件平台(CPU/GPU/ 嵌入式)。
2. 核心挑战
  • 动态背景:背景元素本身运动(如旋转的风扇、流动的河水),易被误判为前景。
  • 光照突变:突然的亮度 / 色温变化(如开灯、阴天转晴天),导致背景模型失效。
  • 相机运动:手持设备拍摄或无人机航拍时,全局运动干扰局部前景检测。
  • 初始化阶段:前几帧需无运动物体干扰,否则背景模型包含错误信息。



二、背景建模模型


1、帧差法原理

由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为运动目标,从而实现目标的检测功能。


帧差法的优缺点:
帧差法非常简单,但是会引入噪音和空洞(人物中间是黑色的)问题。

2. 概率模型(Parametric Models)

假设像素值服从特定概率分布,通过参数估计(如均值、方差)描述背景。

(1)高斯混合模型(Gaussian Mixture Model, GMM)
  • 核心思想:每个像素的背景由 K 个高斯分布混合表示,权重反映该分布的 “重要性”。
  • 数学表达
  • 更新策略:通过在线 EM 算法更新高斯分布的参数,淘汰低权重分布,纳入新观测值。
(2)单高斯模型(Single Gaussian Model)
  • 简化版:假设背景像素服从单一高斯分布,适合静态背景(如固定摄像头监控场景)。
  • 缺点:无法处理多模态背景(如周期性运动的风扇叶片)。

3. 非参数模型(Non-Parametric Models)

不假设像素值的分布形式,直接存储历史观测值作为背景模型。

(1)K 近邻(K-Nearest Neighbors, KNN)
  • 核心思想:当前像素与历史 K 个最近邻像素比较,若距离小于阈值则为背景,否则为前景。
  • 距离度量:通常使用欧氏距离或曼哈顿距离。
  • 优点:对多模态背景鲁棒性强,无需假设分布形式。
(2)ViBe 算法(Visual Background Extractor)
  • 核心思想:从初始帧随机选取像素样本作为背景模型,通过时空一致性(邻域像素和时间帧)更新模型。
  • 创新点
    • 空间邻域:利用当前像素的 8 邻域样本增强模型鲁棒性。
    • 随机子采样:每个像素仅更新少量样本,降低计算量。

三、主流背景建模算法对比与解析

1. MOG2(Gaussian Mixture-Based Background Subtraction)

(1)算法原理
  • 每个像素用 K=3~5个高斯分布建模,按权重和方差排序,前 B 个分布构成背景
  • 支持动态更新背景模型,适应光照变化和缓慢运动的背景(如旋转的吊灯)。
(2)OpenCV 实现
bg_subtractor = cv2.createBackgroundSubtractorMOG2(
    history=500,        # 参与背景建模的历史帧数
    varThreshold=16,    # 像素值与背景模型的方差阈值
    detectShadows=True  # 检测阴影(阴影标记为灰色,非前景)
)
fg_mask = bg_subtractor.apply(frame)  # 输出二值掩码(255=前景,0=背景,128=阴影)
(3)优缺点
  • 优点:速度较快(CPU 下约 20fps),支持阴影检测,适合监控视频。
  • 缺点:对快速变化的背景(如突然开关灯)适应较慢,内存占用随历史帧数增加。

2. KNN 背景减除

(1)算法原理
  • 为每个像素维护一个历史观测值队列(如最近 500 帧的像素值),通过 KNN 搜索判断当前像素是否属于背景。
  • 距离阈值动态调整,适应不同场景的噪声水平。
(2)OpenCV 实现
bg_subtractor = cv2.createBackgroundSubtractorKNN(
    history=500,        # 历史帧数
    dist2Threshold=400, # 平方距离阈值(值越大,检测到的前景越少)
    detectShadows=True
)
fg_mask = bg_subtractor.apply(frame)
(3)优缺点
  • 优点:对动态背景(如水流、火焰)鲁棒性强,适合自然场景。
  • 缺点:计算复杂度高(O (K) 近邻搜索),内存占用大(存储所有历史样本)。

3. GMG(Gaussian Mixture-based Background Subtraction with GMG)

(1)算法原理
  • 初始化阶段:前 N 帧(如 30 帧)用于构建初始背景模型,假设背景像素服从高斯分布。
  • 在线阶段:通过贝叶斯推理更新背景模型,每个像素的前景概率由当前帧与背景模型的差异计算得到。
  • 创新点:引入 “软判决”,用概率掩码而非硬二值化,提升边缘检测精度。
(2)OpenCV 实现(需手动实现核心逻辑)
class GMGModel:
    def __init__(self, initial_frames, history=120):
        self.gmm = cv2.createBackgroundSubtractorMOG2(history=history)
        for frame in initial_frames:
            self.gmm.apply(frame)  # 预训练背景模型
    
    def apply(self, frame):
        return self.gmm.apply(frame, learningRate=0.01)  # 低学习率缓慢更新
(3)优缺点
  • 优点:初始化快,适合静态相机场景(如门禁监控)。
  • 缺点:相机移动或剧烈光照变化时易失效。

4. CNT(Codebook Background Subtraction)

(1)算法原理
  • 每个像素的背景用码本表示,码本包含多个码字(颜色区间),覆盖该像素可能的取值范围。
  • 码字通过聚类算法生成,支持多模态分布(如周期性变化的像素值)。
(2)OpenCV 实现(需安装opencv-contrib-python
import cv2.bgsegm as bgsegm
bg_subtractor = bgsegm.createBackgroundSubtractorCNT(
    use_history=True,    # 是否使用历史帧更新码本
    maxPixelDistance=30  # 像素与码字的最大距离
)
fg_mask = bg_subtractor.apply(frame)
(3)优缺点
  • 优点:抗噪声能力强,适合高动态范围场景(如夜间车灯变化)。
  • 缺点:计算复杂度高,内存占用大(每个像素存储多个码字)。

5. ViBe 算法(Visual Background Extractor)

(1)算法原理
  • 初始化:从第一帧随机选取 200 个邻域像素作为背景样本(每个像素维护一个样本集合)。
  • 更新策略
    • 每个像素以小概率(如 1/16)用当前值替换样本集合中的随机样本。
    • 利用空间邻域的样本一致性,抑制孤立噪声点。
(2)手动实现核心逻辑
class ViBe:
    def __init__(self, frame, sample_size=200, radius=20):
        self.sample_size = sample_size
        self.radius = radius
        self.samples = np.zeros((frame.shape[0], frame.shape[1], sample_size), dtype=np.uint8)
        # 初始化:每个像素随机选取邻域样本
        for i in range(frame.shape[0]):
            for j in range(frame.shape[1]):
                self.samples[i,j] = self._sample_neighbors(frame, i, j)
    
    def _sample_neighbors(self, frame, i, j):
        # 从3x3邻域随机选取sample_size个样本(包括自身)
        neighbors = frame[max(0,i-1):min(frame.shape[0],i+2), max(0,j-1):min(frame.shape[1],j+2)].ravel()
        return np.random.choice(neighbors, self.sample_size, replace=False)
    
    def apply(self, frame):
        fg_mask = np.zeros(frame.shape[:2], dtype=np.uint8)
        for i in range(frame.shape[0]):
            for j in range(frame.shape[1]):
                # 计算当前像素与样本的距离
                dist = np.sum(np.abs(self.samples[i,j] - frame[i,j]) < self.radius)
                if dist < 20:  # 小于匹配阈值,判为前景
                    fg_mask[i,j] = 255
                    # 以1/16概率更新样本(仅前景像素更新)
                    if np.random.rand() < 1/16:
                        self.samples[i,j][np.random.randint(0, self.sample_size)] = frame[i,j]
                else:
                    # 背景像素以1/16概率更新样本,并扩散到邻域
                    if np.random.rand() < 1/16:
                        ni, nj = self._get_random_neighbor(i,j)
                        self.samples[ni,nj][np.random.randint(0, self.sample_size)] = frame[i,j]
        return fg_mask
(3)优缺点
  • 优点:速度极快(单帧处理时间 < 1ms),内存效率高,适合嵌入式设备。
  • 缺点:依赖第一帧初始化,相机移动时需重新校准。

四、背景建模的完整实现流程(以 MOG2 为例)

1. 输入预处理

  • 灰度化:将彩色图像转为灰度图(减少计算量,多数算法基于单通道)。
  • 缩放:降低分辨率(如从 1920x1080 缩至 640x480),提升实时性。
frame = cv2.resize(frame, (640, 480))
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

2. 背景模型初始化

  • history帧用于训练背景(期间避免运动物体干扰,或通过参数允许动态更新)。
bg_subtractor = cv2.createBackgroundSubtractorMOG2(history=200)
for _ in range(200):
    bg_subtractor.apply(gray)  # 预训练背景

3. 前景提取与后处理

  • 形态学操作:腐蚀(去除小噪声点)和膨胀(连接断裂的前景区域)。
  • 轮廓检测:提取前景轮廓,过滤面积过小的区域(如面积 < 50 像素的噪声)。
fg_mask = bg_subtractor.apply(gray)
fg_mask = cv2.erode(fg_mask, None, iterations=2)
fg_mask = cv2.dilate(fg_mask, None, iterations=2)
contours, _ = cv2.findContours(fg_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    if cv2.contourArea(cnt) > 50:  # 过滤小轮廓
        x, y, w, h = cv2.boundingRect(cnt)
        cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)

4. 背景模型更新

  • 自适应学习率bg_subtractor.apply(frame, learningRate=0.01),学习率越小,模型更新越慢(0 表示固定背景,1 表示完全用当前帧更新)。

五、背景建模代码逐步分解

1. 初始化环境与读取视频

import cv2
cap = cv2.VideoCapture('../data/test.avi')
  • 任务

    • 导入OpenCV库,提供图像处理、视频读写等基础功能。

    • 创建VideoCapture对象,读取指定路径的视频文件,为逐帧处理做准备。


2. 预处理工具准备

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
fgbg = cv2.createBackgroundSubtractorMOG2()
  • 任务

    • 形态学核:创建3x3十字形结构元素,用于后续开运算(去噪)。

    • 背景建模器:初始化MOG2背景减除算法,动态建模背景,分离运动前景(如行人、车辆)。


3. 逐帧处理主循环

(1) 读取视频帧
ret, frame = cap.read()
if not ret:
    break
  • 任务

    • 读取视频的下一帧数据,ret判断是否成功读取(失败则退出循环)。

    • frame变量存储当前帧的BGR图像数据,用于后续处理与显示。


(2) 显示原始帧
cv2.imshow('frame', frame)
  • 任务

    • 实时显示原始视频帧,用于直观对比处理前后的效果。


(3) 背景减除获取前景掩膜
fgmask = fgbg.apply(frame)
  • 任务

    • 应用MOG2算法,动态更新背景模型,生成前景二值掩膜。

    • 输出:白色区域表示运动目标(前景),黑色为背景。

    • 光流关联:此步骤定位可能发生运动的区域,为后续光流计算缩小范围(减少计算量)。


(4) 形态学开运算去噪
fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
cv2.imshow('fgmask1', fgmask_new)
  • 任务

    • 开运算:先腐蚀后膨胀,消除细小噪声点(如树叶晃动、光照变化)。

    • 显示处理后的前景掩膜,验证去噪效果。

    • 光流优化:干净的掩膜可提高光流估计的准确性,避免噪声干扰运动向量计算。


(5) 轮廓检测与筛选
_, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    perimeter = cv2.arcLength(c, True)
    if perimeter > 188:
        x,y,w,h = cv2.boundingRect(c)
        frame = cv2.rectangle(frame, (x,y), (x+w,y+h), (0,0,255), 2)
  • 任务

    • 轮廓检测:在二值掩膜中查找连通区域,获取所有潜在运动目标的轮廓。

    • 周长过滤:通过阈值(188)剔除小轮廓(噪声),保留显著运动物体。

    • 绘制边界框:在原始帧上用红色矩形标记运动目标的位置。

    • 光流定位:框选区域可作为光流算法的输入ROI(Region of Interest),针对性计算运动方向与速度。


(6) 显示检测结果
cv2.imshow('frame_new_rect', frame)
k = cv2.waitKey(1)
if k == 27:
    break
  • 任务

    • 显示带检测框的实时视频,直观反馈算法效果。

    • 检测键盘输入,按下ESC键(ASCII 27)退出循环。


4. 资源释放

cap.release()
cv2.destroyAllWindows()
  • 任务

    • 释放视频捕获对象,关闭所有OpenCV窗口,防止内存泄漏。

完整代码展示

# 导入OpenCV库,用于计算机视觉任务
import cv2

# 获取视频信息:创建VideoCapture对象,读取视频文件
cap = cv2.VideoCapture('../data/test.avi')

# 创建形态学操作核:使用3x3的十字形结构元素,用于后续的开运算去噪
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
# 创建背景减除器:使用MOG2算法进行动态背景建模,用于提取运动前景
fgbg = cv2.createBackgroundSubtractorMOG2()

# 主循环:逐帧处理视频
while True:
    # 读取当前帧:ret表示读取状态,frame为图像数据
    ret, frame = cap.read()

    # 检查帧是否读取成功,失败则退出循环
    if not ret:
        break

    # 显示原始视频帧
    cv2.imshow('frame', frame)

    # 应用背景减除器:获得前景掩膜(二值图像,白色代表前景运动区域)
    fgmask = fgbg.apply(frame)

    # 形态学开运算处理:去除前景掩膜中的小噪声点
    fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
    cv2.imshow('fgmask1', fgmask_new)  # 显示处理后的前景掩膜

    # 查找轮廓:检测二值图像中的连通区域
    # 参数说明:RETR_EXTERNAL只检测外部轮廓,CHAIN_APPROX_SIMPLE压缩水平、垂直和对角线段
    # 注意:OpenCV版本不同返回值可能不同,新版返回两个值(contours, hierarchy)
    _, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 遍历所有检测到的轮廓
    for c in contours:
        # 计算轮廓周长(permier应为perimeter,变量名拼写错误)
        perimeter = cv2.arcLength(c, True)

        # 筛选较大轮廓:周长阈值设为188(根据场景调整,用于过滤小噪声)
        if perimeter > 188:
            # 获取轮廓的外接矩形坐标
            x, y, w, h = cv2.boundingRect(c)
            # 在原始帧上绘制红色矩形框(BGR格式:(0,0,255)为红色)
            frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)

    # 显示带检测框的结果帧
    cv2.imshow('frame_new_rect', frame)
    
    # 检测按键输入:ESC键(ASCII 27)退出循环
    k = cv2.waitKey(1)
    if k == 27:
        break

# 释放资源(隐式执行,但显式释放更规范)
cap.release()
cv2.destroyAllWindows()

六、总结:如何选择合适的背景建模算法

场景需求推荐算法核心参数调优
固定摄像头,静态背景GMG、单高斯模型history=100detectShadows=True
动态背景(如树叶、水流)KNN、ViBeK=50radius=20(ViBe)
实时性优先(嵌入式设备)ViBe、简化 MOG2history=200varThreshold=25
复杂光照变化CNT、MOG2detectShadows=True, 低学习率(0.001)
多模态背景(周期性运动)GMM(K=3~5)增加高斯分布数量,动态调整背景比例阈值

 背景建模是视频分析的基石,其核心价值在于平衡模型鲁棒性与计算效率。通过理解不同算法的适用场景、参数含义及后处理技巧,结合具体硬件条件和场景需求,可实现精准的前景提取,为上层计算机视觉任务奠定坚实基础。

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

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

相关文章

leetcode - 字符串

字符串 466. 统计重复个数 题目 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如&#xff0c;str ["abc", 3] "abcabcabc" 。 如果可以从 s2( )中删除某些字符使其变为 s1&#xff0c;则称字符串 s1( )可以从字符串 s2 获得。 例如&#xf…

【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理

1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解&#xff0c;键盘、显示器等都是文件&#xff0c;因为我们说过“Linux下&#xff0c;一切皆文件”&#xff0c;当然我们现在对于这句话的理解是片面的&#xff1b;狭义上理解&#xff0c;文件在磁盘上&#xff0c;磁盘是一…

Freertos--统计所有任务栈信息以及CPU占比和钩子函数

一、概念 在 FreeRTOS 中统计任务栈信息和 CPU 占比是为了分析栈使用情况防止溢出、优化性能识别高负载任务、合理分配资源避免内存浪费、调试系统排查阻塞或优先级问题&#xff0c;有助于提升效率、确保稳定性、快速定位问题并防止崩溃&#xff0c;比如在你的蜂鸣器任务中可以…

京东商品详情API接口调用技术指南‌

本文基于京东宙斯开放平台&#xff08;JD Open API&#xff09;的 jingdong.ware.product.detail.search.get 接口&#xff0c;提供商品详情数据获取的完整技术方案&#xff0c;包含参数说明、代码实现及实战避坑指南。 一、接口功能与权限‌ 核心能力‌ 获取商品SKU的完整信…

基于Java(JSP)+MySQL实现深度学习的音乐推荐系统

基于深度学习的音乐推荐系统简述 本文简要介绍我做的基于深度学习的音乐推荐系统。主要从需求分析与设计实现的角度来进行介绍。 需求分析 基于深度学习的音乐推荐系统旨在以个性化音乐推荐模型为基础&#xff0c;使用B/S架构的形式实现。个性化推荐模型使用了 随机梯度下降…

Linux:进程间通信---匿名管道

文章目录 1. 进程间通信1.1 什么是进程间通信&#xff1f;1.2 为什么进程要进行进程间通信&#xff1f;1.3 怎么实现进程间通信&#xff1f; 2. 匿名管道2.1 匿名管道的原理2.2 匿名管道的系统接口2.3 匿名管道的使用2.4 匿名管道的运用场景 序&#xff1a;在上一篇文章中我们知…

深度学习小记(包括pytorch 还有一些神经网络架构)

这个是用来增加深度学习的知识面或者就是记录一些常用的命令,会不断的更新 import torchvision.transforms as transforms toPIL transforms.ToPILImage()#可以把tensor转换为Image类型的 imgtoPIL(img) #利用save就可以保存下来 img.save("/opt/data/private/stable_si…

【数据可视化-32】全球住房市场分析(2015-2024 年)数据集可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

DAX Studio将PowerBI与EXCEL连接

DAX Studio将PowerBI与EXCEL连接 具体步骤如下&#xff1a; 第一步&#xff1a;先打开一个PowerBI的文件&#xff0c;在外部工具栏里打开DAXStudio&#xff0c;如图&#xff1a; 第二步&#xff1a;DAXStudio界面&#xff0c;点击Advanced选项卡-->Analyze in Excel&#…

使用spring boot vue 上传mp4转码为dash并播放

1.前端实现 <template><div class"video-upload"><el-uploadclass"upload-demo"action"/api/upload":before-upload"beforeUpload":on-success"handleSuccess":on-error"handleError":show-file-…

深入理解指针 (1)

1.内存和地址 1.1内存 1.1.1内存的使用和管理 &#xff08;1&#xff09;内存划分为一个个的内存单元&#xff0c;每个内存单元的大小是1个字节&#xff0c;一个内存单元可以存放8个bit。 &#xff08;2&#xff09;每个内存单元有一个编号&#xff0c;内存单元的编号在计…

Leetcode98、230:二叉搜索树——递归学习

什么是二叉搜索树&#xff1a;右子树节点 > 根节点 > 左子树节点&#xff0c; 二叉搜索树中的搜索&#xff0c;返回给定值val所在的树节点 终止条件为传进来的节点为空、或者节点的值 val值&#xff0c;返回这个节点&#xff1b; 单程递归逻辑&#xff1a;定义一个resu…

15. LangChain多模态应用开发:融合文本、图像与语音

引言&#xff1a;当AI学会"看听说想" 2025年某智慧医院的多模态问诊系统&#xff0c;通过同时分析患者CT影像、语音描述和电子病历&#xff0c;将误诊率降低42%。本文将基于LangChain多模态框架与Deepseek-R1&#xff0c;手把手构建能理解复合信息的智能系统。 一、…

2022李宏毅老师机器学习课程笔记

机器学习笔记目录 1.绪论&#xff08;内容概述&#xff09;2.机器学习和深度学习的基本概念transformer 1.绪论&#xff08;内容概述&#xff09; 机器学习&#xff1a;让机器找一个函数&#xff0c;通过函数输出想要的结果。应用举例&#xff1a;语音识别&#xff0c;图像识别…

笔试强训:Day2

一、字符串中找出连续最长的数字串(双指针) 字符串中找出连续最长的数字串_牛客题霸_牛客网 #include <iostream> #include <string> #include <cctype> using namespace std;int main() {//双指针string str;cin>>str;int nstr.size();int begin-1,l…

linux合并命令(一行执行多个命令)的几种方式总结

背景&#xff1a; 最近安装配置机器&#xff0c;需要手打很多命令。又不能使用docker&#xff0c;所以就使用iTerm2连接多台服务器&#xff0c;然后move session到一个窗口中&#xff0c;shift command i使用XSHELL类似的撰写功能&#xff0c;就可以一次在多台服务器命令窗口…

基于归纳共形预测的大型视觉-语言模型中预测集的**数据驱动校准**

摘要 本研究通过分离共形预测&#xff08;SCP&#xff09;框架&#xff0c;解决了大型视觉语言模型&#xff08;LVLMs&#xff09;在视觉问答&#xff08;VQA&#xff09;任务中幻觉缓解的关键挑战。虽然LVLMs在多模态推理方面表现出色&#xff0c;但它们的输出常常表现出具有…

docker学习笔记5-docker中启动Mysql的最佳实践

一、查找目录文件位置 1、mysql的配置文件路径 /etc/mysql/conf.d 2、mysql的数据目录 /var/lib/mysql 3、环境变量 4、端口 mysql的默认端口3306。 二、启动命令 1、启动命令说明 docker run -d -p 3306:3306 -v /app/myconf:/etc/mysql/conf.d # 挂载配置目录 -v…

从零开始搭建Django博客③--前端界面实现

本文主要在Ubuntu环境上搭建&#xff0c;为便于研究理解&#xff0c;采用SSH连接在虚拟机里的ubuntu-24.04.2-desktop系统搭建&#xff0c;当涉及一些文件操作部分便于通过桌面化进行理解&#xff0c;通过Nginx代理绑定域名&#xff0c;对外发布。 此为从零开始搭建Django博客…

系统与网络安全------弹性交换网络(3)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 STP协议 环路的危害 单点故障 PC之间的互通链路仅仅存在1个 任何一条链路出现问题&#xff0c;PC之间都会无法通信 解决办法 提高网络可靠性 增加冗余/备份链路 增加备份链路后交换网络上产生二层环路 …