Fancy PCA图像扩充总结(附代码)

Fancy PCA图像扩充总结(附代码)

论文链接:ImageNet Classification with Deep Convolutional Neural Networks

PCA原理参考:PCA (主成分分析)详解 (写给初学者)

示例代码:fancy_pca.py

几天前,老师叫我使用PCA(主成分分析)方法来做图像扩充的任务,在此之前对这方面基本不了解,故参考了上述链接的论文(4.1小节第三段)。论文中没有讲述PCA具体的原理,如果对PCA原理不太清楚的话,可以参考上述第二个链接。好了,下面开始步入正题。


为什么需要图像扩充?

当训练网络的训练集较少时,容易造成过拟合,所以常常通过图像扩充来生成更大的数据集,能够使得神经网络学习到更多的特征,进而从根本上提升网络的性能。

更多图像扩充的方法


Fancy PCA

通常图像具有RGB三个通道,例如一张256 * 256的彩色图像具有(256, 256, 3)的尺寸,每一个通道形成一组数据,将图像尺寸改成((256*256), 3),进而将图像转换成一个三维向量。然后对其执行PCA,得到一个3 * 3的协方差矩阵,通过该矩阵求得特征值与特征向量,特征值与特征向量按从大到小的顺序进行排序。计算公式如下:

其中[P1,P2,P3]表示特征向量,[λ1,λ2,λ3]表示特征值。在论文中α是一个服从均值为0,标准差为0.1的高斯分布。对于同一张图像,α = α1 = α2 = α3。上述公式得到的结果是一个尺寸为(3, 1)的向量,原图像的每个像素(R, G, B)都加上这个向量得到新的目标图像。

下面将通过跟随代码一步步理解Fancy PCA理解


1. 像素值归一化

opencv读到的图像像素值落在[0, 255]且为整数,在计算PCA之前我们需要将图像像素值进行归一化。

orig_img = img.astype(float).copy() # 复制原图像,为了方便最后像素相加
img = img / 255.0


2. 将归一化的图像转化成三维向量

按照RGB每一个通道作为一组数据,将RGB图像转化成一个三维向量。

img_rs = img.reshape(-1, 3)


3. 求协方差矩阵
# 样本矩阵中心化,即每一维度减去该维度的均值
img_centered = img_rs - np.mean(img_rs, axis=0)  

# 将新的样本矩阵乘上它的转置,然后除以(N - 1),N代表维度
# cov方法的功能就是通过样本矩阵求得协方差矩阵
img_cov = np.cov(img_centered, rowvar=False)


4. 求出特征值与特征向量

由于协方差矩阵的尺寸为[3 * 3],故特征向量的尺寸为[3 * 3],特征值的尺寸为[1 * 3]

# eig_vals: 特征值
# eig_vecs: 特征向量
# 每一列为一组
eig_vals, eig_vecs = np.linalg.eigh(img_cov)


5. 对特征值从大到小进行排序,并使特征向量与对应特征值的位置保持一致
# 求出特征值排序从大至小排序的序号
# eig_vals=[15, 12, 28]  -->  sort_perm=[2,0,1] 
sort_perm = eig_vals[::-1].argsort()

# 对特征值从大到小进行排序
eig_vals[::-1].sort()

# 特征向量与对应特征值的位置保持一致
eig_vecs = eig_vecs[:, sort_perm]


6. 将特征向量[P1, P2, P3]与公式中[α1λ1, α2λ2, α3λ3]相乘
# m1 --> [P1, P2, P3]
m1 = np.column_stack((eig_vecs))

# m2 --> [α1λ1, α2λ2, α3λ3]
# alpha_std --> 高斯分布的标准差,作为方法参数传进来
m2 = np.zeros((3, 1))
alpha = np.random.normal(0, alpha_std)
m2[;,0] = alpha * eig_vals[:]

# 将m1与m2进行矩阵相乘,得到add_vect
# add_vect即为最终加到原图像的每个像素点上的向量
add_vect = np.matmul(m1, m2)


7. 将add_vect加到原图像的每一个像素
# 像素值相加
for idx in range(3):
    orig_img[...,idx] += add_vect[idx]

# 对超出[0, 255]范围的像素值进行调整
# value < 0 --> value = 0
# value > 255 --> value = 255
# 0 <= value <= 255 --> 值不变  
orig_img = np.clip(orig_img, 0.0, 255.0)

# 对值取整
orig_img = orig_img.astype(np.uint8)

将最终得到的orig_img进行返回即可。


标准差参数alpha_std调整

