目标检测:2如何生成自己的数据集

news/2024/7/10 2:51:13 标签: 目标检测, 人工智能, 数据集, labels

目录

1. 数据采集

2. 图像标注

3. 开源已标记数据集

4. 数据集划分

参考:


1. 数据采集


数据采集是深度学习和人工智能任务中至关重要的一步,它为模型提供了必要的训练样本和测试数据。在实际应用中,数据采集的方法多种多样,每种方法都有其独特的优势和适用场景。本次将介绍如何标记数据集

一、什么是数据标注?
数据标注即通过分类、画框、标注、注释等,对图片、语 音、文本、视频等数据进行处理,标记对象的特征,以作为机器学习基础 素材的过程。机器学习需要反复学习以训练模型和提高精度,同时自动驾驶、语言大模型、AI医疗、等各大应用场景都需要标注数据。

二、数据标注的分类
对于数据标注,按照不同的分类标准,可以有不同划分。以标注对象作为分类基础,可将数据标注划分为图像标注、语音标注、文本标注以及视频标注

2. 图像标注

图像标注是一个将标签添加到图像上的过程。图像标注类型包括拉框、语义分割、实例分割、 目标检测、图像分类、关键点、线段标注、文字识别转写、点云标注、属性判断等。图像标注在人工智能与各行各业应用相结合的研究过程中扮演着重要的角色:通过对路况图片中的汽车和行人进行筛选、分类、标框, 可以提高安防摄像头以及无人驾驶系统的识别能力。

  • 通过LabelImg来标注矩形框;
  • 通过LabelMe来进行多边形框的标定;
  • 通过PPOCRLabel来完成文本识别标注任务;
  • 通过roLabelImg来解决旋转目标检测的功能;
  • 通过DarkLabel来完成视频文件的标注及对象的跟踪功能;
  • 通过ELAN完成对视频序列中人物动作的识别以及对应字幕的捕捉;

简单的使用,在线标注数据集的工具Make Sense。

开始标注

打开Make Sense点击Get Start即可开始标注。

进入下一个页面,点击Drop images并选中所有数据集

点击 Object Detection ,并添加标签,笔者这里以安全帽为例,所以创建标签Helmet。然后手动画出安全帽对应的矩形。

 

               

标注完成后,点击Action->Export Annotation,即可导出Yolo格式的标签。

导出的文件如下所示

<object-class> <x> <y> <width> <height>

其中,object-class为类别,x,y,width和height是指目标的中心点坐标及宽高信息。

3. 开源已标记数据集


使用开源数据集是一种常见且有效的数据采集方法。开源数据集通常已经过标记和验证,可大大节省数据采集和标注的时间和资源成本。例如ImageNet数据集,包含超过1400万张图像,可用于深度学习模型训练。此外,还有像Coco、DOTA数据集等,笔者在这里为大家整理了常见的深度学习开源数据集地址,具体如下,以供参考。

coco数据集:https://cocodataset.org
Pascal Voc数据集:https://pjreddie.com/projects/pascal-voc-dataset-mirror/

猫咪数据集:http://m6z.cn/5TAgbw
宠物图像数据集:http://m6z.cn/5TAgdC
HMDB人类动作识别数据集:http://m6z.cn/6gGlzF
KITTI道路数据集:http://m6z.cn/5xz4OW
MPII人体模型数据集:http://m6z.cn/69aaIe
天池铝型材表面缺陷数据集:http://m6z.cn/61EksR
防护装备-头盔和背心检测:http://m6z.cn/61zarT
Linkopings交通标志数据集:http://m6z.cn/68ldS0
RMFD口罩遮挡人脸数据集:http://m6z.cn/61z9Fv
生活垃圾数据集:http://m6z.cn/6n5Adu
火焰和烟雾图像数据集:http://m6z.cn/6fzn0f
MTFL人脸识别数据集:http://m6z.cn/6fHmaT

4. 数据集划分

有了数据集之后,对齐划分,分别分为train,val,test三块。

创建helmet_dataset/images保存图像文件,创建helmet_dataset/labels保存标记文件。

分割脚本如下:

import os
import shutil
import zipfile
from sklearn.model_selection import train_test_split

# 定义目录路径
dataset_directory = r'helmet_dataset'
images_directory = os.path.join(dataset_directory, 'images')
labels_directory = os.path.join(dataset_directory, 'labels')

# 定义备份 zip 文件路径
backup_zip_path = os.path.join(dataset_directory, 'helmet_dataset.zip')

