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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从编程实现角度学习 Faster R-CNN(附极简实现)
Faster R-CNN 的极简实现: github: simple-faster-rcnn-pytorch(http://t.cn/RHCDoPv ) 本文插图地址(含五幅高清矢量图):draw.io(http://t.cn/RQzroe3 ) 1 概述 在目标检测领域, Faster R-CNN 表现出了极强的生命力, 虽然是 2015 年的论文(https://arxiv.org/abs/1506.01497),但它至今仍是许多目标检测算法的基础,这在日新月异的深度学习领域十分难得。Faster
AI研习社
2018/03/16
2.6K0
从编程实现角度学习 Faster R-CNN(附极简实现)
MMDetection学习系列(1)——Faster RCNN深度探索与实战指南
目标检测是当前计算机视觉领域内研究的一个热点,与图像分类不一样的是,目标检测不仅要准确地识别出图像中目标的类别,还要准确的定位该目标的位置,并用边界框把目标框起来。
CoovallyAIHub
2025/01/15
2530
MMDetection学习系列(1)——Faster RCNN深度探索与实战指南
手把手教你训练自己的Mask R-CNN图像实例分割模型(PyTorch官方教程)
关于Mask R-CNN的详细理论说明,可以参见原作论文https://arxiv.org/abs/1703.06870,网上也有大量解读的文章。本篇博客主要是参考了PyTorch官方给出的训练教程,将如何在自己的数据集上训练Mask R-CNN模型的过程记录下来,希望能为感兴趣的读者提供一些帮助。
全栈程序员站长
2022/09/23
4K1
手把手教你训练自己的Mask R-CNN图像实例分割模型(PyTorch官方教程)
【AI 进阶笔记】两阶经典检测器:Faster RCNN
在计算机视觉的世界里,目标检测一直是个“烧脑”的问题。让计算机识别物体 “是什么”(分类)相对简单,但让它 “在哪里”(定位)就难了。
繁依Fanyi
2025/03/31
1520
一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。所以,object detection要解决的问题就是物体在哪里以及是什么的整个流程问题。
智能算法
2019/12/06
9.2K1
一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD
PaddlePaddle实战 | 经典目标检测方法Faster R-CNN和Mask R-CNN
机器视觉领域的核心问题之一就是目标检测(objectdetection),它的任务是找出图像当中所有感兴趣的目标(物体),确定其位置和大小。作为经典的目标检测框架FasterR-CNN,虽然是2015年的论文,但是它至今仍然是许多目标检测算法的基础,这在飞速发展的深度学习领域十分难得。而在FasterR-CNN的基础上改进的MaskR-CNN在2018年被提出,并斩获了ICCV2017年的最佳论文。Mask R-CNN可以应用到人体姿势识别,并且在实例分割、目标检测、人体关键点检测三个任务都取得了很好的效果。因此,百度深度学习框架PaddlePaddle开源了用于目标检测的RCNN模型,从而可以快速构建强大的应用,满足各种场景的应用,包括但不仅限于安防监控、医学图像识别、交通车辆检测、信号灯识别、食品检测等等。
用户1386409
2019/06/10
2.3K0
PaddlePaddle实战 | 经典目标检测方法Faster R-CNN和Mask R-CNN
人工智能 - 目标检测算法详解及实战
目标检测(Object Detection)是计算机视觉和人工智能领域中的一个重要任务,旨在识别图像或视频中的特定目标,并确定其在图像中的位置。目标检测广泛应用于自动驾驶、安防监控、人脸识别等领域。
洛秋_
2024/07/22
3350
【Faster R-CNN】2. Faster RCNN代码解析第一弹
在2月10日,Faster RCNN专栏由pprp同学起了个头,文章地址见这里:【Faster R-CNN】1. 梳理Faster R-CNN的四个模块,本着对公众号的每个专栏负责任的态度,我将在接下来的时间里将整个Faster RCNN的原理以及代码(陈云大佬的:https://github.com/chenyuntc/simple-faster-rcnn-pytorch)按照我的理解讲清楚并结束这个专题。
BBuf
2020/05/19
1.3K0
最全综述 | 图像目标检测
图片分类任务我们已经熟悉了,就是算法对其中的对象进行分类。而今天我们要了解构建神经网络的另一个问题,即目标检测问题。这意味着,我们不仅要用算法判断图片中是不是一辆汽车, 还要在图片中标记出它的位置, 用边框或红色方框把汽车圈起来, 这就是目标检测问题。其中“定位”的意思是判断汽车在图片中的具体位置。
AI算法与图像处理
2019/07/11
1.4K0
最全综述 | 图像目标检测
目标检测算法之NIPS 2016 R-FCN(来自微软何凯明团队)
R-FCN全称为Region-based Fully Convolutional Networks,是由微软的何凯明团队在NIPS 2016上提出来的,仍然是双阶段的目标检检测算法。论文地址和官方开源代码见文后。
BBuf
2019/12/31
8270
目标检测算法之NIPS 2016 R-FCN(来自微软何凯明团队)
MMDetection学习系列(4)——Cascade R-CNN深度探索与实战指南
Cascade R-CNN作为目前主流常用的高性能目标检测算法中最广为人知的算法之一。它基于经典的Faster R-CNN架构,通过引入级联式的多阶段检测器来逐层提升检测精度,从而显著提高了模型在困难样本上的表现。
CoovallyAIHub
2025/01/21
2490
MMDetection学习系列(4)——Cascade R-CNN深度探索与实战指南
目标检测系列之二(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)
目标检测系列之二(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)
Minerva
2020/05/25
1.2K0
干货 | 基于深度学习的目标检测算法综述(一)
目标检测(Object Detection)是计算机视觉领域的基本任务之一,学术界已有将近二十年的研究历史。近些年随着深度学习技术的火热发展,目标检测算法也从基于手工特征的传统算法转向了基于深度神经网络的检测技术。从最初 2013 年提出的 R-CNN、OverFeat,到后面的 Fast/Faster R-CNN、SSD、YOLO 系列,再到 2018 年最近的 Pelee。短短不到五年时间,基于深度学习的目标检测技术,在网络结构上,从 two stage 到 one stage,从 bottom-up only 到 Top-Down,从 single scale network 到 feature pyramid network,从面向 PC 端到面向手机端,都涌现出许多好的算法技术,这些算法在开放目标检测数据集上的检测效果和性能都很出色。
AI科技评论
2018/08/21
8320
干货 | 基于深度学习的目标检测算法综述(一)
实例分割–Mask RCNN详解(ROI Align / Loss Fun)
实例分割是一种在像素层面识别目标轮廓的任务,相比其他相关任务,实例分割是较难解决的计算机视觉任务之一:
全栈程序员站长
2022/09/23
2.4K0
【深度学习】深度图像检测算法总结与对比
一. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation
黄博的机器学习圈子
2023/01/10
1.2K0
【深度学习】深度图像检测算法总结与对比
R-FCN: Object Detection via Region-based Fully Convolutional Networks
我们提出了基于区域的全卷积网络,用于精确和有效的目标检测。与之前的基于区域的检测器(如Fast/Faster R-CNN)相比,我们的基于区域的检测器是全卷积的,几乎所有计算都在整个图像上共享。为了实现这一目标,我们提出了位置敏感的分数映射来解决图像分类中的平移不变性与目标检测中的平移方差之间的矛盾。因此,我们的方法可以很自然地采用完全卷积的图像分类器骨干网络,如最新的残差网络(ResNets),用于目标检测。我们使用101层ResNet在PASCAL VOC数据集上显示了很有竞争的结果(例如,在2007年的集上显示了83.6%的mAP)。同时,我们的结果在测试时的速度为每张图像170ms,比Faster R-CNN对应图像快2.5-20倍。
狼啸风云
2019/08/29
9440
R-FCN: Object Detection via Region-based Fully Convolutional Networks
深度学习500问——Chapter08:目标检测(1)
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。
JOYCE_Leo16
2024/04/16
4040
深度学习500问——Chapter08:目标检测(1)
基于Pytorch构建Faster-RCNN网络进行目标检测(一)
尽管R-CNN是物体检测的鼻祖,但其实最成熟投入使用的是faster-RCNN,而且在pytorch的torchvision内置了faster-RCNN模型,当然还内置了mask-RCNN,ssd等。既然已经内置了模型,而且考虑到代码的复杂度,我们也无需再重复制造轮子,但对模型本身还是需要了解一下其原理和过程。
python与大数据分析
2023/09/06
1.2K0
基于Pytorch构建Faster-RCNN网络进行目标检测(一)
深度学习——目标检测(2)Fast-RCNNFASTER RCNNRCNN网络的演进
前言:RCNN虽然能进行目标检测,但检测的精确度,尤其是速度方面太慢了,没秒才0.03帧。在RCNN基础上做了改进就有了FAST RCNN和FASTER RCNN
DC童生
2018/07/24
4610
深度学习——目标检测(2)Fast-RCNNFASTER RCNNRCNN网络的演进
02. OCR学习路径之文本检测(上)Faster R-CNN算法简介
由于目前已经几乎不再使用传统的方法来做OCR,后续我们主要分享基于深度学习的OCR算法。该算法一般需要训练两个模型,一个是文本检测模型,一个是文字识别模型。
Aalto
2019/10/21
3.1K0
02. OCR学习路径之文本检测(上)Faster R-CNN算法简介
推荐阅读
相关推荐
从编程实现角度学习 Faster R-CNN(附极简实现)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验