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

【计算机视觉】语义分割:MMSegmentation:OpenMMLab开源语义分割框架实战指南

在这里插入图片描述

深度解析MMSegmentation:OpenMMLab开源语义分割框架实战指南

  • 技术架构与设计哲学
      • 系统架构概览
      • 核心技术特性
  • 环境配置与安装指南
      • 硬件配置建议
      • 详细安装步骤
      • 环境验证
  • 实战全流程解析
      • 1. 数据集准备
      • 2. 配置文件定制
      • 3. 模型训练与优化
      • 4. 模型评估与推理
  • 核心功能扩展
      • 1. 自定义模型组件
      • 2. 多任务学习
      • 3. 知识蒸馏
  • 常见问题与解决方案
      • 1. CUDA版本冲突
      • 2. 显存溢出问题
      • 3. 数据集加载失败
  • 性能优化技巧
      • 1. 推理加速
      • 2. 模型量化部署
      • 3. 混合精度训练
  • 学术背景与核心论文
      • 基础方法论
      • 最新算法集成
  • 应用场景与未来展望
      • 典型工业应用
      • 技术演进方向

MMSegmentation是OpenMMLab生态系统中的语义分割核心框架,集成了30+种前沿分割算法与200+个预训练模型。作为学术界和工业界的标杆工具,其在模块化设计、算法覆盖率和工程实现质量上均处于领先地位。本文将从技术架构到实战应用,全面解析这一框架的设计哲学与使用技巧。

技术架构与设计哲学

系统架构概览

MMSegmentation采用分层模块化设计:

  1. 数据抽象层:统一数据接口,支持COCO、Cityscapes等20+数据集格式
  2. 算法组件层:解耦骨干网络、解码器、损失函数等核心模块
  3. 训练调度层:集成分布式训练、混合精度等优化策略

在这里插入图片描述

图:MMSegmentation系统架构(来源:官方文档)

核心技术特性

  • 统一接口规范:跨算法复用组件(如骨干网络、评估指标)
  • 灵活配置系统:基于Python的层级化配置管理
  • 高效训练框架:支持8卡GPU 2小时完成Cityscapes训练
  • 多任务扩展:兼容语义分割、全景分割、实例分割

环境配置与安装指南

硬件配置建议

组件推荐配置最低要求
GPUNVIDIA A100GTX 1660Ti
显存16GB6GB
CPUXeon 8核Core i5
内存32GB8GB

详细安装步骤

# 创建conda环境
conda create -n mmseg python=3.8 -y
conda activate mmseg# 安装PyTorch(适配CUDA 11.3)
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.3 -c pytorch# 安装MMCV基础库
pip install mmcv-full==1.7.1 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.12.0/index.html# 安装MMSegmentation
git clone https://github.com/open-mmlab/mmsegmentation.git
cd mmsegmentation
pip install -v -e .

环境验证

import mmseg
print(mmseg.__version__)  # 应输出0.30.0+

实战全流程解析

1. 数据集准备

支持标准格式转换:

# Cityscapes数据集预处理
python tools/convert_datasets/cityscapes.py /path/to/cityscapes --nproc 8

生成结构:

data/cityscapes/
├── img_dir/
│   ├── train/
│   └── val/
└── ann_dir/├── train/└── val/

2. 配置文件定制

典型配置文件(configs/unet/unet-s5-d16_fcn_4x4_512x512_160k_cityscapes.py):

