深度学习零基础学习之路——第五章 个人数据集的制作
Python深度学习入门
第一章 Python深度学习入门之环境软件配置
第二章 Python深度学习入门之数据处理Dataset的使用
第三章 数据可视化TensorBoard和TochVision的使用
第四章 UNet-Family中Unet、Unet++和Unet3+的简介
第五章 个人数据集的制作
深度学习数据集的制作
- Python深度学习入门
- 前言
- 一、选择合适的标注工具进行标注
- 1、Labelme
- 2、Arcgis
- 2.1 使用ArcMap打开原图片(tif格式图片)
- 2.2 创建标注图层shp文件
- 2.3 样本标注准备工作
- 2.4 样本标注
- 2.5 给样本不同类别赋予不同颜色
- 二、标签图像处理
- 1、相同对象类别合并
- 2、shapefle文件转tif图像
- 3、统一图像大小
- 4、小样本制作
- 5、创建训练样本文件夹目录
- 总结
前言
众所周知,深度学习的三大要素:数据、算法、算力。这三者是相辅相成的、缺一不可。但越来越多的学者开始关注算法的设计与优化,而忽略了数据在深度学习中的重要地位。但数据是基础,任何研究都离不开数据,并且优秀的算法模型只有在大规模的数据集上进行的实验结果才具有说服力。因此,今天我将向大家介绍如何制作我们自己的数据集。
一、选择合适的标注工具进行标注
随着深度学习的不断发展,数据集的标注工具也是层出不穷,我这里简单介绍几个,然后深入介绍我目前使用的标注工具ArcGIS,做遥感高光谱的同学,我强力推荐这个软件!!!
1、Labelme
Lableme是一款开源的图像标注工具,常用做检测,分割和分类任务的图像标注,它的下载和使用也是非常的方便。我们可以直接从Anaconda Prompt中通过以下指令进行安装。
pip install labelme
然后等待下载完成,再输入启动指令即可进行标注了。
labelme
2、Arcgis
Arcgis是一款非常强大的制图软件,功能十分强大,对于图像的制作、提取、分割等等一系列操作都可以简单完成,这也是我目前使用的软件。首先我们需要下载这款软件,下载链接我们可以通过这个博主的链接进行下载:https://zhuanlan.zhihu.com/p/473689369
2.1 使用ArcMap打开原图片(tif格式图片)
下载完软件后,我们打开ArcGis中的ArcMap软件
然后我们就需要新建一个地图模板,接着我们打开右侧的文件目录结构右击文件夹链接,这样我们就可以将地图模板与我们的图片文件夹进行链接,方便操作。
链接完文件夹,我们就可以将图片拉至我们的编辑区了。
2.2 创建标注图层shp文件
右击图片所在文件夹,在该文件夹下创建Shapefile文件,要素类型选择面,并且一定要选择坐标系,坐标系的类型要和原图的坐标系类型保持一致!
2.3 样本标注准备工作
为了标注方便,我们需要先将初始标注框填充颜色改为无颜色,这样我们在标注的过程中就不会被颜色给遮住原图。然后我们需要给图层添加class属性来表示标注的类别,右击shp图层选中打开属性表,然后点击下面的箭头选中添加字段,输入名称为class,然后确认即可。
2.4 样本标注
添加完字段,我们就点击上面编辑器,选择开始编辑,然后选中图层中的面,然后沿着我们的标注目标对象的边缘不断点(要想数据集好,我们就要尽可能的让目标对象边缘精准),最后通过双击结束标注,最后在右侧的属性栏给这个目标对象填入类别标签(我这里是1)。
2.5 给样本不同类别赋予不同颜色
我们标注结束后,我们就可以给类别不同的颜色加以区分了,例如我这里有两类:1类用绿色,2类用黄色。首先双击图层,然后选择符号系统—>类别—>唯一值---->值字段(class)—>添加值。然后将我们有的值全部(1和2)添加进来,并选择颜色,点击确定即可。
二、标签图像处理
通过以上处理我们将会得到一张与原图一样的标签图像,如下图。那我们如何得到一个一个的小样本呢?在此之前我们需要使用ArcMap对图像再次处理一下。
1、相同对象类别合并
得到一张完整的标签图像之后我们需要将同一类别的合并,让属性列表最终每一个类别只有一个对象。首先双击class,让类别排好序,然后选中类别相同的,点击编辑器中的合并按钮就可以将选中的对象合并。最终要达到每个类别最多只有一条记录(如下图)。
2、shapefle文件转tif图像
我们的标签图像的文件格式为shp,但是我们的原图为tif,因此我们需要通过ArcMap将shp转为tif。步骤流程如下图。
3、统一图像大小
为了防止后面对图像裁剪出现问题,我们需要对原图和标签图像进行大小的统一。首先我们按照上面的方法创建一个新的shp图层,在该图层上画一个刚好可以圈住原图内容的矩形,然后保存。如下图:
接着我们就可以以这个矩形为基准,裁剪原图和标签图像了。步骤如下:
4、小样本制作
通过以上处理我们就得到了一样尺寸,一一对应的原图和标签图了,接下来我们就需要对图像进行裁剪,裁剪代码如下:
#!/usr/bin/env python3
# coding=utf-8import random
import os
import numpy as np
import sys
from shutil import copyfile, rmtreefrom argparse import ArgumentParserimport rasterio
from rasterio.windows import Windowdef creat_dataset(image_num=10000, imgPath=None, labelPath=None, basePath=None):###landsat数据集img_w = 224 # 切割小图的宽img_h = 224 # 切割小图的长sampleImg = os.path.join(basePath, "sampleImgs") # 要提前创建好样本文件夹sampleImgssampleLab = os.path.join(basePath, "sampleLabels") # 要提前创建好样本文件夹sampleLabelsif(os.path.exists(sampleImg)):rmtree(sampleImg)os.mkdir(sampleImg)if(os.path.exists(sampleLab)):rmtree(sampleLab)os.mkdir(sampleLab)print('creating dataset...')fpImg = rasterio.open(imgPath)srcImg = fpImg.read()band, height, width = srcImg.shapeprofileImg = fpImg.profilefpLabel = rasterio.open(labelPath)srcLabel = fpLabel.read()band, height, width = srcLabel.shapeprofileLabel = fpLabel.profileprint(srcLabel.shape)print(height)print(width)count = 0for random_width in range(0,width-img_w,img_w):for random_height in range(0,height-img_h,img_h):try:src_roi = srcImg[:, random_height: random_height +img_h, random_width: random_width + img_w]label_roi = srcLabel[:, random_height: random_height +img_h, random_width: random_width + img_w]window = Window(random_width, random_height, img_w, img_h)transform = fpImg.window_transform(window)profileImg.update(width=img_w, height=img_h)profileImg.update({'transform': transform})samplePath = (sampleImg + '/%d.tif') % countoutImg = rasterio.open(samplePath, 'w', **profileImg)outImg.write(src_roi)window = Window(random_width, random_height, img_w, img_h)transform = fpLabel.window_transform(window)profileLabel.update(width=img_w, height=img_h)profileLabel.update({'transform': transform})samplePath = (sampleLab + '/%d.tif') % countoutLabel = rasterio.open(samplePath, 'w', **profileLabel)outLabel.write(label_roi)count+=1except:print("{} file error\n".format(image_sets[i]))breakcount1=0if __name__ == '__main__':parser = ArgumentParser()parser.add_argument('--basePath', default=" ", type=str) # 图片存储文件夹路径parser.add_argument('--imgPath', default=" ", type=str) # 原图切割图片路径parser.add_argument('--labelPath', default=" ", type=str) # 标签图切割图片路径parser.add_argument('--imageNum', default=500, type=int)args = parser.parse_args()creat_dataset(image_num=args.imageNum, imgPath=args.imgPath,labelPath=args.labelPath, basePath=args.basePath)
5、创建训练样本文件夹目录
通过上面小样本的裁剪之后,我们就需要创建模型训练所需要的文件夹了,我们这里使用的是pascal voc的数据集格式,他的目录结构如下图:
.{pascal voc数据集格式}
├── VOC2012
│ ├── ImageSets
│ │ ├── Segmentation
│ │ | ├── train.txt
│ │ | ├── val.txt
│ ├── JPEGImages
│ │ ├── xxx.png
│ │ ├── xxx.png
│ │ ├── xxx.png
│ ├── SegmentationClass
│ │ ├── xxx.png
│ │ ├── xxx.png
创建完上面的文件目录结构之后就把对应的内容放入对应的文件夹,这样我们的训练数据集就制作成功啦!
总结
以上就是我个人在制作数据集的方法和步骤,这期间遇到的很多问题,幸好有师兄帮忙。为了让其他小伙伴少走弯路我就把这个方法一步一步的写给大家,希望可以帮助到大家,然后我个人通过这个方法已经拥有了3.5GB,18000+多张的个人数据集,希望能找个好模型测试一下这批数据。
相关文章:

