Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【AI 进阶笔记】cv 小白初上手 Kaggle Person-Collecting-Waste COCO Dataset

【AI 进阶笔记】cv 小白初上手 Kaggle Person-Collecting-Waste COCO Dataset

原创
作者头像
繁依Fanyi
发布于 2025-04-04 13:54:48
发布于 2025-04-04 13:54:48
14301
代码可运行
举报
运行总次数:1
代码可运行

1. 引言

计算机视觉的领域,目标检测(Object Detection)是一个非常重要的任务。与传统的分类任务不同,目标检测不仅要求模型判断图片中有哪些物体,还需要精确地确定物体在图像中的位置。Faster R-CNN 是一种强大的目标检测模型,广泛应用于图像识别自动驾驶、视频分析等场景。

最近刚刚学习了 Faster R-CNN,为了深入理解其原理和实现,决定亲自动手实践,于是从 Kaggle 找了个数据集(Person-Collecting-Waste COCO Dataset)练练手。这篇博客将详细讲解 Faster R-CNN 的工作原理,并分享从数据准备、模型训练、到推理与可视化的完整过程。

在这里插入图片描述
在这里插入图片描述

2. Faster R-CNN 原理解析

2.1 Faster R-CNN 的整体架构

Faster R-CNN 是基于卷积神经网络(CNN)的一种目标检测框架,它的核心思想是通过一系列层来生成候选区域、进行目标分类和位置回归。Faster R-CNN 由以下几部分组成:

  1. 特征提取(Backbone):使用卷积神经网络(如 ResNet-50 或 ResNet-101)作为特征提取网络,提取图像的高层次特征。
  2. 区域生成网络(Region Proposal Network, RPN):RPN 网络负责在图像的特征图上生成候选框,并为每个候选框打分,评估其是否包含目标物体。
  3. ROI Pooling:由于候选框大小不一致,需要使用 ROI Pooling 层将每个候选框裁剪并调整为相同大小,以便输入到全连接层进行分类和回归。
  4. 目标分类与边界框回归:最后,通过分类器预测每个候选框的类别,并通过回归网络预测目标的精确边界框。

这些模块协同工作,最终将图像中的目标检测出来,并给出每个目标的类别及其边界框位置。

下图展示了 Faster R-CNN 的整体流程:

在这里插入图片描述
在这里插入图片描述

图中(这个图不是很生动),输入图像首先通过 backbone 提取特征,然后通过 RPN 生成候选框,并使用 ROI Pooling 进行统一尺寸处理,最后通过分类和回归网络输出最终的检测结果。


2.2 RPN 详解

RPN(Region Proposal Network)是 Faster R-CNN 中一个关键的部分,它的作用是生成候选区域。RPN 会在特征图的每个像素点生成多个不同尺度的候选框(Anchor),并根据目标框的真实标签(Ground Truth)进行分类和回归。

RPN 通过一个小型的卷积网络来计算每个 Anchor 的得分和偏移量:

  • 前景(Positive):与真实目标框的 IoU(Intersection over Union)大于 0.7 的 Anchor。
  • 背景(Negative):与真实目标框的 IoU 小于 0.3 的 Anchor。

通过这种方式,RPN 能够从大量的候选框中筛选出一些最有可能包含物体的区域,从而提高后续检测的效率和准确性。


2.3 ROI Pooling 和分类回归

经过 RPN 之后,得到的候选框大小不一,为了让这些框能够输入到后续的全连接层进行分类和回归,Faster R-CNN 使用了 ROI Pooling(或 ROI Align)方法。ROI Pooling 的作用是将不同尺寸的候选框转换成相同尺寸的特征块。

具体来说,ROI Pooling 会将每个候选框映射到一个固定大小的特征图(例如 7x7),并将其中的每个区域进行池化操作,以保留最重要的特征信息。经过 ROI Pooling 后,特征图会传递给两个全连接层:

  • 分类分支:预测每个候选框的类别。
  • 回归分支:预测每个候选框的精确边界框坐标。

这样,模型就能同时完成目标分类和位置回归的任务,最终输出多个带有类别和位置的预测框。


3. 数据准备与预处理

3.1 COCO 数据格式解析

COCO 数据集是计算机视觉领域广泛使用的数据集,通常用于目标检测、图像分割等任务。COCO 数据集的标注格式包含了每个目标的边界框(bbox)和类别信息:

代码语言:json
AI代码解释
复制
{
  "annotations": [
    {
      "bbox": [x_min, y_min, width, height],  
      "category_id": 1  
    }
  ]
}
在这里插入图片描述
在这里插入图片描述

