Chemmy's Blog

chengming0916@outlook.com

在使用 Qt 开发时,qDebug 打印包含中文的 QString 可能会出现乱码。这通常是由于字符编码不一致导致的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <QDebug>
#include <QTextCodec>
#include <Windows.h>

int main() {

//设置QTextCodec
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);

// 将字符串转换为 UTF-8 编码,然后再传递给 qDebug 打印。
qDebug() << QString::fromUtf8(u8"你好,世界!");
return 0;
}

概述

Windows Server 2016默认情况下只允许一个用户通过远程桌面连接登录。通过配置远程桌面服务,可以实现多用户同时远程登录服务器,提高团队协作效率,避免用户争抢登录权限。

一、安装远程桌面服务

1.1 安装步骤

  1. 打开服务器管理器
  2. 点击添加角色和功能
  3. 在”服务器角色”页面,勾选远程桌面服务
  4. 继续选择远程桌面会话主机远程桌面授权
  5. 完成安装向导,重启服务器

二、配置组策略设置

2.1 打开组策略编辑器

  1. Win + R 打开运行对话框
  2. 输入 gpedit.msc 并回车

2.2 配置连接限制

  1. 导航到:计算机配置管理模板Windows组件远程桌面服务
  2. 双击打开 远程桌面会话主机连接
  3. 找到并双击 限制连接的数量
  4. 选择 已启用
  5. 设置 允许的RD最大连接数(建议根据服务器性能设置,如10-20个)
  6. 点击 确定 保存设置

三、配置远程桌面授权(破解120天限制)

3.1 激活远程桌面授权服务器

  1. 打开 服务器管理器工具远程桌面服务远程桌面授权管理器
  2. 右键点击服务器名称,选择 激活服务器
  3. 按照向导完成激活过程

3.2 安装许可证

  1. 在远程桌面授权管理器中,右键点击服务器
  2. 选择 安装许可证
  3. 按照向导选择合适的许可证类型

3.3 配置授权模式

  1. 打开组策略编辑器
  2. 导航到:计算机配置管理模板Windows组件远程桌面服务远程桌面会话主机授权
  3. 配置以下设置:
    • 设置远程桌面授权模式:选择 按用户按设备
    • 指定远程桌面授权服务器:输入许可证服务器的地址

四、其他重要配置

4.1 用户权限配置

  1. 打开 服务器管理器工具计算机管理
  2. 导航到:系统工具本地用户和组
  3. 双击 Remote Desktop Users
  4. 添加需要远程登录的用户或用户组

4.2 防火墙配置

确保防火墙允许远程桌面连接:

1
2
# 允许远程桌面连接
netsh advfirewall firewall add rule name="Remote Desktop" dir=in action=allow protocol=TCP localport=3389

4.3 性能优化

  1. 打开 系统属性高级性能设置
  2. 选择 调整为最佳性能 或根据需求自定义
  3. 在远程桌面会话主机配置中,可以调整:
    • 会话超时设置
    • 重定向设置
    • 客户端体验设置

五、验证配置

5.1 测试多用户登录

  1. 从不同的客户端计算机同时使用远程桌面连接
  2. 使用不同的用户账户登录
  3. 验证所有用户都能成功连接

5.2 检查连接状态

  1. 在服务器上打开 任务管理器
  2. 切换到 用户 选项卡
  3. 查看当前登录的用户数量

5.3 监控性能

  1. 使用 性能监视器 监控服务器资源使用情况
  2. 关注CPU、内存和网络使用率
  3. 根据监控结果调整连接数量限制

六、故障排除

6.1 常见问题及解决方案

问题1:用户无法远程登录

解决方案

  • 检查用户是否已添加到Remote Desktop Users组
  • 验证防火墙设置
  • 检查网络连通性

问题2:连接数量达到上限

解决方案

  • 增加连接数量限制
  • 检查是否有闲置会话未断开
  • 配置会话超时设置

问题3:120天试用期警告

解决方案

  • 确保远程桌面授权已正确激活
  • 安装有效的许可证
  • 配置授权服务器设置

6.2 诊断命令

1
2
3
4
5
6
7
8
# 查看远程桌面服务状态
Get-Service TermService

# 查看当前远程桌面会话
qwinsta

# 查看远程桌面授权状态
gpresult /h report.html

七、安全建议

7.1 访问控制

  1. 使用强密码策略
  2. 启用账户锁定策略
  3. 定期审计用户权限

7.2 网络安全

  1. 更改默认的RDP端口(3389)
  2. 使用VPN进行远程访问
  3. 启用网络级别身份验证(NLA)

7.3 监控与审计

  1. 启用安全审计日志
  2. 监控异常登录尝试
  3. 定期检查系统日志

八、最佳实践

8.1 容量规划

  • 根据服务器硬件配置合理设置最大连接数
  • 每个用户建议分配至少1GB内存
  • 监控性能指标,及时调整配置

