我认为这是一个广泛适用的问题,但我正在尝试为特定比赛创建一个数据集,其中包括将无人机飞过一个带有纸板几何形状的字段,上面涂有字母数字字符。目标是检测形状和字符并对其进行分类。
目前,我正在使用SURF来检测形状,使用K-means来分割形状和特征,使用卷积神经网络对每个进行分类。但是,在培训可以很好地处理实际数据的数据时,我遇到了瓶颈。
我尝试过什么
使用Keras'ImageDataGenerator生成数据集,其中包含打字字体和几何形状的每个字母数字字符的模板图像的随机旋转,缩放和偏斜:可正常处理数据来自数据集(去图)和一些外部数据,但当角色太偏离时会感到困惑
使用MNIST数据集:无投诉,但仅包含数字
使用EMNIST ByClass数据集(与MNIST数据集不同;也包含字母):由于大小而无法轻松训练,即使经过训练也不能很好地训练高精确度。在数据集本身中,许多图像与声称的类几乎没有相似之处,并且某些类与其他类的旋转不同
使用Tesseract OCR表示字符。 这没有很好的结果
我没有尝试过什么
使用我们创建的真实纸板切口做几个天桥,并使用每个视频中的几个帧作为数据集。 缺点:这将需要相当多的飞行和纸板切口,并且不会提供太多的数据变化。
使用ImageDataGenerator,但使用的是几种不同的字体而不是一种。
有没有人对如何为这样的任务创建自定义数据集有任何建议?
答案 0 :(得分:1)
这是我的dataSetGenerator可能会帮助您生成自己的数据集
import numpy as np
from os import listdir
from glob import glob
import cv2
def dataSetGenerator(path,resize=False,resize_to=224,percentage=100):
"""
DataSetsFolder
|
|----------class-1
| . |-------image-1
| . | .
| . | .
| . | .
| . |-------image-n
| .
|-------class-n
:param path: <path>/DataSetsFolder
:param resize:
:param resize_to:
:param percentage:
:return: images, labels, classes
"""
classes = listdir(path)
image_list = []
labels = []
for classe in classes:
for filename in glob(path+'/'+classe+'/*.tif'):
if resize:image_list.append(cv2.resize(cv2.imread(filename),(resize_to, resize_to)))
else:image_list.append(cv2.imread(filename))
label=np.zeros(len(classes))
label[classes.index(classe)]=1
labels.append(label)
indice = np.random.permutation(len(image_list))[:int(len(image_list)*percentage/100)]
return np.array([image_list[x] for x in indice]),np.array([labels[x] for x in indice]),np.array(classes)
答案 1 :(得分:0)
我们学到的东西是在生成自定义数据集时,应该尝试尽可能多地合并“真实”元素(例如来自EMNIST的手写字符,来自Google图像的背景)。如果需要生成数据集的一部分,数据增强技术(如使用Keras的ImageDataGenerator类)尤为重要。
我们最终使用了EMNIST Balanced数据集,并在此处看到了用于字母数字分类的良好结果。为了定位几何形状,我们使用YOLO(https://pjreddie.com/darknet/yolo/)深度学习算法代替SURF。为了创建自定义数据集,我们在将EMNIST字符放置到几何形状上之后,将生成的几何形状放置在从Google刮下的字段的鸟瞰图的背景图像上。