Task09:目标检测基础;图像风格迁移;图像分类案例

本文介绍了目标检测的基础概念,并详细讲解了如何在图像中绘制边界框来定位目标物体,如猫和狗,通过matplotlib库实现边界框的可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、目标检测基础

9.3 目标检测和边界框

%matplotlib inline
from PIL import Image

import sys
sys.path.append('/home/kesci/input/')
import d2lzh1981 as d2l
# 展示用于目标检测的图
d2l.set_figsize()
img = Image.open('/home/kesci/input/img2083/img/catdog.jpg')
d2l.plt.imshow(img); # 加分号只显示图

 

 9.3.1 边界框

# bbox是bounding box的缩写
dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 112, 655, 493]
def bbox_to_rect(bbox, color):  # 本函数已保存在d2lzh_pytorch中方便以后使用
    # 将边界框(左上x, 左上y, 右下x, 右下y)格式转换成matplotlib格式:
    # ((左上x, 左上y), 宽, 高)
    return d2l.plt.Rectangle(
        xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
        fill=False, edgecolor=color, linewidth=2)
fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'));

 

 

 

### MAML算法在图像分类中的应用 MAML(Model-Agnostic Meta-Learning)是一种元学习框架,旨在快速适应新任务。其核心思想是通过优化模型参数,使得少量样本即可完成目标任务的学习[^2]。具体到图像分类领域,MAML 的目标是在训练阶段利用多个小型数据集的任务分布,使模型能够高效地迁移到新的未见过的分类任务上。 #### 实现过程 1. **初始化模型参数** 首先定义一个可微分的神经网络作为基础模型,并随机初始化其参数 $\theta$。该模型可以是一个卷积神经网络 (CNN),适用于处理图像分类任务。 2. **采样任务集合** 在训练过程中,从一组预定义的小规模分类任务 $T_i$ 中采样若干子任务。这些任务通常由支持集和支持标签组成 $(S, y_S)$ 和查询集及其对应标签 $(Q, y_Q)$。 3. **内部更新(单步或多步梯度下降)** 对于每个任务 $T_i$,基于支持集执行一次或多次梯度下降操作以获得特定任务下的临时参数: \[ \theta'_i = \theta - \alpha \nabla_\theta L_{T_i}(f_\theta(S)) \] 这里,$\alpha$ 是学习率,$L_{T_i}$ 表示损失函数[^1]。 4. **外部更新(元梯度计算)** 使用查询集上的性能反馈调整全局参数 $\theta$,即: \[ \theta \leftarrow \theta - \beta \sum_i \nabla_\theta L_{T_i}(f_{\theta'_i}(Q)) \] 其中涉及二阶导数项用于捕捉不同任务间的关联性。 5. **测试阶段迁移能力验证** 当面对全新的图像分类场景时,只需依据上述机制对初始权重做有限次迭代便可迅速适配至最优解附近。 #### 应用案例分析 - **Few-Shot Learning 场景下的人脸识别** 利用 MAML 方法构建了一个能够在极低标注量条件下识别人类面孔身份差异的有效解决方案。实验表明,在仅提供一张正面照片的情况下也能达到较高精度水平。 - **细粒度物体类别辨别** 借助 MAML 技术开发针对鸟类品种鉴定的应用程序实例展示了如何克服传统监督式深度学习方法因缺乏充足标记而导致泛化效果差的问题。 ```python import torch from torch import nn, optim class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.layers = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3), nn.ReLU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(64, 128, kernel_size=3), nn.ReLU(), nn.MaxPool2d(kernel_size=2), nn.Flatten(), nn.Linear(128 * 7 * 7, 10) ) def forward(self, x): return self.layers(x) def maml_train_step(model, tasks, alpha, beta): meta_loss = [] for task in tasks: support_x, support_y = task['support'] query_x, query_y = task['query'] theta_prime = model.state_dict() # Inner loop update inner_optim = optim.SGD(model.parameters(), lr=alpha) preds = model(support_x) loss = F.cross_entropy(preds, support_y) inner_optim.zero_grad() loss.backward(create_graph=True) # For second-order gradients inner_optim.step() with torch.no_grad(): updated_model = type(model)(...) # Reinitialize same architecture updated_model.load_state_dict(theta_prime) for p_new, p_old in zip(updated_model.parameters(), model.parameters()): p_new.data.copy_(p_old.data - alpha * p_old.grad.data) # Outer loop update preparation q_preds = updated_model(query_x) q_loss = F.cross_entropy(q_preds, query_y) meta_loss.append(q_loss) total_meta_loss = sum(meta_loss) / len(tasks) outer_optim = optim.Adam(model.parameters(), lr=beta) outer_optim.zero_grad() total_meta_loss.backward() outer_optim.step() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值