• 主页
  • 归档
Articles Change The World About me

  • 主页
  • 归档

计算机视觉基础

2018-12-07

0x00 引言

   本文主要知识结构与素材摘自《基于深度学习的计算机视觉》[1]。
   计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。
   计算机视觉与机器视觉是很相近的词汇,计算机视觉主要是指使计算机获得视觉能力,而机器视觉所指更广泛一些,包括工业上使用的机器获得视觉能力,又比如机器人的视觉能力等。
   计算机视觉目前主要有两个研究维度,包括几何属性和语义感知。几何属性比较直观一些,而语义感知更加智能化,比如识别物体以及物体之间的位置关系等。其当前主要研究领域如下图所示:

0x01 图像数据处理

  要使计算机获得视觉能力,则首要的一步就是对图像进行处理,以获取最佳的素材图片。本节的研究内容概况如下图所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
1 图片存储原理
2 空域分析及变换(卷积/滤波)
3 频域分析及变换
3.1 傅里叶变换
3.2 小波变换
4 图像金字塔
4.1 高斯金字塔
4.2 拉普拉斯金字塔
5 模型匹配
6 特征数据操作
6.1 主成分分析/PCA
6.2 奇异值分解/SVD
6.3 聚类/Cluster

1、图片存储原理
  一张图的数字化显示方式有许多,目前常用的方法有:
    1)RGB颜色空间。即用三原色组合。
    2)CMY(K)颜色空间。用于打印机彩打。
    3)HSV/HSL(I)颜色空间。人类的视觉概念。H,色调;S,饱和度;V,明度;L,亮度。
    4)CIE-XYZ颜色空间。基于人类颜色视觉的直接测定。
    5)CIE-Lab颜色空间。接近人类视觉、致力于感知均匀性
  最主流的颜色空间即RGB颜色空间,在硬件上,会用到基于Bayer网格的颜色传感器。

2、空域分析及变换(卷积/滤波)
  卷积/滤波是在图像处理之前很重要的一个步骤,其核心思想就是对像素点附近的点根据权重做数学运算,如下图所示:

  很多人认为卷积就是滤波,两者并无区别,其实不然。两者在原理上相似,但是在实现的细节上存在一些区别[2]。
  卷积/滤波过程是对图片中所有像素点做变换,那么边界像素点的周围像素是不全的,那么就需要对图片做边界补充[3],具体的补充方法有补零、边界复制、镜像以及块复制。
  卷积/滤波的最终目的是对图像进行处理,所以根据卷积核数学操作的不同,可以对图片进行不同的操作[3],例如:
    1)平滑均值滤波/卷积(均值滤波)。该操作是为了抑制噪声,使图像亮度趋于平缓的处理方法就是图像平滑。图像平滑实际上是低通滤波,平滑过程会导致图像边缘模糊化。
    2)平滑中值滤波(中值滤波)。作用与均值滤波一样,比如用于去除椒盐噪声。
    3)平滑高斯滤波/卷积(高斯滤波)。高斯平滑水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重,相比于均值滤波而言,有着更好的平滑效果。
    4)梯度Prewitt滤波/卷积。对水平边缘或垂直边缘有比较好的检测效果。
    5)梯度Laplacian滤波/卷积。Laplacian也是一种锐化方法,同时也可以做边缘检测,而且边缘检测的应用中并不局限于水平方向或垂直方向

3、频域分析及变换
3.1、傅里叶变换
  傅里叶变换[4]想要表达的就是一个信号可以由足够多个不同频率和幅值的正余弦波组成。
  有了理论基础,接下来就是对图片进行二维傅里叶变换[5]。(理论不是很懂,现在有了神经网络之后,这种变换就很少用了,所以…)

4 图像金字塔
  图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部,以金字塔形状排列,往上是一系列像素(尺寸)逐渐降低的图像,一直到金字塔的顶部只包含一个像素点的图像,这就构成了传统意义上的图像金字塔[6]。
  一般情况下有两种类型的图像金字塔常常出现在文献和以及实际运用中。他们分别是高斯金字塔与拉普拉斯金字塔。两者的简要区别[7]:高斯金字塔采用下采样,而拉普拉斯金字塔则用来上采样重建一个图像。

4.1 高斯金字塔
  高斯金字塔能够用来捕捉不同尺寸的物体。之所以要采用高斯滤波加图像金字塔模式的原因是:其一在多次高斯卷积之后,一些像素是多余的,所以要做图像金字塔;其二如果不采用高斯滤波就直接降采样的话,会损失图片原有信息。具体操作过程看博文[7]。

4.2 拉普拉斯金字塔
  高斯金字塔会导致高频信息在下采样过程中丢失。而拉普拉斯金字塔采用上采样,能够保留所有层所丢失的高频信息,用于图像恢复

