计算机视觉算法实现——SAM实例分割:原理、实现与应用全景

news2025/4/13 5:46:25

  ✨个人主页欢迎您的访问 ✨期待您的三连 ✨

 ✨个人主页欢迎您的访问 ✨期待您的三连 ✨

  ✨个人主页欢迎您的访问 ✨期待您的三连✨

​​​

​​​​​​​​​

1. 实例分割领域概述

实例分割(Instance Segmentation)是计算机视觉领域最具挑战性的任务之一,它要求算法不仅能识别图像中的每个物体类别,还要精确区分同一类别中的不同个体实例。与语义分割(Semantic Segmentation)只关注像素级分类不同,实例分割需要同时完成物体检测像素级分割两项任务,为每个独立物体实例生成精确的掩模(mask)。

在众多实例分割算法中,Meta AI于2023年推出的Segment Anything Model(SAM)引起了业界轰动。SAM以其零样本迁移能力强大的泛化性能重新定义了图像分割的边界,被誉为"计算机视觉领域的GPT-3时刻"。该模型在1100万张图像和11亿个掩模的庞大数据集上训练,能够对任何图像中的任何物体进行分割,即使这些物体类别在训练数据中从未出现过。

实例分割技术已广泛应用于自动驾驶、医学影像分析、遥感图像解译、工业质检等领域。SAM的出现进一步降低了图像分割的技术门槛,使开发者无需针对特定领域训练专用模型,即可获得令人惊艳的分割效果。

2. SAM算法基本原理剖析

2.1 SAM的核心架构

SAM采用三模块设计理念,将复杂的分割任务分解为可协同工作的三个组件:

  1. 图像编码器(ViT-H):基于Vision Transformer的庞大主干网络,将输入图像编码为高维特征表示。具体使用ViT-H/16架构(参数量632M),处理1024×1024输入图像,输出64×64的嵌入向量。

  2. 提示编码器(Prompt Encoder):处理各种形式的用户交互提示(点、框、文本等),将其映射为与图像特征空间对齐的向量表示。支持:

    • 稀疏提示(点、框):通过位置编码处理

    • 密集提示(掩模):通过卷积层处理

  3. 轻量级掩模解码器(Mask Decoder):将图像嵌入和提示嵌入结合,动态预测目标掩模。采用类似Transformer的双向注意力机制,在仅0.1秒内即可生成高质量分割结果。

2.2 突破性技术特点

SAM的创新之处主要体现在三个方面:

  1. 提示工程(Promptable Segmentation):通过点、框、文本等多样化提示方式引导模型生成目标掩模,极大提升了人机交互灵活性。

  2. 分割一切(Zero-shot Transfer):得益于海量训练数据,SAM能分割训练时未见过的物体类别,在多个领域达到接近甚至超过专用模型的性能。

  3. 三模态输出:对于每个提示,SAM同时输出:

    • 多个有效掩模(考虑分割歧义)

    • 每个掩模的置信度分数

    • 分割区域的稳定特征表示

2.3 训练方法论

SAM的训练过程采用可提示分割任务模拟实际应用场景:

  1. 从人工标注的掩模中随机采样提示(如点、框)

  2. 要求模型根据提示预测掩模

  3. 使用组合损失函数(包括掩模损失和IoU预测损失)优化模型

损失函数公式:

3. 数据集资源大全

3.1 官方SA-1B数据集

Meta发布的Segment Anything 1 Billion(SA-1B)数据集是迄今最大的分割数据集:

  • 1100万张多样化图像

  • 11亿个高质量掩模标注

  • 平均每张图像包含100个标注对象

  • 图像分辨率高达1500×2250

下载链接(需申请许可):
https://ai.facebook.com/datasets/segment-anything/

3.2 替代开源数据集

当SA-1B访问受限时,可考虑以下优质替代资源:

  1. COCO 2017(通用物体分割)

    • 118K训练图像,5K验证图像

    • 80个物体类别,1.5M实例标注

    • 下载:COCO - Common Objects in Context

  2. LVIS v1.0(长尾分布分割)

    • 1203个类别,超过2M高质量掩模

    • 特别关注稀有物体类别

    • 下载:LVIS

  3. ADE20K(场景解析)

    • 25K图像,覆盖150个场景类别

    • 对象边界标注极为精细

    • 下载:ADE20K dataset