8.2 维护计划

  • 定期更新操作系统和安全补丁
  • 备份重要配置和用户数据
  • 定期测试灾难恢复计划

8.3 用户管理

  • 建立清晰的用户权限管理制度
  • 定期清理不再需要的用户账户
  • 提供用户培训,确保正确使用远程桌面

总结

通过以上配置,Windows Server 2016可以支持多用户同时远程登录,显著提高团队协作效率。关键配置步骤包括:

  1. 安装远程桌面服务:包括远程桌面会话主机和授权服务
  2. 配置组策略:设置最大连接数和其他相关参数
  3. 激活授权服务:破解120天试用期限制
  4. 优化性能和安全:根据实际需求调整配置

建议在生产环境中部署前进行充分测试,确保配置满足业务需求和安全要求。定期维护和监控是保证系统稳定运行的重要保障。

系统要求

  • 操作系统: Ubuntu 18.04 (Bionic Beaver)
  • ROS 版本: Melodic Morenia (官方长期支持版本)
  • Python 版本: 2.7.x (ROS Melodic 默认使用)

安装步骤

1. 配置软件源和密钥

1
2
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

2. 更新软件包列表

1
sudo apt update

3. 安装 ROS Melodic

完整桌面版 (推荐,包含 GUI 工具、仿真器和常用库):

1
sudo apt install ros-melodic-desktop-full

其他可选版本:

1
2
sudo apt install ros-melodic-desktop    # 基础桌面版(无仿真器)
sudo apt install ros-melodic-ros-base # 最小核心版(仅通信库和工具)

4. 初始化 rosdep

1
2
sudo rosdep init
rosdep update

5. 设置环境变量

1
2
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

6. 安装构建工具和依赖

1
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential

7. 创建示例工作空间 (可选)

1
2
3
4
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
source devel/setup.bash

验证安装

打开新终端,运行:

1
roscore

如果看到类似以下输出,说明安装成功:

1
2
3
4
5
6
7
... logging to /home/username/.ros/log/xxx/roslaunch-hostname-xxx.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://hostname:xxx/
ros_comm version 1.14.3

常见问题解决

1. 密钥获取失败

如果 apt-key adv 失败,可以手动下载并添加:

1
curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add -

2. 网络问题

如果下载速度慢,可以替换为国内镜像源(如清华源):

1
sudo sh -c '. /etc/lsb-release && echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'

3. Python 版本验证

确保系统中已安装 Python 2.7:

1
python --version  # 应显示 Python 2.7.x

测试命令

安装完成后,可以使用以下命令测试 ROS 功能:

  • roscore - 启动 ROS master
  • rosrun roscpp_tutorials talker - 运行发布者节点
  • rosrun roscpp_tutorials listener - 运行订阅者节点

参考资源

概述

LIO-SAM (Lidar Inertial Odometry and Mapping) 是一个紧耦合的激光雷达惯性里程计框架,集成了 IMU 预积分和 GPS 数据,适用于机器人建图和定位。

环境要求

组件 版本 下载地址
Ubuntu 18.04+ -
ROS Melodic -
gtsam 4.0.2 GitHub
Eigen 3.3.7 GitLab
LIO-SAM 最新版 GitHub

安装步骤

1. 安装系统依赖

1
2
3
4
5
# 更新系统包列表
sudo apt update

# 安装必要的开发工具和依赖库
sudo apt install -y build-essential cmake libboost-all-dev

2. 安装 Eigen 库

1
2
3
4
5
6
7
8
9
10
11
12
# 下载并解压 Eigen
wget https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz
tar -zxvf eigen-3.3.7.tar.gz

# 编译安装
cd eigen-3.3.7
mkdir build && cd build
sudo cmake ..
sudo make install

# 创建符号链接以便系统找到 Eigen 头文件
sudo cp -r /usr/local/include/eigen3/Eigen/ /usr/local/include/

3. 安装 ROS Melodic

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 设置 ROS 软件源(清华镜像)
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

# 添加 ROS 密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

# 更新包列表并安装 ROS
sudo apt update
sudo apt-get install -y ros-melodic-desktop-full

# 安装 ROS 开发工具
sudo apt-get install -y ros-melodic-rqt* python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential

# 初始化 rosdep
sudo rosdep init
rosdep update

4. 配置 ROS 环境

1
2
3
# 将 ROS 环境变量添加到 bashrc
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

5. 安装 gtsam

1
2
3
4
5
6
7
8
9
10
11
12
# 克隆 gtsam 仓库
git clone https://github.com/borglab/gtsam.git
cd gtsam

# 切换到 4.0.2 版本
git checkout 4.0.2

# 编译安装
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install

6. 安装 LIO-SAM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

# 克隆 LIO-SAM
git clone https://github.com/TixiaoShan/LIO-SAM.git

