人工智能协会纳新培训第七周
心得+延伸内容参考+作业
经过第七周的浅析深度学习培训以及对《 深度学习与图像识别:原理与实践》一书的部分章节初步阅读,我对深度学习和神经网络有了一个初步认知,形成了一个大概的基础框架,下面将对本周任务的完成进行记录并整理本周相关知识点。
任务目标一.
请将作业文件夹中的数据集扩充十倍(至少使用8种方式扩展)并将扩充后的数据集以及相关源码打包成zip上传至课堂派。
参考:图片预处理-keras中文文档注:
(https://keras-cn.readthedocs.io/en/latest/preprocessing/image/)
使用其他方式也行
经过几周下来的培训,学习了一些关于一些图像增强的操作
下面是相关操作及函数实现
1. dst = cv.blur(image, (1, 15)) #均值模糊 去随机噪声有很好的去燥效果(1, 15)是垂直方向模糊,(15, 1)还水平方向模糊
2. dst = cv.medianBlur(image, 5) # 中值模糊 对椒盐噪声有很好的去燥效果
3. dst = cv.GaussianBlur(image, (15, 15), 0) # 高斯模糊
4. dst = cv.bilateralFilter(image, 0, 100, 15) #双边滤波
5. dst = cv.pyrMeanShiftFiltering(image, 10, 50) #均值迁移
原始图片
下面将对原始图片进行操作并记录方便比对
均值模糊
也称为均值滤波,相当于卷积核的矩阵值全部为1/(卷积SIZE)
import cv2
from PIL import Image
import numpy
import numpy as np
for i in range(1,3):
img = Image.open("D:\\15\\{}.jpg".format(i))
img2 = cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)
dst = cv2.blur(img2, (1, 15))
img2 = Image.fromarray(dst)
img2.save("D:\\junzhi\\{}.png".format(i))
中值模糊
它是非线性滤波器,它是取领域的中值作为当前点的灰度值。处理有椒盐噪声(就像烧烤撒很多孜然,图片上有很多点)有很好的效果,实际应用较多。
import cv2
from PIL import Image
import numpy
import numpy as np
for i in range(1,3):
img = Image.open("D:\\15\\{}.jpg".format(i))
img2 = cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)
dst = cv2.medianBlur(img2, 5)
img2 = Image.fromarray(dst)
img2.save("D:\\zhongzhi\\{}.png".format(i))
高斯模糊
高斯模糊和均值模糊其原理上的唯一区别只是在于卷积核的值不同罢了,高斯卷积核矩阵值服从二维高斯函数,也就是说一个图像与服从二维高斯分布的函数做卷积,由于高斯函数是连续的,所有yaoj要将二维高斯函数进行采样和离散化,最后得到服从高斯函数规律的卷积核矩阵。
import cv2
from PIL import Image
import numpy
import numpy as np
for i in range(1,3):
img = Image.open("D:\\15\\{}.jpg".format(i))
img2 = cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)
dst = cv2.GaussianBlur(img2, (15, 15), 0)
img2 = Image.fromarray(dst)
img2.save("D:\\gaosi\\{}.png".format(i))
双边滤波
是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,即能够去除噪声,又能进行边缘保护。
import cv2
from PIL import Image
import numpy
import numpy as np
for i in range(1,3):
img = Image.open("D:\\15\\{}.jpg".format(i))
img2 = cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)
dst = cv2.bilateralFilter(img2, 0, 100, 15)
img2 = Image.fromarray(dst)
img2.save("D:\\shuangbian\\{}.png".format(i))
均值迁移
均值迁移模糊是图像边缘保留滤波算法中的一种,经常用来在对图像进行分水岭分割之前去噪声,可以大幅度提高分水岭分割的效果。
import cv2
from PIL import Image
import numpy
import numpy as np
for i in range(1,3):
img = Image.open("D:\\15\\{}.jpg".format(i))
img2 = cv2.cvtColor(np.array(img),cv2.COLOR_RGB2BGR)
dst = cv2.pyrMeanShiftFiltering(img2, 10, 50)
img2 = Image.fromarray(dst)
img2.save("D:\\qianyi\\{}.png".format(i))
自定义模糊(锐化)
锐化就是突出图像细节或者增强图像被模糊的地方,锐化原理就是细节增强,图像的导数就是图像的细节,随着导数阶数升高,能代表的东西也不同。 (
import cv2 as cv
import numpy as np
def average(image):
new=np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]],np.float32)
scr2=cv.filter2D(image,-1,new)
cv.imshow("rui hua",scr2)
image1=cv.imread("D://4.jpg")
cv.imshow("yuantu",image1)
average(image1)
cv.waitKey(0)
cv.destroyAllWindows()
以上的功能也可以叠加使用
import cv2 as cv
#调用opencv-python库
def tuxiangzengqiang(image,a):
if a == 1:
dst = cv.blur(image, (1, 15))
elif a==2:
dst = cv.medianBlur(image, 5)
elif a ==3:
dst = cv.GaussianBlur(image, (15, 15), 0)
elif a == 4:
dst = cv.bilateralFilter(image, 0, 100, 15)
elif a == 5:
dst = cv.pyrMeanShiftFiltering(image, 10, 50)
elif a == 6:
dst = cv.blur(image, (1, 15))
dst = cv.bilateralFilter(dst, 0, 100, 15)
dst = cv.pyrMeanShiftFiltering(dst, 10, 50)
elif a == 7:
dst = cv.medianBlur(image, 5)
dst = cv.bilateralFilter(dst, 0, 100, 15)
dst = cv.pyrMeanShiftFiltering(dst, 10, 50)
elif a == 8:
dst = cv.GaussianBlur(image, (15, 15), 0)
dst = cv.bilateralFilter(dst, 0, 100, 15)
dst = cv.pyrMeanShiftFiltering(dst, 10, 50)
return dst
t = cv.imread("2.jpg")
#阅读图像
cv.imshow("yuantu",t)
#说明:
#tuxiangzengqiang(t,a)
#a = 1时,进行均值模糊
#a = 2时,进行中值模糊
#a = 3时,进行高斯模糊
#a = 4时,做一个双边滤波(强化边缘)
#a = 5时,做均值迁移,有效的提升图像的关联性
#a = 6,是功能145的结合
#a = 7,是功能245的结合
#a = 8,是功能345的结合
x = tuxiangzengqiang(t,8)
cv.imshow("jieguo",x)
#显示结果
cv.waitKey(0)
高通过滤/滤波(边缘检测/高反差保留)
import cv2
img=cv2.imread('15.jpg',cv2.IMREAD_COLOR)
x=cv2.Sobel(img,cv2.CV_16S,1,0)
y=cv2.Sobel(img,cv2.CV_16S,0,1)
absx=cv2.convertScaleAbs(x)
absy=cv2.convertScaleAbs(y)
dist=cv2.addWeighted(absx,0.5,absy,0.5,0)
cv2.imshow('original_img',img)
cv2.imshow('y',absy)
cv2.imshow('x',absx)
cv2.imshow('dsit',dist)
cv2.waitKey(0)
cv2.destroyAllWindows()
通道分离重组
from PIL import Image
import matplotlib.pyplot as plt
img=Image.open("D://4.jpg") #打开图像
r,g,b=img.split() #分离三通道
pic=Image.merge('RGB',(g,b,r)) #合并三通道
plt.title('chongzu')
plt.imshow(pic),plt.axis('off')
plt.show()
本次作业中碰到的问题整理
1第一次遍历30张图片时只能得到29张结果
原因分析
for i in range(1,5):
print i
1
2
3
4
我们在这里所做的是提供两个数字,range返回一个从第一个数字到第二个数字的一个数字序列。例如,range(1,5)给出序列[1, 2, 3, 4]。默认情况下,range 步距取为1。如果我们提供第三个数字,range那么它变成了步距。例如range(1,5,2)得到[1,3]。
for循环然后遍历这个范围,for i in range(1,5)相当于 for i in [1, 2, 3, 4],这就像把序列中的每一个数(或对象)分配给i,一次一个,然后为每个i值执行该语句块。
所以正确的应该是1~31而不是30
2pylab.imread和PIL.Image.open读入的都是RBG顺序,而cv2.imread读入的是BGR顺序,混合使用的时候要特备注意
深度学习知识整理
本周主要学习了以下四个内容
深度学习的整体流程
深度学习的三大要素
神经网络的超参数
神经网络的激活函数
深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。
深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解释有很大的帮助。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。 深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远超过先前相关技术。(摘自百度)
关于训练
训练的关键:
在输入数据做迭代训练时的关键要关注模型在训练集(绿线)和验证集(紫线)所画出的误差曲线之间关系(或准确度曲线,曲线任选其一,误差越小越好或准确度越高越好)
欠拟合及应对方法:
如果训练集和验证集的误差均较高,则说明训练还不够,处于模型欠拟合状态,需要继续迭代训练,当然如果迭代多久都无法降低误差,则考虑所用的模型是否太小了,导致模型学不到东西。
过拟合及应对方法:
如果训练集和验证集的两者之间的误差差别较大,训练集的误差较低(训练集的误差永远是越来越低的,因为模型就是在不断拟合训练集的),而验证集的误差相对较高,则模型已经处于过拟合状态了。因为模型已经训练的过头,倾向于死记硬背的记住训练集,不再具有泛化性,而在验证集上的表现就很差。此时可以考虑用正则化的方法,如L1正则化或L2正则化,也可以使用Dropout(随机丢弃神经元的)的方法,防止过拟合。
最佳拟合:
当然,欠拟合和过拟合的中间状态就是刚好拟合,是最佳的训练效果,这里用到的方法叫做Early Stopping,就是当你的验证集的误差曲线不断降低,但是验证集的误差开始有向上反弹的趋势时就可以停止训练的迭代了,此时模型的参数就是拟合的较好的情况。
深度学习的三大要数
一、数据的干净程度
二、网络结构
三、损失函数
一
通过数据集的预处理来达到相关目的
增强数据的多样性,从而增强模型的鲁棒性。
旋转 裁剪 平移 模糊 加噪等操作
二
全连接层、卷积层、池化层
(具体内容与具象化表达记录与前几次博客中)
Dropout层
一种重要的正则化手段,可以降低网络过拟合的风险
此外还有
LeNet 1998、AlexNet 2012、VGGNet 2014、Network In Network 2014、GoogLeNet V1 2014
GoogLeNet V3 2015、GoogLeNet V3 2015、DenseNet 2017
三
Sigmoid Cross Entropy Loss
(1)注意数值计算的溢出问题;
(2)通常用于二分类问题;
(2)适用于相互不独立的一对多问题
Softmax Loss
面向更多的K分类类间独立问题,网络有K个输出。
L1 / L2 Loss
通常适用于回归问题:
(1)L2 Loss中,之所以除以2N,只是为了在求导时比较方便而已;
(2)L1 和 L2哪个更好用一点,更多的时候真的要看经验;
(3)通常在L1 和 L2 Loss之前都会对输入做归一化(常用单位方差归一化),以防止数值溢出和Loss动荡
神经网络的超参数
学习率Learning rate
学习率设置
在训练过程中,一般根据训练轮数设置动态变化的学习率。
刚开始训练时:学习率以 0.01 ~ 0.001 为宜。
一定轮数过后:逐渐减缓。
接近训练结束:学习速率的衰减应该在100倍以上。
曲线 初始时 上扬 [红线]:
初始 学习率过大 导致 振荡,应减小学习率,并 从头 开始训练 。
曲线 初始时 强势下降 没多久 归于水平 [紫线]:
后期 学习率过大 导致 无法拟合,应减小学习率,并 重新训练 后几轮 。
曲线 全程缓慢 [黄线]:
初始 学习率过小 导致 收敛慢,应增大学习率,并 从头 开始训练 。
神经网络的激活函数
激活函数不是真的要去激活什么。在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。
此处具体内容可参考https://www.cnblogs.com/rgvb178/p/6055213.html