文章目录
- 前言
- 一、数据收集
-
- [1.1 数据收集的方法](#1.1 数据收集的方法)
- [1.2 数据收集的要求](#1.2 数据收集的要求)
- [1.3 数据收集案例](#1.3 数据收集案例)
- 二、数据标注
-
- [2.1 标注类型-格式-工具](#2.1 标注类型-格式-工具)
- [2.2 数据标注规则](#2.2 数据标注规则)
- [2.3 自动标注](#2.3 自动标注)
- 总结
前言
数据收集和标注是计算机视觉模型训练的前置任务,本文将围绕数据收集和标注,介绍相关概念、方法和规则,并给出简单实操案例,帮助读者快速上手构建自己的数据集。
一、数据收集
1.1 数据收集的方法
数据获取的方法有多种,包括改进现有数据集、手动采集、爬虫、第三方数据收集平台等。
在实际的项目中,现有的数据集不一定包含目标物体,或者只包含较少的目标物体,不能够满足项目的需求,这时就需要配合或者采用其他的数据采集方法。
手动采集是收集项目实际场景最佳的方法,这种方法采集到的数据和应用时的场景最为接近,通常是必不可少的数据获取方法,但是这种方式需要设计采集方式,还需要人力和时间的投入。
爬虫是是收集大数据集经常使用的方法,这种方法直接从网络上获取目标物体,可能样本距离实际项目需求差距较大,但是可以避免数据集的单一化。
通过第三方数据收集平台进行数据采集,对于企业来说是效率比较高的方式。国内数据收集平台有阿里众包、百度众包、腾讯众包等。
1.2 数据收集的要求
为了使得数据具有多样性和代表性,数据集应包含目标的不同图像:包括不同比例、不同旋转角度、不同照明度、不同侧面、不同背景等。需要根据这些因素来设计数据采集的方案。
此外,还需要考虑在数据集中加入一定比例的纯背景图片,避免对背景的误检测。
在图像采集过程中,还需要注意数据采集的质量,如保证数据的清晰度(但也不是分辨率越高越好,需平衡处理速度和存储成本)。也可以在数据采集之后,对数据进行初步的筛选,去除模糊的图像。
对于多类别物体任务,除了采集单个类别物品的图片,还需要考虑不同类别组合情况下的图片。
1.3 数据收集案例
此处以手动采集和爬虫为例,分别给出了两种方法的采集实例代码。
首先对于手动采集,我们给出了利用Realsense相机采集图像的Python脚本如下。其中需要指定保存图像的路径,可以修改需要的图片分辨率,默认的分辨率为640×480。采集时,可以调整不同的视角/距离/背景,按下"Enter"键执行图像的采集和保存。
python
import time
import pyrealsense2 as rs
import numpy as np
import cv2
import os
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
pipeline.start(config)
# 指定保存图像的路径
save_path = "XXX" # 替换为你的目标路径
if not os.path.exists(save_path):
os.makedirs(save_path)
try:
while True:
frames = pipeline.wait_for_frames()
color_frame = frames.get_color_frame()
if not color_frame:
continue
color_image = np.asanyarray(color_frame.get_data())
cv2.imshow('RealSense', color_image)
# 检测键盘输入
key = cv2.waitKey(1) & 0xFF
if key == ord('\r'): # Enter键的ASCII码是13,对应'\r'
current_time = time.time()
image_filename = os.path.join(save_path, f'output_{int(current_time)}.jpg')
cv2.imwrite(image_filename, color_image)
print(f"Image saved as {image_filename}")
if key == ord('q'): # 按下'q'键退出
break
finally:
pipeline.stop()
cv2.destroyAllWindows()
网络爬虫的脚本如下。此处给的案例是基于BingImageCrawler的爬虫实现。当然,以此类推,也可以用BaiduImageCrawler和GoogleImageCrawler实现爬虫。此外,还需要指定爬虫的关键词和下载数量。
python
# from icrawler.builtin import BaiduImageCrawler
from icrawler.builtin import BingImageCrawler
# from icrawler.builtin import GoogleImageCrawler
#需要爬虫的关键字
list_word = ['Pen','Pencil','Ruler','Eraser','Pen holder']
for word in list_word:
#bing爬虫
#保存路径
bing_storage = {'root_dir': 'bing\\'+word}
#从上到下依次是解析器线程数,下载线程数,还有上面设置的保存路径
bing_crawler = BingImageCrawler(parser_threads=2,
downloader_threads=4,
storage=bing_storage)
#开始爬虫,关键字+图片数量
bing_crawler.crawl(keyword=word,
max_num=20)
二、数据标注
2.1 标注类型-格式-工具
本节根据Ultralytics的官网介绍:计算机视觉的数据收集和标注策略,分别阐述常见的数据标注类型、格式和工具。
数据标注的类型:
根据计算机视觉任务(如检测、分割、位姿估计等)的特定要求,有不同类型的数据标注。以下是一些示例:
边界框 :在图像中的对象周围绘制的矩形框,主要用于对象检测任务。这些框由其左上角和右下角坐标定义。
多边形 :对象的详细轮廓,允许比边界框更精确的标注。多边形用于诸如实例分割之类的任务,其中对象的形状很重要。
掩码 : 二进制掩码,其中每个像素要么是对象的一部分,要么是背景。掩码用于语义分割任务中,以提供像素级别的细节。
关键点: 在图像中标注的特定点,用于识别感兴趣的位置。关键点可用于人体姿态估计和面部特征点检测等任务。
数据标注的格式:
在确定标注类型后,需要选择适当的格式来存储和共享标注。以下是一些常用格式的介绍。
YOLO格式 :YOLO格式为每个图像生成一个对应的.txt标注文件,其内容以归一化后的中心坐标、宽度、高度和对象类别构成,这种简洁的纯文本设计使其非常适用于高效的对象检测模型训练与推理。
VOC格式 :Pascal VOC格式采用结构化的XML文件来存储图像的元数据以及物体的边界框和类别信息,这种清晰且标准的定义使其在深度学习时代之前及初期成为对象检测领域最受欢迎的数据集格式之一。
COCO格式:COCO格式通过一个统一的JSON文件集中管理大量图像的多种标注信息,全面支持对象检测、关键点检测、语义分割乃至图像描述生成等复杂任务,极大地促进了大规模视觉模型的研发与应用。
数据标注的工具
根据任务需求可以确定标注类型和标注格式,当准备好进行标注时,可以根据类型和格式确定具体的标注工具。以下是一些常用标注工具的介绍。
LabelImg : 其标注类型为图像边界框,主要用于图像检测任务,特别适合以 YOLO 格式创建边界框标注。(油管上的使用教程:https://www.youtube.com/watch?v=p0nR2YsCY_U)
LabelMe :标注类型为多边形、矩形、圆形、线条、点,主要用于通用图像/视频注释,支持语义和实例分割,可以以 PASCAL VOC、COCO 格式创建标注。
CVAT :标注类型为边界框、多边形、关键点、3D 立方体、视频跟踪,主要用于目标检测、分割、姿态估计、视频跟踪,标注格式包括PASCAL VOC、YOLO、COCO等。
Label Studio :标注类型为图像、文本、音频、视频、时间序列标注,主要用于多模态数据标注,支持自定义界面与审核流程,可以以 COCO、YOLO 等可配置格式创建标注。
Supervisely:标注类型为点、框、折线、多边形、像素笔刷等,主要用于大规模图像处理、自动化标注、团队协作,可以用多种导入/导出格式创建标注。
其中对于YOLO检测算法的训练,主需要标注物体的边界框即可,训练也是使用其专有的YOLO格式,所以使用最简单的LabelImg就足够了,轻量小巧。可以直接在虚拟环境中安装:
python
conda install labelImg
需要注意的是,以上内容仅为常用示例,并未涵盖所有的标注类型、格式和工具,希望能起到抛砖引玉的作用。
2.2 数据标注规则
以目标检测为例,《计算机视觉应用与实战》书籍(韩少云等编著)给出的的部分标注规则如下:
(1)贴边规则:标注框需要紧贴目标物体的边缘进行画框标注,不可框得大小或太大。
(2)重叠规则:当两个目标物体有重叠区域时,只要遮挡未超过一半就可以添加边框,否则不标注。
(3)边界框:确保框坐标不在图像边界上,防止在数据载入或数据扩展过程中出现越界。
(5)不标注规则:图像模糊不清的不标注,太暗和曝光过度的不标注,不符合项目特殊规则的不标注。
(6)小目标规则:不同的算法对小目标的检测效果不同,对于小目标,只要人眼能分清就应标注出来。
以上是物体检测任务的标注规则部分示例。对于分割、姿态估计等其他任务,其标注规则会有所不同。
2.3 自动标注
通常数据集包含的数据较多,采用人工标注的方法非常繁重,这里介绍一下自动标注的方法。
计算机视觉中的自动标注是指利用算法和模型,部分或完全地替代人工,为图像或视频数据自动生成标注信息(如边界框、类别标签、分割掩码等)的过程。其核心目标是显著减少标注所需的时间、人力和经济成本,从而加速数据准备环节,让研究者与开发者能更高效地构建和迭代模型。
首先介绍三种自动标注方法:
基于预训练模型的方法:该方法通过直接利用在大型通用数据集上预训练好的高性能模型(即"教师模型")对未标注数据进行前向推理预测,从而快速生成初步的标注结果,其质量高度依赖于预训练模型本身的能力与泛化性。
半自动标注:这种方法构建了一个"模型预测-人工校验"的迭代循环,即先使用少量标注数据训练初始模型并对大量未标注数据进行预测,然后智能地筛选出模型最不确定或最具价值的样本交由人工精确校正,从而将有限的人力资源集中于关键样本以持续提升模型性能。
基于大模型的方法:此方法借助大模型(如GPT、SAM)强大的理解能力,通过指令引导模型对图像内容进行解析与描述,并能直接输出结构化的标注信息(如检测框、类别及描述文本),为实现通用、灵活且高层次的自动标注提供了全新范式。
对于特定的任务,如果预训练模型未很好地包含目标物体的类别,而且大模型对于复杂情形(如堆叠场景)的识别能力有限,那么就需要使用半自动标注方法了。此处,重点介绍这种自动标注方法。其核心路径可以总结为:
高质量种子数据 → 训练V1模型 → 自动标注新数据 → 人工重点检查修正(尤其是低置信度预测和漏检)→ 合并数据训练V2模型 → 在独立测试集上验证性能提升。
以YOLO物体检测的半自动标注为例,详细介绍每一个步骤:
- 初始数据集准备:精心挑选并高质量人工标注一个覆盖所有类别和多样性的初始数据集,为后续流程奠定坚实基础。
- 第一版模型训练:基于初始数据集,利用预训练模型进行迁移学习,训练出性能可靠的第一版模型作为自动标注工具。
- 自动标注推理:使用训练好的模型对大量未标注数据进行预测,并输出初步标注结果。
YOLO的自动标注可以用其predict功能的save_tet实现,自动标注的代码如下所示:
python
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO(r'/home/XXX/best.pt') # 模型路径
model.predict(source=r'/home/XXX/dataset_extended', # 数据集路径
imgsz=640,
batch=16,
device='0',
project=r'/home/XXX/dataset_extended', # 保存路径
name=r'label_extended',
save_txt=True
)
- 人工检查与修正:对模型自动生成的标注结果进行人工审核和修正,重点处理误检、漏检和定位错误,这是提升数据质量的关键环节。
人工检查和修正建议使用Supervisely或者CVAT标注软件;
- 数据合并与迭代训练:将修正后的高质量新数据与初始数据集合并,用于训练性能更强的下一代模型。
- 循环迭代优化:将性能提升后的新模型作为起点,重复自动标注与人工修正的循环,不断扩充数据集并优化模型,直至达到预期性能。
总结
以上就是今天要讲的内容,围绕数据采集和数据标注两个话题展开,首先介绍了数据采集的方法、要求和案例代码,然后介绍了数据标注的类型、格式、工具、规则,最后延伸到自动标注的方法和步骤。为相关人员作参考。