简易机器学习笔记(七)计算机视觉基础 - 常用卷积核和简单的图片的处理

前言

这里实际上涉及到了挺多有关有关理论的东西,可以详细看一下paddle的官方文档。不过我这里不过多的谈有关理论的东西。

【低层视觉】低层视觉中常见的卷积核汇总

图像处理中常用的卷积核

在代码中,我们实际上是用不同的卷积核来造成不同的影响,我这里也是paddle中对于卷积核的几个比较简单的应用。

什么是卷积核?如果你不考虑卷积核的计算,可以简单的将卷积核理解成一个矩阵,这个矩阵维度的大小和取值的不同会导致卷积计算中对图像造成不同的影响。

实际上你也可以理解成通过卷积算子对图像进行了处理,而输出的参数矩阵也就是卷积核,卷积核会决定对图像的处理结果。卷积核对图像造成的影响可以参考上方常见卷积核汇总。

飞桨卷积算子对应的API是paddle.nn.Conv2D,用户可以直接调用API进行计算,也可以在此基础上修改。Conv2D名称中的“2D”表明卷积核是二维的,多用于处理图像数据。类似的,也有Conv3D可以用于处理视频数据(图像的序列)。

class paddle.nn.Conv2D (in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, padding_mode=‘zeros’, weight_attr=None, bias_attr=None, data_format=‘NCHW’)

常用参数如下

  1. in_channels(int) - 输入图像的通道数。
  2. out_channels(int) - 卷积核的个数,和输出特征图通道数相同
  3. kernel_size(int|list|tuple) - 卷积核大小,可以是整数,比如3,表示卷积核的高和宽均为3 ;或者是两个整数的list,例如[3,2],表示卷积核的高为3,宽为2.
  4. stride(int|list|tuple,可选) - 步长大小,可以是整数,默认值为1,表示垂直和水平滑动步幅均为1;或者是两个整数的list,例如[3,2],表示垂直滑动步幅为3,水平滑动步幅为2。
  5. padding(int|list|tuple|str,可选) - 填充大小,可以是整数,比如1,表示竖直和水平边界填充大小均为1;或者是两个整数的list,例如[2,1],表示竖直边界填充大小为2,水平边界填充大小为1。

卷积算子应用举例

简单的黑白边界检测

下面是使用Conv2D算子完成一个图像边界检测的任务。图像左边为光亮部分,右边为黑暗部分,需要检测出光亮跟黑暗的分界处。

这里是通过np生成了一个单独的照片,左边是白色,右边是黑色,然后我们通过一个简单的卷积算子来检测处光亮和黑暗的分界处。

设置宽度方向的卷积核为[1,0,-1],此卷积核会将宽度方向间隔为1的两个像素点的数值相减。当其像素值为0的时候画面为光亮部分,不为0的时候为黑暗部分。
在这里插入图片描述

当卷积核在图片上滑动时,如果它所覆盖的像素点位于亮度相同的区域,则左右间隔为1的两个像素点数值的差为0。

只有当卷积核覆盖的像素点有的处于光亮区域,有的处在黑暗区域时,左右间隔为1的两个点像素值的差才不为0。将此卷积核作用到图片上,输出特征图上只有对应黑白分界线的地方像素值才不为0。具体代码如下所示,结果输出在下方的图案中。

在这里插入图片描述
目标大概讲解完了,来简单看看代码

卷积核处理图像的流程大致如下:

  1. 创建初始化权重参数w,调整w的维度为[cout,cin,kh,kw]四维张量
  2. 创建卷积算子conv
  3. 输入图片,将图片转换成[N, C, H, W]的形式
  4. 将numpy.ndarray转化成paddle中的tensor
  5. 使用卷积算子作用在输入图片上
  6. 将输出tensor转化为numpy.ndarray
