第一部分:知识点复习提纲
一、香蕉数据集(d2l内置)
1.1 数据集基本信息
来源:李沐教材
d2l.load_data_bananas(batch_size)。图像尺寸:256×256像素。
数据量:训练集1000张,验证集100张。
每张图像:包含一个香蕉(类别0),背景多样。
加载返回:
train_iter, val_iter,每个batch包含(images, labels)。
1.2 标签格式
labels形状:(batch_size, 每张图像的标注数, 5)。每张图像只有一个香蕉,所以标注数=1。批量处理时,若某图无目标,会用-1填充。
每个标注是长度为5的数组:
[类别, x1, y1, x2, y2]。类别:0表示香蕉,-1表示填充(无效)。(x1,y1):边界框左上角坐标,归一化到[0,1]。(x2,y2):边界框右下角坐标,归一化到[0,1]。
示例:
batch[1][0][0]是一个标注,例如[0, 0.2, 0.3, 0.7, 0.8]。
1.3 为什么归一化?
不同图像尺寸统一处理,模型不依赖绝对像素值。
便于数据增强(缩放、裁剪等)后坐标仍有效。
二、YOLO标注格式与转换
2.1 YOLO格式
每行表示一个目标:
class x_center y_center width height。所有值归一化到[0,1](相对于图像宽高)。
文件存储:每张图像对应一个同名
.txt标签文件。
2.2 转换公式(d2l → YOLO)
已知(x1, y1, x2, y2)归一化坐标,则:
x_center = (x1 + x2) / 2 y_center = (y1 + y2) / 2 width = x2 - x1 height = y2 - y1
注意:结果仍在[0,1]范围内。
2.3 为什么YOLO用这种格式?
直接预测中心点偏移和宽高缩放,损失函数计算简单。
归一化便于不同尺度图像训练。
三、迁移学习
3.1 概念
预训练:在大型通用数据集(如COCO,80类)上训练模型,使其学会通用视觉特征(边缘、纹理、形状等)。
微调:在预训练模型基础上,用目标任务的小数据集继续训练(通常用小学习率),使模型适应新类别。
优势:
不需要大量标注数据。
训练速度快,效果好。
避免从零训练。
3.2 本实验体现
加载
yolov8n.pt(COCO预训练权重)。COCO数据集不包含香蕉(可以验证:
model.names中没有'banana')。在香蕉数据集上微调,模型学会检测香蕉。
四、YOLOv8训练参数
data: 数据配置文件路径(包含类别数、类别名、路径)。epochs: 训练轮数,本实验10轮。imgsz: 输入图像尺寸,256。batch: 批大小,16。device: 'cuda:0'(GPU)。patience: 早停,验证指标连续5轮不提升则停止。
五、评估指标
5.1 IoU(交并比)
公式:
IoU = 交集面积 / 并集面积。取值范围:[0,1]。
作用:衡量预测框与真实框的重叠程度,常用于判断检测是否成功(一般IoU>0.5认为正确)。
5.2 mAP(mean Average Precision)
mAP50:IoU阈值=0.5时的平均精度。
mAP50-95:计算IoU阈值从0.5到0.95(步长0.05)的平均mAP。更严格,因为要求模型在不同重叠程度下都准确。
5.3 精确率(Precision)与召回率(Recall)
精确率 = TP / (TP + FP) → 预测为真的里面有多少是真的。
召回率 = TP / (TP + FN) → 真的里面有多少被预测出来了。
六、非极大值抑制(NMS)
6.1 为什么需要NMS?
检测时一个目标可能产生多个重叠的候选框,需要去除冗余。
6.2 算法步骤
所有框按置信度得分降序排序。
选择最高分框,加入保留列表。
计算其余框与该框的IoU,删除IoU > 阈值的框。
重复直到无框剩余。
6.3 IoU阈值的影响
阈值越低:删除条件越宽松,更多框被删除 → 保留的框越少。
阈值越高:删除条件越严格,保留的框越多(可能有冗余)。
七、YOLO网格划分的优势
滑动窗口:需要枚举所有位置和尺度,计算量巨大。
YOLO:将图像划分为S×S网格,每个网格预测固定数量的边界框。一次前向传播得到所有候选框,实时性强。
八、训练损失曲线分析
训练损失:模型在训练集上的拟合程度。
验证损失:模型在未见数据上的泛化能力。
过拟合:训练损失下降,验证损失上升。
欠拟合:两者都高且不降。
良好:两者同步下降并趋于平稳。
九、对比实验(预训练 vs 微调)
预训练模型检测COCO图片:能检测COCO中的80类物体(如人、球等),效果较好。
预训练模型检测香蕉图片:无法检测香蕉(因为COCO无香蕉类),可能输出无目标或错误类别。
微调后模型检测香蕉图片:能准确检测香蕉,边界框准确。
结论:迁移学习让模型学会新类别,无需从头训练。
十、扩展:多类别检测配置
若要检测香蕉和苹果两类,需要修改:
数据集标注中包含两类(类别0和1)。
配置文件
data.yaml中nc: 2。names: ['banana', 'apple']。重新训练(微调)。
第二部分:考试题
一、单选题(每题3分,共15分)
香蕉数据集中,每张图像标注的边界框坐标是( )
A. 绝对像素坐标
B. 归一化到[0,1]的坐标
C. 相对于图像中心的坐标
D. 极坐标YOLO格式的标签中,
width和height表示( )
A. 边界框的像素宽度和高度
B. 边界框的归一化宽度和高度
C. 边界框对角线长度
D. 边界框的面积在目标检测中,IoU的取值范围是( )
A. [0,1]
B. [0,∞)
C. [-1,1]
D. (0,1]关于迁移学习,下列说法正确的是( )
A. 必须使用与目标任务完全相同的数据集进行预训练
B. 微调时只能调整最后一层,其他层必须冻结
C. 可以大幅减少对标注数据量的需求
D. 预训练模型在COCO上学到的特征对香蕉检测完全无用非极大值抑制(NMS)中,删除一个候选框的条件是它与当前最高分框的( )超过阈值。
A. 欧氏距离
B. 余弦相似度
C. IoU
D. 面积比
二、填空题(每空2分,共20分)
香蕉数据集的图像尺寸为×像素,训练集共有 ______ 张图像。
将d2l格式的边界框
(x1, y1, x2, y2)转换为YOLO格式时,中心点坐标计算公式为:x_center = ______,y_center = ______。评估指标中,mAP50表示IoU阈值为 ______ 时的平均精度,mAP50-95比mAP50 ______(填“更严格”或“更宽松”)。
在NMS算法中,
iou_threshold设置得越 ______(填“高”或“低”),保留的框越少。YOLO将图像划分为×的网格。
三、判断题(正确打“√”,错误打“×”,每题2分,共10分)
( )COCO数据集的80个类别中包含香蕉,因此不需要迁移学习。
( )YOLO格式的标签中,
x_center和y_center的取值范围是 [0,1]。( )IoU值越大,表示两个框重叠程度越小。
( )训练时若训练损失下降但验证损失上升,说明模型发生了过拟合。
( )迁移学习时,通常会用较小的学习率进行微调。
四、简答题(共35分)
简答题1(3分)batch[1].shape的输出结果应该是什么形状?第二维代表什么?
简答题2(4分)YOLO格式的标注与d2l原始格式有什么不同?YOLO标签中的x_center, y_center, width, height是什么含义?
简答题3(4分)什么是迁移学习?本实验中如何体现迁移学习的思想?
简答题4(4分)mAP50和mAP50-95分别代表什么?哪个指标更严格?
简答题5(4分)IoU的取值范围是多少?它在目标检测中有什么作用?
简答题6(4分)对比三组实验结果(预训练模型检测COCO图片、预训练模型检测香蕉图片、微调后模型检测香蕉图片),你发现了什么?这说明迁移学习有什么作用?
简答题7(4分)IoU阈值越低,保留的框越少还是越多?为什么?
简答题8(4分)YOLO将图像划分为网格的设计相比于滑动窗口有什么优势?
简答题9(4分)如果要训练一个能同时检测香蕉和苹果的模型,需要修改哪些配置?
五、计算题(10分)
已知两个边界框(绝对像素坐标):
框A:左上角(20,30),右下角(80,90)
框B:左上角(50,60),右下角(100,120)
计算:
(1)两个框的交集面积。
(2)两个框的并集面积。
(3)IoU值(保留三位小数)。
六、代码填空题(每空2分,共10分)
说明:以下代码片段完整可运行,请根据上下文和YOLO格式规范,填写______处的代码。
代码填空1(YOLO坐标转换)
# 从d2l数据集中读取一个标注(示例值) import torch import numpy as np label = torch.tensor([0, 0.2, 0.3, 0.7, 0.8]) # [类别, x1, y1, x2, y2] x1, y1, x2, y2 = label[1:5].numpy() # 转换为YOLO格式 x_center = _____________ # 例如: (0.2 + 0.7) / 2 = 0.45 y_center = _____________ # 例如: (0.3 + 0.8) / 2 = 0.55 width = _____________ # 例如: 0.7 - 0.2 = 0.5 height = _____________ # 例如: 0.8 - 0.3 = 0.5 print(f"YOLO标签: 0 {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}")代码填空2(IoU计算)—— 本题无需填空,理解即可
def compute_iou(box1, box2): x1 = max(box1[0], box2[0]) y1 = max(box1[1], box2[1]) x2 = min(box1[2], box2[2]) y2 = min(box1[3], box2[3]) inter_area = max(0, x2 - x1) * max(0, y2 - y1) area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]) area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]) union_area = area1 + area2 - inter_area iou = inter_area / (union_area + 1e-6) return iou代码填空3(NMS中的条件判断)
def nms(boxes, scores, iou_threshold=0.5): indices = sorted(range(len(scores)), key=lambda i: scores[i], reverse=True) keep = [] while indices: current = indices.pop(0) keep.append(current) remaining = [] for idx in indices: if compute_iou(boxes[current], boxes[idx]) < _______: remaining.append(idx) indices = remaining return keep第三部分:参考答案与超详细解析
一、单选题
1. B
解析:d2l香蕉数据集的标签中,坐标已经通过除以图像宽度和高度,归一化到[0,1]区间。这样做的优点是无论图像尺寸如何变化,坐标值都在标准范围内,便于模型学习。如果选A(绝对坐标),当图像缩放时坐标会失效。
2. B
解析:YOLO格式要求所有数值归一化。width= (x2-x1) / 原图宽,height= (y2-y1) / 原图高,因此它们在0~1之间。若选A,则不同尺寸图像无法统一处理。
3. A
解析:IoU = 交集面积 / 并集面积。两个框不相交时交集=0,IoU=0;完全重合时交集=并集,IoU=1。所以取值范围是[0,1]。选项D不包含0,错误。
4. C
解析:迁移学习的核心是利用预训练模型学到的通用特征(边缘、纹理等),只需少量目标域标注数据即可获得好效果。A错:不需要完全相同的数据集;B错:可以微调多层,只是常用小学习率;D错:通用特征非常有用。
5. C
解析:NMS判断两个框是否冗余重叠,用的是IoU。若IoU大于阈值,说明它们几乎覆盖同一区域,保留得分高的,删除得分低的。其他选项与重叠程度无关。
二、填空题
6. 256;256;1000
解析:实验代码中edge_size = 256,训练迭代器共1000张。
7. (x1 + x2)/2;(y1 + y2)/2
解析:中心点坐标是左上角和右下角坐标的平均值。
8. 0.5;更严格
解析:mAP50只看IoU=0.5一个阈值,mAP50-95计算多个阈值下的平均,要求边界框更精准,因此更严格。
9. 低
解析:阈值低意味着即使两个框只有少量重叠(如IoU=0.3)也会被删除,因此保留的框更少。
10. S;S(或写“S×S”,也可写具体数值如13×13但不确定,答S×S即可)
解析:YOLO的核心设计是划分网格,网格数量是超参数。
三、判断题
11. ×(COCO数据集不包含香蕉类,所以需要迁移学习)
12. √(所有YOLO坐标都是归一化的)
13. ×(IoU越大,重叠程度越大)
14. √(过拟合的典型特征)
15. √(小学习率可以保护预训练学到的特征不被破坏)
四、简答题(超详细解析)
简答题1batch[1].shape输出(4, 1, 5)。第二维代表每张图像中标注的边界框数量(香蕉数据集每张图只有一个香蕉,故为1)。若某图无目标,会用-1填充。
简答题2
d2l格式:
[类别, x1, y1, x2, y2](左上角+右下角,归一化)。YOLO格式:
[类别, x_center, y_center, width, height](中心点+宽高,归一化)。x_center, y_center是边界框中心点的归一化坐标,width, height是归一化的宽和高。
简答题3
迁移学习:将在大型数据集上预训练的模型作为起点,然后在特定小数据集上微调。本实验中,使用在COCO(80类)上预训练的YOLOv8n模型,然后在香蕉数据集(单类)上继续训练。模型已经学会通用特征,只需少量香蕉图像就能学会检测香蕉。
简答题4
mAP50:IoU阈值=0.5时的平均精度。
mAP50-95:计算IoU阈值从0.5到0.95(步长0.05)的平均mAP。后者更严格,因为要求模型在不同重叠程度下都能精准检测。
简答题5
IoU ∈ [0,1]。作用:衡量预测框与真实框的重叠程度,是目标检测中的核心评价指标,也用于NMS中判断冗余框(IoU大于阈值则删除)。
简答题6
预训练模型能检测COCO图片中的多种物体(人、球等),但不能检测香蕉(因为COCO无香蕉类)。微调后模型能准确检测香蕉。这说明迁移学习让模型保留通用特征,只需少量新数据就能快速学会新类别,避免从头训练。
简答题7
IoU阈值越低,保留的框越少。因为低阈值下,两个框只要少量重叠(如IoU=0.3)就被视为冗余并删除,导致更多框被抑制。
简答题8
滑动窗口需要枚举所有可能的位置和尺度,计算量巨大。YOLO将图像划分为网格,每个网格预测固定数量的边界框,一次前向传播就能得到所有候选框,速度极快,且能检测不同长宽比的目标。
简答题9
需要修改:
数据集中标注两类(香蕉和苹果)。
修改配置文件中的类别数
nc=2。修改类别名称列表
names: ['banana', 'apple']。重新训练(微调)。
五、计算题
已知:
A:左上(20,30),右下(80,90) → 宽=60,高=60,面积=3600。
B:左上(50,60),右下(100,120) → 宽=50,高=60,面积=3000。
交集:
左边界 = max(20,50)=50
上边界 = max(30,60)=60
右边界 = min(80,100)=80
下边界 = min(90,120)=90
交集的宽 = 80-50=30,高 = 90-60=30 → 面积 = 30×30=900。
并集:
并集面积 = 3600 + 3000 - 900 =5700。
IoU= 900 / 5700 ≈0.158(保留三位小数)。
六、代码填空题
代码填空1:
x_center = (x1 + x2) / 2 y_center = (y1 + y2) / 2 width = x2 - x1 height = y2 - y1解析:中心点坐标是左上角和右下角的平均值,宽和高直接相减(坐标已归一化)。
代码填空3:
if compute_iou(boxes[current], boxes[idx]) < iou_threshold:解析:NMS中,只有当候选框与当前最高分框的IoU小于阈值时,才保留(即不重叠或重叠很少)。如果IoU大于等于阈值,则删除。iou_threshold是函数参数,通常设为0.5。