写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN
写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN引言在前面的文章中我们学习了图像分类——判断图像中是否存在特定物体。但在实际应用中我们往往需要知道物体在哪里这就是对象识别Object Detection。RCNNRegion-based Convolutional Neural Networks是对象识别领域的里程碑而 Fast-RCNN 则解决了 RCNN 速度慢的问题。本文将从实战角度带你一步步理解并实现这两个算法。## 对象识别的基本概念对象识别需要完成两个任务1.识别物体类别分类2.定位物体位置通过边界框 Bounding Box 表示RCNN 的思路是先提取候选区域Region Proposals然后对每个候选区域进行分类和边界框回归。Fast-RCNN 则通过共享卷积计算来加速。## RCNN 原理与实现### RCNN 工作流程1. 使用选择性搜索Selective Search生成约 2000 个候选区域2. 将每个候选区域缩放至固定大小如 227x2273. 使用预训练的 CNN 提取特征4. 对每个候选区域使用 SVM 分类器和边界框回归器### 实战代码RCNN 候选区域提取与特征提取pythonimport cv2import numpy as npimport torchimport torchvision.models as modelsfrom torchvision import transformsfrom PIL import Image# 加载预训练的 ResNet18 模型去掉全连接层作为特征提取器class FeatureExtractor(torch.nn.Module): def __init__(self): super().__init__() resnet models.resnet18(pretrainedTrue) # 去掉最后的平均池化和全连接层 self.features torch.nn.Sequential(*list(resnet.children())[:-2]) def forward(self, x): return self.features(x)# 图像预处理transform transforms.Compose([ transforms.Resize((227, 227)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225])])# 选择性搜索生成候选区域def selective_search(image): 使用 OpenCV 的选择性搜索生成候选区域 ss cv2.ximgproc.segmentation.createSelectiveSearchSegmentation() ss.setBaseImage(image) ss.switchToSelectiveSearchFast() rects ss.process() # 限制候选区域数量RCNN 通常取前 2000 个 return rects[:2000]# 提取候选区域特征def extract_region_features(image_path): 对图像中的每个候选区域提取 CNN 特征 # 加载图像 image cv2.imread(image_path) image_rgb cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 生成候选区域 rects selective_search(image) # 初始化特征提取器 extractor FeatureExtractor() extractor.eval() features_list [] for (x, y, w, h) in rects: # 裁剪候选区域 region image_rgb[y:yh, x:xw] # 转换为 PIL 图像并预处理 region_pil Image.fromarray(region) region_tensor transform(region_pil).unsqueeze(0) # 提取特征 with torch.no_grad(): features extractor(region_tensor) features_list.append(features.squeeze().numpy()) return np.array(features_list), rects# 示例提取特征假设有一张图片 dog.jpg# features, rects extract_region_features(dog.jpg)# print(f提取了 {len(features)} 个候选区域的特征每个特征维度为 {features.shape[1]})## Fast-RCNN 的改进与实现### Fast-RCNN 的创新点1.共享卷积计算整张图像只经过一次 CNN而不是每个候选区域都计算2.RoI Pooling将不同大小的候选区域映射到固定大小的特征图3.多任务损失同时训练分类器和边界框回归器### 实战代码Fast-RCNN 核心组件实现pythonimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom torchvision.ops import RoIPoolclass FastRCNN(nn.Module): 简化的 Fast-RCNN 实现仅用于演示核心思想 def __init__(self, num_classes20): super().__init__() # 共享卷积层使用预训练的 VGG16 前几层 self.conv_layers nn.Sequential( nn.Conv2d(3, 64, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(64, 128, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), nn.Conv2d(128, 256, kernel_size3, padding1), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), ) # RoI Pooling输出固定大小 7x7 self.roi_pool RoIPool(output_size(7, 7), spatial_scale1/8) # 因为经过3次池化缩放因子为1/8 # 分类头 self.fc_cls nn.Sequential( nn.Linear(256 * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5), nn.Linear(4096, num_classes) # 输出类别分数 ) # 边界框回归头 self.fc_reg nn.Sequential( nn.Linear(256 * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5), nn.Linear(4096, num_classes * 4) # 每个类别输出4个坐标偏移 ) def forward(self, images, rois): images: 输入图像 batch (N, C, H, W) rois: 候选区域列表每个元素是 (batch_index, x1, y1, x2, y2) # 1. 共享卷积计算 conv_features self.conv_layers(images) # 2. RoI Pooling pooled_features self.roi_pool(conv_features, rois) # (num_rois, 256, 7, 7) # 3. 展平特征 flattened pooled_features.view(pooled_features.size(0), -1) # 4. 分类和回归 cls_scores self.fc_cls(flattened) # (num_rois, num_classes) reg_deltas self.fc_reg(flattened) # (num_rois, num_classes * 4) return cls_scores, reg_deltas# 训练示例模拟数据def train_fast_rcnn(): 演示 Fast-RCNN 的训练流程 model FastRCNN(num_classes20) # 20个PASCAL VOC类别背景 # 模拟输入数据 batch_images torch.randn(2, 3, 224, 224) # 2张图像 # 模拟候选区域每张图像2个候选区域 rois torch.tensor([ [0, 10, 10, 50, 50], # 图像1的候选区域1 [0, 30, 30, 80, 80], # 图像1的候选区域2 [1, 5, 5, 40, 40], # 图像2的候选区域1 [1, 60, 60, 100, 100] # 图像2的候选区域2 ], dtypetorch.float) # 模拟标签类别和边界框 cls_labels torch.tensor([0, 1, 2, 0]) # 类别ID reg_targets torch.randn(4, 20 * 4) # 边界框回归目标 # 前向传播 cls_scores, reg_deltas model(batch_images, rois) # 计算损失 cls_loss F.cross_entropy(cls_scores, cls_labels) reg_loss F.smooth_l1_loss(reg_deltas, reg_targets) total_loss cls_loss reg_loss print(f分类损失: {cls_loss.item():.4f}) print(f回归损失: {reg_loss.item():.4f}) print(f总损失: {total_loss.item():.4f}) # 反向传播实际训练时需要优化器 total_loss.backward() print(训练完成)# 运行训练示例# train_fast_rcnn()## RCNN vs Fast-RCNN 性能对比| 特性 | RCNN | Fast-RCNN ||------|------|-----------|| 候选区域特征提取 | 每个区域单独计算 CNN | 整图计算一次 CNN || 训练速度 | 慢需要存储中间特征 | 快端到端训练 || 测试速度 | 每张图约 47 秒 | 每张图约 0.3 秒 || 精度 (mAP) | ~66% | ~70% |## 实际应用注意事项1.候选区域生成选择性搜索较慢现代方法使用 RPNRegion Proposal Network2.NMS非极大值抑制去除重叠的边界框3.数据增强随机裁剪、翻转等提高泛化能力4.学习率调度使用 warmup 策略稳定训练## 完整训练流程示例python# 简化的训练循环仅用于演示结构def training_loop(model, dataloader, optimizer, num_epochs10): model.train() for epoch in range(num_epochs): total_loss 0 for batch_idx, (images, rois, cls_labels, reg_targets) in enumerate(dataloader): optimizer.zero_grad() # 前向传播 cls_scores, reg_deltas model(images, rois) # 计算损失 cls_loss F.cross_entropy(cls_scores, cls_labels) reg_loss F.smooth_l1_loss(reg_deltas, reg_targets) loss cls_loss reg_loss # 反向传播 loss.backward() optimizer.step() total_loss loss.item() if batch_idx % 100 0: print(fEpoch {epoch}, Batch {batch_idx}, Loss: {loss.item():.4f}) avg_loss total_loss / len(dataloader) print(fEpoch {epoch} 平均损失: {avg_loss:.4f})## 总结本文从实战角度介绍了对象识别的两个经典算法RCNN 和 Fast-RCNN。RCNN 开创了 “区域提议 CNN” 的范式但速度较慢Fast-RCNN 通过共享卷积计算和多任务学习大幅提升了效率。虽然现在 Faster-RCNN、YOLO、SSD 等更先进的算法已经普及但理解 RCNN 和 Fast-RCNN 的核心思想对于掌握对象识别技术至关重要。在实际项目中建议优先使用 Torchvision 中实现的 Faster-RCNN 或使用 YOLOv5/YOLOv8 等现代框架。但当你需要自定义网络结构或深入优化时本文介绍的特征提取、RoI Pooling 和多任务损失设计思路将为你提供坚实的基础。记住机器学习的发展是一个不断迭代的过程理解经典算法能让你更好地把握最新的技术趋势。

