Faster R-CNN原理详解以及Pytorch实现模子练习与推理

[复制链接]
发表于 2025-10-14 21:41:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
《------往期经典保举------》

一、AI应用软件开辟实战专栏【链接】
项目名称项目名称1.【人脸辨认与管理体系开辟】2.【车牌辨认与自动收费管理体系开辟】3.【手势辨认体系开辟】4.【人脸面部活体检测体系开辟】5.【图片风格快速迁徙软件开辟】6.【人脸表心情辨认体系】7.【YOLOv8多目标辨认与自动标注软件开辟】8.【基于深度学习的行人跌倒检测体系】9.【基于深度学习的PCB板缺陷检测体系】10.【基于深度学习的生存垃圾分类目标检测体系】11.【基于深度学习的安全帽目标检测体系】12.【基于深度学习的120种犬类检测与辨认体系】13.【基于深度学习的路面坑洞检测体系】14.【基于深度学习的火焰烟雾检测体系】15.【基于深度学习的钢材外貌缺陷检测体系】16.【基于深度学习的舰船目标分类检测体系】17.【基于深度学习的西红柿成熟度检测体系】18.【基于深度学习的血细胞检测与计数体系】19.【基于深度学习的吸烟/吸烟举动检测体系】20.【基于深度学习的水稻害虫检测与辨认体系】21.【基于深度学习的高精度车辆行人检测与计数体系】22.【基于深度学习的路面标志线检测与辨认体系】23.【基于深度学习的智能小麦害虫检测辨认体系】24.【基于深度学习的智能玉米害虫检测辨认体系】25.【基于深度学习的200种鸟类智能检测与辨认体系】26.【基于深度学习的45种交通标志智能检测与辨认体系】27.【基于深度学习的人脸面部心情辨认体系】28.【基于深度学习的苹果叶片病害智能诊断体系】29.【基于深度学习的智能肺炎诊断体系】30.【基于深度学习的葡萄簇目标检测体系】31.【基于深度学习的100种中草药智能辨认体系】32.【基于深度学习的102种花卉智能辨认体系】33.【基于深度学习的100种蝴蝶智能辨认体系】34.【基于深度学习的水稻叶片病害智能诊断体系】35.【基于与ByteTrack的车辆行人多目标检测与追踪体系】36.【基于深度学习的智能草莓病害检测与分割体系】37.【基于深度学习的复杂场景下船舶目标检测体系】38.【基于深度学习的农作物幼苗与杂草检测体系】39.【基于深度学习的智能门路缝隙检测与分析体系】40.【基于深度学习的葡萄病害智能诊断与防治体系】41.【基于深度学习的遥感地理空间物体检测体系】42.【基于深度学习的无人机视角地面物体检测体系】43.【基于深度学习的木薯病害智能诊断与防治体系】44.【基于深度学习的田野火焰烟雾检测体系】45.【基于深度学习的脑肿瘤智能检测体系】46.【基于深度学习的玉米叶片病害智能诊断与防治体系】47.【基于深度学习的橙子病害智能诊断与防治体系】48.【基于深度学习的车辆检测追踪与流量计数体系】49.【基于深度学习的行人检测追踪与双向流量计数体系】50.【基于深度学习的反光衣检测与预警体系】51.【基于深度学习的伤害地区职员突入检测与报警体系】52.【基于深度学习的高密度人脸智能检测与统计体系】53.【基于深度学习的CT扫描图像肾结石智能检测体系】54.【基于深度学习的水果智能检测体系】55.【基于深度学习的水果质量优劣智能检测体系】56.【基于深度学习的蔬菜目标检测与辨认体系】57.【基于深度学习的非机动车驾驶员头盔检测体系】58.【太基于深度学习的阳能电池板检测与分析体系】59.【基于深度学习的工业螺栓螺母检测】60.【基于深度学习的金属焊缝缺陷检测体系】61.【基于深度学习的链条缺陷检测与辨认体系】62.【基于深度学习的交通讯号灯检测辨认】63.【基于深度学习的草莓成熟度检测与辨认体系】64.【基于深度学习的水下海生物检测辨认体系】65.【基于深度学习的门路交通变乱检测辨认体系】66.【基于深度学习的安检X光伤害品检测与辨认体系】67.【基于深度学习的农作物种别检测与辨认体系】68.【基于深度学习的伤害驾驶举动检测辨认体系】69.【基于深度学习的维修工具检测辨认体系】70.【基于深度学习的维修工具检测辨认体系】71.【基于深度学习的构筑墙面损伤检测体系】72.【基于深度学习的煤矿传送带异物检测体系】73.【基于深度学习的老鼠智能检测体系】74.【基于深度学习的水面垃圾智能检测辨认体系】75.【基于深度学习的遥感视角船只智能检测体系】76.【基于深度学习的胃肠道息肉智能检测分割与诊断体系】77.【基于深度学习的心脏超声图像隔断壁检测分割与分析体系】78.【基于深度学习的心脏超声图像隔断壁检测分割与分析体系】79.【基于深度学习的果园苹果检测与计数体系】80.【基于深度学习的半导体芯片缺陷检测体系】81.【基于深度学习的糖尿病视网膜病变检测与诊断体系】82.【基于深度学习的运动鞋品牌检测与辨认体系】83.【基于深度学习的苹果叶片病害检测辨认体系】84.【基于深度学习的医学X光骨折检测与语音提示体系】85.【基于深度学习的遥感视角农田检测与分割体系】86.【基于深度学习的运动品牌LOGO检测与辨认体系】87.【基于深度学习的电瓶车进电梯检测与语音提示体系】88.【基于深度学习的遥感视角地面房屋构筑检测分割与分析体系】二、呆板学习实战专栏【链接】,已更新31期,欢迎关注,一连更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,一连更新中~~
六、YOLO性能对比专栏【链接】,一连更新中~
《------正文------》



弁言

如今大多数SOTA模子都是创建在Faster-RCNN模子的根本之上。Faster R-CNN是一种对象检测模子,它可以辨认图像中的对象,并在它们附近绘制边界框,同时还可以对这些对象举行分类。这是一个两级探测器:

  • 阶段1:提出图像中大概包罗对象的潜伏地区。这是由**Region Proposal Network(RPN)**处理处罚的。
  • 阶段2:利用这些发起的地区来推测对象的种别,并细化边界框以更好地匹配对象。
Faster R-CNN架构


第一阶段:地区提案网络(RPN)

骨干网



  • 图像通过卷积网络(如ResNet或VGG16)。
  • 这将从图像中提取紧张特性并创建特性图。
锚框



  • 锚框是放置在特性图上的点上的差异巨细和外形的框。
  • 每个锚框体现大概的对象位置。
  • 在特性图上的每个点处,天生具有差异巨细和纵横比的锚框。
目标分类



  • RPN推测每个锚框是配景(无对象)照旧远景(包罗对象)。
  • 正(远景)锚点:与实际对象高度重叠的框。
  • 负(配景)锚点:与对象险些没有重叠的框。
边界框优化



  • RPN还通过推测偏移(调解)来细化锚框,以更好地将其与实际对象对齐。
丧失函数:
I)分类丧失:资助模子决定锚是配景照旧远景。
II)回归丧失:资助调解锚框以更准确地顺应对象。
阶段2:目标分类和框细化

Region Proposals地区发起



  • 在RPN之后,我们得到地区发起(大概包罗对象的细化框)。
ROI池化



  • 地区发起有差异的巨细,但神经网络须要固定巨细的输入。
  • ROI池化通过将全部地区方案分别为较小的地区并应用池化来将它们调解为固定巨细,从而使它们匀称划一。
对象分类



  • 每个地区发起通过一个小网络来推测种别(比方,狗、汽车等)内里的物体。
  • 交织熵丧失用于将对象分类到种别中。
边界框优化(再次)



  • 利用偏移量,再次细化地区发起,以更好地匹配实际对象。
  • 这利用回归丧失来调解发起。
多任务学习



  • 第二阶段的网络同时学习推测对象种别和优化边界框。
推理(测试/推测时间):



  • Top Region Proposals:在测试过程中,模子会天生大量的地区发起,但只有顶级发起(具有最高分类分数)会被通报到第二阶段。
  • 终极推测:第二阶段推测终极的种别和边界框。
  • 非最大克制:一种称为非最大克制的技能被应用于删除重复或重叠的框,只保存最好的框。
练习

两种练习方式:

  • 分阶段练习:起首练习地区发起网络(RPN),然后练习分类器和回归器。
  • 同时练习:同时练习两个阶段(更快,更有用)。
在PyTorch中实现和微调Faster R-CNN

步调1:安装所需的库

  1. pip install torch torchvision
复制代码
步调2:导入所需库

  1. import torch
  2. from torch.utils.data import DataLoader
  3. import torchvision
  4. from torchvision.models.detection import fasterrcnn_resnet50_fpn
  5. from torchvision.datasets import ImageFolder
  6. from torchvision import transforms
  7. import torchvision.transforms as T
  8. from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
复制代码
步调3:加载预练习的Faster R-CNN模子

PyTorch的torchvision提供了一个在COCO上预练习的更快的R-CNN模子。您可以通过更改末了一层中的类数目来修改您自己的数据集。
  1. # Load the pre-trained Faster R-CNN model with a ResNet-50 backbone
  2. model = fasterrcnn_resnet50_fpn(pretrained=True)
  3. # Number of classes (your dataset classes + 1 for background)
  4. num_classes = 3  # For example, 2 classes + background
  5. # Get the number of input features for the classifier
  6. in_features = model.roi_heads.box_predictor.cls_score.in_features
  7. # Replace the head of the model with a new one (for the number of classes in your dataset)
  8. model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes)
复制代码
步调4:准备数据集



  • Faster R-CNN须要图像和相应的表明(边界框和标签)。
  • **您的数据集应返回:包罗边界框(*框*)和标签(*标签*)的图像和目标字典。
如有须要,请创建自界说数据集类。您可以利用 torchvision.datasets.ImageFolder 并在表明文件中提供边界框或创建自界说Dataset类。
  1. # Define transformations (e.g., resizing, normalization)
  2. transform = T.Compose([
  3.     T.ToTensor(),
  4. ])
  5. # Custom Dataset class or using an existing one
  6. class CustomDataset(torch.utils.data.Dataset):
  7.     def __init__(self, transforms=None):
  8.         # Initialize dataset paths and annotations here
  9.         self.transforms = transforms
  10.         # Your dataset logic (image paths, annotations, etc.)
  11.     def __getitem__(self, idx):
  12.         # Load image
  13.         img = ...  # Load your image here
  14.         # Load corresponding bounding boxes and labels
  15.         boxes = ...  # Load or define bounding boxes
  16.         labels = ...  # Load or define labels
  17.         # Create a target dictionary
  18.         target = {}
  19.         target["boxes"] = torch.tensor(boxes, dtype=torch.float32)
  20.         target["labels"] = torch.tensor(labels, dtype=torch.int64)
  21.         # Apply transforms
  22.         if self.transforms is not None:
  23.             img = self.transforms(img)
  24.         return img, target
  25.     def __len__(self):
  26.         # Return the length of your dataset
  27.         return len(self.data)
复制代码
步调5:设置数据加载器

  1. # Load dataset
  2. dataset = CustomDataset(transforms=transform)
  3. # Split into train and validation sets
  4. indices = torch.randperm(len(dataset)).tolist()
  5. train_dataset = torch.utils.data.Subset(dataset, indices[:-50])
  6. valid_dataset = torch.utils.data.Subset(dataset, indices[-50:])
  7. # Create data loaders
  8. train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True,
  9.                                    collate_fn=lambda x: tuple(zip(*x)))
  10. valid_loader = DataLoader(valid_dataset, batch_size=4, shuffle=False,
  11.                                     collate_fn=lambda x: tuple(zip(*x)))
复制代码
步调6:设置练习循环

如今设置优化器和练习循环。对于Faster R-CNN,通常利用SGD或Adam作为优化器。
  1. # Move model to GPU if available
  2. device = torch.device('cuda') if torch.cuda.is_available()
  3.                                else torch.device('cpu')
  4. model.to(device)
  5. # Set up the optimizer
  6. params = [p for p in model.parameters() if p.requires_grad]
  7. optimizer = torch.optim.SGD(params, lr=0.005, momentum=0.9,
  8.                                                    weight_decay=0.0005)
  9. # Learning rate scheduler
  10. lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=3,
  11.                                                                gamma=0.1)
  12. # Train the model
  13. num_epochs = 10
  14. for epoch in range(num_epochs):
  15.     model.train()
  16.     train_loss = 0.0
  17.    # Training loop
  18.     for images, targets in train_loader:
  19.         images = list(image.to(device) for image in images)
  20.         targets = [{k: v.to(device) for k, v in t.items()} for t in targets]
  21.         # Zero the gradients
  22.         optimizer.zero_grad()
  23.         # Forward pass
  24.         loss_dict = model(images, targets)
  25.         losses = sum(loss for loss in loss_dict.values())
  26.         # Backward pass
  27.         losses.backward()
  28.         optimizer.step()
  29.         train_loss += losses.item()
  30.     # Update the learning rate
  31.     lr_scheduler.step()
  32.     print(f'Epoch: {epoch + 1}, Loss: {train_loss / len(train_loader)}')
  33. print("Training complete!")
复制代码
步调7:评估模子

练习后,您可以在验证集上评估模子,或将其用于新图像的推理。
  1. # Set the model to evaluation mode
  2. model.eval()
  3. # Test on a new image
  4. with torch.no_grad():
  5.     for images, targets in valid_loader:
  6.         images = list(img.to(device) for img in images)
  7.         predictions = model(images)
  8.         # Example: print the bounding boxes and labels for the first image
  9.         print(predictions[0]['boxes'])
  10.         print(predictions[0]['labels'])
复制代码
8.推理

要在新图像上运行推理,请实验以下操纵:
  1. import cv2
  2. from PIL import Image
  3. # Load image
  4. img = Image.open("path/to/your/image.jpg")
  5. # Apply the same transformation as for training
  6. img = transform(img)
  7. img = img.unsqueeze(0).to(device)
  8. # Model prediction
  9. model.eval()
  10. with torch.no_grad():
  11.     prediction = model([img])
  12. # Print the predicted bounding boxes and labels
  13. print(prediction[0]['boxes'])
  14. print(prediction[0]['labels'])
复制代码


好了,这篇文章就先容到这里,喜欢的小搭档感谢给点个赞和关注,更多精彩内容一连更新~~
关于本篇文章各人有任何发起或意见,欢迎在品评区留言互换!

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表