_base_ = ['../_base_/models/fcn_unet_s5-d16.py',  # 模型架构'../_base_/datasets/cityscapes.py',     # 数据配置'../_base_/default_runtime.py',         # 运行时配置'../_base_/schedules/schedule_160k.py'  # 训练策略
]# 修改模型参数
model = dict(decode_head=dict(num_classes=19,  # Cityscapes类别数loss_decode=dict(type='CrossEntropyLoss', use_sigmoid=False)))# 调整数据路径
data = dict(samples_per_gpu=4,workers_per_gpu=4,train=dict(data_root='data/cityscapes'),val=dict(data_root='data/cityscapes'))

3. 模型训练与优化

# 单GPU训练
python tools/train.py configs/unet/unet-s5-d16_fcn_4x4_512x512_160k_cityscapes.py# 分布式训练(4 GPU)
./tools/dist_train.sh configs/unet/unet-s5-d16_fcn_4x4_512x512_160k_cityscapes.py 4# 混合精度训练
./tools/dist_train.sh configs/unet/unet-s5-d16_fcn_4x4_512x512_160k_cityscapes.py 4 --amp

4. 模型评估与推理

from mmseg.apis import inference_model, init_model, show_result_pyplot# 加载模型
config_file = 'configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_cityscapes.py'
checkpoint_file = 'checkpoints/deeplabv3_r50-d8_512x512_160k_cityscapes_20210905_220318-5f67a1e3.pth'
model = init_model(config_file, checkpoint_file, device='cuda:0')# 执行推理
result = inference_model(model, 'demo.jpg')# 可视化结果
vis_image = show_result_pyplot(model, 'demo.jpg', result, opacity=0.5)
cv2.imwrite('result.jpg', vis_image)

核心功能扩展

1. 自定义模型组件

# 注册新解码器
from mmseg.models import HEADS@HEADS.register_module()
class CustomDecoder(nn.Module):def __init__(self, in_channels, num_classes):super().__init__()self.conv = nn.Conv2d(in_channels, num_classes, kernel_size=1)def forward(self, inputs):return self.conv(inputs)# 配置文件中引用
model = dict(decode_head=dict(type='CustomDecoder',in_channels=512,num_classes=19))

2. 多任务学习

# 实现联合分割与深度估计
model = dict(type='MultiTaskSegmentor',backbone=dict(type='ResNetV1c'),decode_head=[dict(type='FCNHead', num_classes=19),  # 分割头dict(type='DepthHead')                 # 深度估计头],auxiliary_head=[dict(type='FCNHead', num_classes=19)   # 辅助头])

3. 知识蒸馏

# 教师-学生模型配置
_base_ = ['../_base_/models/deeplabv3_r50-d8.py','./knowledge_distillation.py'  # 继承蒸馏配置
]teacher_config = 'configs/deeplabv3/deeplabv3_r101-d8_512x512_160k_cityscapes.py'
teacher_checkpoint = 'checkpoints/deeplabv3_r101-d8_512x512_160k_cityscapes_20210905_220318-5f67a1e3.pth'

常见问题与解决方案

1. CUDA版本冲突

现象undefined symbol: cudaGetErrorString version libcudart.so.11.0
解决方案

# 验证版本匹配
conda list | grep cudatoolkit
python -c "import torch; print(torch.version.cuda)"# 重新安装匹配的MMCV
pip install mmcv-full==1.7.1 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.12.0/index.html

2. 显存溢出问题

优化策略

# 配置梯度累积
optimizer_config = dict(type='GradientCumulativeOptimizerHook', cumulative_iters=4)# 调整批次大小
data = dict(samples_per_gpu=2,workers_per_gpu=2)

3. 数据集加载失败

诊断步骤

  1. 验证标注文件格式(PNG单通道)
  2. 检查数据集路径是否为绝对路径
  3. 确认类别数配置一致:
    dataset_type = 'CityscapesDataset'
    data_root = 'data/cityscapes/'
    num_classes = 19
    

性能优化技巧

1. 推理加速

# 启用cudnn benchmark
cfg = get_cfg()
cfg.setdefault('cudnn_benchmark', True)# 优化后处理
cfg.model.test_cfg.mode = 'slide'  # 滑动窗口推理

2. 模型量化部署

# 导出ONNX模型
python tools/deployment/pytorch2onnx.py \configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_cityscapes.py \checkpoints/deeplabv3_r50-d8_512x512_160k_cityscapes.pth \--output-file deeplabv3.onnx# TensorRT优化
./tools/deployment/deploy.py \--config configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_cityscapes.py \--checkpoint checkpoints/deeplabv3_r50-d8_512x512_160k_cityscapes.pth \--work-dir trt_models \--device cuda \--fp16

3. 混合精度训练

./tools/dist_train.sh \configs/deeplabv3/deeplabv3_r50-d8_512x512_160k_cityscapes.py 4 \--amp \--cfg-options optimizer_config.grad_clip.max_norm=35

学术背景与核心论文

基础方法论

  1. U-Net

    • Ronneberger O, et al. “U-Net: Convolutional Networks for Biomedical Image Segmentation” MICCAI 2015
    • 医学影像分割的里程碑模型
  2. DeepLab系列

    • Chen L, et al. “Rethinking Atrous Convolution for Semantic Image Segmentation” TPAMI 2017
    • 提出空洞卷积与ASPP模块
  3. PSPNet

    • Zhao H, et al. “Pyramid Scene Parsing Network” CVPR 2017
    • 金字塔池化模块的经典实现

最新算法集成

  1. Swin Transformer

    • Liu Z, et al. “Swin Transformer: Hierarchical Vision Transformer using Shifted Windows” ICCV 2021
    • 基于窗口注意力的视觉Transformer
  2. MaskFormer

    • Cheng B, et al. “Masked-attention Mask Transformer for Universal Image Segmentation” CVPR 2022
    • 统一分割框架
  3. SegNeXt

    • Guo M, et al. “SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation” NeurIPS 2022
    • 新型卷积注意力机制

应用场景与未来展望

典型工业应用

  1. 自动驾驶:道路场景解析
  2. 医学影像:器官与病灶分割
  3. 卫星遥感:地表覆盖分类
  4. 工业质检:缺陷区域检测

技术演进方向

  1. 视频语义分割:时序一致性建模
  2. 3D分割:点云与体数据支持
  3. 自监督学习:减少标注数据依赖
  4. 边缘计算:移动端实时推理

MMSegmentation凭借其模块化设计和丰富的算法生态,已成为语义分割领域的标杆框架。通过本文的技术解析与实战指南,开发者可快速掌握框架的核心功能,并将其应用于实际场景。随着OpenMMLab社区的持续发展,MMSegmentation将持续集成前沿算法,推动语义分割技术的边界不断扩展。

相关文章:

【计算机视觉】语义分割:MMSegmentation:OpenMMLab开源语义分割框架实战指南

深度解析MMSegmentation:OpenMMLab开源语义分割框架实战指南 技术架构与设计哲学系统架构概览核心技术特性 环境配置与安装指南硬件配置建议详细安装步骤环境验证 实战全流程解析1. 数据集准备2. 配置文件定制3. 模型训练与优化4. 模型评估与推理 核心功能扩展1. 自…...

25_04_30Linux架构篇、第1章_02源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62

Linux_基础篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:源码编译安装Apache HTTP Server 最新稳定版本是 2.4.62 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.01 适用环境: Centos7 文档说明 本文…...

【重走C++学习之路】25、特殊类设计

目录 一、不能被拷贝的类 二、堆上创建对象的类 三、栈上创建对象的类 四、不能被继承的类 五、单例模式 结语 一、不能被拷贝的类 如何实现一个不能被拷贝的类?在看到这个要求的第一反应就是禁掉类的拷贝构造函数和赋值运算符重载函数,再往深了探…...

基于Redis实现-用户签到

基于Redis实现-用户签到 这个功能将使用到Redis中的BitMap来实现。 我们按照月来统计用户签到信息,签到记录为1,未签到则记录为0 把每一个bit位对应当月的每一天,形成了映射关系。用0和1标示业务状态,这种思路称为位图(BitMap)。…...

利用Redisson分布式锁解决多服务器数据刷新问题

利用Redisson分布式锁解决多服务器数据刷新问题 一、业务背景二、代码实现1、引入Redisson依赖2、配置Redisson,实际项目中Redis为集群配置3、自定义拒绝策略4、异步刷新网元服务 三、项目结构及源码 一、业务背景 最近有个需求需要自动刷新网元服务,由…...

25.4.30数据结构|并查集 路径压缩

前言 在QuickUnion快速合并的过程中,每次都要找根ID,而路径压缩让找根ID变得更加迅速直接。 路径压缩 针对的是findRootIndex()【查找根ID】进行的压缩。 需要实现的是: 在找根节点的过程中,记录这条路径上的所有信息,…...

react学习笔记3——基于React脚手架

React路由 相关理解 SPA的理解 单页Web应用(single page web application,SPA)。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面,只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 路由的理…...

C#中的LINQ:简化数据查询与操作

引言 在现代软件开发中,处理和操作数据是不可避免的任务。无论是从数据库读取信息,还是对内存中的集合进行筛选、排序等操作,开发者都需要一种高效且易于使用的方法。C#中的LINQ(Language Integrated Query)正是为此而…...

OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传【内含常用设计模式设计示例】

OkHttp3.X 工具类封装:链式调用,支持HTTPS、重试、文件上传 基于OkHttp3.X封装,提供链式调用API,简化GET/POST请求,支持HTTPS、自动重试、文件上传等功能,提升开发效率。 在 Android 和 Java 开发中&#x…...

Unity SpriteEditor(精灵图片编辑器)

🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎SpriteEditor: 精灵图片编辑器 📌用于编辑2D游戏开发中使用的Sp…...

雅思写作--70个高频表达

文章目录 1. learn new skills学生通过户外活动学到很多新技2. take immediate action to do各国采取有效行动以保护环境政府采取了必要行动以减少失业。你应该立即采取行动来解3. communication skills4. grow significantly5. have many advantages1. learn new skills “lea…...

Anaconda中配置Pyspark的Spark开发环境

Anaconda中配置Pyspark的Spark开发环境 目录 1.在控制台中测试ipython是否启动正常2.安装好Java3.安装Spark并配置环境变量4.PySpark配置5.修改spark\conf下的spark-env文件6.测试Pyspark是否安装成功 1.在控制台中测试ipython是否启动正常 anaconda正常安装 这里先检查ipyt…...

Spring 提供了多种依赖注入的方式

构造器注入(Constructor Injection) 构造器注入是通过类的构造函数来注入依赖项。这是 Spring 推荐的方式,因为它提供了不可变性和更好的可测试性。 import org.springframework.stereotype.Component;Component public class ServiceA {pub…...

面经-计算机网络——OSI七层模型与TCP/IP四层模型的对比详解

OSI七层模型与TCP/IP四层模型的对比详解 一、图示解析:分层封装结构 你提供的图清晰展示了网络通信中从应用层到物理层的封装过程,每一层都会对上层的数据加上自己的头部信息(Header): 应用层: 应用…...

网络安全知识问答微信小程序的设计与实现

网络安全知识问答微信小程序的设计与实现,说白了,就是搭建一款网络安全知识问答微信小程序,类似网络安全百科直通车。三步走。 需求沟通 进行需求沟通,此处省略1000字。 画草图 根据沟通的需求,进行整理&#xff0c…...

Canvas特效实例:黑客帝国-字母矩阵(字母雨)

黑客帝国-字幕矩阵(字母雨) 效果预览代码实现思路解析遗留问题 效果预览 话不多说,我们直接上效果:当页面加载完成,屏幕上会落下如瀑布般的绿色字母流,不断向下滑动,仿佛进入了黑客帝国的数字世…...

「Mac畅玩AIGC与多模态11」开发篇07 - 使用自定义名言插件开发智能体应用

一、概述 本篇介绍如何在 macOS 环境下,通过编写自定义 OpenAPI Schema,将无需认证的名言服务接入 Dify 平台,并开发基于外部公共数据的智能体应用。本案例继续实践 GET 请求型 API 的实际调用技巧。 二、环境准备 1. 确认本地开发环境 macOS 系统Dify 平台已部署并可访问…...

快速上手非关系型数据库-MongoDB

简介 MongoDB 是一个基于文档的 NoSQL 数据库,由 MongoDB Inc. 开发。 NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…...

响应式布局,在飞帆平台中如此简单

这些控件都是可以自己动手去实现的。也可以将这些控件复制到自己名下进行修改。 响应式布局https://fvi.cn/782...

UN R79 关于车辆转向装置形式认证的统一规定(正文部分1)

UN R79法规是针对转向装置的型式认证法规,涉及A/B1/C类的横向控制辅助驾驶功能,对各功能的功能边界、性能要求、状态提示、故障警示以及型式认证要提交的信息做了规范,本文结合百度文心一言对法规进行翻译,并结合个人理解对部分内…...

深度学习系统学习系列【1】之基本知识

文章目录 说明基础知识人工智能、机器学习、深度学习的关系机器学习传统机器学习的缺陷选择深度学习的原因深度学习的关键问题深度学习的应用深度学习的加速硬件GPU环境搭建主流深度学习框架对比 说明 文章属于个人学习笔记内容,仅供学习和交流。内容参考深度学习原…...

python3GUI--视频监控管理平台 By:PyQt5(详细讲解)

文章目录 一.前言二.相关知识1.PyQt52.RTSP协议📌 简介:🧩 特点:📡 工作方式: 2. **RTMP(Real-Time Messaging Protocol)**📌 简介:&a…...

第十一届蓝桥杯 2020 C/C++组 既约分数

目录 题目: 题目描述: 题目链接: 思路: 核心思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: 既约分数 - 蓝桥云课 思路&a…...

如何让Steam下载速度解除封印?!

平时一直没注意到家里的路由器在偷懒。最近成功榨干家里的带宽,把平时一直20mb/s左右下载速度的路由器一番改造后成功steam下载速度稳定85Mb/s。平时一直都只发挥了他的1/3不到,真是太可惜了。 硬件 首先检查硬件,就千兆路由器而言&#xf…...

HOOK上瘾思维模型——AI与思维模型【88】

一、定义 HOOK上瘾思维模型是一种通过设计一系列的触发(Trigger)、行动(Action)、奖励(Reward)和投入(Investment)环节,来促使用户形成习惯并持续使用产品或服务的思维框…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序的IP开发泡沫破局与价值重构研究

摘要:当前IP开发领域普遍存在"冒进式泡沫"现象,企业将初级IP包装为超级IP运营,导致资源错配与价值虚化。本文通过实证分析开源AI智能名片链动21模式S2B2C商城小程序的技术架构与商业逻辑,揭示其通过智能内容引擎、合规化…...

深⼊理解指针(8)

1.对上一篇的补充内容 typedef int* ptr_t #define PTR_T int* 这两种写法都是可以的 ptr_t p1, p2; //p1, p2 都是指针变量 PTR_T p3, p4; //p3 是指针变量, p4是整型变量 为什么p3 是指针变量, p4是整型变量呢? 因为PTR_T 真的被改为了 int* 在编译器中…...

【iview】icon样式

A. 工程中引入样式文件 iview源码工程中的example工程中如何引入iview样式 image.png 自定义工程中如何引入iview样式 一般在src/main.js中引入(在index.html中也可以,当然app.vue中也可以) import "iview/dist/styles/iview.css"B…...

【计算机视觉】三维视觉:Nerfstudio:模块化神经辐射场框架的技术突破与实战指南

深度解析Nerfstudio:模块化神经辐射场框架的技术突破与实战指南 技术架构与核心创新系统架构设计关键技术特性 环境配置与安装指南硬件要求全平台安装流程 实战全流程解析1. 数据采集与预处理2. 模型训练与优化3. 可视化与导出 核心技术深度解析1. 混合表示网络2. 渐…...

第二章 OpenCV篇-图像阈值的综合操作-Python

目录 一.图像阈值 二.图像平滑 1.均值滤波 2.方框滤波 3.高斯滤波 4.中值滤波 5.双边滤波 此章节主要讲解:图像阈值、图像平滑处理、均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波。 这里先讲作者使用matplotlib模块出现错误的解决方法。 首先作者在这…...

WPF处理大规模激光数据计算与安全传输处理

WPF大规模激光数据处理与安全传输系统设计方案 一、系统架构设计 1. 整体架构 ┌─────────────────────────────────────────────┐ │ WPF客户端应用 │ ├───────────────┬…...

vue 常见ui库对比(element、ant、antV等)

Element UI 1. 简介 Element UI 是一个基于 Vue 2 和 Vue 3 的企业级 UI 组件库,提供了丰富的组件和主题定制功能。官方网站:Element UI 2. 主要特点 丰富的组件:包括表单、表格、布局、导航、弹窗等多种组件。主题定制:支持主…...

【c++】【STL】stack详解

目录 stack类的作用什么是容器适配器stack的接口构造函数emptysizetoppushpopswap关系运算符重载 stack类的实现 stack类的作用 stack是stl库提供的一种容器适配器,也就是我们数据结构中学到的栈,是非常常用的数据结构,特点是遵循LIFO&#…...

单片机-89C51部分:12 pwm 呼吸灯 直流电机

飞书文档https://x509p6c8to.feishu.cn/wiki/JkzfwSoFBiUKc4kh8IoccTfyndg 一、什么是PWM? PWM是脉冲宽度调制的缩写,它是一种通过调整脉冲信号的高电平和低电平时间比例来控制电路输出的技术。简单来说,PWM是一种控制电子设备输出电压或电…...

WPF实现数据库操作与日志记录

1. 数据库操作实现 1.1 数据库连接基类 public abstract class DatabaseBase : IDisposable {protected string ConnectionString { get; }protected IDbConnection Connection { get; private set; }protected DatabaseBase(string connectionString){ConnectionString = co…...

用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案

Spring Boot 的 Fat JAR(通过 spring-boot-maven-plugin 打包)虽然简化了部署,但也存在一些潜在缺点,需根据场景权衡: 1. 启动速度较慢 原因: Fat JAR 需要在启动时解压并加载所有依赖的 JAR 文件到类路径…...

Spring Boot 使用 WebMagic 爬虫框架入门

1. 创建 Spring Boot 项目 使用 Spring Initializr 创建一个 Spring Boot 项目&#xff0c;选择需要的依赖&#xff0c;如 Spring Web 等。 2. 添加 WebMagic 依赖 在项目的 pom.xml 文件中添加 WebMagic 的核心和扩展依赖&#xff1a; <dependency><groupId>u…...

【软件设计师:复习】上午题核心知识点总结(二)

一、计算机网络(常考) 1.网络模型与协议(必考) 1.OSI七层模型 vs. TCP/IP四层模型 OSI七层TCP/IP四层核心协议/设备功能应用层(Application)应用层HTTP、FTP、DNS、SMTP提供用户接口和服务表示层(Presentation)SSL/TLS、JPEG、ASCII数据格式转换、加密/解密会话层(S…...

TensorRt10学习第一章

建立TensorRt时必须要有Public ILogger,因为createInferBuiler和createruntime要用&#xff0c;是一个接口 出错打印 和...

【LeetCode Hot100】回溯篇

前言 本文用于整理LeetCode Hot100中题目解答&#xff0c;因题目比较简单且更多是为了面试快速写出正确思路&#xff0c;只做简单题意解读和一句话题解方便记忆。但代码会全部给出&#xff0c;方便大家整理代码思路。 46. 全排列 一句话题意 给定一个无重复数字的序列&#xf…...

Go 语言中一个功能强大且广泛使用的数据验证库github.com/go-playground/validator/v10

github.com/go-playground/validator/v10 是 Go 语言中一个功能强大且广泛使用的数据验证库&#xff0c;主要用于对结构体字段进行数据校验&#xff0c;确保数据的合法性和完整性。以下是其核心作用、使用场景及代码案例的详细说明&#xff1a; 核心作用 数据校验 支持对结构体…...

Java 多线程进阶:线程安全、synchronized、死锁、wait/notify 全解析(含代码示例)

在 Java 并发编程中&#xff0c;“线程安全” 是核心议题之一。本文将深入讲解线程安全的实现手段、synchronized 的使用方式、可重入锁、死锁的成因与避免、wait/notify 通信机制等&#xff0c;并配合实际代码案例&#xff0c;帮助你彻底搞懂 Java 线程协作机制。 一、线程安全…...

windows电脑端SSH连接开termux的安卓端

&#xff08;确保你此前已经安装好了ssh&#xff09;在手机termux当中输入&#xff1a; 查看状态&#xff1a;ssh 启动服务&#xff1a;sshd 查看IP&#xff1a;ifconfig 然后在电脑端&#xff1a;...

Java 期中考试练习题

一、引言 Java 作为一门广泛应用的编程语言&#xff0c;在计算机相关专业的课程体系中占据重要地位。期中考试是检验同学们对 Java 知识掌握程度的重要环节。本文将呈现一些典型的 Java 期中考试试题&#xff0c;并进行详细讲解&#xff0c;希望能帮助大家更好地理解和掌握 Ja…...

【Unity】 组件库分类详解

1️⃣ Audio&#xff08;音频组件&#xff09; 用于处理游戏中的声音。 Audio Source 读音[ˈɔːdiəʊ ˈsɔːs]&#xff0c;音频源组件&#xff0c;用于播放音频文件&#xff0c;可设置音量、Pitch、循环播放等属性&#xff0c;是音频播放的核心组件。 Audio Listener 读音…...

Java 中使用正则表达式

1. 引入包 在使用正则表达式之前&#xff0c;需要引入包&#xff1a; import java.util.regex.Matcher; import java.util.regex.Pattern; 2. 常用模式规则 元字符 &#xff1a;这些是正则表达式中的特殊字符&#xff0c;用于匹配特定的模式。 . &#xff1a;匹配任意单个字…...

如何降低LabVIEW开发费用

在 LabVIEW 开发过程中&#xff0c;开发费用是用户和开发者共同关注的重点。过高的开发成本可能会压缩项目利润空间&#xff0c;甚至影响项目的可行性。下面将介绍降低 LabVIEW 开发费用的有效方法。 ​ 合理规划项目需求&#xff0c;避免后期增加​ 在项目启动阶段&#xff…...

WPF使用SQLSugar和Nlog

WPF应用中使用SQLSugar和NLog实现数据库操作与日志记录 1. 准备工作 首先,通过NuGet安装必要的包: Install-Package SQLSugarCore Install-Package NLog Install-Package NLog.Config Install-Package NLog.Targets.File 2. 配置NLog 在项目中添加nlog.config文件: <…...

Python10天冲刺-设计模型之策略模式

策略模式是一种行为设计模式&#xff0c;它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起&#xff0c;并让它们相互替换。 下面是使用 Python 实现策略模式的一个示例&#xff1a; 示例代码 假设我们有一个简单的购物车系统&#xf…...

Js扩展DOM、BOM、AJAX、事件、定时器

BOM 操作 BOM指的是浏览器对象模型&#xff1a;Browser Object Mode&#xff0c;通过操作 window 对象的属性和方法来实现与浏览器的交互。 BOM的构成如下图所示&#xff1a; 其中&#xff0c;window对象是顶级对象&#xff0c;在 window 对象下面有一些重要的属性&#xff1…...