掌握深度学习,数据不足也能进行图像分类

简介: 在机器学习中,决定因素往往不是算法而是数据集的大小。——吴恩达 图像分类即根据固定类别对输入的图像设置标签。尽管计算机视觉过于简单,但是它在实际中仍有广泛的应用,而图像分类就是其中的核心问题之一。在本文中,小芯将示范如何在数据不足的情况下应用深度学习。

云栖号:https://www.aliyun.com/#module-yedOfott8
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

image

图源:Unsplash

在机器学习中,决定因素往往不是算法而是数据集的大小。——吴恩达

图像分类即根据固定类别对输入的图像设置标签。尽管计算机视觉过于简单,但是它在实际中仍有广泛的应用,而图像分类就是其中的核心问题之一。

在本文中,小芯将示范如何在数据不足的情况下应用深度学习。现已创建特制汽车和巴士分类器两个数据集,每个数据集包含100个图像。其中,训练集有70个图像,验证集有30个。

image

掌握深度学习,数据不足也能进行图像分类
挑战

  1. 视点变化:基于相机,单一对象实例可以从多个视角聚焦。
  2. 尺度变化:视觉分类常常存在尺度变化(这里的尺度指的是现实世界中的物体的大小,而不仅仅就图像而言)。
  3. 图片变形:许多目标对象并非刚体(指在运动中和受力作用后,形状和大小不变,而且内部各点的相对位置不变的物体),可能会产生极端变形。
  4. 图片遮挡:目标对象可能会被遮挡,所以有时只会显示对象的一小部分(最少时可能只有一些像素点)。
  5. 光照条件:光照影响在像素级别上非常明显。

image

猫vs 狗图像分类

应用

  1. 图片库和视频网站:促成图片网站每日数十亿的搜索量。为用户提供工具,通过搜索找到可视化内容。
  2. 为改善产品可寻性提供可视化搜索:采用可视化搜索,用户可以将自行拍摄的图像或网上下载的图像作为参考搜寻相似的图像或产品。
  3. 安保行业:这项新兴技术在安保行业举足轻重,已用于研发多种安保设备,如:无人机、监控摄像头和用于面部识别的生物特征识别设备等等。
  4. 医疗行业:医疗行业中,机器人驱动的显微外科手术就利用了计算机视觉和图像识别技术。
  5. 汽车行业:这项技术可以减少道路交通事故,促进人们遵守交通规则、维护交通秩序等。

image

数据量函数模型性能

环境和工具:

  1. Matplotlib
  2. keras

数据

这是一个二进制分类的问题。小芯下载了200个图像,其中100个为巴士图像,剩下的是汽车图像。现将数据分解如下所示:

dataset train

car

car1.jpg

car2.jpg

//

bus

bus1.jpg

bus2.jpg

// validation

car

car1.jpg

car2.jpg

//

bus

bus1.jpg

bus2.jpg

//...

image

image

image

汽车

image

image

image

巴士

图像分类

正式且完整的图像分类路径如下:

· 输入包含N个图像的训练集,每个图像均由单一类别标记,总共有两种不同类别。

· 随后,利用该训练集训练分类器辨认各个类别的特征。

· 最后,要求分类器对之前从未接触过的新图像进行标签预测,随后对比这些图像的实际标签和分类器预测的标签,以此来评估分类器的性能。

首先是编写代码。

一开始先加载keras及其各层,这些将用于后面的模型构建。

from keras.models import Sequential

from keras.layers import Convolution2D

from keras.layers import MaxPooling2D

from keras.layers import Flatten

from keras.layers import Dense

viewrawimports6.py hostedwith ❤ by GitHub

接下来,构建模型,可分为3步完成。

1.使用2个由卷积层和最大池化层组成的卷积块,将线性整流函数(Rectified LinearUnit, ReLU)作为卷积层的激活函数。

2.最顶部使用flatten层,下面是分别由线性整流函数和S型函数作为激活函数的两个完全连接层。

3.使用Adam优化器,交叉熵(cross-entropy)作为损失函数。

classifier = Sequential()

Step 1 - Convolution

classifier.add(Convolution2D(32, 3, 3, input_shape= (64, 64, 3), activation='relu'))

Step 2 - Pooling

classifier.add(MaxPooling2D(pool_size= (2, 2)))

Adding a second convolutional layer

classifier.add(Convolution2D(32, 3, 3, activation='relu'))

classifier.add(MaxPooling2D(pool_size= (2, 2)))

Step 3 - Flattening

classifier.add(Flatten())

Step 4 - Full connection

classifier.add(Dense(output_dim=128, activation='relu'))

classifier.add(Dense(output_dim=1, activation='sigmoid'))

Compiling the CNN

classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics= ['accuracy'])

viewrawmodel2.py hostedwith ❤ by GitHub

数据增强

数据增强是扩大训练集规模的有效途径。增强训练样例可以使网络在训练中获取更多多样化但仍具代表性的数据点。

下列代码可以为训练集定义一组增强操作:旋转、平移、剪切、翻转以及缩放。

如果数据集规模太小,就应该使用数据增强创建其它的训练数据。

同时,小芯创建了一个数据生成器,以便自动从文件夹中获取数据并转入Keras。Keras为此提供了便捷的python生成器函数。

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1./255,

shear_range=0.2,

zoom_range=0.2,

horizontal_flip=True,

width_shift_range=0.2,

height_shift_range=0.2,

rotation_range=15,

vertical_flip=True,

fill_mode='reflect',

data_format='channels_last',

brightness_range=[0.5, 1.5],

featurewise_center=True,

featurewise_std_normalization=True)

test_datagen = ImageDataGenerator(rescale=1./255)

training_set = train_datagen.flow_from_directory('dataset/train',

target_size= (64, 64),

batch_size=32,

class_mode='binary')

test_set = test_datagen.flow_from_directory('dataset/validation',

target_size= (64, 64),

batch_size=32,

class_mode='binary')

viewrawsplit_data.py hostedwith ❤ by GitHub

随后,该模型训练了50个epoch,每个epoch共32个批次。

Batch size(批尺寸)是深度学习十分重要的超级参数之一。小芯更习惯用较大的Batch size(批大小)进行模型训练,因为这样可以允许图形处理器并行的同时加快计算速度。

但是,众所周知,Batch size(批尺寸)太大会导致泛化功能低下。

image

图源:Unsplash

一方面,使用规模相当于整个数据集的批量数据可以保证收敛达到目标函数全局最优。但是如此会导致最优收敛速度降低。

另一方面,已证明使用较小的Batch size(批尺寸)可以更快地向良好结果收敛。事实可以直观说明这一点,即较小的Batch size(批尺寸)允许模型在获取所有数据前就开始学习。

但是,它的缺点是无法保证全局最优。因此,一般建议大家首先利用小规模批量处理从更快速的训练动态中获益,而后通过训练逐步增加批量规模。

history = classifier.fit_generator(training_set,

samples_per_epoch=128,

nb_epoch=50,

validation_data= test_set,

nb_val_samples=59)

viewrawtrain4.py hostedwith ❤ by GitHub

将损耗可视化并精准绘图。

import matplotlib.pyplot as plt

fig = plt.figure()

plt.plot(history.history['val_loss'])

plt.legend(['validation'], loc='upper left')

plt.title('validation loss vs epoch')

plt.ylabel('validation loss')

plt.xlabel('Epoch')

viewrawval_loss.py hostedwith ❤ by GitHub

image

验证损耗VS epoch

import matplotlib.pyplot as plt

fig = plt.figure()

plt.plot(history.history['val_acc'])

plt.legend(['validation'], loc='upper left')

plt.title('validation accuracy vs epoch')

plt.ylabel('validation accuracy')

plt.xlabel('Epoch')

viewrawval_acc.py hostedwith ❤ by GitHub

image

该模型跑完50次 epoch可达到100%的验证精度。

结论

因此,数据不足时也能进行深度学习。

本模型仅凭各类别的100个图像就可以在50次epoch实现100%验证精度。

此模型还可以延伸到解决其他二进制或多级别图像分类问题。

有人可能认为这一模型相当简单,因为凭借肉眼也可以轻松看出汽车和巴士区别甚大。那么是否可以借助这一模型开发出识别良性/恶性肿瘤的分类器呢?

答案是肯定的。

我们可以开发出这样的分类器,但是关键在于出现任何数据集规模小的情况都要使用数据增强的方法。另一种解决办法则是采用预训练权重实现迁移学习。

现在,你明白了吗?

image

掌握深度学习,数据不足也能进行图像分类

原文发布时间:2019-12-10
本文作者:读芯术
本文来自云栖社区合作伙伴“读芯术”,了解相关信息可以关注“读芯术

云栖号:https://www.aliyun.com/#module-yedOfott8
第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