相关新闻

如何10倍提升GitHub下载速度:Fast-GitHub浏览器插件完整指南

如何10倍提升GitHub下载速度:Fast-GitHub浏览器插件完整指南

如何10倍提升GitHub下载速度:Fast-GitHub浏览器插件完整指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 如果你在国…

2026/8/11 8:08:40 阅读更多 →
《Machine Learning in Action》—— 浅谈线性回归的那些事

《Machine Learning in Action》—— 浅谈线性回归的那些事

《Machine Learning in Action》—— 浅谈线性回归的那些事 大家好,我是你们的老朋友,一个天天和代码、数据打交道的技术博主。今天,我们来聊聊机器学习里的一个经典话题——线性回归。别看它名字里带个“线性”,就觉得它简单到不…

2026/8/11 0:40:21 阅读更多 →
魔兽争霸3终极优化指南:5个简单步骤解决Win10/Win11卡顿闪退问题

魔兽争霸3终极优化指南:5个简单步骤解决Win10/Win11卡顿闪退问题

魔兽争霸3终极优化指南:5个简单步骤解决Win10/Win11卡顿闪退问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为心爱的《魔兽争霸3…

2026/8/15 18:29:19 阅读更多 →

最新新闻

DB2存储过程SQLCODE -420错误:数据类型转换失败的系统化诊断与解决方案

