这次亚太杯咱们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建模,让你的数模之旅不再孤单~