在撰写硕士学位论文时,花了很多时间研究深度学习原理和主要模型架构。在那段时间,经常思考在不同于MNIST数据集或CIFAR-10的数据(例如图像)上试验模型架构的必要性。因此,开发了一个名为xeye的小型 Python 包,它有助于创建类似于MNIST和CIFAR-10的监督图像数据集。
什么时候开始使用xeye?
那段时间,在对 toy 数据集进行研究和实验之后,会先到外面去寻找我所在地区可以作为案例研究的公司。这种方法使能够更好地理解在现实场景中部署和使用深度学习模型所涉及的挑战。
主要意图从来不是向这些公司出售产品。相反,目标是解决真正的工业问题,作为个人和开发人员学习和发展。
从这个想法中,立即意识到我需要一个工具来使用公司生产站的图像快速创建数据集,以避免浪费他们的时间。
因此,xeye 就是为了这个而诞生的:找到一个可以在模型使用过程中详细说明的流程,用最少的时间(使用xeye)从头开始创建监督图像数据集,然后制作一个演示,向客户展示深度学习模型的强大性和灵活性。
使用xeye需要什么?
你只需要一台配备集成摄像头、网络摄像头或可通过 USB 或兼容接口连接到机器的任何其他类型摄像头的笔记本电脑。本质上,你只需要一个OpenCV可以通过videoccapture类识别和利用的设备。
安装
要安装该软件包,使用以下命令
pip install xeye
Xeye功能
Xeye 包包括从头开始创建数据集的三种主要方法:Dataset、FastDataset和ManualDataset。
数据集:让你在此过程中使用终端 UI 创建数据集。
FastDataset:在开始该过程之前,你需要传递有关要包含在数据集中的图像格式的所有信息。
ManualDataset :与FastDataset相同,但每次手动捕获每张图像。
此外,该包还提供了一种组合使用BuildDataset类创建的数据集的方法。
使用终端 UI 创建数据集
import xeye
# Instance of the Dataset class.
data = xeye.Dataset()
# Setup the image format using the terminal UI.
data.setup()
# Preview the camera's framing.
data.preview()
# Dataset containing RGB images.
data.rgb() # or data.gray()
# Use the terminal UI to specify the dataset split.
data.compress_train_test()
运行脚本后,你可以在终端中看到,一系列问题开始出现:
--- CAMERA SETTING ---
Select the index of the camera that you want to use for creating the dataset: 0
--- IMAGE SETTINGS ---
Num. of types of images to scan: 2
Name of image type (1): peace
Name of image type (2): thumb
Num. of frames to shoot for every image type: 10
Single frame HEIGHT: 128
Single frame WIDTH: 128
num. of waiting time (in sec.) between every frame: 0.1
确切地说,这些问题指的是:
选择要用于创建数据集的相机索引:一般为 0 表示集成相机,1 表示 USB 外部相机。
要扫描的图像类型数目:如果你希望创建包含两个对象(如peace和thumb)的数据集,请设置为“2”。一般来说,请提供你想要包含在数据集中的对象类型的数量。
图像类型名称:输入你希望包含在数据集中的每个特定对象的名称。设置方法将为每种图像类型创建一个命名文件夹。
每种图像类型要拍摄的帧数:选择要捕获的所需图像数量并将其保存在每个相应的对象文件夹中。
单帧高度:帧高度值。
单帧宽度:帧宽度值。
每帧之间的等待时间(以秒为单位):例如,如果将其设置为 0.1,则每次拍摄之间将有 0.1 秒的等待时间。
设置完参数后,你将可以在终端中看到以下消息:
--- PREVIEW ---
这是由数据对象的preview方法引起的,该方法在setup方法之后调用。你会注意到屏幕上出现一个显示相机取景的窗口。
设置相机的取景后,就可以为数据集生成图像了。
想象一下以下场景:你的目标是为概念验证(POC)创建一个数据集,或者使用图像和深度学习来研究某些物理问题。通过使用 xeye,你可以轻松生成这种人工模拟。你可以定位对象或执行你知道可以归类为特定对象类型的进程。同样,对于你确信模型能够正确识别和推断的其他图像类型,你可以重复这些步骤。
在这个“toy”示例中,我将首先拍摄一张我知道可以归类为“peace sign”的照片,然后拍摄一张我知道可以归类为“thumb up”标志的照片。
当然,你可以在生产环境中应用相同的方法,首先捕获制作精良的产品的图像,然后模拟产品制作不正确的情况。虽然这种方法可能不是最佳实践,但在某些情况下可能非常有益。它允许你快速生成可在短时间内研究和用于与分析过程相关的实验的数据集。
rgb方法的执行导致终端中显示以下消息:
--- START TAKING PHOTOS ---
Press [b] on the keyboard to start data collection of image type: [peace]
通过按键盘上的“b”,将出现类似于相机预览的窗口,系统将自动开始在为存储生成的图像而创建的“peace”存储库中捕捉和保存镜头。
完成“peace”类型后,终端将显示消息以指示开始捕获第二对象类型。
--- START TAKING PHOTOS ---
Press [b] on the keyboard to start data collection of image type: [thumb]
完成图像捕获过程后,就可以创建可用于训练深度学习模型的数据集。通过在终端中使用compress_train_test方法,将出现一条消息,允许你设置要包含在测试数据集中的图像的百分比。
--- DATASET SETTING ---
percentage of images in the test set (0,1): 0.25
在该过程结束时,你将发现以下目录结构:
.
├── dataset.npz
├── dataset.py
├── peace
│ ├── peace0.png
│ ├── peace1.png
│ ├── peace2.png
│ ├── peace3.png
│ ├── peace4.png
│ ├── peace5.png
│ ├── peace6.png
│ ├── peace7.png
│ ├── peace8.png
│ └── peace9.png
└── thumb
├── thumb0.png
├── thumb1.png
├── thumb2.png
├── thumb3.png
├── thumb4.png
├── thumb5.png
├── thumb6.png
├── thumb7.png
├── thumb8.png
└── thumb9.png
在目录中导航时,你会注意到两个文件夹,其中包含rgb方法生成的图像,以及compress_train_test方法生成的名为dataset.npz的文件。
import numpy as np
import matplotlib.pyplot as plt
data = np.load("dataset.npz")
X_train = data['X_train']
X_test = data['X_test']
y_train = data['y_train']
y_test = data['y_test']
print(X_train.shape, type(X_train))
print(X_test.shape, type(X_test))
print(y_train.shape, type(y_train))
print(y_test.shape, type(y_test))
(15, 128, 128, 3) <class 'numpy.ndarray'>
(5, 128, 128, 3) <class 'numpy.ndarray'>
(15,) <class 'numpy.ndarray'>
(5,) <class 'numpy.ndarray'>
检查数据集中的图像我们可以看到:
# 0 = peace, 1 = thumb
plt.imshow(X_train[0], cmap='gray')
plt.title(f'load image: {y_train[0]}')
plt.show()
plt.imshow(X_test[0], cmap='gray')
plt.title(f'load image: {y_test[0]}')
plt.show()
创建数据集的其他方法
或者,你可以使用FastDataset类,而不是使用Dataset类。它使你能够创建与前面的示例类似的数据集,但不需要终端 UI。通过将参数值直接传递给FastDataset类的实例,你可以轻松创建所需的数据集。
import xeye
index = 0
img_types = 2
label = ['peace', 'thumb']
num = 10
height = 128
width = 128
standby_time = 0.5
perc = 0.25
data = xeye.FastDataset(index=index, img_types=img_types, label=label,
num=num, height=height, width=width,
stand_by_time=standby_time)
data.preview()
data.rgb() # or data.gray()
data.compress_train_test(perc=perc)
如果你想完全控制图像捕获,可以选择ManualDataset类而不是FastDataset类。使用ManualDataset类,你可以通过按键盘上的“s”键来负责拍摄每张照片。
import xeye
index = 0
img_types = 2
label = ['peace', 'thumb']
num = 10
height = 128
width = 128
perc = 0.2
data = xeye.ManualDataset(index=index, img_types=img_types,
label=label, num=num, height=height, width=width)
data.preview()
data.rgb() # or data.gray()
data.compress_train_test(perc=perc)
通过合并现有数据集创建数据集
在概念验证(POC)期间或现实场景中,有时会出现某些对象类型或过程实现在需要时可能不会出现的情况。在这种情况下,我们需要一种方法来部分收集数据集。xeye 包通过采用特殊类型的图像压缩(just_compress)来帮助我们。然后,我们可以利用BuildDataset类,它使我们能够创建最终的数据集以供进一步分析。
在这种情况下,第一步是使用前面解释的方法之一( Dataset、FastDataset或ManualDataset)一次收集一个图像类型。然后,我们使用BuildDataset类合并为每种图像类型创建的各种 .npz 文件。
第一种图像类型:peace
import xeye
index = 0
img_types = 1
label = ['peace']
num = 10
height = 128
width = 128
standby_time = 0.5
data = xeye.FastDataset(index=index, img_types=img_types, label=label,
num=num, height=height, width=width,
stand_by_time=standby_time)
data.preview()
data.rgb() # or data.gray()
# This method will create on the dir a file called peace.npz
data.just_compress(name="peace")
第二图像类型:thumb
import xeye
index = 0
img_types = 1
label = ['thumb']
num = 10
height = 128
width = 128
standby_time = 0.5
data = xeye.FastDataset(index=index, img_types=img_types, label=label,
num=num, height=height, width=width,
stand_by_time=standby_time)
data.preview()
data.rgb() # or data.gray()
# This method will create on the dir a file called thumb.npz
data.just_compress(name="thumb")
构建并检查新创建的数据集:
import xeye
import numpy as np
import matplotlib.pyplot as plt
path = ['peace.npz', 'thumb.npz']
label = [0,1]
data = xeye.BuildDataset(path=path, label=label, size=(300,300),
color=True, split=True, perc=0.2)
data.build()
data = np.load('dataset.npz')
X_train = data['X_train']
X_test = data['X_test']
y_train = data['y_train']
y_test = data['y_test']
plt.imshow(X_train[0], cmap='gray')
plt.title(f'load image: {y_train[0]}')
plt.show()
plt.imshow(X_test[0], cmap='gray')
plt.title(f'load image: {y_test[0]}')
plt.show()
传递给类BuildDataset的参数:
path:要包含在新数据集中的文件 (.npz) 路径列表
label:序数整数值列表,表示新数据集中包含的 .npz 文件内图像的类类型。在示例脚本中,第一个 .npz 文件图像与类 0 关联,而第二个 .npz 文件图像与类 1 关联。记住:始终以 0 开头。
size:创建的新数据集中图像的元组(高度,宽度)。默认值(None)表示新图像具有在维度列出的数据集中找到的最大高度和宽度
color:定义 .npz 文件中包含的图像是 RGB 还是灰度。默认情况下,布尔值设置为 True(表示 RGB 图像)。
split:定义是否要在训练测试中构建数据集分割。默认情况下,布尔值设置为 True。
perc:定义分配给测试数据集的图像的百分比。(0,1) 之间的浮点值。默认设置为 0.1。
总结
xeye软件包仍处于开发的早期阶段,我相信随着时间的推移它可以得到显着的改进。我希望这个包可以帮助你更快地工作,并在利用深度学习模型的力量方面取得重大进展,
GitHub:https://github.com/marcosalvalaggio/xeye/tree/main
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