其中,bbox 是目标的边界框,它由左上角的 (x_min, y_min) 坐标和目标的宽度和高度 [width, height] 组成。我们需要将这个格式转换成 Faster R-CNN 需要的 [x_min, y_min, x_max, y_max] 格式,其中 x_max = x_min + widthy_max = y_min + height

3.2 自定义数据集类

为了加载和处理 COCO 数据,我们可以使用 torchvision.datasets.CocoDetection 类来读取数据,并且封装成一个自定义的数据集类 CustomDataset

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import os
import torch
import torchvision.transforms as transforms
import torchvision.datasets as datasets

class CustomDataset(torch.utils.data.Dataset):
    def __init__(self, root, split, transforms):
        self.root = os.path.join(root, split)  # 数据集路径
        self.transforms = transforms  # 数据预处理操作
        self.dataset = datasets.CocoDetection(self.root, f"{self.root}/_annotations.coco.json", transform=self.transforms)
    
    def __getitem__(self, idx):
        img, target = self.dataset[idx]  # 获取图片和标注
        
        boxes = []
        labels = []
        for obj in target:
            x_min, y_min, width, height = obj["bbox"]
            x_max = x_min + width
            y_max = y_min + height
            
            # 过滤掉无效的 bbox
            if width > 0 and height > 0:
                boxes.append([x_min, y_min, x_max, y_max])
                labels.append(obj["category_id"])
        
        target = {
            "boxes": torch.tensor(boxes, dtype=torch.float32),
            "labels": torch.tensor(labels, dtype=torch.int64)
        }
        return img, target
    
    def __len__(self):
        return len(self.dataset)

这个数据集类对每张图片的标注进行了转换,并且将每张图片与其对应的目标框一一对应。这样,在训练时我们就可以直接使用这个自定义的数据集类来读取并处理数据。


4. 训练 Faster R-CNN

4.1 加载数据集

在加载数据集时,我们将训练集、验证集和测试集分别加载,并进行批量化处理:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
train_dataset = CustomDataset("data", "train", transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=2, shuffle=True, collate_fn=lambda x: tuple(zip(*x)))

4.2 定义 Faster R-CNN 模型

这里使用 torchvision 提供的预训练 Faster R-CNN 模型,并根据数据集的类别数量进行调整:

代码语言:python
代码运行次数:1
运行
AI代码解释
复制
import torchvision
from torchvision.models.detection.faster_rcnn import FasterRCNN_ResNet50_FPN_Weights

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(weights=FasterRCNN_ResNet50_FPN_Weights.DEFAULT)
num_classes = 2  # 背景 + 1 个类别
in_features = model.roi_heads.box_predictor.cls_score.in_features
model.roi_heads.box_predictor = torchvision.models.detection.faster_rcnn.FastRCNNPredictor(in_features, num_classes)

通过修改 roi_heads.box_predictor 来适配我们自己数据集的类别数量。这样模型就能够进行目标分类与回归。


4.3 训练模型

在训练模型时,我们使用 Adam 优化器,并进行损失计算与反向传播:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
num_epochs = 10

for epoch in range(num_epochs):
    model.train()
    total_loss = 0
    for images, targets in train_loader:
        images = [img.to(device) for img in images]
        targets = [{k: v.to(device) for k, v in t.items()} for t in targets]

        loss_dict = model(images, targets)
        losses = sum(loss for loss in loss_dict.values())

        optimizer.zero_grad()
        losses.backward()
        optimizer.step()
        
        total_loss += losses.item()

    print(f"Epoch {epoch+1}, Train Loss: {total_loss / len(train_loader)}")

数据量很小,没一会就训练完了。

在这里插入图片描述
在这里插入图片描述

如果和我在本地训练慢的,可以试试腾讯云 Cloud Studio 的高性能工作空间,把模型加载到 GPU,这样就会训练很快啦!

在这里插入图片描述
在这里插入图片描述

5. 训练分析

5.1 绘制损失曲线

通过绘制训练过程中的损失曲线,我们可以直观地看到模型的训练进展情况:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt

plt.plot(train_losses, label="Train Loss")
plt.plot(valid_losses, label="Valid Loss")
plt.xlabel("Epoch")
plt.ylabel("Loss")
plt.legend()
plt.show()

可以看到 Loss 正常下降

在这里插入图片描述
在这里插入图片描述

在完成训练后,我们可以通过以下代码对新图片进行预测,并展示检测结果:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def predict(model, image_path):
    model.eval()
    img = Image.open(image_path).convert("RGB")
    img_tensor = transforms.ToTensor()(img).unsqueeze(0).to(device)
    with torch.no_grad():
        predictions = model(img_tensor)
    return predictions
在这里插入图片描述
在这里插入图片描述

也可以保存模型,方便下次使用。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# 保存模型
torch.save(model.state_dict(), "faster_rcnn_trained.pth")
print("模型已保存")