3.3 数据预处理示例代码

import numpy as np
import torch
from torchvision import transforms
from PIL import Image

class SAMDataProcessor:
    def __init__(self, image_size=1024):
        self.image_size = image_size
        self.transform = transforms.Compose([
            transforms.Resize((image_size, image_size)),
            transforms.ToTensor(),
            transforms.Normalize(mean=[0.485, 0.456, 0.406], 
                               std=[0.229, 0.224, 0.225])
        ])
    
    def process_image(self, image_path):
        """处理输入图像为SAM所需格式"""
        image = Image.open(image_path).convert("RGB")
        original_size = image.size  # (W,H)
        
        # 应用变换
        image_tensor = self.transform(image)
        
        # 生成缩放因子(用于将提示坐标还原到原图尺寸)
        scale_factors = (
            original_size[0] / self.image_size,
            original_size[1] / self.image_size
        )
        
        return {
            "image": image_tensor.unsqueeze(0),  # 添加batch维度
            "original_size": original_size,
            "scale_factors": scale_factors
        }
    
    def process_prompt(self, prompt, scale_factors):
        """处理用户提示(点/框)为模型输入格式"""
        if isinstance(prompt, tuple):  # 点提示 (x,y)
            point = np.array([[prompt[0]/scale_factors[0], 
                             prompt[1]/scale_factors[1]]])
            return {
                "point_coords": torch.as_tensor(point, dtype=torch.float),
                "point_labels": torch.ones(1, dtype=torch.int)  # 前景点
            }
        elif isinstance(prompt, list):  # 框提示 [x1,y1,x2,y2]
            box = np.array([
                prompt[0]/scale_factors[0],
                prompt[1]/scale_factors[1],
                prompt[2]/scale_factors[0],
                prompt[3]/scale_factors[1]
            ])
            return {"boxes": torch.as_tensor(box[None,:], dtype=torch.float)}
        else:
            raise ValueError("提示类型必须是点(x,y)或框[x1,y1,x2,y2]")

4. 完整代码实现

4.1 环境配置

pip install torch torchvision opencv-python matplotlib
pip install git+https://github.com/facebookresearch/segment-anything.git
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth  # 下载预训练权重

4.2 SAM实例分割全流程实现

import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
from segment_anything import sam_model_registry, SamPredictor