# 创建初始化权重参数w
w = np.array([1, 0, -1], dtype='float32')
# 将权重参数调整成维度为[cout, cin, kh, kw]的四维张量
w = w.reshape([1, 1, 1, 3])
# 创建卷积算子,设置输出通道数,卷积核大小,和初始化权重参数
# kernel_size = [1, 3]表示kh = 1, kw=3
# 创建卷积算子的时候,通过参数属性weight_attr指定参数初始化方式
# 这里的初始化方式时,从numpy.ndarray初始化卷积参数
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
       weight_attr=paddle.ParamAttr(
          initializer=Assign(value=w)))


# 创建输入图片,图片左边的像素点取值为1,右边的像素点取值为0
img = np.ones([50,50], dtype='float32')
img[:, 30:] = 0.

# 将图片形状调整为[N, C, H, W]的形式
x = img.reshape([1,1,50,50])

# 将numpy.ndarray转化成paddle中的tensor
x = paddle.to_tensor(x)

# 使用卷积算子作用在输入图片上
y = conv(x)
# 将输出tensor转化为numpy.ndarray
out = y.numpy()
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)
# 卷积算子Conv2D输出数据形状为[N, C, H, W]形式
# 此处N, C=1,输出数据形状为[1, 1, H, W],是4维数组
# 但是画图函数plt.imshow画灰度图时,只接受2维数组
# 通过numpy.squeeze函数将大小为1的维度消除
plt.imshow(out.squeeze(), cmap='gray')
plt.show()

图像中物体边缘检测

我这里没有paddle教程上的那张图,所以我自己找了一张图,这张图效果还不错:

在这里插入图片描述
这里实际上是用了 边缘增强卷积核 ,流程和上述的检测差不多,我们期望的结果如图所示:

在这里插入图片描述
和上述代码中最大的区别其实只有使用的卷积核不同,以及输入通道不同

使用的卷积核为
-1 -1 -1
-1 8 -1
-1 -1 -1

造成的影响将如图所示

实际代码:

整体流程和上述代码差距不大,流程还是上述的流程:

  1. 创建初始化权重参数w,调整w的维度为[cout,cin,kh,kw]四维张量
  2. 创建卷积算子conv
  3. 输入图片,将图片转换成[N, C, H, W]的形式
  4. 将numpy.ndarray转化成paddle中的tensor
  5. 使用卷积算子作用在输入图片上
  6. 将输出tensor转化为numpy.ndarray
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
img = Image.open('./work/images/section1/91137200db2fdeaad2c666342a4d653.jpg')

# 设置卷积核参数
w = np.array([[-1,-1,-1], [-1,8,-1], [-1,-1,-1]], dtype='float32')/8
w = w.reshape([1, 1, 3, 3])
# 由于输入通道数是3,将卷积核的形状从[1,1,3,3]调整为[1,3,3,3]
w = np.repeat(w, 3, axis=1)
# 创建卷积算子,输出通道数为1,卷积核大小为3x3,
# 并使用上面的设置好的数值作为卷积核权重的初始化参数
conv = Conv2D(in_channels=3, out_channels=1, kernel_size=[3, 3], 
            weight_attr=paddle.ParamAttr(
              initializer=Assign(value=w)))
    
# 将读入的图片转化为float32类型的numpy.ndarray
x = np.array(img).astype('float32')
# 图片读入成ndarry时,形状是[H, W, 3],
# 将通道这一维度调整到最前面
x = np.transpose(x, (2,0,1))
# 将数据形状调整为[N, C, H, W]格式
x = x.reshape(1, 3, img.height, img.width)
x = paddle.to_tensor(x)
y = conv(x)
out = y.numpy()
plt.figure(figsize=(20, 10))
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img)
f = plt.subplot(122)
f.set_title('output feature map', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()

图像均值模糊

到这里实际上图像均值模糊主要还是来源于卷积核的不同,到这里卷积核就从上面的
-1 -1 -1
-1 8 -1
-1 -1 -1

变成了一个10 x 10的 同样值的矩阵

比如
在这里插入图片描述
在这里插入图片描述

代码实现

# 另外一种比较常见的卷积核(5*5的卷积核中每个值均为1)是用当前像素跟它邻域内的像素取平均,这样可以使图像上噪声比较大的点变得更平滑,如下代码所示:

import paddle
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
# 读入图片并转成numpy.ndarray
# 换成灰度图
img = Image.open('./work/images/section1/91137200db2fdeaad2c666342a4d653.jpg').convert('L')
img = np.array(img)

# 创建初始化参数
w = np.ones([1, 1, 10, 10], dtype = 'float32')/25
print(w)
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[5, 5], 
        weight_attr=paddle.ParamAttr(
         initializer=Assign(value=w)))

