诸神之战 發表於 2025-12-26 10:55:00

吴恩达深度学习课程四:计算机视觉 第三周:检测算法 课后习题和代码实践

<p>此分类用于记录吴恩达深度学习课程的学习笔记,目前已完结,点击进入全集目录<br>
课程相关信息链接如下:</p>
<ol>
<li>原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai</li>
<li>github课程资料,含课件与笔记:吴恩达深度学习教学资料</li>
<li>课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案</li>
</ol>
<p>本篇为第四课第三周的课后习题和代码实践部分。</p>
<hr>
<h1 id="1理论习题">1.理论习题</h1>
<p>【中英】【吴恩达课后测验】Course 4 -卷积神经网络 - 第三周测验<br>
习题都较为简单,就不再多说了,还是把重点放在下面的演示部分。</p>
<h1 id="2代码实践">2.代码实践</h1>
<p>YOLO车辆识别实战<br>
同样先摆上这位博主的链接,在这周的编程作业中,这位博主手动构建了YOLO网络及其各个组件,非常详细,但同样因为 Keras 如今已经被 TF 的集成,如果要进行相应实践,需要调整相应的导库代码和一些方法的调用。</p>
<p>我们仍然使用较成熟的框架来演示一下 YOLO 算法,只是这次我们既不用 PyTorch ,也不用TF。<br>
<strong>我们这次要使用的库叫做 ultralytics,是 YOLO 官方团队维护的 Python 包。</strong><br>
无论是使用 YOLO 进行学术实验,还是竞赛打榜,ultralytics 都被广泛使用,如果说 PyTorch 和 TF 提供的是造模型的积木,那么 ultralytics 就是针对 YOLO 算法的专精机器。<br>
你可以直接通过 pip 安装这个包:</p>
<pre><code class="language-python">pip install ultralytics
</code></pre>
<p>ultralytics 毕竟是一个首次使用的全新库,因此,本篇我会使用一个极小的 demo 数据集,主要演示一下 ultralytics 的使用流程。</p>
<h2 id="21-demo-数据集coco8">2.1 demo 数据集:COCO8</h2>
<p>在目标检测领域,<strong>COCO(Common Objects in Context)</strong> 是目前使用最广泛、影响力最大的标准数据集之一。<br>
它以<strong>复杂真实场景</strong>为特点,强调多目标共存、小目标比例高以及目标与背景强耦合,长期以来被作为目标检测算法的重要评测基准。<br>
标准的 COCO 数据集规模庞大,仅 2017 版本就包含超过 <strong>11 万张训练图像</strong>,覆盖 <strong>80 个常见物体类别</strong>,完整下载、预处理与训练成本都较高。因此,尽管 COCO 非常适合用于严肃的算法研究与性能对比,但对于<strong>初学者上手门槛偏高</strong>。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225211010751-390909452.png" alt="image.png" loading="lazy"><br>
为了解决这一问题,Ultralytics 官方提供了一个用于演示和教学的极简数据集 —— <strong>COCO8</strong>。<br>
COCO8 本质上是从 COCO 数据集中抽取出的一个<strong>最小化子集</strong>,在保持 <strong>COCO 数据格式与标注规范完全一致</strong>的前提下,将数据规模压缩到了极低的水平。目前的 COCO8 <strong>仅包含 8 张图像</strong>,通常划分为 <strong>训练集 4 张、验证集 4 张</strong>,并覆盖 COCO 中的若干典型目标类别。</p>
<p>这种设计使得 COCO8 具备两个非常突出的特点:<br>
一方面,它可以在数秒内完成下载,并在极短时间内跑完一次完整的训练流程;另一方面,它又完整保留了真实 COCO 数据集在目录结构、标注格式与训练接口上的一致性。<br>
因此,COCO8 的核心用途并不是训练一个性能良好的检测模型,而是用于:<strong>快速验证 ultralytics 的安装与环境配置是否正确、流程是否正常并演示 YOLO 的训练、验证与推理的完整闭环。</strong><br>
需要特别说明的是,由于数据规模极小,COCO8 上得到的指标也<strong>不具备统计意义,也不反映模型的实际检测能力</strong>。它的价值更多体现在“流程验证”和“使用示例”层面。</p>
<h2 id="22-使用-ultralytics-实现-yolo-算法">2.2 使用 ultralytics 实现 YOLO 算法</h2>
<p>先来看这样一段代码:</p>
<pre><code class="language-python">from ultralytics import YOLO
model = YOLO("yolo11n.pt")
results = model.train(
    data="coco8.yaml",   
    epochs=50,            
    imgsz=640,            
    batch=16,            
    name="coco8_train",
    device="cpu"         
)
metrics = model.val(device="cpu")
print("mAP50-95:", metrics.box.map)   
print("mAP50:", metrics.box.map50)
</code></pre>
<p>要说明的是:<strong>这就是在ultralytics 上实现 YOLO 算法的完整代码,包括创建模型、输入数据、模型传播、指标评估甚至包括可视化图表。</strong></p>
<p>是的,这便是 ultralytics 的显著特点,它的<strong>封装度极高</strong>。<br>
这代表我们使用起来可以较容易地跑通代码,但同时也意味着隐藏了大量细节,想要熟练应用,就要慢慢拆解。</p>
<p>现在,我们就来详细看看这段代码的运行细节:</p>
<h4 id="1-模型定义">(1) 模型定义</h4>
<p>首先,定义模型:</p>
<pre><code class="language-python">model = YOLO("yolo11n.pt") # 这里传入的是预训练权重文件名,.pt文件是 PyTorch 的权重格式。
</code></pre>
<p><code>YOLO</code> 是 <strong>ultralytics 提供的统一模型接口类</strong>,它可以根据传入的参数,<strong>加载不同版本的 YOLO 模型</strong>(如 YOLOv8、YOLO11 等),它封装了模型的所有关键逻辑。<br>
要说明的是,YOLO 模型权重文件通常遵循如下命名规则:<br>
在 ultralytics 最新版本中,YOLO 模型权重文件通常遵循如下命名规则:</p>
<pre><code>yolo[版本号][模型大小].pt
</code></pre>
<p><strong>版本号</strong>表示 YOLO 的算法版本或 ultralytics 发布的迭代版本。<br>
<strong>模型大小</strong> 表示模型的<strong>参数量与计算复杂度</strong>,也是速度和精度的折中指标:</p>
<ul>
<li><code>n</code> = nano → 极小模型,参数少,推理快,适合演示和入门</li>
<li><code>s</code> = small → 小型模型,参数稍多,精度和速度平衡</li>
<li><code>m</code> = medium → 中等模型,精度更高,训练和推理开销也增大</li>
<li><code>l</code> = large → 大模型,高精度,训练和推理成本高</li>
<li><code>x</code> = extra large → 超大模型,精度最高,但训练成本最大</li>
</ul>
<p>同时,你会发现,<strong>只要我们传入 .pt 结尾的权重文件作为参数,那就代表我们使用的是预训练模型。</strong><br>
而如果你希望从头训练自己的模型,就要改变传入参数:</p>
<pre><code class="language-python"># 从头创建模型,不加载预训练权重
model = YOLO("yolov8n.yaml")# 只指定网络结构 YAML,不是 .pt 文件
</code></pre>
<h4 id="2-训练方法">(2) 训练方法</h4>
<p>了解完模型定义后,现在就来看看传入方法</p>
<pre><code class="language-python">results = model.train(...)
</code></pre>
<p>这一行是整个流程的核心。调用 <code>train()</code> 方法后,ultralytics 会自动完成一次<strong>完整的目标检测训练流程</strong>。<br>
从宏观上看,这一行代码内部依次完成了以下工作:</p>
<ul>
<li>读取并解析 <code>coco8.yaml</code> 数据集配置文件</li>
<li>根据配置构建训练集与验证集的数据加载器</li>
<li>加载预训练权重并初始化模型参数</li>
<li>按照指定的训练轮数执行前向传播、损失计算与反向传播</li>
<li>在训练过程中自动记录 loss、mAP 等指标,并生成可视化结果</li>
</ul>
<p>也就是说,我们在代码中看到的只是一次函数调用,但在其背后,实际上已经包含了一个标准深度学习训练框架所需的完整流程。</p>
<p>下面,我们再展开看看这个方法的参数设置:</p>
<pre><code class="language-python">data="coco8.yaml" # Ultralytics 内置的 COCO8 配置,首次运行自动下载数据集
</code></pre>
<p>这一参数用于指定<strong>数据集的配置文件</strong>。<br>
与之前在代码中手动构建 <code>Dataset</code> 和 <code>DataLoader</code> 不同,ultralytics 采用 <strong>YAML 文件(你可以理解为专用设定集)</strong> 来描述数据集的路径、类别数量以及类别名称。<br>
通过这种方式,模型与数据集实现了解耦:<strong>同一套训练代码可以通过更换 YAML 文件,直接应用到不同的数据集上</strong>,而无需修改模型或训练逻辑。</p>
<p>再来看看它的运行时的细节:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210918841-1158161335.png" alt="image.png" loading="lazy"></p>
<p>继续看下面几个参数:</p>
<pre><code class="language-python">epochs=50,         # 训练轮次
imgsz=640,         # 图像大小
batch=16,            # 批次大小
name="coco8_train",# 实验名称
device="cpu"         # 如果有 GPU 用 0,或 "cuda";无 GPU 用 "cpu"
</code></pre>
<p>这些我们都比较熟悉了,要专门说的一点是:<br>
<code>name="coco8_train"</code> 指定了<strong>本次训练实验的名字</strong>,ultralytics 会根据这个名字<strong>创建一个文件夹来保存训练输出</strong>。<strong>每个实验名对应一个独立的训练结果目录</strong>,方便管理。<br>
我们后面展示运行结果时就会再次用到它。</p>
<h4 id="3评估方法">(3)评估方法</h4>
<p>同样,这一方法被高度封装:</p>
<pre><code class="language-python">metrics = model.val(device="cpu") # 默认使用GPU,因此,如果没有GPU,要显式指定CPU。
print("mAP50-95:", metrics.box.map)   
print("mAP50:", metrics.box.map50)
</code></pre>
<p>这是 <strong>ultralytics YOLO 提供的验证接口</strong>, 它在内部做了这些关键步骤:</p>
<ol>
<li><strong>读取并加载验证集</strong>:如果有缓存(<code>.cache</code> 文件),会加快数据载入。</li>
<li><strong>模型前向传播</strong>:自动使用非极大值抑制筛选重复框。</li>
<li><strong>计算指标</strong>:返回的 <code>metrics</code> 对象中包含了不同类型的指标数据。</li>
</ol>
<p>于是,我们便可以直接打印 <code>metrics</code> 对象中的指标。</p>
<p>现在,了解了框架本身后,我们来看看运行效果和其过程中的细节。</p>
<h2 id="23-在-coco8-上运行-yolo-算法">2.3 在 coco8 上运行 YOLO 算法</h2>
<p>YOLO 的模型时至今日仍在不断地更新,我们使用的 YOLOv11 的网络结构如下:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210944100-425341995.png" alt="image.png" loading="lazy"><br>
它集成了很多的先进技术,非常复杂,目前阶段,我们理解 YOLO 算法的基础原理就好。</p>
<p>现在,我们来看看代码的运行过程:</p>
<h4 id="1控制台输出内容">(1)控制台输出内容</h4>
<p>当代码成功开始运行后,你会发现在轮次信息前,控制台就输出了很多内容。这些其实是<strong>在训练开始时的标准日志</strong>,它主要是在做<strong>训练前的准备、模型初始化、数据检查和优化器配置</strong>。<br>
我们简单看一看:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210919653-825748362.png" alt="image.png" loading="lazy"><br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210919454-595704748.png" alt="image.png" loading="lazy"><br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210949364-1654560201.png" alt="image.png" loading="lazy"></p>
<p>直到这里,模型才完成<strong>前期准备工作</strong>,开始正式训练。<br>
同样,ultralytics 对训练信息的输出也十分丰富:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210919319-1405517961.png" alt="image.png" loading="lazy"></p>
<p>别急,还没完,在结束训练后,ultralytics 还会给你做一些”<strong>善后和总结</strong>“:<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210918336-829710733.png" alt="image.png" loading="lazy"><br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225211021702-934195784.png" alt="image.png" loading="lazy"></p>
<p>显然,这里的指标较高是预训练的成果。<br>
这一整套下来,你会发现,不同于我们原本自己打印的输出结果,<strong>ultralytics 对训练日志的记录和管理非常完备,而且还不仅仅局限于控制台输出。</strong><br>
我们继续往下:</p>
<h4 id="2日志文件夹">(2)日志文件夹</h4>
<p>在完成训练后,你会发现,运行文件的同级目录中新出现了一个名为 <strong>runs</strong> 的文件夹,这就是<strong>ultralytics用来管理日志的文件夹</strong>。<br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225210918939-139738413.png" alt="image.png" loading="lazy"><br>
<img src="https://img2024.cnblogs.com/blog/3708248/202512/3708248-20251225211038302-2025213915.png" alt="image.png" loading="lazy"><br>
这样的管理方式也更方便我们的溯源和调试。</p>
<p>我们这次实践内容就到这里,实际上,与其说本篇是在演示 YOLO 算法,倒不如说是对 ultralytics 的使用介绍。主要原因是 YOLO 算法作为真正流行的算法,其使用的各项技术和原理已经可以出本书了,我们这里只将其作为计算机视觉中的一个方向来介绍一些基础内容。</p>
<p>实际上还有很多内容可以展开,比如在训练日志里出现的一些专业图表的含义,以及检测任务的几个评估指标,这些我们之后遇到再慢慢说。</p><br><br>
来源:https://www.cnblogs.com/Goblinscholar/p/19401196
頁: [1]
查看完整版本: 吴恩达深度学习课程四:计算机视觉 第三周:检测算法 课后习题和代码实践