沐扬 發表於 2025-12-8 21:02:00

吴恩达深度学习课程四:计算机视觉 第一周:卷积基础知识(一)图像处理基础

<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>
课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第四课的第一周内容,1.1到1.3的内容。</p>
<hr>
<p>本周为第四课的第一周内容,这一课所有内容的中心只有一个:<strong>计算机视觉</strong>。应用在深度学习里,就是专门用来进行图学习的模型和技术,是在之前全连接基础上的“特化”,也是相关专业里的一个重要研究大类。<br>
<strong>这一整节课都存在大量需要反复理解的内容和机器学习、数学基础。</strong> 因此我会尽可能的补足基础,用比喻和实例来演示每个部分,从而帮助理解。<br>
本篇的内容关于计算机视觉的入门知识:<strong>数字图像处理</strong></p>
<h1 id="1-什么是计算机视觉">1. 什么是计算机视觉?</h1>
<p>简单来说,<strong>计算机视觉(Computer Vision,CV)就是让机器“看懂世界”</strong>。但“看懂”这件事,对人类来说像呼吸一样自然,对机器来说却非常不自然。<br>
先来说说<strong>计算机是怎么表示图片的?</strong><br>
你可以把一张图片想象成一张“巨型方格纸”。<br>
每一个小格子里都塞着一个数字,这个数字就是这个位置的亮度或颜色。</p>
<ol>
<li>
<p><strong>黑白图片:一个格子一个数字</strong><br>
黑白图最简单,每个像素只有一个值,用来表示亮度。<br>
举个比喻,就像一幅“像素点拼成的黑白油画”,每个点要么黑一些、灰一些、亮一些。<br>
<strong>电脑会把图片变成一个 <span class="math inline">\(M \times N\)</span> 的大表格,比如 <span class="math inline">\(28 \times 28\)</span>。</strong><br>
<strong>表格里每个数字范围通常是 <span class="math inline">\(0 \sim 255\)</span>,代表亮度从黑到白。</strong></p>
</li>
<li>
<p><strong>彩色图片:一个格子三个数字(RGB)</strong><br>
彩色图片就像每个像素藏着三个小灯泡:<br>
一个红灯(R)、一个绿灯(G)、一个蓝灯(B)。<br>
三个灯的亮度不同,拼起来就成了各种颜色。<br>
<strong>所以电脑会把一张彩色图片存成一个 <span class="math inline">\(M \times N \times 3\)</span> 的三维表格。</strong><br>
用比喻来说,就像把“彩色拼图”拆成三张透明胶片:<br>
第一张只画红色强弱、第二张画绿色、第三张画蓝色,然后叠起来。</p>
</li>
</ol>
<p>因此,无论人眼看到的图像有多逼真、多可爱,对计算机来说最终就是:“一个大表格(矩阵),里面每个格子写着一些 0~255 的数字。”<br>
<strong>举个例子</strong>,我们看一张猫的照片,大脑里有成千上万条“经验规则”,比如“圆圆的脑袋、尖尖耳朵、柔软身体、胡须”等等。<strong>孩子只要小时候见过几次,就大致能认出来</strong>。<br>
<strong>但机器没有这样的经验</strong>,它看到的只是一个庞大的网格,其中每个格子里一个或多个数字,意味着“这里的亮度是多少”。<br>
换句话说,对我们来说是一只猫,对计算机来说是一张堆满 <strong>0~255 的亮度数字</strong>的大<strong>表格</strong>。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208211939291-438643891.png" alt="2bbd1f89c1e815fbebe03d08f192d5c2" loading="lazy"><br>
而计算机视觉本质目的就是:<strong>把这些冷冰冰的数字,变成机器能理解的“形状、纹理、轮廓”等特征。</strong><br>
比如判断“这是猫还是狗”“有没有安全帽”“道路在哪”“有没有缺陷”等等。<br>
列举一下课程中提到的<strong>几个简单的应用领域</strong>:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205646618-277920281.png" alt="image.png" loading="lazy"><br>
在了解了 CV 是用来干什么的之后,那又如何实现上面所说的“让机器理解图像”呢?<br>
答案就是 CV 最常用的操作:<strong>卷积</strong>。</p>
<h1 id="2-全连接网络做错了什么">2. 全连接网络做错了什么?</h1>
<p>正式引入卷积之前,我们先看看,<strong>为什么我们在 CV 不再继续使用之前的的全连接网络?</strong></p>
<p>在上面我们里我们说过,<strong>图像在机器眼中,只是一张巨大无比的数字表格</strong>。那么如果我们把这张表像之前一样直接塞给之前学过的 <strong>全连接神经网络</strong> 会发生什么?</p>
<p><strong>从理论上讲,FC 确实能处理图像,但它会做两件非常“蠢”的事:</strong></p>
<ol>
<li><strong>它把图像当成一堆“孤立的数字”</strong></li>
</ol>
<p>比如一个 224×224 的图片,全连接层会把它拉成一个 <strong>50176 维的长向量</strong>。<br>
<strong>还记得我们之前在 FC 的的实践模型的正向传播中从没强调过的第一步是什么吗?</strong> 是这个:</p>
<pre><code class="language-python">x = self.flatten(x) # 展平
</code></pre>
<p>这一步是在干什么?来看看:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205456410-692006996.png" alt="image.png" loading="lazy"><br>
<strong>这就是展平的作用:为了符合 FC 的输入要求,它把多维矩阵压平成了一维向量。</strong><br>
但是这样就会出现一个问题:<br>
在它眼里: “左上角的像素”和“右下角的像素”之间<strong>没有任何关系</strong>,就是两个数字。<br>
<strong>但实际图像不是这样运作的。</strong><br>
我们用人类的直觉来打个比喻:<br>
就像你随便画个小人,你也知道“眼睛在脸上”“鼻子不会跑到耳朵底下”,但对于压平后的输入,<strong>全连接网络就不会认识到这一点。</strong><br>
<strong>因此,总结一下就是:图像是有空间结构的,而 FC 会破坏这种结构。</strong></p>
<ol start="2">
<li><strong>全连接网络的参数量会爆炸</strong></li>
</ol>
<p>一个 50176 → 1024 的全连接层,那他要维护参数量就是:</p>
<p></p><div class="math display">\[50176 \times 1024 \approx 5000 万
\]</div><p></p><p>这么恐怖的参数量,如果再多加几层,<strong>模型直接炸掉,硬件也跑不动</strong>。</p>
<p>所以总结一下,全连接网络在图像任务上犯的两个核心错误就是:</p>
<ol>
<li><strong>把图像“拍扁”了,破坏了空间关系</strong></li>
<li><strong>参数量巨大,训练困难、容易过拟合,硬件也带不动。</strong></li>
</ol>
<p><strong>如果说前一点是“脑子笨”,那么后一点就是“身体差”。</strong><br>
为了弥补这些问题,我们需要一种“天然就擅长看图”的方法,这个方法就是卷积。</p>
<h1 id="3-数字图像处理卷积convolution">3. 数字图像处理:卷积(Convolution)</h1>
<p>卷积是什么?一句话概括:<br>
<strong>卷积就是用一个小窗口在图像上“滑来滑去”,并在每个位置做一次加权求和。</strong><br>
这个“小窗口”我们称为卷积核(Filter 或 Kernel)。</p>
<p>你可以把它想象成一个<strong>小印章</strong>:<br>
(1)把印章盖在图像某一块<br>
(2)图像那块区域与印章“<strong>点对点相乘再加起来</strong>”<br>
(3)得到一个新的像素值<br>
(4)挪到下一格<br>
(5)重复</p>
<p>最终,整张图就变成了一张“新图”。<br>
这么说还是太抽象了,我们来做课程中的<strong>一个完整实例:边缘检测,实现下面这个效果:</strong><br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205442858-1471528388.png" alt="image.png" loading="lazy"></p>
<p>我们一步步演示一下这个过程:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205432729-657655169.png" alt="image.png" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205432753-718913658.png" alt="image.png" loading="lazy"><br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205608699-1136219672.png" alt="image.png" loading="lazy"></p>
<p><strong>这就是整个卷积计算的过程和边缘检测的原理。</strong><br>
根据竖直边缘检测的原理,很容易就可以得出水平边缘检测的过滤器:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205433471-1013391333.png" alt="image.png" loading="lazy"></p>
<p>现在,我们只要使用这样格式的过滤器对图像进行卷积操作,就可以检测图像的边缘。<br>
最后一部分,我们<strong>按课程内容再对过滤器进行一些拓展</strong>。</p>
<h1 id="4-过滤器与卷积核">4. 过滤器与卷积核</h1>
<p>上面我们已经看到,过滤器(卷积核)本质上就是一个“带着权重的印章”。<br>
但在不同的领域,它会有两个名字:</p>
<h2 id="41-过滤器">4.1 过滤器</h2>
<p>过滤器通常指 <strong>人工设计好的固定权重表</strong>,例如刚才做边缘检测用的竖直边缘过滤器:</p>
<p></p><div class="math display">\[\left[
\begin{array}{ccc}
1 &amp; 0 &amp; -1 \\
1 &amp; 0 &amp; -1 \\
1 &amp; 0 &amp; -1
\end{array}
\right]
\]</div><p></p><p>它不会变,就是死的、固定的,这种称呼常用于数字图像处理和信号处理中。<br>
除此之外,在边缘检测中,我们还有<strong>一些经过检验和优化后的经典过滤器</strong>。<br>
就像Adam相对于普通梯度下降一样,我们简单看一看:</p>
<h4 id="1-sobel-过滤器sobel-filter">(1) Sobel 过滤器(Sobel Filter)</h4>
<p>Sobel 是比上面的的“简单边缘检测过滤器”更常用、更平滑的一种。它在检测边缘的同时,也对邻域进行了轻度平滑,使得检测效果更稳定。<br>
它的竖直边缘检测过滤器为:</p>
<p></p><div class="math display">\[G_x =
\left[
\begin{array}{ccc}
1 &amp; 0 &amp; -1 \\
2 &amp; 0 &amp; -2 \\
1 &amp; 0 &amp; -1
\end{array}
\right]
\]</div><p></p><p>水平方向检测为:</p>
<p></p><div class="math display">\[G_y =
\left[
\begin{array}{ccc}
1 &amp; 2 &amp; 1 \\
0 &amp; 0 &amp; 0 \\
-1 &amp; -2 &amp; -1
\end{array}
\right]
\]</div><p></p><p>你会发现它和简单过滤器相比,中间那一列成了 <span class="math inline">\(2\)</span>,这样做的效果是:<br>
<strong>让过滤器更关注中心区域,使得边缘检测更稳定、更抗噪声。</strong></p>
<h4 id="2-scharr-过滤器scharr-filter">(2) Scharr 过滤器(Scharr Filter)</h4>
<p>Scharr 是 Sobel 的升级版,进一步增强了旋转一致性。<br>
简单说,它比 Sobel 更“均匀”,更能在各种角度下检测出稳定的边缘。<br>
它的竖直方向过滤器:</p>
<p></p><div class="math display">\[G_x =
\left[
\begin{array}{ccc}
3 &amp; 0 &amp; -3 \\
10 &amp; 0 &amp; -10 \\
3 &amp; 0 &amp; -3
\end{array}
\right]
\]</div><p></p><p>水平方向过滤器:</p>
<p></p><div class="math display">\[G_y =
\left[
\begin{array}{ccc}
3 &amp; 10 &amp; 3 \\
0 &amp; 0 &amp; 0 \\
-3 &amp; -10 &amp; -3
\end{array}
\right]
\]</div><p></p><p>你可以看到 <span class="math inline">\(10\)</span> 这个数字的出现,它相当于加强了方向性的权重。<br>
<strong>当你需要更精确、更抗噪声、角度更稳定的边缘检测时,用 Scharr。</strong><br>
最后来看看效果:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208205434410-1009636571.png" alt="myplot2222222222222.png" loading="lazy"><br>
肉眼乍一看可能看不出太大的区别,但是在细微之处确实有相应的不同。<br>
再来说说卷积核。</p>
<h2 id="42-卷积核kernel">4.2 卷积核(Kernel)</h2>
<p>在深度学习里,这些权值不是人工设置的,而是通过梯度下降 <strong>自动学习出来的</strong>。<br>
也就是说,每一组<span class="math inline">\(3\times 3\)</span> 或 <span class="math inline">\(5\times 5\)</span> 的权值,都像“模型在做作业时不断写、擦、修正笔记”,最终形成了能识别物体的特征模式,<strong>在深度学习领域的卷积神经网络里,我们称之为卷积核</strong>。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251208210128429-1538860209.png" alt="20251208204454984" loading="lazy"></p>
<p>这一篇主要是关于图像处理的一些基本知识,之后我们再慢慢展开在深度学习中卷积网络的结构和应用等详细内容。</p>
<h1 id="5总结">5.总结</h1>
<table>
<thead>
<tr>
<th>概念</th>
<th>原理</th>
<th>比喻</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>计算机视觉(CV)</strong></td>
<td>将图像从“像素表格”转换成模型能理解的结构化信息</td>
<td>像让一个从未见过世界的孩子学会“看懂照片”</td>
</tr>
<tr>
<td><strong>全连接网络处理图像的缺点</strong></td>
<td>① 展平破坏空间结构 ② 参数量巨大 <span class="math inline">\(50176\times1024\)</span></td>
<td>把一张风景拆成一串数字,就像把一幅画剪碎成纸屑很难拼回去</td>
</tr>
<tr>
<td><strong>卷积(Convolution)</strong></td>
<td>用卷积核在图上滑动,做“局部加权求和”,生成特征图</td>
<td>一个带图案的小印章不断盖在图像各处</td>
</tr>
<tr>
<td><strong>卷积核 / 过滤器</strong></td>
<td>正方形的的权值表,用来提取局部特征</td>
<td>换不同图案的印章,就能盖出不同风格的结果</td>
</tr>
<tr>
<td><strong>边缘检测滤波器(基础版)</strong></td>
<td>利用像 <span class="math inline">\([,,]\)</span> 这种结构检测垂直边缘</td>
<td>数字版“照妖镜”:亮暗对比越强,越容易显形</td>
</tr>
<tr>
<td><strong>Sobel 过滤器</strong></td>
<td>引入 <span class="math inline">\(2\)</span> 的加权,使边缘检测更平滑、更抗噪声</td>
<td>“加强版照妖镜”,能稳定看出对比度变化</td>
</tr>
<tr>
<td><strong>Scharr 过滤器</strong></td>
<td>引入 <span class="math inline">\(10\)</span> 加权,旋转一致性更好,比 Sobel 更精确</td>
<td>角度再变,它也能稳稳抓住“哪里变亮变暗”</td>
</tr>
<tr>
<td><strong>卷积核(深度学习版)</strong></td>
<td>权重由反向传播自动学习,不再人工设计</td>
<td>像孩子自己总结“看到耳朵尖尖+圆脑袋=猫”的规则</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19323640
頁: [1]
查看完整版本: 吴恩达深度学习课程四:计算机视觉 第一周:卷积基础知识(一)图像处理基础