5 模板匹配
  模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。其作用是同尺度目标的检测(阴阳师辅助外挂里就用了这个,哈哈!)。
  模板匹配有六个方法[8],可以了解一下。

6 特征数据操作
6.3 聚类/Cluster
  目标是找出混合样本中内在的组群关系。其常用的方法有:
    1)Kmeans[9]
    2)EM算法
    3)Mean shift
    4)谱聚类
    5)层次聚类

0x02 图像特征及描述

  经过图像处理后的图片素材,接下来需要通过图像特征及描述来获取图片中的重要信息。本节内容是在神经网络流行之前计算机视觉常用的一些知识。本节的研究内容概况如下图所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1 颜色特征
1.1 直方图
1.2 量化颜色直方图
1.3 聚类颜色直方图
2 几何特征
2.1 边缘/Edge
2.2 兴趣点/关键点
2.3 Harris角点/Corner
2.4 斑点/Blob
3 局部特征
3.1 SIFT关键点
3.2 SURF关键点
4 纹理特征
4.1 方向梯度直方图/HOG
4.2 局部二值模式/LBP
4.3 滤波器组/Gabor

1 颜色特征
1.1 直方图
  没什么好讲的,就是数据统计用的直方图。

1.2 量化颜色直方图
  适用于均匀的颜色空间,比如RGB、HSV等,其属性坐标系如下图所示:

1.3 聚类颜色直方图
  适用于非均匀的颜色空间,例如Lab。操作过程需要先使用聚类算法(例如Kmeans)对所有像素点颜色向量进行聚类。

2 几何特征
2.1 边缘/Edge
  像素明显变化的区域,一般具有丰富的语义信息,该特征主要用于物体识别、几何与视角变换等。
  边缘提取操作过程为先高斯去噪,再使用一阶导数获取极值。先使用高斯去噪的原因是导数对噪声敏感。
  二维高斯函数如下所示:

hσ(u,v)=12πσ2e−u2+v22σ2

  其在x方向上的一阶导数可表示为:

hx(x,y)=∂h(x,y)∂x=−x2πσ4e−x2+y22σ2

  其在y方向上的一阶导数可表示为:

hy(x,y)=∂h(x,y)∂y=−y2πσ4e−x2+y22σ2

  上式中的变量σ即为标准差,该值越大,高斯函数的峰值越小,范围越宽,该变量对于边缘提取的尺度有影响。
  根据周围像素之间变化程度可以做出梯度向量,梯度(增加最快)的方向可以表示为:

arctan(hy(x,y)hx(x,y))

  梯度幅值/强度可以表示为:

hx(x,y)2+hy(x,y)2

  矢量的箭头方向表示梯度增加最快的方向,矢量的大小用箭头的长度表示,矢量可如下图表示:

  不同标准差的滤波捕捉到不同尺度的边缘。其变化可从下图看出:

2.2 兴趣点/关键点
  兴趣点/关键点是指稳定的局部特征点,其特点是可重复性与显著性,这类点能够抗图片变换,例如当图片的外貌变换(亮度、光照)以及几何变换(平移、选择、尺度)发生时,仍然能够捕捉到该点。
  兴趣点/关键点主要运用在图片配准/拼接、运动跟踪、物体识别、机器人导航以及3D重建。(ROS里的find_object功能包应该就用到了特征点检测)

2.3 Harris角点/Corner
  如果在任何方向上移动小观察窗,导致大的像素变动的点,肯定是一个角点,其原理如下图所示:

2.4 斑点/Blob
  斑点即一阶极值点或者说是二阶导数零点,这种点对噪声很敏感,需要先做高斯平滑。斑点检测通常也被称为兴趣点检测或者兴趣区域检测,即兴趣点经常指斑点。

3 局部特征
*3.1 SIFT关键点
  SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的。SIFT特征对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。
  SIFT算法的原理可见博文[10]。

3.1 SURF关键点
  SURF算法采用均值滤波与积分图像,其计算速度比SIFT快6倍,但是精度不如SIFT。

4 纹理特征
4.1 方向梯度直方图/HOG
  是一种对图像局部重叠区域的密集型描述符, 它通过计算局部区域的梯度方向直方图来构成特征。
  是具体计算过程看博文[11]。如果需要检测物体,还需要配合如SVM分类器。

4.2 局部二值模式/LBP
  LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。它是首先由T. Ojala, M.Pietikäinen, 和D. Harwood 在1994年提出,用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征。
  具体计算过程看博文[12]。如果需要检测物体,还需要配合如SVM分类器。

4.3 滤波器组/Gabor

0x03 引用文献

