强化学习做目标检测(通俗原理+结合案例+代码分析)
强化学习做目标检测结合案例代码分析项目源码什么是目标检测目标检测Object Detection的任务是在原始图像中找出感兴趣的目标, 具体分为两项工作找出目标在哪里即对目标物体定位目前常用的方法是用矩形框标定。判断目标是什么即进行分类Classification输出其类别。目标检测为什么可以用强化学习来做目标检测目前普遍是用深度学习来做的检测性能取决于特征提取网络的好坏所以基于深度学习的目标检测方法几乎都在卷特征提取网络的设计。强化学习的出现为目标检测问题提供了新的思路它将目标检测问题看成一系列控制问题强化学习具有强大的决策能力它可以指导当前矩形框采取一个最合适的动作平移或者伸缩去靠近目标经过多次迭代之后矩形框就移动到了目标的位置。我用强化学习的方法实现了对工业零件的检测展示一下结果强化学习的建模那么如何实现这个方法呢强化学习有三个要素状态state、动作action、奖励reward), 我们需要根据不同的场景对这三个要素进行定义建立模型。状态建模状态是智能体agent“眼中的世界”, 由不同特征信息构成智能体会用这些信息来决定下一步做什么所以我们在状态建模过程中要考虑有哪些特征信息会对决策有影响。在目标检测中我们通常把矩形框区域的图像特征作为当前状态具体做法是将矩形框区域的图像从原始图像中裁剪出来然后输入到预训练的卷积神经网络中得到其特征向量我这边用的是3层VGG。动作建模动作的意义在于使智能体在不同状态进行切换、尝试这样才有可能找到目标状态。所以设计的动作理论上要能够使智能体到达任意一种状态。在目标检测中动作主要包含平移、缩放、终止这三类动作矩形框用左上角和右下角的顶点表示部分代码如下ifaction0:# 左移ifself.current_box[0]-step_stride0:#如果没有超过边界self.current_box[0]-step_stride self.current_box[2]-step_strideelifaction4:# 等比例压缩dx(self.current_box[2]-self.current_box[0])*0.1/2.0dy(self.current_box[2]-self.current_box[0])*0.1/2.0self.current_box[0]dx self.current_box[2]-dx self.current_box[1]dy self.current_box[3]-dy奖励函数设计奖励可以把好的状态和不好的状态区分开来进而引导智能体向着好的状态靠近。所以在设计奖励函数时我们要考虑可以用哪些指标来定义状态的好坏。在目标检测当中我们常用iou这个指标来衡量矩形框的精度。如果当前的iou比上一时刻的值要大说明当前矩形框更接近目标那就给一个奖励1反之则为-1。defreward_function(self,done):reward0#iouiouself.compute_iou()ifdoneFalse:#如果还没到最后一步ifiouiou_done_th:d_iouiou-self.last_iou#计算调整前后iou之差ifd_iouiou_step_th:reward1reward_iou_stepelifd_iou-iou_step_th:reward1-reward_iou_stepelse:reward10rewardreward1else:rewardreward_done doneTrueelse:ifiouiou_done_th:rewardreward_doneelifiouiou_done_th-0.1:#如果iou0.5认为检测不成功reward-reward_doneelse:reward0.5*reward_done self.last_iouioureturnreward,doneDQN网络在定义了状态、动作、奖励之后我们可以用探索与利用策略产生经验experience), 送入强化学习网络中进行训练。经典的强化学习网络有PPO、TD3、DQN系列等。我这边用的是DQN网络DQN使用神经网络训练拟合最优Q函数它告诉了我们在当前状态下采取哪个动作价值最大。常用的模型结构是先用3层卷积提取图像特征最后使用2个线性层进行预测。classDQN(nn.Module):def__init__(self,num_actions):super(DQN,self).__init__()self.featuresnn.Sequential(# 第一层卷积块nn.Conv2d(3,64,kernel_size3,padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),# 第二层卷积块nn.Conv2d(64,128,kernel_size3,padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),# 第三层卷积块nn.Conv2d(128,256,kernel_size3,padding1),nn.ReLU(inplaceTrue),nn.MaxPool2d(kernel_size2,stride2),)self.classifiernn.Sequential(nn.Linear(256*28*28,4096),nn.ReLU(inplaceTrue),nn.Dropout(0.5),nn.Linear(4096,num_actions),# 输出每个动作的Q值)训练我这边用了500张图片构建数据集包含5种零件各100张。每张图片训练40步每次模型优化的batch_size是100每1000步更新一次target_net的网络参数。deftrain(env,agent):forepisodeinrange(num_episodes):#进入一个周期#初始化stateenv.reset()doneFalsetotal_reward0step0whilenotdone:state_tempstate.unsqueeze(0)step1ifstepnum_step:doneTrue#收集经验并更新模型actionagent.select_action(state_temp)next_state,reward,doneenv.step(action,done)env.draw_block(reward,episode*num_stepstep)agent.memory.push(state,action,reward,next_state,int(done))statenext_state total_rewardreward agent.optimize_model()ifepisode%target_update0:#更新目标网络参数agent.update_target_net()env.get_new_pic(episode1)训练结果训练结束后保存模型参数并绘制奖励变化曲线图。从曲线图中可以看出在训练初期奖励呈上升的趋势证明训练的模型也越来越好。到了中后期奖励上升趋势减缓并逐渐收敛到11左右说明模型最后达到了稳定。

