首页 飞桨领航团 帖子详情
【AI达人养成营】 学习笔记 -- momo -- _
收藏
快速回复
飞桨领航团 文章AI达人创造营 332 3
【AI达人养成营】 学习笔记 -- momo -- _
收藏
快速回复
飞桨领航团 文章AI达人创造营 332 3

-- by - momo --

Python计算基础及环境搭配搭建

Python编程基础

Python函数基础

Python面向对象

文件操作及常用模块使用

图像处理基本概念

图像分类基础

卷积神经网络基础:蝴蝶图像识别分类

图像分类竞赛全流程实战

模型部署

0
收藏
回复
全部评论(3)
时间顺序
momo3
#2 回复于2021-12

图像处理基本概念

1. 图像处理的概念与基本操作

像素:画面中最小的点

灰度值与光学三原色(RGB):红、绿、蓝(靛蓝)。光学三原色混合后,组成像素点的显示颜色,三原色同时相加为白色,白色属于无色系(黑白灰)中的一种。

分辨率=画面水平方向的像素值 * 画面垂直方向的像素值
屏幕分辨率
例如,屏幕分辨率是1024×768,也就是说设备屏幕的水平方向上有1024个像素点,垂直方向上有768个像素点。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样的。

例如,尺寸面积大小相同的两块屏幕,分辨率大小可以是不一样的,分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致,单个色块面积更小。而分辨率低的屏幕上像素点(色块)更少,单个像素面积更大,可以显示的画面就没那么细致。

图像分辨率
例如,一张图片分辨率是500x200,也就是说这张图片在屏幕上按1:1放大时,水平方向有500个像素点(色块),垂直方向有200个像素点(色块)。

在同一台设备上,图片分辨率越高,这张图片1:1放大时,图片面积越大;图片分辨率越低,这张图片1:1缩放时,图片面积越小。(可以理解为图片的像素点和屏幕的像素点是一个一个对应的)。

但是,在屏幕上把图片超过100%放大时,为什么图片上像素色块也变的越大,其实是设备通过算法对图像进行了像素补足,我们把图片放的很大后看到的一块一块的方格子,虽然理解为一个图像像素,但是其实是已经补充了很多个屏幕像素;同理,把图片小于100%缩小时,也是通过算法将图片像素进行减少。

常见图片格式:jpg、png、gif、psd、tiff、bmp等

使用OpenCV加载并保存图片
加载图片,显示图片,保存图片
OpenCV函数:cv2.imread(), cv2.imshow(), cv2.imwrite()

加载图片
使用cv2.imread()来读入一张图片:

参数1:图片的文件名

如果图片放在当前文件夹下,直接写文件名就行了,如'lena.jpg'
否则需要给出绝对路径,如'D:\OpenCVSamples\lena.jpg'
参数2:读入方式,省略即采用默认值

cv2.IMREAD_COLOR:彩色图,默认值(1)
cv2.IMREAD_GRAYSCALE:灰度图(0)
cv2.IMREAD_UNCHANGED:包含透明通道的彩色图(-1)

2. OpenCV库进阶操作

图像基本操作
学习ROI感兴趣区域,通道分离合并等基本操作。

ROI
ROI:Region of Interest,感兴趣区域。。

截取ROI非常简单,指定图片的范围即可

通道分割与合并
彩色图的BGR三个通道是可以分开单独访问的,也可以将单独的三个通道合并成一副图像。分别使用cv2.split()和cv2.merge()

# 创建一副图片
img = cv2.imread('lena.jpg')
In [ ]
# 通道分割
b, g, r = cv2.split(img)
In [ ]
# 通道合并
img = cv2.merge((b, g, r))
In [ ]
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
RGB_Image=cv2.merge([b,g,r])
RGB_Image = cv2.cvtColor(RGB_Image, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(12,12))
#显示各通道信息
print(RGB_Image.shape)
plt.subplot(141)
plt.imshow(RGB_Image,'gray')
plt.title('RGB_Image')
plt.subplot(142)
plt.imshow(r,'gray')
plt.title('R_Channel')
plt.subplot(143)
plt.imshow(g,'gray')
plt.title('G_Channel')
plt.subplot(144)
plt.imshow(b,'gray')
plt.title('B_Channel')

颜色空间转换
最常用的颜色空间转换如下:

RGB或BGR到灰度(COLOR_RGB2GRAY,COLOR_BGR2GRAY)
RGB或BGR到YcrCb(或YCC)(COLOR_RGB2YCrCb,COLOR_BGR2YCrCb)
RGB或BGR到HSV(COLOR_RGB2HSV,COLOR_BGR2HSV)
RGB或BGR到Luv(COLOR_RGB2Luv,COLOR_BGR2Luv)
灰度到RGB或BGR(COLOR_GRAY2RGB,COLOR_GRAY2BGR)

阈值分割
使用固定阈值、自适应阈值和Otsu阈值法"二值化"图像
OpenCV函数:cv2.threshold(), cv2.adaptiveThreshold()
固定阈值分割
固定阈值分割很直接,一句话说就是像素点值大于阈值变成一类值,小于阈值变成另一类值。

cv2.threshold()用来实现阈值分割,ret是return value缩写,代表当前的阈值。函数有4个参数:

