ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenCV+TensorFlow游戏自动驾驶实战:从数据采集到闭环避坑指南

OpenCV+TensorFlow游戏自动驾驶实战:从数据采集到闭环避坑指南 简介基于OpenCV与TensorFlow的游戏车辆自动驾驶工程包面向人工智能、计算机科学与技术等专业学生的毕业设计或课程项目也适合对游戏自动驾驶仿真感兴趣的开发者实践学习。压缩包共37个文件、约11.77MB以Python脚本为主体28个py并包含训练数据npy、道路参考线png、依赖清单list、说明文档README与配置类文件覆盖屏幕捕获、键鼠控制、ROI提取、HSV道路线识别及AlexNet模型的训练与测试模块。项目源码均通过严格测试验证可直接运行。工程内置游戏画面采集、键鼠控制、数据集平衡、模型训练与测试等脚本可完成从采集画面、平衡数据、训练模型到实际车辆自动驾驶测试的完整流程直观体验传统视觉处理与深度学习的结合以游戏窗口为环境涵盖感知、决策、控制等环节。随包提供README说明与开发环境配置参考便于快速上手和二次开发。已有80人学习/下载适用于课程设计、毕设课题及技术学习交流。1. 用OpenCVTensorFlow让游戏里的车自己动起来这个zip到底能做什么在欧卡2这种模拟驾驶游戏里很多玩家的终极想法是让车自己跑自己只当乘客。你拿到的这个使用OpenCVTensorflow实现游戏中车辆的自动驾驶.zip拆开看就是一套端到端自动驾驶的玩具级闭环OpenCV负责从游戏画面里截取一帧做缩放和颜色空间转换TensorFlow负责跑一个卷积神经网络网络输出转向角和油门最后通过模拟按键把控制信号送回游戏。它的价值不在于让车开得多稳而是给你一条从图像预处理到模型推理再到闭环控制的完整链路能完全跑通这件事本身就值回票价。适合两类人一是想入门自动驾驶、又不想碰真车的开发者二是玩欧卡2时对原版AI不满意、想自己写控制逻辑的玩家。这个方向不是玄学但它对数据时序极度敏感网上能跑通的demo往往都藏着几个没写出来的坑。2. 为什么偏偏是OpenCVTensorFlow一对分工明确的搭档2.1 OpenCV做眼睛游戏画面怎么变成模型能吃的张量OpenCV是整个管线里的第一棒它的职责不是识别而是把屏幕上一个矩形区域截下来转成张量。很多人一提到OpenCV就想到opencv识别物体、模板匹配、HOG行人检测这些经典玩法但在这个自动驾驶项目里识别工作全部交给TensorFlowOpenCV只做图像处理项目里最脏最累的那部分截屏、ROI裁剪、缩放、颜色空间转换、归一化。先看一个最典型的预处理函数import cv2 import numpy as np def preprocess_frame(frame_bgr, target_size(66, 200)): # 输入是OpenCV的BGR帧先裁掉顶部天空区域只保留路面 # 行号范围要根据你的游戏分辨率和视角来调欧卡2默认视角我一般裁180:720 roi frame_bgr[180:720, :] # 缩放到NVIDIA端到端驾驶模型论文里的经典输入尺寸66高x200宽 resized cv2.resize(roi, target_size, interpolationcv2.INTER_AREA) # BGR转HSV在隧道、逆光这些场景里HSV比灰度更扛光照变化 hsv cv2.cvtColor(resized, cv2.COLOR_BGR2HSV) # 归一化到[-1,1]并转成float32网络收敛会明显更快 norm hsv.astype(np.float32) / 127.5 - 1.0 # 返回形状 (1, 66, 200, 3)第一维是batch return np.expand_dims(norm, axis0)这段代码的逻辑很直接先裁掉不包含路面的部分避免网络把精力花在学习天空和远景上再缩放到固定尺寸因为卷积网络输入大小是写死的最后转HSV并归一化。参数上需要调的是两个地方一个是roi的行号范围另一个是目标尺寸。为什么选66x200这套尺寸来自NVIDIA在2016年发表的端到端驾驶模型它被各种复现项目验证过在转向场景下这个分辨率足够保留车道线细节又不会把计算量拉高。如果你想跑更高帧率用32x64也不是不行但弯道识别能力会明显下降。顺带提一句如果你的需求更偏三维坐标计算OpenCV里的solvePnP能用来做相机位姿估计但那属于几何方案端到端驾驶用不上。这里还有个常见误区预处理必须在训练和推理两条路径上完全一致。很多人训练时用了HSV推理时忘了写转换那行结果模型表现断崖式下跌。这种错误最坑的地方在于——代码不报错就是效果差。2.2 TensorFlow做大脑端到端控制还是传统分模块控制游戏自动驾驶有两种主流路线。第一种是传统分模块用OpenCV识别车道线算出车辆偏移量再用PID控制方向盘。第二种就是TensorFlow的做法端到端模仿学习图像直接进网络网络直接输出控制量中间没有人工定义的特征。分模块方案在简单赛道上确实能跑比如纯色路面、固定光影的竞速游戏用Canny边缘检测加Hough变换就能拿到车道线。但一旦场景变复杂——阴影、隧道灯光、雨天、路面纹理变化——手写的特征就开始翻车。端到端方案不做这些假设它从数据里自己学特征泛化能力通常更强。TensorFlow在这个项目里承担大脑的角色核心是一个CNN回归模型。输入是预处理后的图像张量输出是转向角和油门值或者刹车值。训练过程用到的数据本质上就是人类玩家的驾驶记录画面帧对应着当时的操作。这种方法在学术上叫行为克隆Behavioral Cloning自动驾驶领域里最经典的入门案例就是Udacity的模拟器项目原理一模一样。选择TensorFlow而不是PyTorch其中一个很实际的原因是这类项目的训练脚本和部署脚本都可以用Keras API一把梭代码量更短对刚入场的新手更友好。如果你关注tensorflow与pytorch的流行趋势会发现2024年学界明显偏向PyTorch但这个游戏自动驾驶的场景没有复杂的自定义算子也不需要动态计算图TensorFlow的静态图反而更省心踩坑资源也更多。2.3 分工边界OpenCV不该做的TensorFlow也扛不住这套组合的分工边界一定要划清楚。OpenCV负责的是确定性强的几何和像素操作截屏、裁剪、缩放、颜色转换、图像增强。TensorFlow负责的是从像素到控制的非线性映射到底该转多少度方向盘、该踩多少油门。最典型的反面案例有两个。第一个把所有希望都压在OpenCV上试图用模板匹配识别前方车辆。模板匹配对光照和尺度极度敏感换一个天气效果就全部失效这不是调参能救的。第二个把所有希望都压在TensorFlow上输入图像不做任何预处理直接original尺寸丢进网络。这不叫端到端这叫把灾难交给显卡——模型训练慢、收敛差而且毫无必要。我的习惯是只要能用OpenCV一行代码解决的绝不交给网络学。裁剪和缩放就是典型这类几何变换用手工方法又快又准让CNN自己去学空域缩放纯属浪费参数。真正值得交给网络的是那些说不清规则的特征比如弯道到哪个程度该打多少方向。下表总结了分工边界环节执行者典型操作为什么这么分图像采集OpenCVmss截屏、ROI裁剪确定性几何操作手工做更准图像预处理OpenCV缩放、HSV转换、归一化一行代码不需要学习特征提取TensorFlowCNN卷积层规则难描述交给数据驱动控制决策TensorFlow全连接层输出转向/油门端到端模仿学习后处理OpenCV/NumPy平滑滤波、阈值限制快且不需要训练这套分工再往后延伸还有数据增强。OpenCV可以做随机亮度扰动、平移、水平翻转翻转时转向角标签取反这些操作能直接把训练集的有效量放大好几倍成本几乎为零。3. 数据是第一个分水岭采集和标注决定了模型上限3.1 截屏方案对比PIL.ImageGrab、mss还是游戏内置API训练数据从哪来答案是截屏。这一步看似简单实际上直接决定你的数据质量。常见方案有三种PIL的ImageGrab、mss库、以及游戏自带截图API。PIL.ImageGrab最简单三行代码就能截全屏或指定区域但它的速度慢实测在1080p下有几十毫秒延迟而且它走的是Windows GDI路径在DirectX全屏游戏里经常截出来黑屏。mss走的是Windows Desktop Duplication API速度快了不止一个量级可以轻松跑到30fps以上而且支持把窗口句柄传进去只截游戏窗口区域。游戏内置API类似欧卡2自带的截图接口质量高但要改游戏文件这里不展开。我在本地跑数据采集用mss一个原因是快另一个原因是它能设定monitor区域配合win32gui找到游戏窗口位置后动态追踪窗口截屏。代码长这样import mss import cv2 import numpy as np import win32gui # 找到游戏窗口按标题匹配 hwnd win32gui.FindWindow(None, Euro Truck Simulator 2) left, top, right, bottom win32gui.GetWindowRect(hwnd) width right - left height bottom - top # 只截游戏窗口客户区内部注意不同游戏可能有边框偏移 monitor {left: left 8, top: top 30, width: width - 16, height: height - 30} with mss.mss() as sct: # 读取一帧mss返回BGRA格式 frame np.array(sct.grab(monitor)) frame_bgr cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) # 这里就交给上一章的preprocess_frame继续处理参数上有两个坑。第一个是窗口边框偏移Windows的窗口有标题栏和边框直接从GetWindowRect拿到的是外层矩形不裁掉边框会截到黑色的系统区域。第二个是分辨率我建议采集时把窗口设成1280x720左右的窗口模式别用4K全屏——分辨率越高数据量越大但模型输入最终都会缩放到66x200高分辨率对模型收益很小反而拖慢采集帧率。3.2 键盘输入同步记录标签必须和画面在同一时间轴数据采集有个关键细节每一帧画面必须对应一个操作标签这个标签就是你当时按键的状态。标签的准确性和画面的清晰度同等重要甚至更重要——模型学的是看到什么就做什么的映射如果画面和操作对不上它学到的就是混乱。我用pynput监听键盘事件同时用mss截屏两个线程都往一个队列里写时间戳和事件类型import pynput import threading import time import csv # 全局队列统一缓存在内存里最后再写盘 event_queue [] def on_press(key): event_queue.append((time.time(), press, str(key))) def on_release(key): event_queue.append((time.time(), release, str(key))) # 启动键盘监听线程目标是记录W/S/A/D和方向键 listener pynput.keyboard.Listener(on_presson_press, on_releaseon_release) listener.start()这里有个很容易翻车的点游戏里按键是有状态的你按下然后松开但如果监听器记录的是按下和松开两个瞬时事件后面对齐时要把它们重建成一段时间内的持续状态。我的做法是记录按下时刻然后到松开时刻之间这个键都视为被按住。重建这个状态机需要用时间戳去匹配按下/松开对千万别漏掉任何一个release事件否则后面会把几个小时的油门状态都搞错。3.3 数据清洗与帧率对齐一个迟到的标签毁掉一批样本采集完后原始数据存在硬盘上但还不能直接训练得先做三步清理。第一步是去重静止帧。车辆停在红灯前、刚启动的静止画面转向角标签是零这种样本占比太高会把模型带偏让它倾向于输出不需要打方向。我一般会把画面变化小于阈值的相邻帧丢弃只保留一部分静止样本作为负样本。第二步是样本均衡。直道帧永远比弯道帧容易采但弯道才是真正考验模型的地方。我一般会统计转向角分布把直道样本降采样甚至对弯道样本做重复采样让直道和弯道比例接近6:4。第三步是标签延迟补偿。这是最容易被忽略也是影响最大的一步。人的反应有延迟摄像头采集到画面、你看到后大脑处理、手按下按键中间隔了几百毫秒。真正的自动驾驶系统里模型输出的控制指令也应该相对于当前画面有一定提前量。代码上处理的思路是把当前帧对应的标签替换成几帧之后的标签。import numpy as np # images: (N, 66, 200, 3) 预处理后的图像帧 # labels: (N, 2) 每帧对应的 [steering, throttle] # delay_frames: 经验值我一般设3~5帧对应30fps下100~160ms delay_frames 4 shifted_labels np.roll(labels, -delay_frames, axis0) # 最后几帧没有未来标签了直接丢掉 images images[:-delay_frames] shifted_labels shifted_labels[:len(images)]为什么延迟补偿这么关键因为游戏物理反馈很直接如果你在画面看到弯道时才转向车头已经偏了好远。模型学到的映射如果是画面出现的弯道边缘对应此刻的方向盘动作那它总是慢半拍。补偿之后模型学到的是画面出现弯道边缘时提前一点打方向。这个参数需要在测试时微调3帧还是5帧没有唯一答案跟你的设备和游戏手感有关。4. 训练与推理的最小可复现骨架4.1 模型结构参考NVIDIA端到端CNN的回归设计模型结构不需要很复杂NVIDIA当年的端到端驾驶模型至今仍然是这个任务最好的起点。它由三部分组成三个卷积层提取低级到高级的视觉特征一个flatten层打平再用四个全连接层回归出连续的控制量。我用Keras把模型完整写出来import tensorflow as tf from tensorflow.keras import layers, models def build_steering_model(): model models.Sequential([ # 归一化层放在网络第一层输入是预处理后的float32图 # 因为预处理时已经归一化过这里只做占位保留结构对称 layers.Lambda(lambda x: x, input_shape(66, 200, 3)), # 三层卷积卷积核逐渐缩小通道数逐渐增大 layers.Conv2D(24, (5, 5), strides(2, 2), activationrelu), layers.Conv2D(36, (5, 5), strides(2, 2), activationrelu), layers.Conv2D(48, (5, 5), strides(2, 2), activationrelu), # 特征图展平 layers.Flatten(), # 全连接层输出维度逐层减小 layers.Dense(100, activationrelu), layers.Dense(50, activationrelu), layers.Dense(10, activationrelu), # 输出层2个输出转向角(归一化到-1~1)和油门(0~1) layers.Dense(2, activationlinear) ]) return model model build_steering_model() model.summary()参数上的考量卷积层第一层为什么用24个5x5卷积核因为输入只有66x200分辨率低不需要更大的卷积核去覆盖视野步长2x2是为了直接降采样减少计算量。全连接层逐步压到10维相当于在控制层做一个压缩迫使网络只保留最有判别力的信息。如果你机器配置一般可以把Conv2D的通道数减半24改成1236改成1848改成24模型参数量会降很多推理延迟明显缩短代价是弯道识别精度略降。这个取舍对游戏是值得的因为你不需要像真车一样在120km/h下做决策游戏里适当减速就能弥补视觉能力的不足。4.2 训练脚本数据集加载与训练参数模型结构定了接下来把清洗好的数据集喂进去。我习惯把所有样本存成一个npz文件里面是images和labels两个数组加载后按8:1:1分成训练集、验证集和测试集。import numpy as np from sklearn.model_selection import train_test_split # 数据文件由上一章的采集清洗脚本生成 data np.load(game_driving_data.npz) X data[images] y data[labels] # 划分数据集注意用stratify按转向角分箱保证弯道样本在各集合中比例一致 y_binned np.digitize(y[:, 0], binsnp.linspace(-1, 1, 20)) X_train, X_val, y_train, y_val train_test_split( X, y, test_size0.2, stratifyy_binned, random_state42 ) # 编译回归任务用MSEAdam优化器学习率先给1e-3 model.compile(optimizertf.keras.optimizers.Adam(learning_rate1e-3), lossmse, metrics[mae]) # 训练batch_size选64验证集上表现不再提升时自动减小学习率 history model.fit( X_train, y_train, validation_data(X_val, y_val), batch_size64, epochs30, callbacks[ tf.keras.callbacks.ReduceLROnPlateau( factor0.5, patience3, min_lr1e-5), tf.keras.callbacks.EarlyStopping(patience5, restore_best_weightsTrue) ] )训练参数里最值得调的是learning_rate和batch_size。learning_rate从1e-3开始配合ReduceLROnPlateau在验证loss平台期自动减半这比我手动调参省心得多。batch_size的选择跟显存和CPU核数有关我做过对比64比32收敛更稳但128以后收益递减训练时间反而拉长。EarlyStopping的patience我设5个epochrestore_best_weights一定要设为True否则训练结束后你拿到的不是验证集上最好的权重而是最后一次epoch后的权重这可能让你白白损失几个点的性能。训练完评估模型的正确姿势是看验证集MAE我一般会关注转向角的MAE是否在0.05以下归一化单位。如果不在先回去检查数据清洗而不是堆模型深度——数据问题导致的loss偏高加层是救不回来的。4.3 推理循环从截屏到按键的完整回路模型训练完最后一步是把它接到游戏上让预测结果变成键盘按键。这里有个细节直接用ctypes模拟按键会更快pynput也能做但有一层Python回调开销。我实测在窗口化游戏里两者延迟差个几毫秒但在高速场景这可能是撞不撞车的区别。推理主循环的核心逻辑如下import cv2 import numpy as np import tensorflow as tf import ctypes import time # 加载训练好的模型 model tf.keras.models.load_model(game_autopilot.h5) # 定义按键虚拟键码W加速、S刹车、A左转、D右转 VK_W 0x57 VK_A 0x41 VK_D 0x44 VK_SPACE 0x20 # 欧卡2里空格是刹车 def press_key(vk): ctypes.windll.user32.keybd_event(vk, 0, 0, 0) def release_key(vk): ctypes.windll.user32.keybd_event(vk, 0, 2, 0) # 上一帧的转向输出用来做简单低通滤波 prev_steer 0.0 while True: # 1. 截屏并预处理 frame_bgr capture_screen() # 内部用mss代码同上一章 tensor preprocess_frame(frame_bgr) # 2. 模型推理 steer, throttle model.predict(tensor, verbose0)[0] # 3. 转向输出做低通滤波避免大幅抖动导致方向盘画龙 smoothed 0.7 * prev_steer 0.3 * steer prev_steer smoothed # 4. 把连续值映射为按键动作 # 转向角0.2右转-0.2左转中间区域是死区避免频繁点按 release_key(VK_A) release_key(VK_D) if smoothed 0.2: press_key(VK_D) elif smoothed -0.2: press_key(VK_A) # 油门映射大于阈值就按W否则松开 if throttle 0.3: press_key(VK_W) else: release_key(VK_W) # 固定控制频率约30Hz留出时间给游戏渲染 time.sleep(1 / 30)这个循环里有几个必须说清楚的参数。第一个是死区阈值0.2如果转向角输出在-0.2到0.2之间就认为直行避免模型轻微的抖动导致方向键高频点按。第二个是低通滤波系数0.7/0.3值越大转向越平滑但响应越迟钝我实测0.7在欧卡2的高速路段手感最自然。第三个是控制频率30Hz低于这个频率转向会有明显的阶梯感高于60Hz键盘事件会有积压反而让游戏处理不过来。这里还有一个很多人忽略的坑你的模型预测的是连续方向盘角度但你用键盘模拟只能输出有或没有。键盘无法精细控制转向力度所以模型如果有小幅转向输出大部分量会被死区吞掉。想让转向精细化要么用vJoy虚拟出轴量控制要么把转向角映射成方向键点按的持续时间——按住20ms松开10ms这种PWM方式。后者实现简单压弯道时明显更丝滑但需要在游戏里反复试出合适的脉冲宽度。5. 五个绕不开的坑现象、原因与解决办法5.1 cv2.error: 图像读取失败或窗口直接崩溃现象程序运行到cv2.imread或cv2.cvtColor时报错类似cv2.error: OpenCV(4.4.0) C:\...或者是读到一张全黑的图。原因这个报错九成不是图像损坏而是路径或窗口句柄的问题。路径含中文时imread直接返回None但你后面还在用这个None做cvtColor就炸出OpenCV底层错误。另一个常见原因是mss截屏返回的缓冲区颜色通道顺序和预期不符。解决路径里去掉中文字符、统一用英文路径imread后用if img is None: raise做一个显式保护mss截屏后明确调用cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)转一次再往下走。窗口句柄为0时加个重试逻辑等游戏窗口完全渲染后再开始截屏。5.2 ModuleNotFoundError: No module named opencv现象命令行里已经pip install opencv-python了但运行脚本还是报ModuleNotFoundError: No module named opencv。原因几乎永远是环境错位。你pip装到了系统Python但脚本用conda虚拟环境跑或者是Jupyter Notebook内核和pip命令对应的不是同一个解释器。这类tensorflow安装问题在Windows上尤其常见。解决直接用conda创建一个独立环境不要混装conda create -n gameai python3.9 conda activate gameai pip install opencv-python tensorflow2.10 mss pynput注意Python版本别选3.11以上TensorFlow的Windows轮子对Python版本支持滞后我用3.9最稳。装完后用python -c import cv2, tensorflow; print(cv2.__version__, tensorflow.__version__)确认导入成功再往下写代码。5.3 训练loss很低进游戏就左右乱撞现象验证集MAE已经很低了模型看起来学得很好一进游戏车走出S形甚至撞护栏像喝醉了一样。原因这是端到端自动驾驶最著名的坑。本质上是两个问题的叠加。第一是标签时序偏移采集时你的操作比画面晚了几百毫秒模型学的是看到这个画面之后X毫秒才打方向但推理时它输出的控制指令立刻执行少了那段延迟于是转向永远慢半拍。第二是采样偏差你采集的轨迹里直道占比远高于弯道模型学到的是大幅度转向输出大概率是对的这件事概率很低所以它倾向于输出直行。解决先回到数据层面确认上一章的延迟补偿做了且delay_frames不是0。再把数据按转向角画出直方图如果直道样本超过70%做降采样。如果这些都没问题检查推理循环里的低通滤波系数——滤波太强会让模型输出被平滑到接近0车自然就走不直。5.4 TensorFlow与OpenCV的依赖冲突现象代码能正常import opencv也能import tensorflow但运行时某个底层库报错比如Could not load dynamic library cudnn64_8.dll或protobuf版本冲突。原因TensorFlow和OpenCV各自依赖protobuf和numpy而这两个包恰恰是Python生态里最爱打架的。opencv-python新版本对numpy版本有要求TensorFlow对protobuf版本有强约束pip在装的时候无辜的一方会被静默升级或降级最后运行时才发现版本对不上。解决最省心的做法是放弃pip install单独装改用conda装OpenCV让conda解析依赖矩阵conda install -c conda-forge opencv pip install tensorflow2.10装完后一定跑一遍完整的截屏加推理脚本别只import就收工。如果还是报protobuf冲突干脆把protobuf锁到固定版本pip install protobuf3.20.3这是TensorFlow 2.10版本最稳的搭配。这种依赖问题没有玄学锁定版本后不要再手贱升级任何包。5.5 转向角输出对但车不走直线绝对量与增量问题现象模型预测转向角明明只有一个很小的值比如0.15但进游戏后方向盘一直在往一个方向打车画大圈。原因你混淆了绝对转向角和转向角增量。模型在线性回归里学到的是这个画面下方向盘应该处于的角度但如果你的动作模拟方式是检测到转向为正值就往右按键那车会一直往右直到你松键。游戏按键本身没有回正概念你的映射逻辑需要把模型输出当作目标值而不是持续指令。解决把动作映射改成比例控制而不是阈值触发# 每个控制周期检查一次当前误差误差小时松开方向键 target_steer model.predict(tensor)[0][0] if abs(target_steer - current_steer_est) 0.08: release_key(VK_D) release_key(VK_A)这里current_steer_est是当前方向盘状态的估计值——你没有游戏内部方向盘角度数据可以用上一时刻的控制输出加上积分来模拟。这样做相当于PID里的P控制比简单的阈值触发稳健得多。这是我在这个项目上花费时间最长的一个坑核心经验是模型输出什么和你把输出翻译成按键的方式这两件事是同一个问题的两端任何一端错了都跑不出直线。6. 从离线到闭环延迟预算与真实验证方法模型训练完只是第一步真正让它稳定跑起来要靠延迟预算和逐级验证。我给这个系统做的延迟预算表如下按30Hz控制周期倒推环节典型耗时说明mss截屏8~15ms窗口小一点会更快OpenCV预处理1~2ms缩放和HSV转换都是轻量操作TensorFlow推理10~30msCPU上约30msGPU上可到5ms按键模拟1~3msctys性能窗口调用游戏渲染16~33ms取决于游戏帧率合计36~83ms必须控制在100ms以内如果端到端总延迟超过100ms高速路段基本没法玩。我实测CPU推理是本机最大的瓶颈一个可行方案是把模型换成MobileNet结构的变体或者把输入缩到32x64推理时间能砍掉一半以上。验证方法要分三步走。第一步离线回放把采集的测试帧喂给模型把预测的转向角序列画成曲线和真实操作对比看趋势是否一致。不用进游戏几十秒就能判断模型有没有学到基本逻辑。第二步半自动在游戏里把油门写死只让AI控制方向盘车速保持低速观察车道保持能力。这一步能把转向问题从油门问题里独立出来排查更精准。第三步全自动完全交给AI跑欧卡2的高速路先跑一段直道多的高速再逐渐加入环岛和匝道。我自己的经验教训是一上来就追求满速全自动化注定翻车。先让AI在60km/h下跑完整段路再逐步加速每次只改一个变量。你最终会发现90%的问题都不是模型不够聪明而是延迟和数据时序没对齐。如果新手入门我建议直接拿欧卡2的高速路试手数据好采赛道简单跑通之后再去碰GTA的城市道路。这个方向真正值钱的不是那个zip包本身而是你在处理数据时序和闭环验证时建立的直觉这套能力放到真实自动驾驶项目的仿真验证环节一样适用。希望帮到你。本文还有配套的精品资源点击获取
返回列表