x = img.astype('float32')

x = x.reshape(1,1,img.shape[0], img.shape[1])
x = paddle.to_tensor(x)
y = conv(x)
out = y.numpy()

plt.figure(figsize=(20, 12))
f = plt.subplot(121)
f.set_title('input image')
plt.imshow(img, cmap='gray')

f = plt.subplot(122)
f.set_title('output feature map')
out = out.squeeze()
plt.imshow(out, cmap='gray')

plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/291162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始搭建企业级前端项目模板(vue3+vite+ts)

文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本,项目安装eslint配置2.3 安装完成后,后面启动项目还缺少一些依赖,提前按需安装好 三,修改eslintrc.…

达梦数据:数字化时代,国产数据库第一股终于到来?

又是新的一年开始。回首一年前的此时,在大家千呼万唤地期待中,数据基础制度体系的纲领性文件正式发布。 时隔一年之后,数据资源入表如约而至。2024年1月1日《企业数据资源相关会计处理暂行规定》正式施行,各行各业海量数据巨大的…

隔离式双向DC-DC 转换器介绍

1.前言 由于电力电子、数字控制及电池技术的进步,促使再生能源、储能系统及新能源应用等产业的蓬勃发展。例如 : 电动汽车的电能系统、对电力系统用电进行削峰填谷和调节电力的储能系统、应急电源及可携式行动电源等。这些设备都需要双向电力转换系统在电力系统与电…

5G阅信助力互联网行业:XX出行-出票通知,案例分析

XX出行日常有大量业务通知短信下发,用户触达频次和用户打开率都比较高,但原短信无法带来附加营销增值,通过阅信增值服务消息将两者结合起来,可实现业务的多渠道引流,开拓了新的渠道和方式。 项目概述: 1. 项…

MATLAB基本绘图操作(二维和三维绘图)

MATLAB基本绘图操作 文章目录 MATLAB基本绘图操作1、二维平面绘图1.1、线条(折线图)1.2、条形图1.3、极坐标图1.4、散点图 2、三维立体绘图2.1、三维曲面图2.2、三维曲线图(点图) 3、图片分区(子图) 1、二维…

机器学习:贝叶斯估计在新闻分类任务中的应用(实验报告)

文章摘要 随着互联网的普及和发展,大量的新闻信息涌入我们的生活。然而,这些新闻信息的质量参差不齐,有些甚至包含虚假或误导性的内容。因此,对新闻进行有效的分类和筛选,以便用户能够快速获取真实、有价值的信息&…

如何把照片多余的地方擦除?一键消除图片上的瑕疵,简单又轻松,太方便了

在数字繁荣的时代,图片处理已然成为我们生活乐章中不可或缺的一部分,就如画师手中的画笔般灵动,摄影师镜头下的世界般多彩。然而,在捕捉或获取这些美丽的图片时,可能会不小心闯入一些不速之客,给画面带来瑕…

Linux Perf 介绍

文章目录 前言 二、安装Perf三、二级命令3.1 perf list3.2 perf record/report3.3 perf stat3.4 perf top 四、使用火焰图进行性能分析4.1 下载火焰图可视化生成器4.2 使用perf采集数据4.3 生成火焰图参考资料 前言 perf是一款Linux性能分析工具,内置在Linux内核的…