class SAMSegmenter:
    def __init__(self, model_type="vit_h", checkpoint_path="sam_vit_h_4b8939.pth", device="cuda"):
        """
        初始化SAM分割器
        
        参数:
            model_type: 模型类型(vit_h/vit_l/vit_b)
            checkpoint_path: 模型权重路径
            device: 运行设备(cuda/cpu)
        """
        self.device = torch.device(device if torch.cuda.is_available() else "cpu")
        self.model = sam_model_registry[model_type](checkpoint=checkpoint_path)
        self.model.to(self.device)
        self.predictor = SamPredictor(self.model)
        self.result_cache = {}
    
    def set_image(self, image_path):
        """设置待分割图像"""
        image = cv2.imread(image_path)
        self.image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        self.predictor.set_image(self.image)
        self.result_cache.clear()  # 清除之前的结果缓存
        
    def segment_with_prompt(self, prompt, multimask=True):
        """
        根据提示进行分割
        
        参数:
            prompt: 可以是点(x,y)、框[x1,y1,x2,y2]或掩模
            multimask: 是否输出多个可能掩模
            
        返回:
            masks: 分割掩模数组(H,W,N)
            scores: 每个掩模的置信度
            logits: 低分辨率掩模logits(可用于细化)
        """
        if isinstance(prompt, tuple):  # 点提示
            input_point = np.array([prompt])
            input_label = np.array([1])  # 前景点
            masks, scores, logits = self.predictor.predict(
                point_coords=input_point,
                point_labels=input_label,
                multimask_output=multimask
            )
        elif isinstance(prompt, list):  # 框提示
            input_box = np.array(prompt)
            masks, scores, logits = self.predictor.predict(
                box=input_box,
                multimask_output=multimask
            )
        else:
            raise ValueError("提示类型必须是点(x,y)或框[x1,y1,x2,y2]")
        
        # 缓存结果
        key = str(prompt)
        self.result_cache[key] = {
            "masks": masks,
            "scores": scores,
            "logits": logits
        }
        
        return masks, scores, logits
    
    def show_results(self, prompt, mask_index=0):
        """可视化分割结果"""
        key = str(prompt)
        if key not in self.result_cache:
            raise ValueError("请先对当前提示执行分割")
            
        masks = self.result_cache[key]["masks"]
        scores = self.result_cache[key]["scores"]
        
        plt.figure(figsize=(15,10))
        plt.imshow(self.image)
        self._show_mask(masks[mask_index], plt.gca())
        
        if isinstance(prompt, tuple):  # 点提示
            plt.scatter(prompt[0], prompt[1], color='red', 
                        marker='*', s=200, edgecolor='white')
        elif isinstance(prompt, list):  # 框提示
            x1, y1, x2, y2 = prompt
            plt.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], 
                     color='green', linewidth=2)
        
        plt.title(f"Mask {mask_index}, Score: {scores[mask_index]:.3f}", fontsize=16)
        plt.axis('off')
        plt.show()
    
    def _show_mask(self, mask, ax, random_color=False):
        """在图像上叠加显示掩模"""
        color = np.array([30/255, 144/255, 255/255, 0.6])
        h, w = mask.shape[-2:]
        mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
        ax.imshow(mask_image)
    
    def auto_segment(self, points_per_side=32, pred_iou_thresh=0.88):
        """
        自动分割图像中的所有对象
        基于SAM的自动掩模生成功能
        
        参数:
            points_per_side: 采样的点数
            pred_iou_thresh: 掩模质量阈值
            
        返回:
            segments: 分割结果列表[{'segmentation':mask, 'area':int, ...}]
        """
        from segment_anything import SamAutomaticMaskGenerator
        
        mask_generator = SamAutomaticMaskGenerator(
            model=self.model,
            points_per_side=points_per_side,
            pred_iou_thresh=pred_iou_thresh,
            stability_score_thresh=0.92,
            crop_n_layers=1,
            crop_n_points_downscale_factor=2,
            min_mask_region_area=100
        )
        
        segments = mask_generator.generate(self.image)
        segments = sorted(segments, key=lambda x: x['area'], reverse=True)
        
        # 可视化所有分割结果
        plt.figure(figsize=(15,15))
        plt.imshow(self.image)
        for seg in segments:
            self._show_mask(seg['segmentation'], plt.gca(), random_color=True)
        plt.axis('off')
        plt.show()
        
        return segments

# 使用示例
if __name__ == "__main__":
    # 初始化分割器
    segmenter = SAMSegmenter()
    
    # 加载测试图像
    image_path = "example.jpg"
    segmenter.set_image(image_path)
    
    # 点提示分割
    point_prompt = (500, 300)  # 图像中的(x,y)坐标
    masks, scores, _ = segmenter.segment_with_prompt(point_prompt)
    segmenter.show_results(point_prompt)
    
    # 框提示分割
    box_prompt = [100, 100, 800, 600]  # [x1,y1,x2,y2]
    masks, scores, _ = segmenter.segment_with_prompt(box_prompt)
    segmenter.show_results(box_prompt)
    
    # 自动分割所有对象
    segments = segmenter.auto_segment()
    print(f"发现{len(segments)}个独立对象")

4.3 代码架构解析

  1. SAMSegmenter类:封装了SAM的核心功能,提供简洁易用的接口

    • set_image():准备待分割图像

    • segment_with_prompt():基于交互提示执行分割

    • auto_segment():自动分割图像中所有显著对象

  2. 可视化工具:集成Matplotlib实现结果可视化

    • 支持点、框提示的标注显示

    • 掩模叠加显示与透明度控制

  3. 自动掩模生成:利用SAM的网格点采样策略,实现全自动分割

  4. 多掩模处理:支持同时处理并可视化多个候选掩模

5. 前沿论文与研究进展

5.1 奠基性论文

  1. 《Segment Anything》(Meta AI,ICCV 2023)

    • 论文链接:[2304.02643] Segment Anything

    • 代码仓库:https://github.com/facebookresearch/segment-anything

    • 核心贡献:提出提示式分割范式,建立SA-1B数据集,实现零样本迁移能力

  2. 《Fast Segment Anything》(复旦大学,2023)

    • 论文链接:[2306.12156] Fast Segment Anything

    • 核心贡献:优化SAM架构,推理速度提升50倍,参数量减少100倍