在实现的过程中,按照论文将标准差设置为0.1时,发现得到的新图像与原图像几乎没有差异,于是将add_vect打印出来进行观察。

print(add_vect)

out:
[[ 0.01741496]
 [-0.01558548]
 [ 0.01257316]]


由于原图像的像素值在[0, 255]之间,而add_vect的值太小了,加上去后对原图像几乎没有什么影响,于是试着将alpha_std增大至100,观察效果如下。

所以我认为参数的具体值,应该根据自己的需求来进行调节。如果有人有调节出比较好的参数值,欢迎在评论区留言告诉我,谢谢!

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: “qt canpool fancy demo”在中文中意思是“使用Qt可以创建华丽的演示”。Qt是一个开源的跨平台应用程序开发框架,它提供了丰富的图形界面和功能库,可用于创建各种类型的应用程序,包括演示。 Qt Canpool Fancy Demo为开发者提供了一个用于展示Qt框架强大功能的例子。通过使用Qt的图形界面系统和图形渲染引擎,开发者可以创建出华丽的、吸引人的演示。这些演示可以包含各种特效、动画、渐变和其他视觉元素,以展示Qt的灵活性和多样性。 Qt Canpool Fancy Demo还可以展示Qt的多平台兼容性。Qt可以在多种操作系统上运行,包括Windows、macOS、Linux等等。这意味着您可以使用Qt来创建适用于不同平台的演示,以满足不同用户的需求。 此外,Qt Canpool Fancy Demo还可以展示Qt图形用户界面设计器的优势。Qt提供了一个可视化界面设计器,使开发者能够通过简单拖拽组件的方式进行界面设计。这个设计工具非常强大且易于使用,使得开发者可以在短时间内创建出华丽的演示。 总的来说,Qt Canpool Fancy Demo展示了Qt框架作为一个功能强大的应用程序开发工具的能力。无论是在图形界面设计、特效展示还是多平台兼容性方面,Qt都可以帮助开发者创建出华丽而且功能丰富的演示。 ### 回答2: Qt Canpool Fancy Demo是一个使用Qt框架开发的漂亮的演示程序。 该演示程序使用了Qt的图形界面和动画特效功能,展示了一些引人注目的特性。它有一个精致的用户界面,设计简洁而美观。用户可以通过演示程序中的按钮和菜单来进行各种操作。 Qt Canpool Fancy Demo演示了一些高级的图形特效,如淡入淡出、旋转和缩放。用户可以通过控制面板来调整这些特效的参数,使得演示效果更加个性化。同时,程序还展示了一些图形控件的使用方法,如按钮、滑动条和进度条等。 除了图形特效,Qt Canpool Fancy Demo还提供了一些实用的功能。例如,用户可以通过程序中的文件浏览器来选择和编辑文件,还可以通过网络浏览器来访问网站。这些功能增加了应用程序的实用性和趣味性。 通过Qt的跨平台特性,Qt Canpool Fancy Demo可以运行在多种操作系统上,如Windows、MacOS和Linux等。这使得用户可以在不同的设备上获得相同的优秀使用体验。 总体而言,Qt Canpool Fancy Demo是一个用Qt开发的令人赏心悦目的演示程序,融合了图形特效、实用功能和跨平台优势。无论是作为学习Qt开发的入门示例,还是用作参考和灵感的源泉,该演示程序都能够为用户带来很多乐趣和启发。 ### 回答3: Qt Canpool Fancy Demo是一个使用Qt框架编写的演示程序。这个演示程序采用了qtcanpool库来实现多线程并行计算的功能。 在这个演示中,通过多线程计算和并行处理,可以提高程序的计算效率和响应速度。当程序运行时,它会将计算任务分配给多个线程,每个线程会同时执行一部分任务,然后将结果汇总。 Qt Canpool Fancy Demo的界面设计精美,采用了Qt的图形界面库来创建演示程序的用户界面。用户可以通过演示程序的界面来输入计算任务的参数和数据,然后点击开始按钮来启动计算过程。 在计算过程中,演示程序会动态显示计算进度和计算结果。通过多线程并行计算,程序可以更快地完成计算任务,并将计算结果显示给用户。 此外,Qt Canpool Fancy Demo还提供了一些额外的功能,例如任务管理、线程调度和错误处理等。这些功能使得程序更加健壮和高效,用户可以更轻松地使用和控制程序的运行。 总之,Qt Canpool Fancy Demo是一个使用Qt框架开发的演示程序,通过多线程并行计算来提高计算效率和响应速度。它具有精美的界面设计和丰富的功能,非常适合用于演示和教学等用途。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值