爬虫工具(tkinter+scrapy+pyinstaller)

需求介绍输入:关键字文件,每一行数据为一爬取单元。若一行存在多个and关系的关键字 ,则用|隔开处理:爬取访问6个网站的推送,获取推送内容的标题,发布时间,来源,正文第一段&#xff0…

自动化测试框架总结

1. 单元测试框架 几乎所有的主流语言,都会有其对应的单元测试框架,下面简单介绍一下python,java,C#三种语言的常见单元测试框架 1.1 Python python常见单元测试框架包括unittest, pytest 1.1.1 unittest unittest单元测试框架不仅可以适用于单元测试&#xff0c…

Windows重装升级Win11系统后 恢复Mysql数据

背景 因为之前电脑硬盘出现问题,换了盘重装了系统,项目的数据库全部没了,还好之前的Mysql是安装在的D盘里,还有留存文件 解决办法 1.设置环境变量 我的路径是 D:\SoftWare\Application\mysql-5.7.35-winx64 此电脑右键属性 …

auto关键字的含义以及常见用法,C++11中的关键字

一、auto关键字的含义: auto:这是 C11 引入的关键字,用于自动推断变量的类型; 二、auto关键字的常见用法: auto 关键字在 C 中用于自动推断变量的类型,它可以让编译器根据初始化表达式的类型推导出变量的…

Python 介绍和环境准备

一、概述 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的解释性编程语言。 Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式语言: 这意味着,您可以在一个 Python…

和鲸解放军总医院连续生理数据分析引擎入选爱分析数据智能最佳实践案例

近日,“2023 爱分析 数据智能最佳实践案例”评选活动落下帷幕,和鲸科技基于旗下数据科学协同平台 ModelWhale 携手解放军总医院联合打造的《解放军总医院连续生理数据分析引擎》成功入选,有力证明了该案例于数据资产归集、数据架构升级、数据…

UE5.1保存资源报错

UE5.1保存资源报错 错误: The asset /Game/XXX(XXX.uasset) failed to save. Cancel: Stop saving all assets and return to the editor. Retry: Attempt to save the asset again. Continue: Skip saving this asset only. 解决: 1. 可能是进程中有多开的项目&…

iOS 组件开发教程——手把手轻松实现灵动岛

1、先在项目里创建一个Widget Target 2、一定要勾选 Include live Activity,然后输入名称,点击完成既可。 3、在 Info.plist 文件中声明开启,打开 Info.plist 文件添加 NSSupportsLiveActivities,并将其布尔值设置为 YES。 4、我…

Spark内核解析-脚本解析2(六)

2、脚本解析 在看源码之前,我们一般会看相关脚本了解其初始化信息以及Bootstrap类,Spark也不例外,而Spark中相关的脚本如下: %SPARK_HOME%/sbin/start-master.sh %SPARK_HOME%/sbin/start-slaves.sh %SPARK_HOME%/sbin/start-all…

freeRTOS——事件标志组知识总结及实战

1事件标志组概念 事件标志组:是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。 其特点: 1)它的每一个位表示一个事件(高8位不算) 2)每一位事件的含义,…

Spark内核解析-节点启动4(六)

1、Master节点启动 Master作为Endpoint的具体实例,下面我们介绍一下Master启动以及OnStart指令后的相关工作 1.1脚本概览 下面是一个举例: /opt/jdk1.7.0_79/bin/java -cp /opt/spark-2.1.0/conf/:/opt/spark-2.1.0/jars/*:/opt/hadoop-2.6.4/etc/ha…

UI5与后端的文件交互(四)

文章目录 前言一、后端开发1. 新建管理模板表格2. 新建Function,动态创建文档 二、修改UI5项目1.Table里添加下载证明列2. 实现onClickDown事件 三、测试四、附 前言 这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行交互。 这篇的主要内容有&…
最新文章