深度学习零基础学习之路——第五章 个人数据集的制作
Python深度学习入门 第一章 Python深度学习入门之环境软件配置 第二章 Python深度学习入门之数据处理Dataset的使用 第三章 数据可视化TensorBoard和TochVision的使用 第四章 UNet-Family中Unet、Unet和Unet3的简介 第五章 个人数据集的制作 深度学习数据集的制作Python深度学…...

女神节 | PHP和Java算什么,女工程师才是最美最好的语言!
世界上第一个程序员是女性 第一个发现Bug的也是女性 在智领云有一群追求快乐和独立的女性工程师 她们多有魅力? 工位上她们专注于数据与代码 平日里郊游、瑜伽、插花、科学养娃一件不落 不仅用0和1编织数字世界 也在用心装点自己的生活 今天是国际劳动妇女节…...

【Python】装饰器
一、装饰器的作用 装饰器能够为已经存在的对象添加额外的功能。 二、什么是装饰器 装饰器本质是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。 三、装饰器的应用场景 插入日志、性能…...

Spring事务及传播机制
概念 在MySQL中介绍过,当同一时间出现一起读写数据的情况,可能会导致最终的结果出错,因此可以使用事务来提高隔离级别 而Spring中也可以实现事务 手动添加事务 使用SpringBoot中的DataSourceTransactionManager对象可以获取事务࿰…...