希望这篇文章对你有所帮助!下次见!🚀

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何将flash制作的动画存成高质量的GIF
喜欢用flash制作GIF动画的同学有个疑惑就是flash直接导出的GIF质量不高无法达到我们对动画的色彩要求,所以下面教大家如何将flash制作的动画存成高质量的GIF 1、 在flash里选择“导出影片” 2、 选择“PNG序列” 3、 弹出导出png面版 4、 打开photoshop,选文件-脚本-将文件载入堆栈,之前的序列图片就会按顺序出现在层里 5、 打开时间轴面板,在右上角的菜单中选择“从图层建立帧” 6、 此时的动画方向是反向的。时间轴菜单里点选“反向帧”
用户1730674
2018/05/02
1.7K0
如何将flash制作的动画存成高质量的GIF
是的!Figma也可以用时间轴做超级流畅的动画了
静电说:继昨天我们发布了Figma下的一款超神奇的抠图插件后,今天静电再次为大家带来一款Motion插件,它可以在Figma中做帧动画。在通常情况下,Figma中是没有时间轴的,因此只能使用Smart Animate做一些补间过渡动画,而要做一些更流畅且具有更多细节的动画,Figma则显得有点无奈。不过没关系,今天,我们为大家介绍使用Motion插件在Figma中来完成超流畅动画的案例。一起来看Pavel Babkin的这篇文章。
用户5009027
2021/03/15
21.1K0
是的!Figma也可以用时间轴做超级流畅的动画了
Ps图像处理:Photoshop 2023
Photoshop 2023是一款功能强大的图像处理软件,Photoshop 2023可以让摄影师对照片进行后期调整、修复和优化,以获得最佳效果。 是许多设计师创建海报、插图、广告和其他视觉设计作品的首选软件。可以让美术家创建数字绘画作品,并进行各种颜色和纹理效果的调整。 Photoshop 可以用来创建和编辑网站的图像和图标。 Photoshop 可以用来创建广告素材和商业宣传品,如海报、杂志广告和电视广告等。利用Photoshop 软件在桌面上的强大功能,您可以在灵感来袭时随时随地进行创作。
用户10520003
2023/04/21
1.1K0
SketchBook Pro2021激活版SketchBook2022免费版SketchBook2023下载安装教程
AutodeskSketchBook Pro 2021是一款专业的数码画画插图软件,它拥有一个极其优美的界面,可以在每个设备上最大化地显示空间,让用户可以享受到出色的绘画体验。这款软件是专门为平板电脑或手写笔写板设计的,提供专业水平的绘图和插图工具,并配有丰富的命令选项、参数,提供灵活高效的插图设计和绘图功能,干净整洁的软件环境,友好的图形界面,可以快速地找到您所需要的工具,涵盖从简单的草图到最终精美插图的所有工具,可以帮助用户自由地发挥自己的想象力,在进行绘画创作时,还有超多类型的可自定义笔刷,综合的纹理和形状,流畅的笔触和精确度以及速度,让这款软件独具优势!
知识兔
2022/10/22
1.3K0
使用Photoshop画一个圆锥体
一、准备工作 软件环境:PhotoshopCS6 实验目的:通过运用变换和选区工具,画出一个圆锥体 二、实验步骤 1,新建文件 2,前景色设置为黑色,并进行填充(快捷键 Alt+Delete) 3,创
Zoctopus
2018/06/04
9450
CorelDRAW 2019 软件应用项目(一)
今天我们聊聊 cdr 这个绘制矢量图的软件,这个软件是我最近才接触到的,一个和 AI 一样,能够制作矢量图的软件,并且学习它的一个非常重要的绘制曲线的功能。
设计者
2022/12/20
1.2K0
CorelDRAW 2019 软件应用项目(一)
Macromedia flash制作落叶飘下动画
2.选中引导层,在左侧工具栏中设置笔触颜色为黄色,填充颜色为无,在舞台上绘制一条路径。并锁定引导层。
全栈程序员站长
2022/08/18
1.5K0
Macromedia flash制作落叶飘下动画
PS制作GIF
昨天写了篇博客,是关于CSS实现图片旋转的,群里的小伙伴跟我说博客里看不到效果让我做个GIF。。。那我今天就来写篇如何用PhotoShop制作GIF
阿超
2022/08/16
1.5K0
PS制作GIF
如何用Scratch 3绘制矢量图形 【Gaming】
Scratch是一种流行的用于创建视频游戏和动画的可视化编程语言。它还具有矢量绘图工具,任何人都可以使用它来创建独特的游戏和艺术。
五月Rambo
2019/11/10
5.8K0
如何用Scratch 3绘制矢量图形 【Gaming】
「图层基础知识」Photoshop 图层面板概述
Photoshop 中的“图层”面板列出了图像中的所有图层、图层组和图层效果。可以使用“图层”面板来显示和隐藏图层、创建新图层以及处理图层组。可以在“图层”面板菜单中访问其他命令和选项。
IT胶囊
2021/05/28
1.4K0
《边学边做Photoshop图像制作案例教程》
3.单击“矩形选框工具”-绘制-编辑-按<Alt+Delete>键-按<Ctrl+D>键
裴来凡
2022/05/29
5650
《边学边做Photoshop图像制作案例教程》
PhotoShop制作gif动态广告效果示例
6. 复制第二个图层“米扑2”为“米扑3”,输入文字“米扑科技公司”,调节字体颜色
阳光岛主
2019/02/18
1.9K0
PhotoShop制作gif动态广告效果示例
Photoshop软件应用项目(一)
今天我们在 PS 软件上,制作一个简单的帧动画,方便以后和 Flash 动画效果,做对比,我们会多做几个案例,更加熟练的掌握 PS 帧动画原理,这样在接触 flash 动画时,就能够很明显的区分两个软件在动图领域的优缺点。
设计者
2022/12/20
8210
Photoshop软件应用项目(一)
数据可视化之下发图实践
随着互联网的快速发展,数据维度越来越广,呈现形式也越发丰富,具有多维度数据特点的相关业务实践都能通过可视化图表来展示,比如个推的下发图,从时间和区域两个维度,可以即时、直观地展现个推数据下发的过程。
个推
2019/04/18
9210
数据可视化之下发图实践
Android 自定义标签 ViewLayout
自定义viewLayout实现标签View,UI的效果图如下: 如图,我们要自己实现带描边的,带花括号的,带三角形,带对勾的这样一个layout ,并且对勾和中间的虚线我们都要用最基础的API绘制出
非著名程序员
2018/02/02
1.3K0
Android 自定义标签 ViewLayout
Photoshop软件2020软件下载安装教程-PS全版本最新版本软件安装包
Photoshop软件是一款非常强大的图像处理软件,可以帮助用户进行各种图片处理、编辑、设计等工作。
用户8187027
2023/04/08
5050
html遮罩层动画制作,flash简单制作遮罩动画效果[通俗易懂]
flash简单制作遮罩动画效果QQ空间的开机动画大家应该都有,从最初的出现的一点到后面全部出现,如此神奇的效果到底是怎么做的呢,一起来看看吧!遮罩特效: 由于百度只能上传500k以内的照片,所以效果图片质量不是很好,当然,我们一般做的特效是.swf,这里是为了方便大家观看,所以做成了gif.
全栈程序员站长
2022/08/14
3.7K0
html遮罩层动画制作,flash简单制作遮罩动画效果[通俗易懂]
【01】AE特效开发制作特技-Adobe After Effects-AE特效制作快速入门-制作飞机,子弹,爆炸特效以及导出png序列图-优雅草央千澈
优雅草央千澈所有的合集,系列文章可能是不太适合完全初学者的,因为课程不会非常细致的系统的去教一些很基础不过的东西,这种需要系统学习的同学建议需要去看很详细的几十集,几百集课程的那种,央央的博文以及内容分享是针对于有一定计算机基础,而且有一定的编程能力的同学,并且是学习能力会比较强的观看比较适宜,因为有些地方是比较跳跃的,但是针对有一定基础的同学没问题,零基础可能会卡在某些很小的问题地方,不过这些都不是事,只要你愿意努力学习,我相信都是小问题,而且不是还可以评论吗?
卓伊凡
2025/01/11
2110
大学课程 | 计算机图形学,基于MFC和二维变换的画图软件
本文描述了二维复合变换的基本方法和思想,根据鼠标位置坐标获取起始点pStart和终止点pEnd的坐标,设计实现每个基本图形的画图方法,根据pStart和pEnd即可确定基本图形的控制点,进而绘制对应图形。规范化齐次坐标以后,图形几何变换可以表示为图形控制点点集合的规范化齐次坐标矩阵与二维变换矩阵相乘的形式,分别设置二维变换矩阵的参数信息,设计实现对应的方法,即可实现图形的二维变换功能。
Justlovesmile
2021/12/14
2.5K0
大学课程 | 计算机图形学,基于MFC和二维变换的画图软件
Building a clean model tutorial
本教程将逐步指导您构建机器人或任何其他物品的清晰仿真模型。这是一个非常重要的课题,为了有一个漂亮的外观,快速显示,快速模拟和稳定的仿真模型。
六四零
2020/08/04
1.4K0
推荐阅读
相关推荐
如何将flash制作的动画存成高质量的GIF
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验