5.2 领域应用论文

  1. 《Medical SAM Adapter》(清华大学,Nature Medicine 2023)

    • 论文链接:Precise, pragmatic and inclusive: the modern era of oncology clinical trials | Nature Medicine

    • 核心贡献:将SAM适配到医学影像分割,在20种CT/MRI模态上达到SOTA

  2. 《Track Anything》(中科院,NeurIPS 2023)

    • 论文链接:https://arxiv.org/abs/2305.20651

    • 核心贡献:结合SAM与视频目标跟踪,实现高效视频对象分割

5.3 改进方向论文

  1. 《Edge-SAM》(MIT,CVPR 2024)

    • 论文链接:[2312.06660] EdgeSAM: Prompt-In-the-Loop Distillation for On-Device Deployment of SAM

    • 核心贡献:专为边缘设备优化的SAM变体,内存占用减少80%

  2. 《Text2Seg》(Google Research,ICLR 2024)

    • 论文链接:[2401.02320] Amplification of supersonic micro-jets by resonant inertial cavitation-bubble pair

    • 核心贡献:增强SAM的文本提示能力,实现开放词汇分割

6. 实际应用场景

6.1 医学影像分析

SAM在医疗领域展现出惊人潜力:

  • 放射影像分割:自动分割CT/MRI中的器官、病变区域

  • 病理切片分析:精确标记癌细胞区域,辅助癌症诊断

  • 手术导航:实时分割手术视野中的关键解剖结构

案例:在乳腺超声图像中,仅需点击肿块中心,SAM即可精确分割肿瘤边界,准确率超过90%。

6.2 遥感图像解译

地理信息系统(GIS)中的创新应用:

  • 地物分类:自动提取建筑物、道路、水体等地表特征

  • 变化检测:比对不同时期图像,识别地表变化

  • 灾害评估:快速分割洪水、火灾等灾害影响区域

数据:在0.5米分辨率的卫星图像上,SAM对建筑物的IoU达到0.85。

6.3 工业质检

制造业中的质量控制系统:

  • 缺陷检测:分割产品表面的划痕、凹陷等缺陷

  • 零件定位:精确定位装配线上的关键部件

  • 尺寸测量:基于分割结果进行非接触式精密测量

效益:某汽车厂采用SAM后,质检效率提升300%,误检率降低50%。

6.4 增强现实(AR)

交互体验提升:

  • 实时对象分割:在AR眼镜中即时分离前景对象

  • 虚拟试穿:精确分割身体部位实现服装虚拟展示

  • 场景理解:识别并分割环境中的可交互元素

性能:在移动设备上实现30FPS的实时分割性能。

7. 未来研究方向

7.1 当前技术局限

尽管SAM表现卓越,仍存在以下挑战:

  1. 小物体分割:对小于图像面积1%的对象分割精度不足

  2. 透明/反光物体:对玻璃、金属等特殊材质分割效果差

  3. 计算资源需求:ViT-H模型需要16GB GPU内存才能流畅运行

  4. 语义理解有限:无法理解"分割第三排书架上的书本"这类复杂指令

  5. 视频时序一致性:帧间分割结果缺乏连续性

7.2 重点改进方向

  1. 轻量化架构设计

    • 知识蒸馏:用大模型训练小模型

    • 量化压缩:8/4-bit低精度推理

    • 动态网络:根据输入复杂度调整计算量

  2. 多模态提示增强

    • 文本提示:支持自然语言描述

    • 语音交互:通过语音指令引导分割

    • 手势识别:结合AR/VR的交互方式

  3. 时序一致性优化

    • 光流引导:利用运动信息稳定视频分割

    • 记忆机制:维护跨帧的对象表征

    • 3D感知:结合深度信息提升空间一致性

  4. 领域自适应技术

    • 小样本微调:使用少量标注数据适配特定领域

    • 无监督域适应:解决训练-测试数据分布差异

    • 测试时优化:在推理阶段动态调整模型

  5. 开放世界理解

    • 属性识别:分割同时识别物体属性

    • 关系推理:理解对象间空间/语义关系

    • 常识整合:融入常识知识提升分割逻辑性

