前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >计算机视觉:7.1 卷积神经网络

计算机视觉:7.1 卷积神经网络

作者头像
DioxideCN
发布2022-08-05 18:51:28
7820
发布2022-08-05 18:51:28
举报

卷积神经网络

7.1 卷积操作 图片卷积 图像卷积就是卷积核在图像上按行滑动遍历像素时不断地相乘求和的过程。 原图 Image:

Pasted image 20220710101744
Pasted image 20220710101744

步长

步长就是卷积核在图像上移动的步幅。在上一个例子中,卷积核每次移动一个像素步长的结果,如果将这个步长修改为2个像素,结果又不一样。 为了充分扫描图片,步长一般设置为1

Pasted image 20220710101802
Pasted image 20220710101802

padding

从上面的例子中我们发现,卷积之后图片的长宽会变小。如果要保持图片大小不变,我们需要在图片周围填充0,padding指的就是填充的0的圈数

Pasted image 20220710101951
Pasted image 20220710101951

我们可以通过公式计算出需要填充的0的圈数:

例题: 现给定一张28x28的图片,卷积核大小为5x5,步长为1,padding为0,计算一次卷积后得到的图片大小? 解:

∴ 一次卷积后得到的图片大小为 24x24

综上:

  1. 3x3的卷积核若没有padding,则一次卷积后的图片宽高均 -2
  2. 5x5的卷积核若没有padding,则一次卷积后的图片宽高均 -4
  3. 7x7的卷积核若没有padding,则一次卷积后的图片宽高均 -6

如果要保持卷积之后图片大小不变,可以得出等式:

(N+2∗P−F+1)=N

从而可以推导出:

P={F-1 \over 2}

综上:

  1. 3x3的卷积核需要补1圈0
  2. 5x5的卷积核需要补2圈0
  3. 7x7的卷积核需要补3圈0
Pasted image 20220710110231
Pasted image 20220710110231

卷积核的大小

图片卷积中,卷积核一般为奇数,比如 3x3 5x5 7x7 为什么选用奇数卷积核,需要从以下两个方面进行考虑:

  1. 根据上述padding的计算公式,如果要保持图片大小不变,采用偶数卷积核的话会出现填充1.5层零圈的情况。
  2. 奇数维度的过滤器有中心点,便于指出过滤器的位置,即OpenCV卷积中的锚点。

卷积案例

  • filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
    • ddepth:卷积之后图片的位深,即卷积之后图片的数据类型,一般为-1,表示核原图类型保持一致;
    • kernel:卷积核大小,用元组或ndarray表示,要求数据类型必须是float类型;
    • anchor:锚点,即卷积核的中心点,是可选参数,默认为(-1, -1);
    • delta:可选参数,表示卷积之后额外加的一个值,相当于线性方程中的偏差,默认为0;
    • borderType:边界类型,一般不设置;
代码语言:javascript
复制
# OpenCV图像卷积操作
import cv2
import numpy as np

img = cv2.imread('./dog.jpg')

# kernel必须是float类型
# 相当于原始图片中的每个点都被平均了一次,所以图片变模糊了
kernel = np.ones((5, 5), np.float32) / 25

# 2D卷积
dst = cv2.filter2D(img, -1, kernel)

cv2.imshow('2Dfilter', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()
Pasted image 20220710111205
Pasted image 20220710111205

使用不同的卷积核提取不同的特征:

  1. 轮廓卷积
代码语言:javascript
复制
# 轮廓卷积
import cv2
import numpy as np

img = cv2.imread('./dog.jpg')

kernel = np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])

dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('2Dfilter', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()
Pasted image 20220710111501
Pasted image 20220710111501
  1. 浮雕卷积
代码语言:javascript
复制
# 浮雕卷积
import cv2
import numpy as np

img = cv2.imread('./dog.jpg')

kernel = np.array([[-2,1,0],[-1,1,1],[0,1,2]])

dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('2Dfilter', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()
Pasted image 20220710111620
Pasted image 20220710111620
  1. 锐化卷积
代码语言:javascript
复制
# 锐化卷积
import cv2
import numpy as np

img = cv2.imread('./dog.jpg')

kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])

dst = cv2.filter2D(img, -1, kernel)
cv2.imshow('2Dfilter', np.hstack((img, dst)))

cv2.waitKey(0)
cv2.destroyAllWindows()
Pasted image 20220710111721
Pasted image 20220710111721
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 卷积神经网络
    • 步长
      • padding
        • 卷积核的大小
          • 卷积案例
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档