卷积神经网络:用于图像分类
卷积神经网络用于图像分类,最早可以追溯到Lenet-5,它最早被应用于手写数字的识别,并且取得了不错的分类效果。
因为通常数据集是要求我们自己收集,而且有些数据并不是特别容易收集的,会遇到采集仪器价格昂贵、样本可收集性不高等问题。
这就说明了一个潜在的问题,数据集要多大才能用于分类网络中。
下面,送给大家三句话:
训练集中每个类应有1000张图像;
所用图像应当是具有代表性的高质量图像;
如果图像数量不够,可采用数据增强方法。
对于小样本数据如何处理
1、迁移学习
因为你正在使用是已经查看过大量图像并且学会区分类的网络,所以通常可以教给模型同一领域的新类,只需要几十个数据样本即可。
2、数据增强
博主分享几个自己常用的数据增强代码。
"伽马变换"
img = cv2.imread(file_pathname+'/'+filename, 1)
# 图像归一化
fi = img / 255.0
# 伽马变换
gamma = 0.8 #自己设定
out = np.power(fi, gamma)
out = out * 255
"平移"
def affine(img, a, b, c, d, tx, ty): #平移H, W, = img.shapetem = img.copy()img = np.zeros((H + 2, W + 2, ), dtype=np.float32)img[1:H + 1, 1:W + 1] = temH_new = np.round(H * d).astype(np.int)W_new = np.round(W * a).astype(np.int)out = np.zeros((H_new + 1, W_new + 1, ), dtype=np.float32)x_new = np.tile(np.arange(W_new), (H_new, 1))y_new = np.arange(H_new).repeat(W_new).reshape(H_new, -1)adbc = a * d - b * cx = np.round((d * x_new - b * y_new) / adbc).astype(np.int) - tx + 1y = np.round((-c * x_new + a * y_new) / adbc).astype(np.int) - ty + 1# 避免目标图像对应的原图像中的坐标溢出x = np.minimum(np.maximum(x, 0), W + 1).astype(np.int)y = np.minimum(np.maximum(y, 0), H + 1).astype(np.int)# assgin pixcel to new imageout[y_new, x_new] = img[y, x]out = out[:H_new, :W_new]out = out.astype(np.uint8)return out
"旋转"
def remote(img, degree):height, width = img.shape[:2]radians = float(degree / 180 * pi)heightNew = int(width * fabs(sin((radians))) + height * fabs(cos((radians))))widthNew = int(height * fabs(sin((radians))) + width * fabs(cos((radians))))# 得到二维矩阵的旋转的仿射矩阵matRotation = cv2.getRotationMatrix2D((width / 2, height / 2), degree, 1)# 中心位置的实际平移matRotation[0, 2] += (widthNew - width) / 2matRotation[1, 2] += (heightNew - height) / 2imgRotation = cv2.warpAffine(img, matRotation,(widthNew, heightNew), borderValue=(0,0,0))return imgRotation
3、基于Keras的Data Augmentation方法
代码如下:
from keras.preprocessing.image import ImageDataGenerator
"""
parameters:rotation_range:整数,数据提升时图片随机转动的角度width_shift_range:浮点数,图片宽度的某个比例,数据提升时图片水平偏移的幅度height_shift_range:浮点数,图片高度的某个比例,数据提升时图片竖直偏移的幅度rescale: 重放缩因子,默认为None. 如果为None或0则不进行放缩,否则会将该数值乘到数据上(在应用其他变换之前)shear_range:浮点数,剪切强度(逆时针方向的剪切变换角度)zoom_range:浮点数或形如[lower,upper]的列表,随机缩放的幅度,若为浮点数,则相当于[lower,upper] = [1 - zoom_range, 1+zoom_range]fill_mode:‘constant’‘nearest’,‘reflect’或‘wrap’之一,当进行变换时超出边界的点将根据本参数给定的方法进行处理cval:浮点数或整数,当fill_mode=constant时,指定要向超出边界的点填充的值channel_shift_range: Float. Range for random channel shifts.horizontal_flip:布尔值,进行随机水平翻转vertical_flip:布尔值,进行随机竖直翻转"""datagen = ImageDataGenerator(rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True,fill_mode='nearest',cval=0,channel_shift_range=0,horizontal_flip=False,vertical_flip=False,rescale=None)
数据增强告一段落,接下来就正式进入卷积神经网络的学习。
AlexNet
alexnet实现手写数字的识别
"直接用代码的形式来表达网络结构"
model = Sequential()
model.add(Conv2D(96, (11, 11), strides=(1, 1), input_shape=(28, 28, 1), padding='same',activation='relu',kernel_initializer='uniform'))
# 池化层
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
# 第二层加边使用256个5x5的卷积核,加边,激活函数为relu
model.add(Conv2D(256, (5, 5), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
#使用池化层,步长为2
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
# 第三层卷积,大小为3x3的卷积核使用384个
model.add(Conv2D(384, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
# 第四层卷积,同第三层
model.add(Conv2D(384, (3, 3), strides=(1, 1), padding='same',activation='relu', kernel_initializer='uniform'))
# 第五层卷积使用的卷积核为256个,其他同上
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.summary()
VGG
一个5x5的卷积核用两个串联的3x3卷积核来代替
VGG11、13、16、19,SimpleVGG
"VGG13"
model = Sequential()
model.add(Conv2D(64, (3, 3), strides=(1, 1), input_shape=(32, 32, 3), padding='same', activation='relu',kernel_initializer='uniform'))
model.add(Conv2D(64, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(128, (3, 2), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(128, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(256, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(Conv2D(512, (3, 3), strides=(1, 1), padding='same', activation='relu', kernel_initializer='uniform'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
GoogLeNet
虽然深度只有22层,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。
Resnet
ResNet引入了残差网络结构(residual network),通过这种残差网络结构,可以把网络层弄的很深(据说目前可以达到1000多层),并且最终的分类效果也非常好。
Densenet
密集连接:缓解梯度消失问题,加强特征传播,鼓励特征复用,极大的减少了参数量。
总结:上诉神经网络都经常用于图像分类中,并辅之迁移学习。
卷积神经网络:用于图像分类相关推荐
- 图像处理神经网络python_深度学习使用Python进行卷积神经网络的图像分类教程
深度学习使用Python进行卷积神经网络的图像分类教程 好的,这次我将使用python编写如何使用卷积神经网络(CNN)进行图像分类.我希望你事先已经阅读并理解了卷积神经网络(CNN)的基本概念,这里 ...
- 卷积神经网络和图像分类识别
Andrew Kirillov 著 Conmajia 译 2019 年 1 月 15 日 原文发表于 CodeProject(2018 年 10 月 28 日). 中文版有小幅修改,已获作者本人授权. ...
- 【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——[附完整训练代码]
[神经网络与深度学习]CIFAR-10数据集介绍,并使用卷积神经网络训练模型--[附完整代码] 一.CIFAR-10数据集介绍 1.1 CIFAR-10数据集的内容 1.2 CIFAR-10数据集的结 ...
- pytorch1.7教程实验——迁移学习训练卷积神经网络进行图像分类
只是贴上跑通的代码以供参考学习 参考网址:迁移学习训练卷积神经网络进行图像分类 需要用到的数据集下载网址: https://download.pytorch.org/tutorial/hymenopt ...
- 轻松学Pytorch-使用卷积神经网络实现图像分类
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|人工智能与算法学习 大家好,本篇教程的贡献者来自社区投稿作 ...
- MTCNN-将多任务级联卷积神经网络用于人脸检测和对齐
论文链接: https://kpzhang93.github.io/MTCNN_face_detection_alignment/,本文是根据自己的理解翻译的如有错误,还请见谅,评论提出,立马修 ...
- Bag of Tricks for Image Classification with Convolutional Neural Networks(卷积神经网络在图像分类中的技巧)
来源:Tong He Zhi Zhang Hang Zhang Zhongyue Zhang Junyuan Xie Mu L Amazon Web Services fhtong,zhiz,hzaw ...
- 经典卷积神经网络(CNN)图像分类算法详解
本文原创,转载请引用 https://blog.csdn.net/dan_teng/article/details/87192430 CNN图像分类网络 一点废话:CNN网络主要特点是使用卷积层,这其 ...
- 在PyTorch中使用卷积神经网络建立图像分类模型
概述 在PyTorch中构建自己的卷积神经网络(CNN)的实践教程 我们将研究一个图像分类问题--CNN的一个经典和广泛使用的应用 我们将以实用的格式介绍深度学习概念 介绍 我被神经网络的力量和能力所 ...
- 将图卷积神经网络用于解码分子生成
©PaperWeekly 原创 · 作者|张玮玮 学校|东北大学硕士 研究方向|脑电情绪识别 论文标题: A Two-Step Graph Convolutional Decoder for Mole ...
最新文章
- python写电商网站框架,python-django框架-电商项目-商品模块开发_20191124
- oracle重做日志文件版本不一致问题处理
- html js不触发_图文详解鼠标事件CSS:hover和JS:mouseover的区别
- 祝贺本刊编委石勇教授入选2016年汤森路透全球高被引科学家
- apache开源项目_众筹开源笔记本电脑,新的Apache项目等
- java用正则表达式 编写简单词法分析器_500+ 精选 Java 面试题大放送
- 力压微信成 App Store 榜第一,子弹短信能否避免火一把就“死”?| 畅言
- 查看IIS进程所对应的应用程序池名称
- 苹果计算机系统是什么,苹果电脑系统和Win电脑系统有什么不同
- java单线程任务调度_一文详解Spring任务执行和调度(小结)
- UVC系列2-探索Android UVC协议
- 如何学习渗透测试:初学者教程
- 程序员修炼之道(一)
- cpp读取分数并进行求和化简
- C/C++ 如何判断闰年,对判断闰年条件的疑惑解答
- Rouge | 自动文摘及机器翻译评价指标
- [转]嵌入式Web服务器
- 转载:“只要3分钟,我就能扒光你的隐私!” | 互联网时代,14亿中国人都在裸奔|你的隐私已不是隐私
- js中settimeout的终止
- (Java)算法基础6:图/贪心算法(带模板上考场,模板一定滚瓜烂熟解决考场订制)