[1]http://www.chinahadoop.cn/course/916
[2]https://blog.csdn.net/haoji007/article/details/53911940
[3]https://www.cnblogs.com/xiaojianliu/p/9075872.html
[4]https://www.cnblogs.com/h2zZhou/p/8405717.html
[5]https://blog.csdn.net/thecentry/article/details/80709593
[6]https://www.cnblogs.com/jiahenhe2/p/7919356.html
[7]https://blog.csdn.net/xbcreal/article/details/52629465
[8]https://www.cnblogs.com/skyfsm/p/6884253.html
[9]https://www.cnblogs.com/bourneli/p/3645049.html
[10]https://blog.csdn.net/weixin_38404120/article/details/73740612
[11]https://www.cnblogs.com/zhazhiqiang/p/3595266.html
[12]https://blog.csdn.net/heli200482128/article/details/79204008

  • 视觉,入门

展开全文 >>

RBF神经网络

2018-12-04

0x00 引言

   Powell在1985年提出了多变量插值的径向基函数(RBF)方法;1988年,Broomhead和Lowe首先将RBF应用于自适应神经网络的设计中,从而构成了RBF神经网络;1990年,Poggi和Girosi发表两篇论文,将正则化理论应用于RBF神经网络。其特点是结构简单、训练简洁、学习收敛速度快、能够以任意精度逼近任意连续函数[1]。

0x01 RBF神经网络基本结构

   与BP神经网络类似,径向基神经网络是一种含三层神经元的前馈神经网络,分别是输入层、隐含层以及输出层,其基本结构如下图所示[2] :

  RBF网络的基本思想是:用RBF作为隐单元的“基”构成隐含层空间,这样就可以将输入矢量直接映射到隐空间,而不需要通过权连接。当RBF的中心点确定以后,这种映射关系也就确定了。而隐含层空间到输出空间的映射是线性的,即网络的输出是隐单元输出的线性加权和,此处的权即为网络可调参数。其中,隐含层的作用是把向量从低维度的p映射到高维度的h,这样低维度线性不可分的情况到高维度就可以变得线性可分了,主要就是核函数的思想。这样,网络由输入到输出的映射是非线性的,而网络输出对可调参数而言却又是线性的。网络的权就可由线性方程组直接解出,从而大大加快学习速度并避免局部极小问题。
   第一层:输入层。与BP神经网络输入层含义相同,为输入向量X。
   第二层:隐含层。网络中仅有的隐含层,作用是实现输入空间到隐含空间的非线性变换,这种变换是通过隐含节点的径向基函数实现的。该层即RBF与BP神经网络区别所在,与BP神经网络的激活函数(sigmoid函数)不同,RBF神经网络的激活函数一般取以下三种[1]:
    1)高斯函数:

φ(x)=exp(−xTxσ2)

    2)逆多二次函数:
φ(x)=1(xTx+σ2)12

    3)反射sigmoid函数:
φ(x)=(1+exp(xTxσ2))−1

  其中最常用的径向基函数是高斯核函数:
φ(x,ui)=exp(−|x−ui|22σi2),,,i=1,2,⋯,n

  式中,ui表示神经元i的核函数中心向量;σi表示核函数的宽度参数,控制核函数的径向作用范围。
  第三层:输出层。隐含层到输出层为线性映射:
y=∑i=1nwiφ(x,ui)+b

  式中,wi为权重,b为偏置。

0x01 RBF神经网络学习算法[3]

  在上一节中提到的高斯核函数为隐含层的网络结构如下图所示:

  学习算法的整个流程可以大致如下图:

  其算法过程具体描述为:
    1)利用K-means算法寻找核函数中心向量ui
    2)利用KNN计算核函数宽度参数σi
    3)利用最小二乘法求得权重wi
  (可以看到该过程让人一头雾水..)后来有人提出了lazy RBF,又称为固定法,即定义隐含单元的径向基函数的中心向量是固定值,具体过程可用下图表示:

0x03 引用文献

[1]神经网络控制与MATLAB仿真
[2]https://www.cnblogs.com/pinking/p/9349695.html
[3]https://blog.csdn.net/weiwei9363/article/details/72808496

  • 机器学习,神经网络,算法

展开全文 >>

Q-learning算法

2018-11-26

0x00 引言

   强化学习是机器学习的一个分支,目前应用比较广泛的强化学习方法有AHC、TD以及Q-learning、sarsa、H-learning、DQN等[1]。
  连接主义学习理论是心理学学习理论的一种,其将学习的方式分类为有监督学习、无监督学习和强化学习。
  监督学习是人工标记输出,并反馈修改神经网络权值的学习方法。无监督学习需要机器对给定的输入自行聚类。而强化学习则是机器主动做出试探动作,并根据环境的反馈来修改行为的学习方式。
  本文主要介绍在强化学习中使用最多的基础算法,即Q-learning。

