2023年第十三届APMCM亚太地区大学生数学建模竞赛A题深度剖析(基于Faster R-CNN+SVM+决策树的建模思路)

这次亚太杯咱们Unicorn建模团队继续出征!!

目前我们已经将ABC题的思路和代码完成了,还在持续更新中~

经过我们团队的分析,本次比赛的难度大概是C<A<B,但试题的开放程度正好相反。

下面是我们对A题的试题解析,要查看更多解答可以关注我们的公众号Unicorn建模呀~

A题问题回顾:

问题1解答

问题1要求根据提供的成熟苹果图像数据集,在每张图像中提取特征,建立数学模型,统计苹果的数量,并绘制所有苹果分布的直方图。以下是问题1的详细解答和数学建模过程:

l 图像数据集:问题描述中提到了附件1,其中包含成熟苹果的图像数据集。

l 特征提取:针对每张图像,需要提取有助于识别和计数苹果的特征。这可能包括颜色、形状、纹理等特征。

l 数学模型:为了统计苹果的数量,需要建立一个数学模型。可以使用计算机视觉的技术,例如目标检测算法,来识别每个苹果并计数它们。

l 直方图绘制:统计完成后,将苹果的数量用直方图表示。直方图的横轴可以是苹果的数量,纵轴是出现次数或频率。

Faster R-CNN (Region-based Convolutional Neural Network) 是一种常用于目标检测的深度学习模型。以下是基于 Faster R-CNN 的建模过程:

1. 数据准备:

- 获取附件1提供的成熟苹果图像数据集。

- 对图像进行标注,标明每个苹果的边界框和类别。

2. Faster R-CNN 模型结构:

Faster R-CNN 主要由两部分组成:卷积基网络(如ResNet或VGG)和两个子网络,即Region Proposal Network (RPN) 和 Region-based Convolutional Neural Network (RCNN)。

2.1 卷积基网络:

选择一个预训练的卷积基网络,如 ResNet,用于提取图像特征。这个网络的参数在训练过程中通常是不可训练的,即冻结。

2.2 Region Proposal Network (RPN):

RPN 负责生成候选的目标边界框(Region of Interest,RoI)。

- 输入:卷积基网络的特征图。

- 输出:候选边界框的坐标和置信度得分。

2.3 Region-based Convolutional Neural Network (RCNN):

RCNN 用于对每个候选边界框进行目标分类和精确的边界框回归。

- 输入:卷积基网络的特征图和由RPN生成的候选边界框。

- 输出:每个边界框的类别和坐标。

3. 损失函数:

Faster R-CNN 的损失函数包括分类损失(分类每个RoI的类别)和边界框回归损失(修正每个RoI的边界框位置)。

4. 训练:

- 使用标注的数据集对整个模型进行训练。

- 优化损失函数,通过梯度下降等优化算法来更新模型参数。

5. 预测:

- 对新的图像使用训练好的模型进行预测。

- 使用非极大值抑制(Non-Maximum Suppression,NMS)来筛选最终的目标边界框。

6. 参数设置:

- 学习率:选择一个合适的学习率,通常在训练过程中会进行学习率的调整。

- 迭代次数:根据模型在验证集上的表现,确定适当的训练迭代次数。

- Anchor Boxes:RPN使用的锚框(anchor boxes)的尺寸和宽高比需要根据数据集的特点进行调整。

7. 直方图绘制:

- 统计每张图像中检测到的苹果数量。

- 绘制直方图以展示苹果数量的分布。

Python代码实现:

import torch

import torchvision

from torchvision.models.detection import FasterRCNN

from torchvision.models.detection.rpn import AnchorGenerator

from torchvision.transforms import functional as F

from torch.utils.data import DataLoader, Dataset

 

# 定义数据集类

class AppleDataset(Dataset):

    def __init__(self, images, targets):

        self.images = images

        self.targets = targets

 

    def __len__(self):

        return len(self.images)

 

    def __getitem__(self, idx):

        image = self.images[idx]

        target = self.targets[idx]

        return F.to_tensor(image), target

 

# 创建 Faster R-CNN 模型

def create_faster_rcnn_model():

    backbone = torchvision.models.resnet50(pretrained=True)

    backbone_out_channels = backbone.fc.in_features

 

    # 使用AnchorGenerator定义RPN的anchor参数

    anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),

                                       aspect_ratios=((0.5, 1.0, 2.0),))

 

    # 定义ROI Pooling层

    roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=['0'],

                                                    output_size=7,

                                                    sampling_ratio=2)

 

    # 创建 Faster R-CNN 模型

    model = FasterRCNN(backbone,

                       num_classes=2,  # 2表示有苹果和背景两个类别

                       rpn_anchor_generator=anchor_generator,

                       box_roi_pool=roi_pooler)

 

    return model

 

# 训练函数

def train(model, train_data_loader, optimizer, criterion):

    model.train()

    for images, targets in train_data_loader:

        optimizer.zero_grad()

 

        images = list(image for image in images)

        targets = [{k: v for k, v in t.items()} for t in targets]

 

        loss_dict = model(images, targets)

        total_loss = sum(loss for loss in loss_dict.values())

        total_loss.backward()

        optimizer.step()

 

# 测试函数

def test(model, test_data_loader):

    model.eval()

    for images, targets in test_data_loader:

        with torch.no_grad():

            images = list(image for image in images)

            targets = [{k: v for k, v in t.items()} for t in targets]

            prediction = model(images)

 

            # 处理模型输出,进行目标计数等操作

 

# 主训练和测试过程