# 安装依赖
cd ~/catkin_ws
rosdep install --from-paths src --ignore-src -y

# 编译
catkin_make -j$(nproc)

# 设置工作空间环境
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

验证安装

测试 ROS 安装

1
2
3
4
5
# 启动 ROS 核心
roscore

# 新终端中检查 ROS 环境
echo $ROS_PACKAGE_PATH

测试 LIO-SAM 编译

1
2
3
4
5
# 检查 LIO-SAM 包是否存在
rospack find lio_sam

# 尝试运行节点(需要相应的启动文件)
roslaunch lio_sam run.launch

常见问题解决

1. Eigen 头文件找不到

问题:编译时出现 fatal error: Eigen/Dense: No such file or directory

解决方案

1
2
# 确保 Eigen 头文件在正确位置
sudo ln -s /usr/local/include/eigen3/Eigen /usr/local/include/Eigen

2. gtsam 版本不兼容

问题:需要特定版本的 gtsam

解决方案

1
2
3
# 确保使用 gtsam 4.0.2 版本
cd gtsam
git checkout 4.0.2

3. ROS 依赖问题

问题:缺少 ROS 包依赖

解决方案

1
2
# 安装所有缺失的依赖
rosdep install --from-paths src --ignore-src -y

使用说明

启动 LIO-SAM

1
2
3
4
5
# 启动 LIO-SAM 主要节点
roslaunch lio_sam run.launch

# 启动可视化工具
roslaunch lio_sam visualization.launch

数据播放

1
2
# 播放 bag 文件
rosbag play your_data.bag

目录结构

1
2
3
4
5
6
7
~/catkin_ws/
└── src/
└── LIO-SAM/
├── config/ # 配置文件
├── launch/ # 启动文件
├── src/ # 源代码
└── package.xml # ROS 包配置

注意事项

  1. 版本匹配:确保所有组件的版本兼容性
  2. 内存要求:编译过程需要足够的内存,建议 8GB+ RAM
  3. 网络连接:下载依赖需要稳定的网络连接
  4. 权限问题:某些操作需要 sudo 权限

后续步骤

  1. 配置参数:根据你的传感器调整 config/params.yaml
  2. 数据采集:使用你的传感器采集数据
  3. 性能调优:根据实际场景调整算法参数

参考资源

一、什么是 NVIDIA-SMI?

nvidia-smi 是 NVIDIA 的系统管理界面(System Management Interface),用于监控和管理 NVIDIA GPU 设备。它是 NVIDIA 驱动安装包的一部分,无需额外安装。

核心功能

  • 监控:实时查看 GPU 状态、温度、功耗、显存使用率、进程占用等。
  • 管理:修改 GPU 配置选项,如启用/禁用 ECC 内存、设置持久化模式、调整计算模式等。
  • 诊断:查询设备拓扑、时钟速度、支持的功能等。

支持的产品

  • 完全支持:所有 Tesla(Fermi 架构起)、Quadro(Fermi 架构起)、GRID(Kepler 架构起)、GeForce Titan(Kepler 架构起)产品。
  • 有限支持:所有 GeForce 产品(Fermi 架构起)。

二、基础信息查询命令

2.1 查看 GPU 概览信息

命令nvidia-smi
这是最常用的命令,显示所有 GPU 的实时状态摘要。

输出字段详解