43-Golang中的goroutine!!!
Golang中的goroutine进程和线程说明并发和并行并发并行Go协程和Go主线程案例小结goroutine的调度机制MPG模式基本介绍MPG模式运行的状态1MPG模式运行的状态2设置GOlang运行的CPU数不同 goroutine之间如何通讯使用全局变量加锁同步改进程序进程和线程说明 1.进程就是程序在操作…...

[深入理解SSD系列 闪存实战2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现
前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…...

pandas库中的read_csv函数读取数据时候的路径问题详解(ValueError: embedded null character)
read_csv()函数不仅是R语言中的一个读取csv文件的函数,也是pandas库中的一个函数。pandas是一个用于数据分析和处理的python库。它的read_csv函数可以读取csv文件里的数据,并将其转化为pandas里面的DataFrame对象。它由很多参数可以设置,例如…...

【量化交易笔记】4.移动平均值的实现
上一讲已经讲A股的数据下载到本地或保存数据库,我们可以随时使用。 移动平均MA(Moving Average) ,是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成…...

2023年3月份的野兔在线工具系统版本更新
这个是野兔在线工具系统中文版更新,这次更新的功能,和修改的问题还是比较多的,也修复系统部分功能,应该也是目前市面上在线工具比较多的一个系统了。系统名称:野兔在线工具系统系统语言:中文版系统源码&…...

科技成果赋智中小企业深度行 边界无限靖云甲ADR入选十大优秀案例
近日,国家工业信息安全发展研究中心、青岛市工业和信息化局、青岛市民营经济发展局、青岛市即墨区人民政府、青岛蓝谷管理局联合举办的科技成果赋智中小企业“深度行”活动(青岛站)成功举办,同步举行了赋智“深度行”活动…...

我们的理性何处安放
每天工作压力和各种人相处都让我们非常忙碌,我们上大学,努力工作,都是想获得更好的人生场景,素养,提升自身的认知,这样就是对我们大多数人生最负责任。如何让自己理性与人为善,并能被人温柔以待…...
RecyclerView的详细使用
首先就是了解ListView和RecyclerView的区别1.ListView相比RecycleView的优点a.ListView实现添加HeaderView和FooderView有直接的方法b.分割线可以直接设置c.ListView实现onItemClickListence和onItemLongClickListence有直接的方法2.RecyclerView相比ListView的优点a.封装了Vie…...
一、向量及其线性运算
🙌作者简介:数学与计算机科学学院出身、在职高校高等数学专任教师,分享学习经验、生活、 努力成为像代码一样有逻辑的人! 🌙个人主页:阿芒的主页 ⭐ 高等数学专栏介绍:本专栏系统地梳理高等数学…...

Spring Cloud/Spring Cloud Alibaba核心知识总结
Spring Cloud核心知识总结 springCloud是一个服务治理平台,若干个框架的集合,提供了全套的分布式系统的解决方案。包含:服务注册与发现、配置中心、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息、分布式事务等等。 SpringC…...

Locust框架从0到1入门
Locust介绍 Locust是使用Python语言编写实现的开源性能测试工具,可以用来测试Web应用程序、API、数据库等各种应用程序的性能,使用起来简洁、轻量、高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力。中文意为&a…...
C++:整数(short ,int,long,long long)表示范围
整形 C用short、int、long 、long long来表示整数的整形,同一整形也分为有符号(signed)和无符号(unsigned)两种。数据长度与操作系统和编译器的位数有关,其能够表示的范围也有所不同。接下来本文将用代码的…...

会声会影2023旗舰版新功能介绍,Corel VideoStudio Ultimate2023以及电脑系统配置要求
会声会影2023中文旗舰版功能非常强大的视频编辑软件,非常专业的使用效果,会声会影2023中文版可以针对剪辑电影进行使用,非常强大的色彩校正方式,无论什么光线下进行拍摄,都可以通过后期进行调整,并且里面超…...

软件测试用例篇(5)
测试是否运行代码去划分? 1)静态测试: 不运行代码,检查代码的风格,格式是否符合公司的标准规范,检查代码的逻辑结构是否满足需求要实现的功能 看代码,不运行代码,通过静态分析代码的语法,编写规…...
三个修饰符
三个修饰符三个修饰符一、abstract1.1 修饰类1.2 修饰方法二、final2.1 修饰类2.2 修饰方法2.3 修饰变量2.3.1 修饰属性2.3.2 修饰局部变量2.3.3 修饰方法的参数2.3.4 常量三、static关键字3.1 修饰属性3.2 修饰方法3.3 修饰代码块3.4 继承时的执行顺序三个修饰符 一、abstrac…...

JVM调优面试题——参数命令专题
文章目录1、JVM参数有哪些?1.1、 标准参数1.2、-X参数1.3、 -XX参数1.4、 其他参数1.5、 查看参数1.6、 设置参数的常见方式1.7、 常用参数含义2、JVM常用命令有哪些?2.1、jps2.2、jinfo2.3、jstat2.4、jstack2.5、jmap3、你会估算GC频率吗?4、 内存溢出…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...