7.3 潜在突破点

  1. 神经符号结合:将深度学习的感知能力与符号系统的推理能力结合

  2. 物理引擎集成:利用物理规律约束分割结果合理性

  3. 终身学习框架:使模型能持续学习新概念而不遗忘旧知识

  4. 人机协作分割:设计更高效的交互式分割工作流

  5. 通用视觉系统:迈向统一的多任务视觉理解模型

8. 结语

Segment Anything Model的出现标志着计算机视觉领域的一个重要转折点,它首次实现了真正通用的图像分割能力。通过本文的技术剖析、代码实现和应用展望,我们可以看到SAM不仅是一个强大的工具,更为整个领域开辟了新的研究方向。

未来,随着模型轻量化、交互多元化和应用垂直化的发展,SAM及其衍生技术将深刻改变医疗诊断、工业质检、遥感分析等多个领域的工作方式。特别是在与大型语言模型(LLM)结合后,有望实现"以自然语言描述任何视觉任务"的终极目标。

对于研究者和开发者而言,现在正是探索SAM潜力的最佳时机。无论是改进其核心架构,还是开发垂直应用,亦或是探索其理论基础,都存在大量创新机会。让我们共同期待并参与这场由SAM引发的计算机视觉革命。

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

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

相关文章

基于SpringBoot的宠物健康咨询系统(源码+数据库+万字文档)

502基于SpringBoot的宠物健康咨询系统,系统包含三种角色:管理员、用户,顾问主要功能如下。 【用户功能】 1. 首页:查看系统主要信息和最新动态。 2. 公告:浏览系统发布的公告信息。 3. 顾问:浏览可提供咨询…

vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值

项目场景&#xff1a; <el-table-column label"税率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …

CCF CSP 第35次(2024.09)(2_字符串变换_C++)(哈希表+getline)

CCF CSP 第35次&#xff08;2024.09&#xff09;&#xff08;2_字符串变换_C&#xff09; 解题思路&#xff1a;思路一&#xff08;哈希表getline&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;哈希表getline&#xff09;&#xff09;&#xff1a; …

Docker--利用dockerfile搭建mysql主从集群和redis集群

Docker镜像制作的命令 链接 Docker 镜像制作的注意事项 链接 搭建mysql主从集群 mysql主从同步的原理 MySQL主从同步&#xff08;Replication&#xff09;是一种实现数据冗余和高可用性的技术&#xff0c;通过将主数据库&#xff08;Master&#xff09;的变更操作同步到一个…

蓝桥杯嵌入式考前模块总结

一.RTC 使用RTC直接再cubeMX中配置启动时钟和日历 如第六届省赛 想要让RTC的秒每隔一秒递增1需要在时钟树界面观察RTC的主频 由于RTC时钟主频为32KHZ将异步预分频计数器的值设为31&#xff0c;将同步预分频计数器的值设为999这样就可以将RTC的时钟信号分频为1HZ达到1秒自增的…

关于举办“2025年第五届全国大学生技术创新创业大赛“的通知

赛事含金量 大赛获奖即可有机会为你的大学里的“创新创业”加分&#xff01;这是每个大学要求必须修满的学分&#xff01; 中国“互联网&#xff0b;”大学生创新创业大赛磨刀赛&#xff01;“挑战杯”中国大学生创业计划大赛必参赛&#xff01; 国赛获奖&#xff0c;“互联…

Ingress蓝绿发布

Ingress蓝绿发布 Ingress常用注解说明yaml资源清单绿色版本yml资源清单蓝色版本yaml资源清单 主Ingress金丝雀Ingress基于客户端请求头的流量切分结果验证 基于客户端来源IP的流量切分结果验证 基于服务权重的流量切分结果验证 基于IP来源区域来切分IP---方案未验证基于User-Ag…

基于AOP+Log4Net+AutoFac日志框架

1.项目概述 这是一个基于 C# 的 WPF 项目 WpfApp12log4net&#xff0c;它综合运用了依赖注入、日志记录和接口实现等多种技术&#xff0c;同时使用了 Autofac、Castle.Core 和 log4net 等第三方库。 2.配置log4net 新建一个Log4Net.config&#xff0c;配置需要记录的日志信息…

python推箱子游戏

