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建模,让你的数模之旅不再孤单~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值