参数1:要处理的原图,一般是灰度图
参数2:设定的阈值
参数3:最大阈值,一般为255
参数4:阈值的方式,主要有5种,详情:ThresholdTypes0: THRESH_BINARY  当前点值大于阈值时,取Maxval,也就是第四个参数,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4:THRESH_TOZERO_INV  当前点值大于阈值时,设置为0,否则不改变

# 应用5种不同的阈值方法
# THRESH_BINARY  当前点值大于阈值时,取Maxval,否则设置为0
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
ret, th2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
# THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
ret, th3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
# THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
ret, th4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
# THRESH_TOZERO_INV  当前点值大于阈值时,设置为0,否则不改变
ret, th5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

titles = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, th1, th2, th3, th4, th5]

小结
cv2.threshold()用来进行固定阈值分割。固定阈值不适用于光线不均匀的图片,所以用 cv2.adaptiveThreshold()进行自适应阈值分割。
二值化跟阈值分割并不等同。针对不同的图片,可以采用不同的阈值方法。

图像几何变换

实现旋转、平移和缩放图片
OpenCV函数:cv2.resize(), cv2.flip(), cv2.warpAffine()

绘图功能
绘制各种几何形状、添加文字
OpenCV函数:cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()

3. 图像分类任务概念导入

计算机视觉中的图像分类任务

对人类来说,识别猫和狗是件非常容易的事。但对计算机来说,即使是一个精通编程的高手,也很难轻松写出具有通用性的程序(比如:假设程序认为体型大的是狗,体型小的是猫,但由于拍摄角度不同,可能一张图片上猫占据的像素比狗还多)。
在早期的图像分类任务中,通常是先人工提取图像特征,再用机器学习算法对这些特征进行分类,分类的结果强依赖于特征提取方法,往往只有经验丰富的研究者才能完成。

Image Classification: 图像分类,用于识别图像中物体的类别(如:bottle、cup、cube)。
Object Localization: 目标检测,用于检测图像中每个物体的类别,并准确标出它们的位置。
Semantic Segmentation: 图像语义分割,用于标出图像中每个像素点所属的类别,属于同一类别的像素点用一个颜色标识。
Instance Segmentation: 实例分割,值得注意的是,目标检测任务只需要标注出物体位置,实例分割任务不仅要标注出物体位置,还需要标注出物体的外形轮廓。

0
回复
momo3
#3 回复于2021-12

图像分类基础

 

在机器学习中,感知机(perceptron)是二分类的线性分类模型,属于监督学习算法。输入为实例的特征向量,输出为实例的类别(取+1和-1)。

感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面,为求得超平面导入了基于误分类的损失函数,利用梯度下降法 对损失函数进行最优化(最优化)。

感知机的学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。

感知机由Rosenblatt于1957年提出的,是神经网络和支持向量机的基础。

引入必要的包
import paddle
print("本教程使用的paddle版本为:" + paddle.__version__)
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
num=100

#生成数据集x1,x2,y0/1
#随机生成100个x1
x1=np.random.normal(6,1,size=(num))
#随机生成100个x2
x2=np.random.normal(3,1,size=(num))
#生成100个y(全身不都是1哦)
y=np.ones(num)
#将生成好的点放入到一个分类中
class1=np.array([x1,x2,y])
class1.shape
#接下来生成第二类点,原理跟第一类一样
x1=np.random.normal(3,1,size=(num))
x2=np.random.normal(6,1,size=(num))
y=np.ones(num)*(-1)
class2=np.array([x1,x2,y])

#看一下生成点的样子
print(class1.shape)
print(class2.shape)

class1=class1.T
class2=class2.T
#再看一下生成点的样子
print(class1.shape)
print(class2.shape)

# 画图看一下
plt.scatter(class1[:,0],class1[:,1])
plt.scatter(class2[:,0],class2[:,1],marker='*')

#将两类数据都放到一个变量里面
all_data = np.concatenate((class1,class2))
print(all_data)

#将数据打乱
np.random.shuffle(all_data)
print(all_data)

开始训练:

# 定义一下要训练多少回合,这只鸡看起来就不太聪明咱们多训练一会
total_epoch = 50000
#构建训练过程
for i in range(total_epoch):
    #将数据给到定义好的linear感知“鸡”中,对就是要 赶 只 鸡
    y_predict = linear(x_data)
    #获取loss
    loss = mse_loss(y_predict, y_data)
    #反向传播
    loss.backward()
    sgd_optimizer.step()
    sgd_optimizer.clear_grad()
    #获取感知“鸡”中的w1
    w1_after_opt = linear.weight.numpy()[0].item()
    #获取感知“鸡”中的w2
    w2_after_opt = linear.weight.numpy()[1].item()
    #获取感知“鸡”中的b
    b_after_opt = linear.bias.numpy().item()
    #每1000次输出一次数据
    if i%1000 == 0:
        print("epoch {} loss {}".format(i, loss.numpy()))
        print("w1 after optimize: {}".format(w1_after_opt))
        print("w2 after optimize: {}".format(w2_after_opt))
        print("b after optimize: {}".format(b_after_opt))
print("finished training, loss {}".format(loss.numpy()))

 

绘制可视化图形

0
回复
momo3
#4 回复于2021-12

竞赛全流程实战
图像分类竞赛全流程工具
一、EDA(Exploratory Data Analysis)与数据预处理
二、Baseline选择
训练过程可视化
三、模型预测
流程总结
调参技巧
数据处理
模型训练
数据读取
模型预测

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户