这个项目实现了一个基于近端策略优化(PPO)算法的游戏视觉导航系统,通过卷积神经网络(CNN)处理游戏画面,控制角色在3D环境中寻找目标门并完成导航任务。系统采用双动作空间设计:默认持续前进,AI仅控制左右转向动作。训练120轮后,智能体已经能够学习到基本的导航策略,但在某些特定场景(如门口卡死点)表现仍有提升空间。
核心机制是通过YOLO目标检测识别游戏画面中的"门"对象,根据门的可见面积和位置给予相应奖励(+1/+2/+3),同时设置时间惩罚(-1/步)和终点奖励(+500)。从训练曲线来看,智能体已经能够在部分回合成功完成任务,最近20轮平均奖励达到75.46,表明模型具备一定的学习能力。
环境模块(TargetSearchEnvironment)负责与游戏实例交互,主要功能包括:
屏幕捕获:通过pyautogui或专用截图工具获取当前游戏画面,分辨率为640x480。为提高效率,实现了图像变化检测机制,通过哈希值比较判断画面是否更新,避免重复处理静态帧。
目标检测:使用YOLOv5模型(find_gate.pt)实时检测画面中的"门"对象。检测置信度阈值设为0.75,仅处理高置信度结果。对于检测到的门,计算其像素面积和中心位置,作为状态特征的一部分。
动作执行:通过ImprovedMovementController控制游戏角色:
奖励计算:复合奖励函数包含:
python复制STEP_PENALTY = -1.0 # 时间惩罚
SUCCESS_REWARD = 500.0 # 到达终点
GATE_REWARD = 2.0 # 检测到门
FORWARD_REWARD = 2.0 # 前进动作
STAY_PENALTY = -1.0 # 静止惩罚
策略网络采用CNN+MLP架构,特别针对视觉输入优化:
python复制class PolicyNetwork(nn.Module):
def __init__(self, state_dim, turn_action_dim):
super().__init__()
self.conv_layers = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=8, stride=4), # [32,159,119]
nn.BatchNorm2d(32),
nn.ReLU(),
nn.Conv2d(32, 64, kernel_size=4, stride=2), # [64,78,58]
nn.BatchNorm2d(64),
nn.ReLU(),
nn.Conv2d(64, 128, kernel_size=3, stride=1), # [128,76,56]
nn.BatchNorm2d(128),
nn.ReLU(),
nn.AdaptiveAvgPool2d((1,1)) # [128,1,1]
)
self.fc = nn.Sequential(
nn.Linear(128, 512),
nn.ReLU(),
nn.Linear(512, turn_action_dim)
)
PPO算法的关键参数配置:
python复制CONFIG = {
'LEARNING_RATE': 0.001,
'GAMMA': 0.99, # 折扣因子
'K_EPOCHS': 10, # 策略更新次数
'EPS_CLIP': 0.2, # PPO截断范围
'ENTROPY_COEF': 0.1 # 熵正则化系数
}
训练过程中记录了多项指标以评估策略学习情况:
奖励曲线:呈现较大波动,反映探索-利用的平衡过程。智能体在某些episode能获得500分的终点奖励,但稳定性不足。
策略熵值:初期较高(约0.6-0.7),随着训练逐渐降低到0.3左右,表明策略从探索转向利用。
梯度范数:保持在0.5以下,说明学习过程稳定,没有出现梯度爆炸问题。
常见成功模式:
局部最优问题:
python复制if recent_turns == [0,1,0] or recent_turns == [1,0,1]:
return -80.0 # 严重惩罚摆动
目标遮挡处理:
python复制self.area_history = deque(maxlen=3) # 记录最近3帧面积
视觉特征提取:
面积奖励分级:
python复制if area > 20000: reward += 3
elif area > 15000: reward += 2
else: reward += 1
中心位置奖励:
python复制center_reward = 1.0 - (dist_x + dist_y)/2 # 归一化距离
时间惩罚衰减:
python复制step_penalty = -1 * (1 + step_count/100) # 随时间增加惩罚
激活值监控:
python复制print(f"conv1均值:{conv1.mean().item():.2f}, 方差:{conv1.std().item():.2f}")
梯度裁剪:
python复制torch.nn.utils.clip_grad_norm_(self.policy.parameters(), max_norm=0.5)
学习率预热:
python复制lr = min(epoch/10 * base_lr, base_lr) # 前10轮线性增加
帧堆叠:将连续4帧堆叠作为状态输入,提供时序信息
python复制state = np.stack([frame1, frame2, frame3, frame4], axis=-1)
课程学习:从简单场景逐步过渡到复杂场景:
集成检测:结合YOLO检测框和语义分割掩模:
python复制gate_mask = segmentation_model.predict(frame)
state = np.concatenate([frame, gate_mask], axis=-1)
奖励不增长:
策略振荡:
训练不稳定:
多模态输入:
分层强化学习:
模仿学习初始化:
python复制expert_loss = F.mse_loss(agent_action, expert_action)
total_loss = ppo_loss + 0.1*expert_loss
分布式训练:
这个项目展示了如何将PPO算法应用于实际的游戏AI控制任务。通过合理的奖励设计、网络架构优化和训练技巧,即使相对简单的模型也能学习到有效的导航策略。关键是要建立准确的游戏状态表示,设计合理的奖励函数,以及进行充分的超参数调优。