相关文章
|
机器学习/深度学习 编解码 人工智能
人脸表情[七种表情]数据集(15500张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
本数据集包含15,500张已划分、已标注的人脸表情图像,覆盖惊讶、恐惧、厌恶、高兴、悲伤、愤怒和中性七类表情,适用于YOLO系列等深度学习模型的分类与检测任务。数据集结构清晰,分为训练集与测试集,支持多种标注格式转换,适用于人机交互、心理健康、驾驶监测等多个领域。
|
2月前
|
机器学习/深度学习 人工智能 监控
河道塑料瓶识别标准数据集 | 科研与项目必备(图片已划分、已标注)| 适用于YOLO系列深度学习分类检测任务【数据集分享】
随着城市化进程加快和塑料制品使用量增加,河道中的塑料垃圾问题日益严重。塑料瓶作为河道漂浮垃圾的主要类型,不仅破坏水体景观,还威胁水生生态系统的健康。传统的人工巡查方式效率低、成本高,难以满足实时监控与治理的需求。
|
2月前
|
机器学习/深度学习 传感器 人工智能
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在人工智能和计算机视觉的快速发展中,火灾检测与火焰识别逐渐成为智慧城市、公共安全和智能监控的重要研究方向。一个高质量的数据集往往是推动相关研究的核心基础。本文将详细介绍一个火灾火焰识别数据集,该数据集共包含 2200 张图片,并已按照 训练集(train)、验证集(val)、测试集(test) 划分,同时配有对应的标注文件,方便研究者快速上手模型训练与评估。
火灾火焰识别数据集(2200张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
2月前
|
机器学习/深度学习 人工智能 自动驾驶
7种交通场景数据集(千张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在智能交通与自动驾驶技术快速发展的今天,如何高效、准确地感知道路环境已经成为研究与应用的核心问题。车辆、行人和交通信号灯作为城市交通系统的关键元素,对道路安全与交通效率具有直接影响。然而,真实道路场景往往伴随 复杂光照、遮挡、多目标混杂以及交通信号状态多样化 等挑战,使得视觉识别与检测任务难度显著增加。
|
2月前
|
机器学习/深度学习 人工智能 监控
坐姿标准好坏姿态数据集(图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
坐姿标准好坏姿态数据集的发布,填补了计算机视觉领域在“细分健康行为识别”上的空白。它不仅具有研究价值,更在实际应用层面具备广阔前景。从青少年的健康教育,到办公室的智能提醒,再到驾驶员的安全监控和康复训练,本数据集都能发挥巨大的作用。
坐姿标准好坏姿态数据集(图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
2月前
|
机器学习/深度学习 编解码 人工智能
102类农业害虫数据集(20000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
在现代农业发展中,病虫害监测与防治 始终是保障粮食安全和提高农作物产量的关键环节。传统的害虫识别主要依赖人工观察与统计,不仅效率低下,而且容易受到主观经验、环境条件等因素的影响,导致识别准确率不足。
|
1月前
|
机器学习/深度学习 数据采集 编解码
基于深度学习分类的时相关MIMO信道的递归CSI量化(Matlab代码实现)
基于深度学习分类的时相关MIMO信道的递归CSI量化(Matlab代码实现)
|
机器学习/深度学习 人工智能 文字识别
中药材图像识别数据集(100类,9200张)|适用于YOLO系列深度学习分类检测任务
本数据集包含9200张中药材图像,覆盖100类常见中药材,适用于YOLO系列及主流深度学习模型的图像分类与目标检测任务。数据已划分为训练集(8000张)与验证集(1200张),采用标准文件夹结构和简体中文命名,适配PyTorch、TensorFlow等框架,可用于中药识别系统开发、医学辅助诊断、移动端图像识别App研发及AI科研训练,具备较强的实用性与拓展性。
602 45
|
2月前
|
机器学习/深度学习 自动驾驶 算法
道路表面缺陷数据集(裂缝/井盖/坑洼)(6000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
随着城市化与交通运输业的快速发展,道路基础设施的健康状况直接关系到出行安全与城市运行效率。长期高强度的使用、气候变化以及施工质量差异,都会导致道路表面出现裂缝、坑洼、井盖下沉及修补不良等缺陷。这些问题不仅影响驾驶舒适度,还可能引发交通事故,增加道路养护成本。
道路表面缺陷数据集(裂缝/井盖/坑洼)(6000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
|
机器学习/深度学习 人工智能 编解码
AI虫子种类识别数据集(近3000张图片已划分、已标注)|适用于YOLO系列深度学习分类检测任务【数据集分享】
本数据集包含近3000张已划分、标注的虫子图像,适用于YOLO系列模型的目标检测与分类任务。涵盖7类常见虫子,标注采用YOLO格式,结构清晰,适合农业智能化、小样本学习及边缘部署研究。数据来源多样,标注精准,助力AI虫害识别落地应用。

热门文章

最新文章