,--^----------,--------,-----,-------^--,-------- 作者 yty---------------------------^----------_,-------, _________________________XXXXXX XXXXXX XXXXXX ______(XXXXXXXXXXXX(________(------ 0 [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,0,0,0,0,0,0,0,0,0,0,…

华为hcie证书的有效期怎么判断?

在ICT行业&#xff0c;华为HCIE证书堪称含金量极高的“敲门砖”&#xff0c;拥有它往往意味着在职场上更上一层楼。然而&#xff0c;很多人在辛苦考取HCIE证书后&#xff0c;却对其有效期相关事宜一知半解。今天&#xff0c;咱们就来好好唠唠华为HCIE证书的有效期怎么判断这个关…

PowerBI 条形图显示数值和百分比

数据表: 三个度量值 销售额 SUM(销量表[销售量])//注意, 因为Y轴显示的产品&#xff0c;会被筛选&#xff0c;所以用ALLSELECTED来获取当前筛选条件下&#xff0c;Y轴显示的产品 百分比 FORMAT(DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED(销量表[产品编码]))),"0…

基于YOLOv8的火车轨道检测识别系统:技术实现与应用前景

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 引言&#xff1a;火车轨道检测领域概述 铁路运输作为国民经济的大动脉&#xff0c;其安全运行至关重要…

css使用mix-blend-mode的值difference实现内容和父节点反色

1. 使用场景 往往开发过程中&#xff0c;经常遇到产品说你这个背景图和文字颜色太接近了&#xff0c;能不能适配下背景图&#xff0c;让用户能够看清具体内容是啥。 这么说吧&#xff0c;这种需求场景非常合理&#xff0c;因为你做开发就是要给用户一个交代&#xff0c;给他们…

Pytest多环境切换实战:测试框架配置的最佳实践!

你是否也遇到过这种情况&#xff1a;本地测试通过&#xff0c;一到测试环境就翻车&#xff1f;环境变量错乱、接口地址混乱、数据源配置丢失……这些「环境切换」问题简直像定时炸弹&#xff0c;随时引爆你的测试流程&#xff01; 测试人员每天都跟不同的环境打交道&#xff0…

单细胞多组学及空间组学数据分析与应用

一、引言 生命科学研究正处于快速发展的阶段&#xff0c;随着技术的不断革新&#xff0c;对生物系统的理解也在逐步深入到单细胞和空间层面。单细胞多组学及空间组学技术应运而生&#xff0c;它们突破了传统研究手段在细胞异质性和空间结构解析上的局限&#xff0c;为我们打开…

[ctfshow web入门] web39

信息收集 题目发生了微妙的变化&#xff0c;只过滤flag&#xff0c;include后固定跟上了.php。且没有了echo $flag;&#xff0c;虽说本来就没什么用 if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){include($c.".php");} }else{…

HarmonyOS-ArkUI 装饰器V2 @ObservedV2与@Trace装饰器

参考文档: 文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V14/arkts-new-observedv2-and-trace-V14#trace%E8%A3%85%E9%A5%B0%E5%AF%B9%E8%B1%A1%E6%95%B0%E7%BB%84由于V2的装饰器比V1的装饰器更加易用,尽管学习的过程中用到的都是V1的装饰器,但…

基于ImGui+FFmpeg实现播放器

基于ImGuiFFmpeg实现播放器 演示&#xff1a; ImGui播放器 继续研究FFmpeg&#xff0c;之前做了一个SDL的播放器&#xff0c;发现SDL的可视化UI界面的功能稍微差了点&#xff0c;所以今天我们换了一个新的工具&#xff0c;也就是ImGui。 ImGui官方文档&#xff1a;https://g…

python的web框架flask(hello,world版)

问题 最近需要基于一个开源项目进行二次开发&#xff0c;但是&#xff0c;现在的我主修java&#xff0c;从来没有接触过python的web开发。所以&#xff0c;我现在需要学习一下flask的hello&#xff0c;world。 python版本选择 通过这个Python版本状态页面Status of Python v…

Java面试39-Zookeeper中的Watch机制的原理

Zookeeper是一个分布式协调组件&#xff0c;为分布式架构下的多个应用组件提供了顺序访问控制能力。它的数据存储采用了类似于文件系统的树形结构&#xff0c;以节点的方式来管理存储在Zookeeper上的数据。 Zookeeper提供了一个Watch机制&#xff0c;可以让客户端感知到Zooke…