def main():

    # 加载数据集

    train_dataset = AppleDataset(train_images, train_targets)

    test_dataset = AppleDataset(test_images, test_targets)

 

    # 创建数据加载器

    train_data_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)

    test_data_loader = DataLoader(test_dataset, batch_size=2, shuffle=False)

 

    # 创建 Faster R-CNN 模型

    model = create_faster_rcnn_model()

 

    # 定义优化器和损失函数

    optimizer = torch.optim.SGD(model.parameters(), lr=0.005, momentum=0.9)

    criterion = torch.nn.CrossEntropyLoss()

 

    # 训练和测试循环

    for epoch in range(5):

        train(model, train_data_loader, optimizer, criterion)

        test(model, test_data_loader)

 

# 运行主函数

if __name__ == "__main__":

    main()

问题2解答

问题2要求根据提供的成熟苹果图像数据集,在每张图像中识别苹果的位置,并绘制两维散点图展示苹果的空间分布。以下是问题2的详细解答和建模过程:

详细解答:

1. 图像数据集:使用附件1提供的成熟苹果图像数据集。

2. 预训练的目标检测模型:在问题1中,我们已经建立了一个基于 Faster R-CNN 的目标检测模型。这个模型可以用来检测苹果的位置。

3. 苹果位置识别:对每张图像使用训练好的目标检测模型进行推理,获取苹果的位置信息(边界框坐标)。

4. 散点图绘制:将每个苹果的位置信息绘制在二维散点图上,其中 x 轴和 y 轴分别表示图像中的水平和垂直位置。

建模过程:

1. 数据预处理:对图像进行预处理,包括归一化、缩放等操作,以便输入到目标检测模型中。

2. 目标检测:使用问题1中训练好的 Faster R-CNN 模型对每张图像进行推理,得到苹果的位置信息。

3. 苹果位置获取:从模型的输出中提取苹果的位置信息,通常是边界框的坐标。

4. 散点图绘制:将每个苹果的位置信息绘制在二维散点图上,以可视化苹果的分布情况。

import torch

import torchvision.transforms as T

from torchvision.models.detection import fasterrcnn_resnet50_fpn

from torchvision import datasets

from torch.utils.data import DataLoader

import numpy as np

import matplotlib.pyplot as plt

 

# 加载训练好的 Faster R-CNN 模型

model = fasterrcnn_resnet50_fpn(pretrained=False)  # 这里使用了预训练模型,你可以加载你自己的模型

model.load_state_dict(torch.load('trained_faster_rcnn_model.pth'))

model.eval()

 

# 定义图像预处理函数

transform = T.Compose([T.ToTensor()])

 

# 加载测试图像数据集

test_dataset = datasets.ImageFolder(root='test_images', transform=transform)  # 假设测试图像存储在 'test_images' 文件夹下

test_loader = DataLoader(test_dataset, batch_size=1, shuffle=False)

 

# 遍历测试数据集并进行目标检测

all_predictions = []

 

with torch.no_grad():

    for images, _ in test_loader:

        predictions = model(images)

        all_predictions.append(predictions)

 

# 提取苹果的位置信息

apple_locations = []

 

for predictions in all_predictions:

    boxes = predictions[0]['boxes'].cpu().numpy()

    apple_locations.append(boxes)

 

# 绘制散点图

plt.figure()

for locations in apple_locations:

    plt.scatter(locations[:, 0], locations[:, 1], c='r', marker='.')

plt.xlabel('Horizontal Position')

plt.ylabel('Vertical Position')

plt.title('Apple Spatial Distribution')

plt.show()

要查看更多内容可以关注公众号Unicorn建模,或者加入交流群:721717425,里面有详细解答呀!选择Unicorn建模,让你的数模之旅不再孤单~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当讲解 R-CNN、Fast R-CNNFaster R-CNN 和 Mask R-CNN 时,你可以按照以下思路和讲解内容进行组织: 思路: 1. 介绍目标检测的概念和应用场景,以引起听众的兴趣。 2. 简要解释传统目标检测方法的局限性,如选择性搜索等。 3. 引出 R-CNN 作为第一个基于深度学习的目标检测方法,并介绍其基本原理。 4. 逐步引入 Fast R-CNNFaster R-CNN 和 Mask R-CNN,说明它们在 R-CNN 的基础上进行了哪些改进和优化。 具体讲解内容: 1. R-CNN (Region-based Convolutional Neural Networks) - 解释 R-CNN 的三个主要步骤:候选区域生成、特征提取和分类器。 - 介绍选择性搜索算法用于生成候选区域。 - 解释如何利用预训练的卷积神经网络提取候选区域的特征。 - 说明如何使用 SVM 进行目标分类。 2. Fast R-CNN - 引出 Fast R-CNN 的改进目标:加速训练和推理过程,提高检测效果。 - 解释 Fast R-CNN 的主要改进:使用全卷积网络提取特征,引入 RoI pooling 层等。 - 说明 Fast R-CNN 的训练和推理流程。 3. Faster R-CNN - 引出 Faster R-CNN 的改进目标:进一步提高检测速度。 - 介绍 Faster R-CNN 的两个核心组件:区域议网络 (RPN) 和 Fast R-CNN。 - 解释 RPN 的作用和原理,以及如何生成候选区域。 - 说明 Faster R-CNN 的训练和推理流程。 4. Mask R-CNN - 引出 Mask R-CNN 的改进目标:在目标检测的基础上增加语义分割能力。 - 解释 Mask R-CNN 的主要改进:在 Fast R-CNN 的基础上添加了一个分割分支。 - 说明如何通过在 RoI 上应用全卷积网络实现像素级别的语义分割。 通过以上思路和具体内容,你可以向听众清晰地介绍 R-CNN、Fast R-CNNFaster R-CNN 和 Mask R-CNN 的原理和演进过程。记得适当使用图表和示意图来帮助解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值