DB2存储过程SQLCODE -420错误:数据类型转换失败的系统化诊断与解决方案

1. 问题初探:当存储过程执行撞上SQLCODE -420在DB2数据库的日常开发和运维中,存储过程是封装复杂业务逻辑、提升性能的利器。但当你满怀信心地执行一个精心编写的存储过程,屏幕上却赫然出现SQLCODE: -420, SQLSTATE: 22018这样的错误信息时&a…

2026/8/16 3:11:53 阅读更多 →
RoboMaster_C板_启动与复位_CSDN

RoboMaster_C板_启动与复位_CSDN

RoboMaster C 板烧录后没反应?聊聊 BOOT0 拉低与下载后按复位的原因 文章目录RoboMaster C 板烧录后没反应?聊聊 BOOT0 拉低与下载后按复位的原因一、背景二、为什么 BOOT0 必须拉低2.1 STM32 上电后先"看脚色"2.2 0 地址是个"别名窗口&q…

2026/8/16 3:11:53 阅读更多 →
Python数据规整:聚合、合并与重塑实战技巧

Python数据规整:聚合、合并与重塑实战技巧

1. Python大数据分析中的数据规整核心逻辑在大数据分析的实际场景中,原始数据往往以分散、杂乱的形式存在。数据规整(Data Wrangling)作为分析前的关键预处理阶段,其本质是通过系统化的操作将原始数据转化为适合分析的结构化形式。…

2026/8/16 3:11:53 阅读更多 →
Windows安全中心无法打开的完整修复指南:从服务重启到系统重置

Windows安全中心无法打开的完整修复指南:从服务重启到系统重置

1. 问题概述:当Windows安全中心“罢工”时如果你正在使用Windows 11,某天突然发现右下角那个熟悉的盾牌图标点不开了,或者点击“病毒和威胁防护”时页面一片空白、转圈圈,甚至直接弹出一个“页面不可用”的错误提示,别…

2026/8/16 3:11:53 阅读更多 →
百万 token 窗口的代价:Cline 账单暴涨 300% 后,我的预算分配表救场

百万 token 窗口的代价:Cline 账单暴涨 300% 后,我的预算分配表救场

百万 token 窗口的代价:Cline 账单暴涨 300% 后,我的预算分配表救场 百万token陷阱:一次昂贵的RAG系统选型教训与技术救赎 危机爆发:企业微信的17条告警 灰度上线的第3天凌晨2点37分,企业微信突然炸出17条告警消息--全部来自Cline的API超额计费通知。我睡眼惺忪地打开监控面板…

2026/8/16 3:11:53 阅读更多 →
《大话数据结构》第8章精读:二叉排序树(BST)完整 C++ 实现(插入、查找、删除、遍历)

《大话数据结构》第8章精读:二叉排序树(BST)完整 C++ 实现(插入、查找、删除、遍历)

1. 二叉排序树的定义进入《大话数据结构》第8章「查找」,本章第一个重点就是二叉排序树(Binary Sort Tree / Binary Search Tree,简称 BST)。它把“排序”和“查找”结合在一起,是后续平衡二叉树、B 树等内容的基础。二…

2026/8/16 3:10:53 阅读更多 →

日新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/16 0:00:54 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/16 0:00:55 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/16 0:03:55 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →