【图像标注技巧】目标检测图像标注技巧
介绍一些图像标注技巧。之前引用过别人的文章 yolo目标检测 技巧 trick 提升模型性能,deep research检测调研报告也可以进行参考。
拉框类的标注,如果你不确定哪种方法好,你可以把所标注区域的都剪切出来,然后站在屏幕一米之外眯起眼睛,看看能否区分不同的标注类别,人工模拟卷积过程。
1.模糊、重合图像
参考d-fine的标注方法,模糊、重合物体可以这样标注。

前后重合(例如近处一个人张开手,远处在他的手下面还有一个人),可以将两个人分别标注;模糊目标也可以整体标注,但是置信度可能较低。
2.过大的目标
假设一张图像中,人体比例大于画面整体70%,那么你可以把图像处理成下图那样(加个黑边),然后再进行标注、模型训练。推理的时候,如果需要,也可以把图像进行类似的加黑边处理。

3.一般原则
- 距离太远⽆法判断,不标。角度相似的重复样本只取一张 (除非角度有变化,比如在侧面和正面拍摄了同一台笔记本)。
- 主要目标被异物遇到遮挡⼤于 70%时,⽆需标注。(假设一个人站在一块大模板上,只漏出脖子和胸部,那么大概率你不能把他标成“人体”;个人感觉,在这样的条件下即便不标注,模型也有一定的概率识别出“人体”)。
- 只能看到⼀个⽬标的局部图,占据整体图像⾯积超过70%且⽆法分辨具体⽬标,不标(假设你在距离一台施工机械一米的地方拍了张照片,你只能看到黄色的车体结构,但是无法分辨挖掘机/吊车等具体类型,此时可以不标注,但是模型仍有可能识别出某一种施工机械)。
- 对于过明,过暗,模糊,⼈⼯标注图⽚(图中有标注框)时,不标。
4.细长目标
可以从中间断开,例如一根电线被电线杆阶段,则可以分成两个区域,标注电线杆左边和右边的电线,如红色框:

如果中间没有分割,例如一条垂直的细线,那么你可以把标注框稍微留宽一点(也可以先贴着边缘标注,然后用代码统一沿较细的边按照10%等比例进行放大,这个方法试过,即便没有提升,也不会有太大的损失),例如左右各延长1/3:

5.倾斜目标
建议用旋转目标检测或分割解决。图中红框有些超过边界了。

6.零散目标
假设着火了,4条火线聚在一起,远处有一条短的火线,且距离较远,那么也许可以使用右图的绿框进行标注(尽可能让画框中的火焰面积占比大一些),但是没有验证过。

7.L形目标
例如下图近处的金属杆子,呈现L形,用两个框标注L的每一条臂。

8.易混淆目标
例如吊车、斗臂车,二者底盘几乎一致(都是黄色的多轮卡车),那么在标注的时候就可以先标出施工机械整体,再标出标“底盘”、“吊臂”、“载人斗臂”等(可以不标底盘),通过组合关系进行判断(例如在施工机械整体大框中,有一个吊臂的框,那么大概率这就是一辆吊车臂车)。有时候你进能看到吊车的吊臂,这时候“吊臂”标签就发挥了作用。
有其他类似的车辆,例如普通的城市救援黄色多轮卡车,你可以尝试仅仅将其标注为底盘,然后通过斗臂和吊臂来判断。你也可以将其标注为“城市救援车辆”,或者直接不对其做任何标注,可以试一下哪种方法效果好。
假设你正在识别地面上的深坑。水坑反光会对你造成影响,那么你就可以增加一个类别“水坑反光”,或者训练一个二分类模型,区别深坑和水坑。玻璃瓶塑料瓶也可以采取类似的手段,先识别瓶子,再做分类。
假设你在识别电线杆上的裂缝,那么先识别电线杆,再判断你检测到的裂缝是否位于电线杆内部,也是不错的选择。
9.模型建议
以下是其他大模型给出的调研报告,截取一部分内容,完整内容请参考请参考文章deep research检测调研报告
9.1复杂背景、模糊重合解决
- 专注标注: 标注时需要高度集中,仔细区分目标物体与背景。
- 紧密边界: 确保边界框紧密贴合目标,排除不相关的背景 。
- 明确指南:标注指南中应包含如何处理模糊边界(例如阴影、毛发、烟雾等)的规则,明确是应该包含还是排除这些区域 。
- 针对性测试: 在模型评估时,应特别关注其在复杂背景和杂乱环境下的表现
9.2 小目标
可以使用sahi等框架,更精细地去识别小刮擦痕迹、破损等。具体训练方法可以参考这个文章)。以下模型调研给出的方案也可以:
5. 保持图像分辨率: 尽可能使用高分辨率的原始图像进行标注和训练,避免信息损失 。
6. 图像切片 (Tiling):对于非常高分辨率的图像,可以考虑将其切割成多个较小的图块(Tiles),然后在每个图块上进行标注和检测,最后再将结果合并 。
7. 精细标注: 标注时利用缩放功能仔细定位小物体的边界。确保所有小物体都被一致地标注,避免遗漏 。
8. 模型适配:可能需要调整模型架构,例如增加专门用于检测小物体的特征层或检测头 。
9. 数据增强:使用数据增强技术(如旋转、翻转、色彩抖动、复制粘贴小物体等)来增加小物体样本的多样性和数量 。
10. 测试时放大:在测试阶段将输入图像放大,有时可以提高小物体检测性能,即使训练时没有专门标注小物体 。
9.3 共性原则
- 利用标注工具提供的缩放(Zoom)功能,以便在像素级别进行精确定位 。
- 仔细调整边界框的边缘,使其与物体的轮廓对齐,特别是对于不规则形状的物体 。
- 尽量减少边界框内的背景区域。如果确实需要包含少量背景(例如,为了保持一定的上下文或由于工具限制),应在整个数据集中保持一致的填充(Padding)策略**(可以借助代码实现,参见4。细长目标**),但通常建议最小化填充 。
- 对于图像中出现的同一类别的多个实例,应为每个实例单独绘制边界框,而不是将它们框在一起 。
- 边界框(Bounding Box)应紧密地包围目标物体,覆盖其所有可见部分,同时避免包含过多的背景区域,也不能裁剪掉物体的任何部分 。理想情况下,边界框的边缘应紧贴物体最外沿的像素 。
9.4遮挡 (Occlusion):
当一个物体被另一个物体或背景部分阻挡时,就会发生遮挡 。这是现实世界图像中非常常见且具有挑战性的问题 。
标注策略: 关于如何标注被遮挡物体,存在不同的实践方法,因此遵循项目定义的明确、一致的指南至关重要 。
一种常见的做法是,估计并标注出被遮挡物体的完整边界,即使只有部分可见 。这种方法旨在帮助模型学习即使在部分可见的情况下也能识别整个物体。
另一种做法是,仅紧密标注物体的可见部分 。这种方法侧重于提供模型当前可见区域的精确信息。选择哪种策略取决于模型的预期行为和应用场景。
如果标注工具支持,可以使用特定的标签或属性(例如 Pascal VOC 或 CVAT 中的 occluded 标志 或自定义属性)来明确指示遮挡情况。
对于严重遮挡或形状复杂的物体,可以考虑使用实例分割 或多边形标注 代替边界框。在某些场景下,显式地标注那些容易发生遮挡的边界情况(例如,体育比赛中球员聚集的区域)可能有助于模型训练 。通过在包含不同遮挡程度图像的数据集上进行微调,可以提高模型处理遮挡的鲁棒性 。
9.5 截断
当物体的一部分超出了图像的边界时,即为截断 。
标注策略: 通常的做法是标注物体的可见部分。在支持此功能的格式中(如 Pascal VOC),应使用 truncated 标志(通常为 1)来表明该物体被截断 。同样,处理截断物体的方式应在标注指南中明确规定,并保持一致性 。
处理遮挡和截断物体时,存在一种内在的张力:是优先保证边界框对可见部分的紧密贴合 ,还是优先估计物体的完整范围以保持物体身份的完整性 ?这没有绝对统一的标准,凸显了制定清晰、具体的项目标注指南的必要性。选择的策略将直接影响模型如何学习处理这些部分可见的情况。
相关文章:
【图像标注技巧】目标检测图像标注技巧
介绍一些图像标注技巧。之前引用过别人的文章 yolo目标检测 技巧 trick 提升模型性能,deep research检测调研报告也可以进行参考。 拉框类的标注,如果你不确定哪种方法好,你可以把所标注区域的都剪切出来,然后站在屏幕一米之外眯…...
MuJoCo中的机器人状态获取
UR5e机器人xml文件模型 <mujoco model"ur5e"><compiler angle"radian" meshdir"assets" autolimits"true"/><option integrator"implicitfast"/><default><default class"ur5e">&…...
pnpm解决幽灵依赖问题
文章目录 前言1. npm/yarn 现在还有幽灵依赖问题吗?2. pnpm 解决了幽灵依赖问题吗?3. pnpm 是如何解决的?举例说明 1. pnpm 的 node_modules 结构原理结构示意 2. 实际演示幽灵依赖的杜绝步骤1:初始化项目并安装依赖步骤2…...
测试第四课---------性能测试工具
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
frp远程穿透配置
文章目录 准备工作服务端配置(toml)客户端配置(toml)访问内网服务使用ini文件配置 frp是一个高性能的反向代理应用,用于将位于内网的服务通过代理暴露到公网。以下是其基本使用步骤: 准备工作 拥有一台具有公网IP的服务器,作为frp的服务端。…...
【C++】新手入门指南(下)
文章目录 前言 一、引用 1.引用的概念和定义 2.引用的特性 3.引用的使用 4.const引用 5.指针和引用的关系 二、内联函数 三、nullptr 总结 前言 这篇续上篇的内容新手入门指南(上),继续带大家学习新知识。如果你感兴趣欢迎订购本专栏。 一、…...
Linux系统编程 day9 SIGCHLD and 线程
SIGCHLD信号 只要子进程信号发生改变,就会产生SIGCHLD信号。 借助SIGCHLD信号回收子进程 回收子进程只跟父进程有关。如果不使用循环回收多个子进程,会产生多个僵尸进程,原因是因为这个信号不会循环等待。 #include<stdio.h> #incl…...
前后端分离项目在未部署条件下如何跨设备通信
其实我此前也不知道这个问题怎么解决,也没有想过—因为做的项目大部分都是前后端分离的,前端直接用后端的部署好的环境就行了。最近也是有点心高气傲开始独立开发,一个人又写前端又写后端也是蛮累的,即使有强有力的cursor也很累很…...
基于Python的多光谱遥感数据处理与分类技术实践—以农作物分类与NDVI评估为例
多光谱遥感数据包含可见光至红外波段的光谱信息,Python凭借其丰富的科学计算库(如rasterio、scikit-learn、GDAL),已成为处理此类数据的核心工具。本文以Landsat-8数据为例,演示辐射校正→特征提取→监督分类→精度评…...
vscode python 代码无法函数跳转的问题
TL; DR; python.languageServer 配置成了 None 导致 vscode python 代码无法函数跳转 详细信息 mac 环境下 vscode 正常 command 鼠标左键 可以跳转到定义或者使用位置,但是我的为何不知道失效了 我一开始以为是热键冲突,结果发现 mac 好像没办法定…...
SAS宏核心知识与实战应用
1. SAS宏基础 1.1 核心概念 1.1.1 宏处理器 宏处理器在SAS程序运行前执行,用于生成动态代码,可实现代码的灵活定制。 通过宏处理器,可基于输入参数动态生成不同的SAS代码,提高代码复用性。 1.1.2 宏变量 宏变量是存储文本值的容器,用&符号引用,如&var,用于存储…...
Unity 脚本使用(二)——UnityEngine.AI——NavMesh
描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询(spatial queries),例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本,并调整寻路和避免的全局行为。 静态属性࿰…...
从项目真实场景中理解二分算法的细节(附图解和模板)
遇到一个真实场景里使用二分算法的问题,本以为可以放心交给小师弟去做,结果出现了各种问题,在此梳理下二分算法的核心思想和使用细节。 文章目录 1.场景描述2.场景分析3.二分算法的精髓3.1 核心模板3.2 二分过程图解3.3 各种区间写法3.3.1 闭…...
金融图QCPFinancial
QCPFinancial 是 QCustomPlot 中用于绘制金融图表(如蜡烛图/K线图)的核心类。以下是其关键特性的详细说明: 一、主要属性 属性类型说明dataQSharedPointer<QCPFinancialDataContainer>存储金融数据的数据容器chartStyleQCPFinancial:…...
Jetson Orin NX 16G 配置GO1强化学习运行环境
这一次收到了Jrtson Orin NX, 可以进行部署了。上一次在nano上的失败经验 Jetson nano配置Docker和torch运行环境_jetson docker-CSDN博客 本次的目的是配置cuda-torch-python38环境离机运行策略。 Jetson Orin NX SUPER 1. 烧录镜像 参考链接在ubuntu系统中安装sdk manag…...
文档管理 Document Management
以下是关于项目管理中 文档管理 的深度解析,结合高项(如软考高级信息系统项目管理师)教材内容,系统阐述文档管理的理论框架、核心流程及实战应用: 一、文档管理的基本概念 1. 定义 文档管理是对项目全生命周期中产生的各类文档进行规范化管理的过程,包括创建、存储、版…...
【Pandas】pandas DataFrame truediv
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
Linux 内核中 cgroup 子系统 cpuset 是什么?
cpuset 是 Linux 内核中 cgroup(控制组) 的一个子系统,用于将一组进程(或任务)绑定到特定的 CPU 核心和 内存节点(NUMA 节点)上运行。它通过限制进程的 CPU 和内存资源的使用范围,优…...
Windows 同步-互锁变量访问
互锁变量访问 应用程序必须同步对多个线程共享的变量的访问。 应用程序还必须确保对这些变量的作以原子方式执行(完全或根本不执行)。 对正确对齐的 32 位变量的简单读取和写入是原子作。 换句话说,你最终不会只更新变量的一部分;所有位都以…...
深度学习3.5 图像分类数据集
%matplotlib inline import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l代码执行流程图 #mermaid-svg-WWhBmQvijswiICpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-…...
js原型链prototype解释
function Person(){} var personnew Person() console.log(啊啊,Person instanceof Function);//true console.log(,Person.__proto__Function.prototype);//true console.log(,Person.prototype.__proto__ Object.prototype);//true console.log(,Function.prototype.__prot…...
从M个元素中查找最小的N个元素时,使用大顶堆的效率比使用小顶堆更高,为什么?
我们有一个长度为 M 的数组,现在我们想从中找出 最小的 N 个元素。例如: int a[10] {12, 3, 5, 7, 19, 0, 8, 2, 4, 10};从中找出 最小的 4 个元素。 正确方法:使用大小为 N 的「大顶堆」 原因分析: 我们想保留最小的 4 个元素…...
【知识】性能优化和内存优化的主要方向
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 前言 现在有很多论文,乍一看很高级,实际上一搜全是现有技术的堆砌,但是这种裁缝式的论文依然能发表在很好的会议和期…...
VS Code + GitHub:高效开发工作流指南
目录 一、安装 & 基本配置 1.下载 VS Code 2.安装推荐插件(打开侧边栏 Extensions) 3.设置中文界面(可选) 二、使用 VS Code 操作 Git/GitHub 1.基本 Git 操作(不输命令行!) 2.连接 GitHub(第一次使用) 三、克隆远程仓库到 VS Code 方法一(推荐): 方…...
软件测试之接口测试常见面试
一、什么是(软件)接口测试? 接口测试:是测试系统组件间接口的一种测试方法 接口测试的重点:检查数据的交换,数据传递的正确性,以及接口间的逻辑依赖关系 接口测试的意义:在较早期开展,在软件开发的同时…...
发送百度地图的定位
在vuephp写的聊天软件项目中,增加一个发送百度地图的定位功能 在 Vue PHP 的聊天软件中增加发送百度地图定位功能,需要从前端定位获取、地图API集成、后端存储到消息展示全流程实现。以下是详细步骤: 一、前端实现(Vue/Uni-app…...
11、Refs:直接操控元素——React 19 DOM操作秘籍
一、元素操控的魔法本质 "Refs是巫师与麻瓜世界的连接通道,让开发者能像操控魔杖般精准控制DOM元素!"魔杖工坊的奥利凡德先生轻抚着魔杖,React/Vue的refs能量在杖尖跃动。 ——以神秘事务司的量子纠缠理论为基,揭示DOM…...
uniapp-商城-33-shop 布局搜索页面以及u-search
shop页面上有一个搜索,可以进行商品搜索,这里我们先做一个页面布局,后面再来进行数据i联动。 1、shop页面的搜索 2、搜索的页面代码 <navigator class"searchView" url"/pagesub/pageshop/search/search"> …...
npm的基本使用安装所有包,安装删除指定版本的包,配置命名别名
npm的基本使用安装所有包,安装删除指定版本的包,配置命名别名 安装所有依赖指定版本安装/删除包给 npm 脚本配置“命令别名(自定义命令)” ✅ 一、安装所有包(恢复依赖) 如果项目中已经存在 package.json…...
【dataframe显示不全问题】打开一个行列超多的excel转成df之后行列显示不全
出现问题如下图: 解决方案~ display.width解决列显示不全 pd.set_option(display.max_columns,1000) pd.set_option(display.width, 1000) pd.set_option(display.max_colwidth,1000) pd.set_option(display.max_rows,1000)...
