日本血统二哈辽 發表於 2025-12-22 20:08:00

吴恩达深度学习课程四:计算机视觉 第三周:检测算法 (一)目标定位与特征点检测

<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>
课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第四课的第三周内容,3.1到3.2的内容。</p>
<hr>
<p>本周为第四课的第三周内容,这一课所有内容的中心只有一个:<strong>计算机视觉</strong>。应用在深度学习里,就是专门用来进行图学习的模型和技术,是在之前全连接基础上的“特化”,也是相关专业里的一个重要研究大类。<br>
<strong>这一整节课都存在大量需要反复理解的内容和机器学习、数学基础。</strong> 因此我会尽可能的补足基础,用比喻和实例来演示每个部分,从而帮助理解。<br>
第三周的内容将从<strong>图像分类</strong>进一步拓展到<strong>目标检测(Object Detection)</strong> 这一更具挑战性的计算机视觉任务。<br>
与分类任务只需回答“图中有什么”不同,目标检测需要同时解决“ <strong>有什么</strong>”以及“<strong>在什么位置</strong>”两个问题,因此在模型结构设计、训练方式和评价标准上都更为复杂。<br>
本篇的内容关于目标定位与特征点检测。</p>
<h1 id="1目标定位">1.目标定位</h1>
<p>这个标题想必不用解释,在原本的分类算法中,我们构建模型来识别输入的图像“”是什么“,而现在,我们想进一步进行定位,找到检测内容在图像中的位置。<br>
这并不是另起炉灶,而是在原本的分类基础上的进一步发展,因此在这部分,我们就来看看如何从”是什么“到”在什么位置“。</p>
<h2 id="11-图像分类的传播逻辑">1.1 图像分类的传播逻辑</h2>
<p>图像分类的逻辑对我们来说早就不陌生了,我们再简单梳理一遍,来看这样课程里这样一个例子:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251222200657746-1727850064.png" alt="image.png" loading="lazy"><br>
你会发现,在监督学习中,我们对每个样本都规定了它的”标准答案“。<br>
因此,网络才能在”传播——对比——改正“这样的循环中不断学习,最终实现分类。<br>
用通俗的话来说,这其中的一个关键点在于:<strong>模型并不知道汽车是什么,但是你通过标签告诉它:这是汽车。</strong><br>
而目标定位也是同样的逻辑:<strong>我们不仅要通过标签告诉模型什么是汽车,还要告诉它汽车在哪</strong>。</p>
<h2 id="12-从分类到定位">1.2 从分类到定位</h2>
<p>通过上一部分的了解,我们知道,要实现从分类到定位的逻辑,首先就要在标签中增加检测目标的位置信息。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251222200659358-1846109048.png" alt="image.png" loading="lazy"><br>
我们知道,在分类问题中,可以用标签 0 和 1 来表示二分类,用独热编码来表示多分类。<br>
但显然,表示目标在图像中的位置是一个更复杂,需要更多参数的问题。<br>
你可能会想,可不可以在标签中增加四个参数对,来表示检测目标的四角?<br>
这的确是一种方法,但实际上,我们使用的是<strong>另一种参数量更少且更普适的方法</strong>:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251222200658515-1899177316.png" alt="image.png" loading="lazy"><br>
再规范一下:<br>
在目标检测中,通常使用一个<strong>边界框(Bounding Box)</strong> 来描述目标在图像中的位置与大小。<br>
相比直接记录四个顶点坐标,更常见也更通用的做法是用<strong>中心点 + 宽高</strong>来表示:</p>
<ol>
<li><span class="math inline">\(b_x\)</span>:表示目标边界框<strong>中心点在水平方向上的位置</strong>,通常是相对于整张图像宽度的归一化坐标,取值范围为 <span class="math inline">\(\)</span>。</li>
<li><span class="math inline">\(b_y\)</span>:表示目标边界框<strong>中心点在垂直方向上的位置</strong>,同样是相对于图像高度归一化后的坐标。</li>
<li><span class="math inline">\(b_w\)</span>:表示目标边界框的<strong>宽度</strong>,一般以图像宽度为基准进行归一化,用来描述目标在水平方向上所占的比例。</li>
<li><span class="math inline">\(b_h\)</span>:表示目标边界框的<strong>高度</strong>,同样以图像高度为基准归一化,用来描述目标在垂直方向上所占的比例。</li>
</ol>
<p>通过这四个参数,模型不仅能够判断“<strong>是什么</strong>”,还可以同时给出“<strong>在什么位置、占多大范围</strong>”,从而完成最基本的目标定位任务。</p>
<h2 id="13-定位问题的完整样本标签">1.3 定位问题的完整样本标签</h2>
<p>了解了如何表示检测目标在图像中的位置信息后,继续延续上面的例子,来看看如何完整地表示一个样本的标签:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251222200658627-1495275469.png" alt="image.png" loading="lazy"></p>
<p>同样再次列举一下:<br>
在<strong>单目标检测</strong>的设定下,一个样本的标签通常由以下几部分组成:</p>
<ol>
<li><span class="math inline">\(p_c\)</span>:表示<strong>当前图像中是否存在需要检测的目标</strong>,这是一个二值变量,通常取值为 <span class="math inline">\(0\)</span> 或 <span class="math inline">\(1\)</span>。<br>
当 <span class="math inline">\(p_c = 1\)</span> 时,表示图像中确实存在目标,此时后续的位置信息和类别信息才是“有效”的;<br>
当 <span class="math inline">\(p_c = 0\)</span> 时,表示图像中不存在目标,<strong>其余参数通常被忽略或置为 0。</strong></li>
<li><span class="math inline">\(b_x,b_y,b_h,b_w\)</span> :表示检测目标的<strong>位置信息</strong>。</li>
<li><span class="math inline">\(c_n\)</span>:表示目标所属的<strong>类别信息</strong>。<br>
在二分类问题中,它可以是一个标量;<br>
在多分类问题中,通常采用<strong>独热编码</strong> 的形式,用一个向量来表示目标属于哪一类。</li>
</ol>
<p>因此,在单目标检测任务中,一个完整的标签可以被表示为:</p>
<p></p><div class="math display">\[y=(p_c,b_x,b_y,b_w,b_h,c_1,c_2,…,c_n)
\]</div><p></p><p>它同时包含了<strong>是否存在目标、目标的位置与尺度,以及目标的类别信息</strong>。</p>
<p>这样,我们就在数据层面上为目标检测问题完成了准备工作。<br>
为了逻辑的完整性,下一步网络如何学习目标检测的问题就放在下一篇来展开。<br>
下面我们简单拓展一下课程里提到的另一项应用:特征点检测。</p>
<h1 id="2特征点检测keypoint-detection">2.特征点检测(Keypoint Detection)</h1>
<p>在我们了解了如何对图像中的目标进行定位后,结合实际,你会发现在很多实际任务中,我们关注的目标并不是汽车、行人这类需要用边界框描述的宏观物体,而是一些<strong>更精细、更局部的结构</strong>,例如:</p>
<ul>
<li>人的眼角、瞳孔</li>
<li>人体的关节位置</li>
<li>笔尖的位置</li>
<li>面部轮廓上的关键点</li>
</ul>
<p>这类目标本身<strong>几乎不具备“面积”或“尺寸”概念</strong>,用一个边界框来描述反而显得冗余。<br>
在这种情况下,目标往往可以直接用<strong>一个二维坐标点</strong>来表示。</p>
<p>因此,与目标检测类似,我们同样可以通过<strong>人工标注关键点坐标</strong>,构建训练样本,让神经网络学习这个关键点是否存在,以及如果存在,它在图像中的具体位置。<br>
从建模角度看,特征点检测本质上是一个对连续坐标进行预测的<strong>回归问题</strong>。<br>
这种任务,就叫<strong>特征点检测(Keypoint Detection)</strong>。<br>
来看课程里这样一个例子:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251222200657530-300000923.png" alt="image.png" loading="lazy"><br>
我们可以通过检测得到的特征点做进一步应用,比如根据面部特征点分布判断人的表情,根据人的关节特征点位置预测人的动作等等。</p>
<h1 id="3总结">3.总结</h1>
<table>
<thead>
<tr>
<th>概念</th>
<th>原理</th>
<th>比喻</th>
</tr>
</thead>
<tbody>
<tr>
<td>图像分类</td>
<td>通过标签告诉模型“输入图像<strong>是什么</strong>”,模型在传播—对比—修正中学习从图像到类别的映射关系</td>
<td>像给学生一张照片,并直接告诉他:“这是汽车”</td>
</tr>
<tr>
<td>目标定位</td>
<td>在分类的基础上,进一步通过标签告诉模型目标<strong>在图像中的什么位置</strong></td>
<td>不仅说“这是汽车”,还用手指指出“汽车在这里”</td>
</tr>
<tr>
<td>边界框(Bounding Box)</td>
<td>用一个矩形区域描述目标的位置与大小,统一表示空间信息</td>
<td>在照片上用框把目标圈出来</td>
</tr>
<tr>
<td><span class="math inline">\(b_x, b_y\)</span></td>
<td>描述目标中心点在图像中的相对位置(归一化坐标)</td>
<td>用“地图坐标”标出目标的中心点</td>
</tr>
<tr>
<td><span class="math inline">\(b_w, b_h\)</span></td>
<td>描述目标在水平方向和垂直方向所占的比例</td>
<td>告诉别人这个框“有多宽、多高”</td>
</tr>
<tr>
<td>中心点 + 宽高表示法</td>
<td>相比四个角坐标,参数更少、形式更统一,便于网络学习</td>
<td>不报四个角地址,而是说“在市中心,方圆两公里”</td>
</tr>
<tr>
<td><span class="math inline">\(p_c\)</span>(目标存在性)</td>
<td>指示图像中是否存在需要检测的目标,决定后续标签是否有效</td>
<td>先确认“房间里有没有人”,再讨论他站在哪</td>
</tr>
<tr>
<td>类别向量 <span class="math inline">\(c_1,\dots,c_n\)</span></td>
<td>表示目标属于哪一类,可用标量或独热编码</td>
<td>给被圈出来的目标贴上“身份标签”</td>
</tr>
<tr>
<td>特征点检测</td>
<td>不用边界框,而是直接预测关键点的二维坐标</td>
<td>不给人画框,只标出“眼睛、关节、笔尖的位置”</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19384242
頁: [1]
查看完整版本: 吴恩达深度学习课程四:计算机视觉 第三周:检测算法 (一)目标定位与特征点检测