0x01 Q-learning算法

  q-learning算法[2]包含两个最主要的概念,即状态S(state)和动作A(action),每次通过选择动作更新状态时,要同时按照图中的最优值函数Q计算公式更新Q表。其中参数α称为学习率,其决定这次的误差有多少是要被学习的, 且α是一个小于1 的数。γ为折扣率,是对未来 reward 的衰减值,值在[0,1]选择。

  在强化学习中,如果已经估计出最优值函数Q,则有三种动作选择方式[1]:贪婪动作选择策略(greedy)、ε-贪婪动作策略(ε-greedy)和softmax策略。第一种策略总是选择最高Q值的下步动作,第二种策略有ε的概率选择最高Q值,(1-ε)的概率任意选择动作,第三种策略根据各动作的Q值权重来选择动作。
  在了解基础的算法以后,分析一个实际问题[3],例子描述了如何利用q-learning来学习未知环境并训练agent。

0x02 实例分析

  现在分析一下莫烦视频[4]中的代码段,代码[5]可从github上获得。该例子的内容,是移动一个圆点,使其学会以最快的速度从左侧移动至右侧。

1
2
3
4
5
6
def build_q_table(n_states, actions):
table = pd.DataFrame(
np.zeros((n_states, len(actions))),
columns=actions,
)
return table

  函数build_q_table旨在新建一个6行2列的Q值表,行代表状态,列代表左右移动。

1
2
3
4
5
6
7
def choose_action(state, q_table):
state_actions = q_table.iloc[state, :]
if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()):
action_name = np.random.choice(ACTIONS)
else:
action_name = state_actions.idxmax()
return action_name

  该例子采用ε-greedy策略来选择动作,choose_action即根据ε值选择下一步的实际动作,有90%的机率选择最大的Q值动作,其余10%的机率随机选择其他动作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def get_env_feedback(S, A):
if A == 'right':
if S == N_STATES - 2:
S_ = 'terminal'
R = 1
else:
S_ = S + 1
R = 0
else:
R = 0
if S == 0:
S_ = S
else:
S_ = S - 1
return S_, R

  函数get_env_feedback的作用是假设按照已选择完成的动作行动,则下一状态的环境是否到达最左或最右,若是,则采取相应措施,若不是,则判断可安全执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def rl():
q_table = build_q_table(N_STATES, ACTIONS)
for episode in range(MAX_EPISODES):
step_counter = 0
S = 0
is_terminated = False
update_env(S, episode, step_counter)
while not is_terminated:

A = choose_action(S, q_table)
S_, R = get_env_feedback(S, A)
q_predict = q_table.loc[S, A]
if S_ != 'terminal':
q_target = R + GAMMA * q_table.iloc[S_, :].max()
else:
q_target = R
is_terminated = True

q_table.loc[S, A] += ALPHA * (q_target - q_predict)
S = S_

update_env(S, episode, step_counter+1)
step_counter += 1
return q_table

  函数update_env是在搭建环境,这里不赘述。函数rl则是执行函数,循环做选择动作、判断环境、更新Q表以及实际运行动作的过程。

0x03 引用文献

[1]强化学习方法及其应用研究
[2]https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-2-A-q-learning/
[3]http://mnemstudio.org/path-finding-q-learning-tutorial.htm
[4]https://www.bilibili.com/video/av16921335/?p=6
[5]https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/1_command_line_reinforcement_learning/treasure_on_right.py

  • 强化学习,算法

展开全文 >>

上一页1…151617181920下一页
© 2023 JailbreakFox by Hexo
本站总访问量次
  • Articles
  • Change The World
  • About me

tag:

  • 计算机基础
  • 计算机技术
  • Linux 工具
  • 视觉,应用, AI
  • 工具
  • 计算机技术,Linux
  • 内核
  • Linux 计算机技术
  • 计算机技术 Linux
  • 计算机技术,Linux内核
  • 机器学习,神经网络,算法
  • Linux
  • 机器人
  • pytorch,神经网络,机器学习
  • 强化学习,算法
  • 计算机技术 黑客技术
  • 工具, 信息聚合
  • 数据库
  • 计算机技术,编译工具
  • 食物 茶
  • 工具,流
  • 游戏设计,游戏AI,入门
  • 信息安全技术
  • 配置
  • 视觉,入门
  • 数字货币 区块链
  • 远程桌面, 工具
  • 计算机技术,打包工具
  • 技巧

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 卞神
致力于创造风靡全球的机器人

迈向CyberPunk的新世界
Never STOP!