数据获取方法
- 三大要素:数据、算法(神经网络)、算力
数据集分类
- 分类数据:图像分类,一般以目录的形式分开
- 标注数据:目标检测和图像分割,是有标注数据的
开源数据集
免费,成本低
-
开源数据集imagenet:ImageNet
-
Hugging Face数据集:https://huggingface.co/datasets
-
kaggle数据集下载网址:https://www.kaggle.com/datasets
-
各种网站:
https://zhuanlan.zhihu.com/p/648720525
https://zhuanlan.zhihu.com/p/648720525
外包平台
- 效果好,成本高,外包平台(Amazon Mechanical Turk,阿里众包,百度数据众包,京东微工等)
自己采集和标注
- 质量高、效率低、成本高。
- labelimg、labelme工具的使用。
pip install -i https://mirrors.aliyun.com/pypi/simple/ labelimg
pip install -i https://mirrors.aliyun.com/pypi/simple/ label
- 在安装工具环境下的命令行打开
- 图片标注
- 标注保存记录
- labelme使用大致同理,但标注方式不一样(点框),保存格式不一样,以json格式进行保存
通过网络爬虫获取
爬虫工具或爬虫代码
数据本地化
- 使用公开数据集时,会自动保存到本地。如果已下载,就不会重复下载。如果需要以图片的形式保存到本地以方便观察和重新处理,可以按照如下方式处理。
图片本地化
使用一下代码保存图片到本地
dir = os.path.dirname(__file__)
def save2local():
trainimgsdir = os.path.join(dir, "MNIST/trainimgs")
testimgsdir = os.path.join(dir, "MNIST/testimgs")
if not os.path.exists(trainimgsdir):
os.makedirs(trainimgsdir)
if not os.path.exists(testimgsdir):
os.makedirs(testimgsdir)
trainset = torchvision.datasets.MNIST(
root=datapath,
train=True,
download=True,
transform=transforms.Compose([transforms.ToTensor()]),
)
for idx, (img, label) in enumerate(trainset):
labdir = os.path.join(trainimgsdir, str(label))
os.makedirs(labdir, exist_ok=True)
pilimg = transforms.ToPILImage()(img)
# 保存成单通道的灰度图
pilimg = pilimg.convert("L")
pilimg.save(os.path.join(labdir, f"{idx}.png"))
# 加载测试集
testset = torchvision.datasets.MNIST(
root=datapath,
train=False,
download=True,
transform=transforms.Compose([transforms.ToTensor()]),
)
for idx, (img, label) in enumerate(testset):
labdir = os.path.join(testimgsdir, str(label))
os.makedirs(labdir, exist_ok=True)
pilimg = transforms.ToPILImage()(img)
# 保存成单通道的灰度图
pilimg = pilimg.convert("L")
# 保存中不能有中文路径
pilimg.save(os.path.join(labdir, f"{idx}.png"))
print("所有图片保存成功~~")
加载图片数据集
直接下载的图片文件目录也可以直接使用
trainpath = os.path.join(dir, "MNIST/trainimgs")
trainset = torchvision.datasets.ImageFolder(root=trainpath, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=32, shuffle=True)
本地图片序列化
- 把本地图片存储为 pickle序列化格式,然后通过 tar格式的形式分发。
- Pickle 和 Tar 是两种不同的文件格式,分别用于不同的目的。
Pickle 格式
- Pickle 是 Python 内置的模块,它允许你序列化和反序列化 Python 对象结构。这意味着你可以把几乎任何 Python 对象(如列表、字典、类实例等)转换为一个字节流(序列化),然后可以将其保存到磁盘上或通过网络传输。之后,你可以从这个字节流中恢复出原始的对象(反序列化)。Pickle 文件通常以 `.pkl` 或 `.pickle` 扩展名保存。
字节流
1.字节流(Byte Stream)是一种数据传输和存储的概念,指的是将数据表示为一系列的字节(8位二进制数)。每个字节由八个连续的比特组成,是计算机中最基本的信息单位之一。字节流可以用于表示任何类型的数据,比如文本、图片、音频、视频等,并且可以在程序内部处理、通过网络发送或保存到磁盘上。
2.在计算机科学中,字节流是一个抽象的概念,它描述了数据从一个地方到另一个地方流动的过程。
- 文件读写:当你从文件读取数据时,操作系统通常会提供一个接口,允许你以字节流的形式读取文件内容。同样,当你向文件写入数据时,你也通常是以字节流的形式写入。
- 网络通信:在网络编程中,客户端和服务器之间交换的数据也是以字节流的形式进行传输的。无论是HTTP请求、FTP传输还是其他类型的网络协议,数据都被编码成字节流后在网络上传输。
- 序列化/反序列化:如之前提到的 Pickle 模块,它可以将 Python 对象转换成字节流(序列化),然后可以通过网络发送或保存到磁盘。接收方可以读取这些字节并将它们转换回原始对象(反序列化)。
字节流的一个重要特性是它是无结构的,即它不包含关于如何解释这些字节的信息。这意味着,为了正确地处理字节流,发送方和接收方必须就数据格式达成一致,或者在字节流中嵌入额外的信息来描述数据结构(如使用特定的文件格式或协议)。
例如,当处理图像文件时,不同的图像格式(如JPEG、PNG等)会有不同的方式来组织字节流中的信息。解码器需要知道正在处理的是哪种格式才能正确解析这些字节。
此外,在某些情况下,字节流可能会经过压缩或加密,以便更高效地传输或保护数据的安全性。在这种情况下,接收方需要先解压缩或解密字节流,然后再进行进一步的处理。
Tar 格式
- Tar(Tape Archive)是一种文件格式,最初设计用于磁带归档。它可以把多个文件和目录打包成一个单独的文件,但不包括压缩功能(虽然 Tar 文件经常与压缩算法结合使用,例如 gzip 或 bzip2,生成 `.tar.gz` 或 `.tar.bz2` 文件)。Tar 文件保留了原始文件的元信息,比如权限、时间戳和目录结构等。
结合使用
为了将本地图片存储为 Pickle 序列化格式并以 Tar 形式分发,你可以按照以下步骤操作:
- 读取图片:用 Python 读取图片文件为二进制数据。
- 序列化:使用 pickle 模块将包含图片二进制数据的对象序列化。
- 保存 Pickle 文件:将序列化的对象保存为 Pickle 文件。
- 创建 Tar 包:使用 `tarfile` 模块将 Pickle 文件以及可能的其他相关文件打包成一个 Tar 文件。
- 分发 Tar 文件:你现在可以将这个 Tar 文件分发给其他人。
接收方可以解包 Tar 文件,然后使用 pickle 模块反序列化 Pickle 文件来恢复原始的图片数据。
过拟合处理
数据增强
- 可以使用transform完成对图像的数据增强,防止过拟合发生
数据增强的方法
1.随机旋转
2.镜像
3.缩放
4.图像模糊
5.裁剪
6.翻转
7.饱和度、亮度、灰度、色相
8.噪声、锐化、颜色反转
9.多样本增强
- SamplePairing操作:随机选择两张图片分别经过基础数据增强操作处理后,叠加合成一个新的样本,标签为原样本标签中的一种。
- 多样本线性插值:Mixup 标签更平滑
- 直接复制:CutMix, Cutout,直接复制粘贴样本
- Mosic:四张图片合并到一起进行训练
数据增强的好处
- 查出更多训练数据:大幅度降低数据采集和标注成本;
- 提升泛化能力:模型过拟合风险降低,提高模型泛化能力
标准化
- 使数据更加的平滑,利于数据集的训练
DROP-OUT
- 处理过拟合问题的,丢去一定比列的神经元
欠拟合注意事项
- 欠拟合: 如果模型在训练集和验证集上表现都不够好,考虑增加模型的层级或训练更多的周期。
训练过程可视化
wandb.ai
- 可在控制台看到训练进度。
- 详情参考官方文档: