目标检测——RCNN之建议框padding

博客详细介绍了在RCNN目标检测过程中,如何进行建议框的context padding,澄清了原论文中关于resize图片的疑惑。作者通过研究`rcnn_create_model.m`, `rcnn_extract_regions.m`, `rcnn_im_crop.m`三个文件,发现padding并非简单的等距扩大16像素,而是基于图像长宽比进行,以保持形状不变。同时提到了各向同性和各向异性变形的概念,并推荐了一篇相关文章进行深入理解。" 136089646,8269512,前后端交互实现分页功能设计解析,"['前端开发', '后端开发', '数据库']
摘要由CSDN通过智能技术生成

在学习RCNN的过程中,一直搞不明白resize 227*227这个步骤之前的context padding(建议框padding)这个步骤是怎么进行的,因为发现原论文中最后得到的resize图片(下图 a中红框)跟我所理解得到的resize图片不太相符,

                                                                                      图 a 

我所理解的padding后的图片,应该是上下左右都等距地扩大16个像素值,但是从图a中红框可以看出原文并没有进行等距地扩大16个像素,所以百思不得其解,在google各种问题,查看各种网址,最终在源代码中找到了答案,分别查看:

1. rcnn_create_model.m

2.rcnn_extract_regions.m

3.rcnn_im_crop.m

这3个文件发现:虽然文中说是padding 16个像素值,但是却是在保持长宽比的基础上进行padding,也就是说如果一幅影像的长宽比不是1:1的话,那么建议框的扩大也不是按照1:1进行。

对于文中出现的各向同性变形以及各向异性变形,可以参考这篇文章:

https://www.jianshu.com/p/3a0a0e5a26a1 

终于可以睡觉了~各位早安,晚安~

以下是使用PyTorch实现Faster R-CNN目标检测的示例代码: ```python import torch import torchvision import torchvision.transforms as transforms import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torch.autograd import Variable from collections import OrderedDict import numpy as np import cv2 import os # 定义超参数 learning_rate = 0.001 num_epochs = 5 batch_size = 16 # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)) ]) # 加载COCO数据集 train_data = torchvision.datasets.CocoDetection(root='./data', annFile='./data/annotations/instances_train2017.json', transform=transform) train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True) # 定义模型 class FasterRCNN(nn.Module): def __init__(self): super(FasterRCNN, self).__init__() self.features = nn.Sequential(OrderedDict([ ('conv1', nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)), ('relu1', nn.ReLU(inplace=True)), ('conv2', nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1)), ('relu2', nn.ReLU(inplace=True)), ('conv3', nn.Conv2d(128, 256, kernel_size=3, stride=1, padding=1)), ('relu3', nn.ReLU(inplace=True)), ('conv4', nn.Conv2d(256, 512, kernel_size=3, stride=1, padding=1)), ('relu4', nn.ReLU(inplace=True)), ('conv5', nn.Conv2d(512, 512, kernel_size=3, stride=1, padding=1)), ('relu5', nn.ReLU(inplace=True)), ('maxpool', nn.MaxPool2d(kernel_size=2, stride=2)) ])) self.roi_pool = nn.AdaptiveMaxPool2d((7, 7)) self.head = nn.Sequential(OrderedDict([ ('fc6', nn.Linear(7 * 7 * 512, 4096)), ('relu6', nn.ReLU(inplace=True)), ('drop6', nn.Dropout()), ('fc7', nn.Linear(4096, 4096)), ('relu7', nn.ReLU(inplace=True)), ('drop7', nn.Dropout()) ])) self.cls_score = nn.Linear(4096, 80) self.bbox_pred = nn.Linear(4096, 320) def forward(self, x, rois): x = self.features(x) x = self.roi_pool(x) x = self.head(x.view(x.size(0), -1)) cls_score = self.cls_score(x) bbox_pred = self.bbox_pred(x) return cls_score, bbox_pred # 定义损失函数和优化器 model = FasterRCNN() criterion_cls = nn.CrossEntropyLoss() criterion_bbox = nn.SmoothL1Loss() optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9) # 训练模型 for epoch in range(num_epochs): for i, (images, targets) in enumerate(train_loader): images = Variable(images) targets = [{k: Variable(v) for k, v in t.items()} for t in targets] # 前向传播 cls_scores, bbox_preds = model(images, targets) cls_scores = torch.cat(cls_scores, dim=0) bbox_preds = torch.cat(bbox_preds, dim=0) cls_targets = torch.cat([t['labels'] for t in targets]) bbox_targets = torch.cat([t['boxes'] for t in targets]) # 计算损失 loss_cls = criterion_cls(cls_scores, cls_targets) loss_bbox = criterion_bbox(bbox_preds, bbox_targets) loss = loss_cls + loss_bbox # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (i + 1) % 100 == 0: print("Epoch [{}/{}], Iteration [{}/{}], Loss: {:.4f}" .format(epoch + 1, num_epochs, i + 1, len(train_loader), loss.item())) # 保存模型 torch.save(model.state_dict(), 'faster_rcnn.pth') ``` 注意:以上代码仅是一个示例,实际使用时可能需要进行适当的修改和调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值