相关新闻

ROS2+树莓派+STM32全栈机器人开发实战

ROS2+树莓派+STM32全栈机器人开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:40:58 阅读更多 →
CKEditor实现Word粘贴无格式错乱:从原理到配置全解析

CKEditor实现Word粘贴无格式错乱:从原理到配置全解析

我们在做内容管理系统的时候,几乎都会遇到同一个让人抓狂的问题:用户从Word文档里复制一段内容,粘贴到富文本编辑器里,结果页面直接“垮掉”。要么是字体大小忽大忽小,要么是段落间距乱七八糟,更离谱的还带…

2026/10/9 4:40:58 阅读更多 →
YOLO船舶检测实战:从数据集标签到训练调参避坑全指南

YOLO船舶检测实战:从数据集标签到训练调参避坑全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 4:40:57 阅读更多 →

最新新闻

Vulkan固定功能阶段详解:从顶点输入到颜色混合的管线配置

Vulkan固定功能阶段详解:从顶点输入到颜色混合的管线配置

很多朋友学到 Vulkan 管线的可编程阶段,写完了顶点着色器和片元着色器,就以为万事大吉。结果在创建VkGraphicsPipelineCreateInfo的时候,突然冒出一大堆结构体要填:顶点输入、输入装配、光栅化、深度模板、颜色混合。这就是 Vulka…

2026/10/9 5:12:22 阅读更多 →
并网逆变器VSG预同步控制Matlab仿真模型搭建与调试

并网逆变器VSG预同步控制Matlab仿真模型搭建与调试

做过微电网和分布式电源并网仿真的朋友,十有八九都遇到过这个画面:预同步没做好的模型一合闸,直流母线电压瞬间被拉垮,电流波形上冲出一个尖峰,直接把过流保护和示波器刻度一起顶飞。这个标题很直白——VSG预同步控制M…

2026/10/9 5:12:22 阅读更多 →
PS消失点滤镜:透视贴图与空间绘图完全指南

PS消失点滤镜:透视贴图与空间绘图完全指南

1. 从“贴图透视总画歪”说起:消失点滤镜到底在解决什么问题做设计或者修图的朋友,大概都遇到过这种场景:手里有一张带透视的实景照片,比如一面斜着拍的砖墙、一张有纵深感的桌面、一个带角度的包装盒,你想在上面贴个l…

2026/10/9 5:12:22 阅读更多 →
CAXA电子图板2026功能区全解析:从布局到自定义实战

CAXA电子图板2026功能区全解析:从布局到自定义实战

说实话,我第一次接触CAXA电子图板2026的时候,第一反应是盯着顶部那条又宽又密的“功能区”发了好一会儿呆。作为从老版本菜单栏一路用过来的设计人员,看到所有图标被重新分门别类地塞进好几个选项卡,心里多少有点别扭。但用了一个…

2026/10/9 5:12:22 阅读更多 →
城市生命线物联网年度实践:从硬件选型到平台闭环的工程复盘

城市生命线物联网年度实践:从硬件选型到平台闭环的工程复盘

2025年,我在恒星物联主要做的事情,就是围着“城市生命线”转:地下管网的压力传感器、燃气井里的可燃气体探测器、桥梁上的位移监测节点、智慧城市运营中心里的那块大屏。年终写下这篇回顾,既是替团队做个交代,也是给还…

2026/10/9 5:12:21 阅读更多 →
SpringBoot瑜伽馆管理系统毕设:设计实现与答辩要点全解析

SpringBoot瑜伽馆管理系统毕设:设计实现与答辩要点全解析

每年到了毕设季,总有一大批人被“选什么题目”卡住。Java方向的项目来来去去就是管理系统、商城、博客这三板斧,但真正能把一个管理系统讲到明白、做出亮点的人其实不多。这次我完整走了一遍SpringBoot瑜伽馆管理系统的设计与实现,从选题、建…

2026/10/9 5:11:21 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →