在计算机视觉的世界里,目标检测一直是个“烧脑”的问题。让计算机识别物体 “是什么”(分类)相对简单,但让它 “在哪里”(定位)就难了。
我们先简单回顾目标检测的进化史,看看 Faster R-CNN 到底解决了什么问题。
在 Faster R-CNN 出现之前,我们有三个老前辈:
关键词:RPN + 共享特征图 + 端到端训练
Faster R-CNN 主要解决了两个痛点:
Faster R-CNN 的创新点:
一句话总结:Faster R-CNN = CNN + RPN + ROI Pooling + 分类+ 回归
Faster R-CNN 的整体结构如下👇
Faster R-CNN 使用 CNN(通常是 ResNet)来提取图像的特征,作用是把 输入的图片 变成 Feature Map。
示例:
RPN 解决的问题: 以往的目标检测器(如 R-CNN)需要手工选候选框,而 RPN 让网络自己选,省时省力!
RPN 的流程:
Anchor 是 Faster R-CNN 的核心概念,是 RPN 提出的 “候选框”。
简而言之:Anchor 让 Faster R-CNN 不用从零开始学框,而是基于预定义框进行微调,学习更高效!
问题:RPN 生成的候选框大小不一,怎么处理?
ROI Pooling 解决方案:
ROI Pooling 的作用:让不同大小的框变成统一大小,方便后续处理。
最后,经过 ROI Pooling 处理的特征进入全连接层,完成两件事:
先安装 PyTorch 相关依赖:
pip install torch torchvision matplotlib
然后导入必要库:
import torch
import torchvision
from torchvision.models.detection import fasterrcnn_resnet50_fpn
import matplotlib.pyplot as plt
from PIL import Image
import torchvision.transforms as T
model = fasterrcnn_resnet50_fpn(pretrained=True)
model.eval()
image = Image.open("test.jpg")
transform = T.Compose([T.ToTensor()])
image = transform(image).unsqueeze(0) # 增加 batch 维度
with torch.no_grad():
prediction = model(image)
import matplotlib.patches as patches
fig, ax = plt.subplots(1, figsize=(8, 6))
ax.imshow(Image.open("test.jpg"))
for box, score in zip(prediction[0]['boxes'], prediction[0]['scores']):
if score > 0.5:
x1, y1, x2, y2 = box
rect = patches.Rectangle((x1, y1), x2 - x1, y2 - y1, linewidth=2, edgecolor='r', facecolor='none')
ax.add_patch(rect)
plt.show()
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。