字段 含义
GPU 本机中的 GPU 编号(从 0 开始)
Name GPU 型号(如 Tesla V100)
Fan 风扇转速(百分比)
Temp GPU 核心温度(摄氏度)
Perf 性能状态(P0-P12,P0 为最高性能)
Pwr:Usage/Cap 当前功耗 / 最大设计功耗
Bus-Id PCI 总线 ID(格式:domain:bus:device.function
Disp.A Display Active,显示是否初始化
Memory-Usage 显存使用情况(已用 / 总量)
Volatile GPU-Util GPU 计算单元利用率(百分比)
Uncorr. ECC 未纠正的 ECC 错误计数
Compute M. 计算模式(Default, Exclusive_Process 等)
Processes 显示占用该 GPU 的进程及其显存使用量

2.2 列出所有 GPU 设备

命令nvidia-smi -L
以简洁格式列出系统中所有 NVIDIA GPU 设备。

1
2
GPU 0: Tesla V100-SXM2-32GB (UUID: GPU-xxxxxx)
GPU 1: Tesla V100-SXM2-32GB (UUID: GPU-yyyyyy)

2.3 查看系统拓扑

命令nvidia-smi topo --matrix
显示 GPU 之间以及 GPU 与 CPU、其他 PCIe 设备(如 InfiniBand 网卡)的互连拓扑。这对于配置 GPUDirect 等高级功能至关重要。


三、高级查询与监控

3.1 查询详细 GPU 信息

命令nvidia-smi -q
显示指定 GPU(或所有 GPU)的极其详细的信息报告。可以通过 -i <gpu_id> 指定 GPU。

报告包含的主要部分

  • GPU 基本信息:产品名称、序列号、UUID、VBIOS 版本等。
  • PCI 信息:总线 ID、带宽、链路宽度等。
  • 时钟信息:图形时钟、内存时钟、SM 时钟的当前值、默认值和最大值。
  • 温度与功耗:当前温度、功耗限制、电源管理状态。
  • 显存信息:总显存、已用显存、ECC 模式、BAR1 内存使用情况。
  • ECC 错误:易失性和聚合性 ECC 错误计数。
  • 计算进程:当前正在使用 GPU 的计算进程列表。

3.2 查询时钟信息

  • 查看当前时钟nvidia-smi -q -d CLOCK
    显示 GPU 的当前图形、内存和 SM 时钟速度,以及默认和最大时钟。

  • 查看支持的时钟列表nvidia-smi -q -d SUPPORTED_CLOCKS
    列出 GPU 支持的所有可用时钟速度组合。

3.3 虚拟 GPU (vGPU) 状态查询

命令nvidia-smi vgpu
查看虚拟化环境中 vGPU 的状态信息。如果系统未启用 vGPU,会提示不支持。

动态监控 vGPU 进程nvidia-smi vgpu -p
以滚动刷新的方式循环显示虚拟桌面中应用程序对 GPU 资源的占用情况。


四、设备管理与配置

4.1 设置持久化模式

命令nvidia-smi -pm <0/1>

  • 0DISABLED:禁用持久化模式(默认)。GPU 驱动在最后一个客户端断开连接后会卸载。
  • 1ENABLED:启用持久化模式。驱动始终保持加载状态,减少后续应用启动的延迟。
    1
    2
    # 为 GPU 0 启用持久化模式
    nvidia-smi -i 0 -pm 1

4.2 配置 ECC 内存

  • 启用/禁用 ECCnvidia-smi -e <0/1>
    • 0DISABLED:禁用 ECC。
    • 1ENABLED:启用 ECC(需要重启生效)。
  • 重置 ECC 错误计数nvidia-smi -p <0/1>
    • 0VOLATILE:重置易失性错误计数。
    • 1AGGREGATE:重置聚合性错误计数。

4.3 设置计算模式

命令nvidia-smi -c <MODE>
控制 GPU 如何被计算应用程序共享。

模式值 模式名称 描述
0 DEFAULT 多个计算应用可以共享 GPU(默认)。
1 EXCLUSIVE_THREAD 已弃用。
2 PROHIBITED 禁止任何计算应用使用 GPU。
3 EXCLUSIVE_PROCESS 一个计算进程可以独占 GPU,该进程内的多个线程可共享。
1
2
# 将 GPU 0 设置为独占进程模式
nvidia-smi -i 0 -c 3

4.4 重置 GPU

命令nvidia-smi -r
在 GPU 无响应或状态异常时,尝试触发 GPU 复位。此操作可能导致正在运行的进程崩溃,请谨慎使用。


五、实用参数与监控技巧

5.1 周期性监控

  • 按秒间隔循环刷新nvidia-smi -l <秒数>
    例如 nvidia-smi -l 2 每 2 秒刷新一次显示。
  • 按毫秒间隔循环刷新nvidia-smi -lms <毫秒数>
    例如 nvidia-smi -lms 500 每 500 毫秒刷新一次。

5.2 输出到文件

使用 -f--filename 参数将输出重定向到文件,便于后续分析。

1
2
3
4
# 将详细查询结果保存到文件
nvidia-smi -q -f gpu_info.log
# 周期性监控并记录到文件
nvidia-smi -l 1 -f monitor.log

5.3 指定目标 GPU

使用 -i--id 参数对特定的 GPU 进行操作。

1
2
3
4
# 仅查看 GPU 1 的详细信息
nvidia-smi -q -i 1
# 仅监控 GPU 0 和 GPU 2
nvidia-smi -i 0,2 -l 1

5.4 以 XML 格式输出

使用 -x--xml-format 参数,便于脚本解析。

1
nvidia-smi -q -x

六、命令参数速查表

参数类别 参数 功能描述
帮助 -h, --help 打印帮助信息。
列表 -L, --list-gpus 列出所有连接的 GPU。
查询 -q, --query 查询 GPU 详细信息。
-d, --display= 选择性显示信息(如 MEMORY, CLOCK)。
目标 -i, --id= 指定目标 GPU ID(如 0, 0,2)。
输出 -f, --filename= 将输出保存到文件。
-x, --xml-format 以 XML 格式输出。
监控 -l, --loop= 按指定秒数间隔循环刷新。
-lms, --loop-ms= 按指定毫秒数间隔循环刷新。
管理 -pm, --persistence-mode= 设置持久化模式 (0/1)。
-e, --ecc-config= 启用/禁用 ECC (0/1)。
-c, --compute-mode= 设置计算模式 (0-3)。
-r, --gpu-reset 触发 GPU 复位。

七、总结与最佳实践

nvidia-smi 是管理和监控 NVIDIA GPU 不可或缺的工具。掌握其核心用法:

  1. 日常监控:使用 nvidia-sminvidia-smi -l 1 实时查看 GPU 状态。
  2. 问题诊断:使用 nvidia-smi -q 获取详细报告,分析温度、功耗、ECC 错误和进程占用。
  3. 性能调优:通过 -pm-c 等参数调整 GPU 运行模式以适应不同工作负载。
  4. 自动化脚本:利用 -f-x 参数将输出重定向或格式化为 XML,便于集成到监控系统中。

官方资源

准备

建议准备一个干净、换好源的 Ubuntu 16.04 及以上版本(建议 清华源 ),本教程也适用其他 ROS1版本。

查看ubuntu 版本

1
lsb_release -a

根据自己的 Ubuntu 的版本选择 ROS 版本 (示例是 Ubuntu 18.04 所以对应ROS版本为 melodic
![[Ubuntu部署ROS/IMG-20250829234441526.png]]

ROS安装

1. 安装源

1
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'

2. 设置密钥

1
2
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

3. 安装

1
2
3
4
sudo apt update
sudo apt install ros-melodic-desktop
# 其他版本替换对应的版本(例如 noetic )
# sudo apt install ros-noetic-desktop

4. 配置环境变量

1
2
3
4
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc #使环境生效
# 替换对应版本同上
# echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc

5. 配置rosdep

在使用许多 ROS 工具之前,需要初始化 rosdep,有些功能包源码编译需要rosdep 来安装这些系统依赖项,不配置也不影响ros使用,所以后面需要时再来配置也可以。 rosdep 请求的文件都放在 github 上的, 推荐使用代理。

1
2
3
4
5
6
7
8
9
10

# 安装依赖
sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
# 对于Ubuntu20
# sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential

# 初始化
sudo rosdep init
rosdep update

测试

1
2
3
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key

参考
官方文档(melodic)
ubuntu18.04安装ROS Melodic(最详细配置)-CSDN博客
基于Ubuntu18.04的ROS Melodic环境详细配置(含各种大坑及填坑)
[ROS 系列学习教程] ROS与操作系统版本对应关系_ros版本-CSDN博客

目标检测模型的效果高度依赖三个核心参数的调优:置信度阈值、IoU 阈值和图像尺寸。本文详细解析这三个参数的作用、推荐值及实战组合。


一、置信度阈值(Confidence Threshold)

定义

置信度是模型对「检测框内存在目标」的确信程度,取值范围 0~1

  • 值越高 → 模型越自信,框越可靠
  • 值越低 → 可能包含噪声或模糊目标

作用

过滤低置信度预测框,减少误报。

示例

1
results = model(img, conf=0.5)
  • 只保留置信度 ≥ 0.5 的检测结果
  • 置信度 0.4 的头盔会被丢弃

推荐值

场景 推荐值 说明
高召回(不漏检) 0.3~0.4 安防监控,宁可误报不漏检
平衡精度与召回 0.5 通用推荐
高精度(少误报) 0.6~0.7 自动报警系统

⚠️ 太高漏检,太低误报


二、IoU 阈值(Intersection over Union)

定义

IoU 是两个边界框的重叠程度:

$$IoU = \frac{交集面积}{并集面积}$$

  • 0 → 完全不重叠
  • 1 → 完全重合

作用

用于非极大值抑制(NMS),去除重复检测框。

示例

1
results = model(img, iou=0.45)
  • 两个框 IoU > 0.45 → 认为是同一目标,只保留置信度高的

推荐值

IoU 值 效果
0.2~0.3 严格,易漏检
0.4~0.5 推荐,平衡去重与保留
0.6~0.7 宽松,可能保留多框

⚠️ 太低过度去重,太高重复框多


三、图像尺寸(Image Size)

定义

推理时输入模型的图像尺寸,如 640x640。训练时固定尺寸,推理时自动缩放。

作用

  • 决定模型看到的分辨率
  • 影响检测精度和推理速度

示例

1
results = model(img, imgsz=640)

图像保持比例缩放,短边拉伸,长边补灰边。

推荐值

imgsz 精度 速度 适用场景
320 较低 实时性高、大目标
480 中等 小目标不多
640 一般 通用推荐
800~960 更高 小目标多(远处物体)

⚠️ 太小小目标丢失,太大计算慢


四、参数对比总结

参数 全称 作用 默认值 推荐值
conf Confidence 过滤低置信预测 0.25 0.5
iou Intersection over Union 去除重复框 0.45 0.45
imgsz Image Size 输入分辨率 640 640

五、实战代码

1
2
3
4
5
6
7
8
9
10
from ultralytics import YOLO

model = YOLO('yolov8n.pt')

results = model(
img, # 输入图像
conf=0.5, # 置信度阈值
iou=0.45, # NMS IoU 阈值
imgsz=640 # 输入图像大小
)

六、场景组合推荐

场景 conf iou imgsz 说明
通用检测 0.5 0.45 640 推荐起点
安全报警 0.6 0.45 640 减少误报
小目标检测 0.4 0.45 800 提高召回率
实时检测 0.5 0.45 480 提升速度

七、调优建议

  1. 先用默认值测试conf=0.5, iou=0.45, imgsz=640
  2. 根据结果微调
    • 漏检 → 降低 conf 或增大 imgsz
    • 多框 → 降低 iou
    • 太慢 → 降低 imgsz
  3. 可视化验证:保存带标签图像观察效果

一、SWAP 空间基础概念

1.1 什么是 SWAP?

当 Linux 系统的物理内存(RAM)耗尽时,内核会将内存中不活跃的“页面”移动到硬盘上的一个预配置区域,这个区域就是 SWAP 空间。物理内存与 SWAP 空间的总和称为虚拟内存

1.2 SWAP 的两种形式

  • SWAP 分区:硬盘上一个独立的、专门用于交换的分区。
  • SWAP 文件:文件系统中的一个特殊文件,功能与分区相同。

注意:在虚拟机中安装 Ubuntu 时,系统通常不会自动创建 SWAP 空间,需要手动配置。

1.3 为什么需要 SWAP?

  • 内存溢出保护:当 RAM 完全占满时,系统可将非关键数据移至 SWAP,防止系统崩溃(对小内存系统尤其重要)。
  • 释放物理内存:将启动后很少使用的程序“页面”交换出去,为更活跃的程序腾出 RAM。
  • 休眠支持:系统休眠(Hibernate)功能需要 SWAP 空间来保存内存状态。

1.4 SWAP 的潜在缺点

  • 速度差异:RAM 的访问速度是纳秒级,而硬盘(即使是 SSD)是毫秒级,速度相差数个数量级。
  • 系统变慢:频繁的交换操作(称为“Thrashing”)会导致系统响应迟缓。

二、检查现有 SWAP 空间

在开始操作前,首先检查系统当前的 SWAP 配置。

2.1 查看所有活动的 SWAP 空间

1
sudo swapon --show

如果输出为空,则表示系统未启用任何 SWAP 空间

2.2 查看内存与 SWAP 使用概况

1
sudo free -h

该命令会显示物理内存和 SWAP 的总量、已用量及空闲量。


三、创建 SWAP 文件(推荐方法)

与分区相比,SWAP 文件更灵活,可以轻松调整大小,且不涉及磁盘分区操作。以下是创建 2GB SWAP 文件的完整步骤。

3.1 步骤 1:创建空白文件

1
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
  • if=/dev/zero:输入源,一个输出全零字节的特殊设备。
  • of=/swapfile:输出文件路径。
  • bs=1M:块大小为 1MB。
  • count=2048:块数量。计算:1MB × 2048 = 2GB

    提示:要创建不同大小的文件,只需修改 count 值(例如 count=1024 为 1GB)。

3.2 步骤 2:设置正确的文件权限

SWAP 文件必须严格限制访问权限,防止被普通用户读取。

1
sudo chmod 600 /swapfile

3.3 步骤 3:将文件格式化为 SWAP 空间

1
sudo mkswap /swapfile

此命令会在文件上设置特殊的 SWAP 签名。

3.4 步骤 4:激活 SWAP 文件

1
sudo swapon /swapfile

现在,SWAP 文件已加入系统交换池并立即生效。

3.5 步骤 5:配置永久生效(开机自动启用)

编辑 /etc/fstab 文件,在末尾添加一行:

1
sudo nano /etc/fstab

添加以下内容:

1
/swapfile swap swap defaults 0 0

保存并退出(Ctrl+X,然后按 Y 确认)。

3.6 步骤 6:验证创建结果

再次运行检查命令,确认 SWAP 文件已成功激活:

1
2
3
sudo swapon --show
# 或
sudo free -h

四、优化 SWAP 使用行为:调整 Swappiness

4.1 什么是 Swappiness?

swappiness 是一个内核参数(范围 0-100),用于控制内核使用 SWAP 空间的积极程度

  • 值越低(如 10):内核尽量避免使用 SWAP,除非绝对必要。
  • 值越高(如 80):内核更积极地将内存页面交换出去。
  • Ubuntu 默认值60

4.2 查看当前 Swappiness 值

1
cat /proc/sys/vm/swappiness

4.3 临时调整 Swappiness 值

例如,设置为 40(对服务器更友好):

1
sudo sysctl vm.swappiness=40

4.4 永久调整 Swappiness 值

编辑 /etc/sysctl.conf 文件:

1
sudo nano /etc/sysctl.conf

在文件末尾添加或修改以下行:

1
vm.swappiness=40

保存后,运行以下命令使更改立即生效:

1
sudo sysctl -p

最佳实践建议

  • 桌面系统30-60(平衡响应性与内存使用)。
  • 服务器/数据库10-30(减少慢速交换,优先使用 RAM)。
  • 高性能计算/内存充足时1-10(几乎禁用交换,除非紧急)。

五、删除 SWAP 文件

如果您不再需要某个 SWAP 文件,请按以下步骤安全移除。

5.1 步骤 1:停用 SWAP 文件

1
sudo swapoff -v /swapfile

-v 参数显示详细过程。

5.2 步骤 2:从 /etc/fstab 中移除配置

编辑 /etc/fstab 文件,删除或注释掉之前添加的 /swapfile 那一行。

1
2
3
sudo nano /etc/fstab
# 在行首添加 # 号注释掉,例如:
# /swapfile swap swap defaults 0 0

5.3 步骤 3:删除物理文件

1
sudo rm /swapfile

六、调整 SWAP 空间大小

6.1 调整 SWAP 分区大小(复杂)

调整分区大小通常需要:

  1. 使用 swapoff 停用分区。
  2. 使用 GParted 等图形化分区工具或 parted 命令行工具调整分区边界。
  3. 使用 mkswap 重新格式化。
  4. 使用 swapon 重新激活。

    注意:此操作有风险,且需要分区后方有未分配的连续空间。

6.2 调整 SWAP 文件大小(简单推荐)

这是 SWAP 文件的最大优势。例如,将现有的 2GB 文件扩容到 4GB:

步骤 1:停用当前 SWAP 文件

1
sudo swapoff /swapfile

步骤 2:调整文件大小

1
2
3
4
5
# 方法A:使用 dd 追加 2GB(总大小变为 4GB)
sudo dd if=/dev/zero of=/swapfile bs=1G count=2 oflag=append conv=notrunc

# 方法B:直接创建指定大小的新文件(会覆盖旧文件)
# sudo dd if=/dev/zero of=/swapfile bs=1G count=4

步骤 3:重新设置权限并格式化

1
2
sudo chmod 600 /swapfile
sudo mkswap /swapfile

步骤 4:重新激活 SWAP 文件

1
sudo swapon /swapfile

步骤 5:验证新大小

1
sudo swapon --show

七、SWAP 空间大小规划建议

系统物理内存 (RAM) 推荐 SWAP 大小 休眠支持所需 SWAP
≤ 2 GB RAM 的 2 倍 RAM 的 2-3 倍
2 - 8 GB 等于 RAM 大小 RAM 的 1.5 倍
8 - 64 GB 至少 4 GB RAM 的 1 倍
> 64 GB 至少 4 GB(主要用于休眠) RAM 的 0.5 倍

说明

  • 对于现代拥有大容量 RAM(如 16GB+)的系统,SWAP 的主要作用已从“内存溢出缓冲”转变为支持系统休眠
  • 如果完全不需要休眠功能,且内存充足,可以设置一个较小的 SWAP(如 1-2GB)作为安全缓冲。

八、总结与最佳实践

  1. 检查先行:操作前务必使用 swapon --showfree -h 了解当前状态。
  2. 首选文件:对于大多数用户,创建 SWAP 文件 比调整分区更安全、灵活。
  3. 合理规划大小:根据你的 RAM 大小和用途(是否休眠)参考上表。
  4. 优化 Swappiness:为你的工作负载(桌面/服务器)设置合适的值,以平衡性能。
  5. 持久化配置:任何更改都要记得更新 /etc/fstab/etc/sysctl.conf
  6. 监控使用:定期使用 free -hhtop 监控 SWAP 使用率。如果 SWAP 被频繁使用(>20%),应考虑增加物理内存。

一、使用linuxdeployqt拷贝依赖文件

1. 下载linuxdeployqt

GitHub Releases 下载:

1
2
3
4
5
6
7
8
# 重命名简化
mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt
# 添加执行权限
chmod 777 linuxdeployqt
# 移至系统路径
mv linuxdeployqt /usr/local/bin
# 验证安装
linuxdeployqt --version

2. 配置Qt环境变量

编辑 ~/.bashrc,添加Qt路径(根据实际安装路径调整):

1
2
3
4
5
#add qt env
export PATH=/opt/Qt5.13.0/5.13.0/gcc_64/bin:$PATH
export LIB_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/qml:$QML2_PATH

使配置生效:

1
2
3
source ~/.bashrc
# 验证
qmake -v

注意:最关键的是 PATH 环境变量,其他变量可能非必需。

3. 拷贝依赖文件

准备目录结构:

1
2
mkdir -p TestSetup/Test
cp YourApp TestSetup/Test/ # 替换为你的应用

执行依赖拷贝:

1
2
cd TestSetup/Test
linuxdeployqt Test -appimage

重要提示

  • 确保应用为 Release 版本
  • linuxdeployqt 内部使用 ldd,仅能处理隐式加载.so 文件
  • 对于显式加载.so(如 dlopen),需手动处理其依赖:
    1
    2
    3
    # 示例:若 A.so 显式加载 B.so,而 B.so 隐式依赖 C.so
    # 需对 B.so 单独执行:
    linuxdeployqt B.so -appimage

4. 验证应用运行

清除Qt环境变量后测试:

1
2
3
4
5
6
7
# 清除环境变量(仅当前终端)
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export LIB_PATH=
export PLUGIN_PATH=
export QML2_PATH=
# 运行应用
./Test

二、打包为.deb安装包

1. 目录结构规划

1
2
3
4
5
6
7
8
TestSetup/
├── output/ # 存放生成的.deb包
└── source/ # 打包源文件
├── DEBIAN/ # 控制文件目录(固定名称)
└── opt/Test/ # 安装目标路径(对应系统/opt/Test/)
├── Test # 应用程序
├── lib/ # 依赖库
└── ... # 其他资源

创建目录:

1
2
3
mkdir -p TestSetup/{output,source/{DEBIAN,opt/Test}}
# 移动依赖文件
mv TestSetup/Test/* TestSetup/source/opt/Test/

2. 配置桌面快捷方式

编辑 TestSetup/source/opt/Test/Test.desktop

1
2
3
4
5
6
7
[Desktop Entry]
Type=Application
Name=My Test # 应用显示名称
Exec=/opt/Test/Test # 绝对执行路径
Icon=/opt/Test/Test.png # 绝对图标路径
Comment=This is my test # 描述信息
Terminal=false # 是否启动终端(false=仅应用窗口)

注意

  • 路径必须是安装后的绝对路径(非打包路径)
  • 需赋予执行权限:chmod +x Test.desktop
  • 准备图标文件:Test.png

3. 创建DEBIAN控制文件

control(包元数据)

TestSetup/source/DEBIAN/control

1
2
3
4
5
6
7
8
9
Package: mytest                 # 包名(卸载时使用)
Version: 0.1.0
Section: utils
Priority: optional
Architecture: amd64
Depends: # 依赖包(留空或填写)
Installed-Size: 512
Maintainer: 123@163.com
Description: my test package

postinst(安装后脚本)

TestSetup/source/DEBIAN/postinst

1
2
3
4
#!/bin/sh
chmod 777 /opt/Test/Test.desktop
cp /opt/Test/Test.desktop /usr/share/applications/ # 开始菜单
cp /opt/Test/Test.desktop ~/Desktop/ # 桌面快捷方式

postrm(卸载后脚本)

TestSetup/source/DEBIAN/postrm

1
2
3
4
5
#!/bin/sh
rm -f /usr/share/applications/Test.desktop
rm -f ~/Desktop/Test.desktop
# 若需删除应用生成的日志,添加:
# rm -rf ~/.config/YourApp/ # 根据实际日志路径调整

脚本要求

  • 首行必须为 #!/bin/sh
  • 赋予执行权限:chmod +x DEBIAN/{postinst,postrm}

4. 构建.deb包

1
2
cd TestSetup/source
dpkg -b . ../output/test_amd64_0.1.0.deb

三、安装与卸载

1. 安装

1
2
cd TestSetup/output
sudo dpkg -i test_amd64_0.1.0.deb

验证效果

  • 桌面出现快捷方式
  • 开始菜单 → Other 中出现应用
  • 应用文件位于 /opt/Test/

2. 卸载

1
2
# 使用control文件中的Package字段值
sudo apt-get remove mytest

卸载效果

  • 删除 /opt/Test/ 目录
  • 自动移除桌面和开始菜单快捷方式
  • (若在 postrm 中配置)删除应用日志

关键注意事项

  1. 依赖完整性:显式加载的 .so 需单独处理依赖
  2. 路径一致性.desktop 文件中的路径必须匹配安装路径
  3. 脚本权限DEBIAN 目录下的脚本必须有执行权限
  4. 包名唯一性control 中的 Package 字段需全局唯一

相关笔记与链接建议

  • 当前笔记引用:Linux下Qt打包发布
  • 建议补充双向链接:
    • [[Qt应用部署最佳实践]] - 跨平台部署策略
    • [[Linux软件包管理]] - deb/rpm 包机制对比
    • [[CMake构建系统]] - Qt项目自动化构建
    • [[AppImage打包指南]] - 替代打包方案

总结

通过 linuxdeployqt + dpkg 组合,可高效生成符合 Linux 发行版规范的安装包,实现依赖自动管理、快捷方式集成和干净卸载。

0%