# 将整个数据集目录压缩备份
with zipfile.ZipFile(backup_zip_path, 'w') as backup_zip:
    for folder in [images_directory, labels_directory]:
        for root, dirs, files in os.walk(folder):
            for file in files:
                file_path = os.path.join(root, file)
                backup_zip.write(file_path, os.path.relpath(file_path, dataset_directory))

# 所有图像文件名(不带扩展名)的列表
image_filenames = [os.path.splitext(filename)[0] for filename in os.listdir(images_directory) if filename.endswith('.jpg')]

# 定义拆分比例
train_ratio = 0.7
validation_ratio = 0.2
test_ratio = 0.1

# 执行拆分
train_filenames, test_filenames = train_test_split(image_filenames, test_size=1 - train_ratio)
validation_filenames, test_filenames = train_test_split(test_filenames, test_size=test_ratio/(test_ratio + validation_ratio))

# 创建目录并移动文件的函数
def create_and_move_files(file_list, source_folder, destination_folder, file_extension):
    os.makedirs(destination_folder, exist_ok=True)
    for filename in file_list:
        shutil.move(os.path.join(source_folder, filename + file_extension),
                    os.path.join(destination_folder, filename + file_extension))

# 为每个集创建目录并移动文件
sets_directories = {
    'train': os.path.join(dataset_directory, 'train'),
    'val': os.path.join(dataset_directory, 'val'),
    'test': os.path.join(dataset_directory, 'test')
}

for set_name, file_list in zip(['train', 'val', 'test'], [train_filenames, validation_filenames, test_filenames]):
    images_set_directory = os.path.join(sets_directories[set_name], 'images')
    labels_set_directory = os.path.join(sets_directories[set_name], 'labels')
    create_and_move_files(file_list, images_directory, images_set_directory, '.jpg')
    create_and_move_files(file_list, labels_directory, labels_set_directory, '.txt')

# 删除空的images和labels文件夹
for folder in [images_directory, labels_directory]:
    if os.path.exists(folder) and not os.listdir(folder):
        os.rmdir(folder)

# 返回备份文件路径和已创建目录的路径
print(backup_zip_path, sets_directories)

创建好的数据集,留待使用,下一次学习如何利用数据集训练。

参考:

目标检测:1预备知识


http://www.niftyadmin.cn/n/5364257.html

相关文章

架构篇33:传统的可扩展架构模式-分层架构和SOA

文章目录 分层架构SOA小结相比于高性能、高可用架构模式在最近几十年的迅猛发展来说,可扩展架构模式的发展可以说是步履蹒跚,最近几年火热的微服务模式算是可扩展模式发展历史中为数不多的亮点,但这也导致了现在谈可扩展的时候必谈微服务,甚至微服务架构都成了架构设计的银…

Flutter和Dart中Future是一个非常重要的概念

在Flutter和Dart中&#xff0c;Future是一个非常重要的概念&#xff0c;用于表示一个异步操作的最终结果。Dart是一门单线程的语言&#xff0c;但为了执行耗时的操作&#xff08;如网络请求、文件I/O等&#xff09;而不阻塞主线程&#xff0c;Dart引入了异步编程模型。 Future…

大数据 - Spark系列《四》- Spark分布式运行原理

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 目录 &#x1f360;…

STM32TIM时钟(1)

文章目录 前言一、介绍部分TIM简介了解定时器类型基本定时器框图通用定时器框图高级定时器框图定时器级联关系 所需简化定时器中断流程图时序部分预分频器时序计数器时序无影子寄存器计数器时序有影子寄存器计数器时序 时钟树 二、实例部分使用定时器计数使用对射红外传感器来控…

LiveData 迁移到 Kotlin Flow详解

LiveData ,是Android 2017推出的一个东西,配合MVVM使用。观察者模式,的确简化了我们的工作方式,但 RxJava 等选项,对于当时的初学者来说实在是太复杂了。因此 Architecture Components 团队创建了 LiveData :这是个非常 “有主见的” 可观察数据持有者类,并且是专门为 A…

浅谈——开源软件的影响力

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

SpringMVC-组件解析

一、引子 我们在上一篇文章Spring MVC-基本概念中&#xff0c;为读者解释了如何使用SpringMVC框架&#xff0c;将承接客户端请求的工作从原生的Servlet转移到我们熟知的Controller中。那么我们不禁会好奇&#xff0c;SpringMVC框架到底做了什么&#xff0c;是怎么把请求分发给…

典型数据结构的模板实现

栈和数组 1.使用类模板实现数组结构定长数组 &#xff08;未完待续..&#xff09;可变数组 2.使用类模板实现栈结构 在我们初步了解编写模板类后&#xff0c;应当做一下代码练习。这节我们就做一个编写代码的补充&#xff0c;方便大家继续学习模板类的嵌套。作为新手而言&#…