Sample Factory

—Stars

面向强化学习研究与工程的高吞吐训练框架,提供同步和异步策略梯度实现,并支持 ViZDoom、Isaac Gym、DMLab、MuJoCo 与 Atari 等环境的并行采样、训练、评估和轨迹录制。

REINFORCEMENT LEARNING · EPISODE RECORDING

终止帧可以缺失,环境步骤不能跟着丢失

录制器面对的是两条不同的数据流:图像可以在终止边界为空,动作与奖励仍然必须完成记账并让异步 Worker 正常结束这一步。

ENV STEP · TERMINAL BOUNDARY
observationNone / emptyaction0reward+1.0
env.step(action)

图像缺失 · 环境步骤仍然有效

BEFORE · RECORD EVERYTHINGcv2.cvtColor(observation)
EMPTY SRC→ASSERTION FAILED
ACTIONAPPENDEDREWARDNOT UPDATEDWORKERRETRY LOOP
AFTER · ENCODING BOUNDARYif img is None or np.size(img) == 0: return
SKIP FRAME→KEEP STEP
next image00000.pngactions[0, 1]episoder2.00 ✓
录制崩溃

空 Observation 进入 OpenCV 并中断 STEP

`RecordingWrapper.step()` 会把环境返回的每个 observation 直接交给 OpenCV;ViZDoom 在终止步骤可能返回 `None` 或零元素图像,`cv2.cvtColor()` 因空输入抛出断言错误。动作此时已经写入列表,但奖励与 shaping reward 尚未更新,异步 Worker 还会持续重试失败的 STEP,训练最终卡住。

边界判断

有没有帧要看编码输入,而不是终止标记

是否存在可编码帧应由 `_record()` 接收到的值决定,不能只依赖 `terminated`:不同环境和兼容层可能在 terminated 或 truncated 路径省略终止 observation。缺帧只代表这一步没有图像可写,不代表动作、奖励或原始环境返回值无效;守卫必须位于编码边界,才能让其余记账继续完成。

最小跳过

只跳过空图像,不改 Observation 与帧序列

在 `_record()` 入口同时检测 `img is None` 与 `np.size(img) == 0`,缺帧时直接返回;不合成替代图像、不修改传给调用方的 observation,也不递增帧号。新增参数化假环境分别返回 `None` 和空数组,再跟随一张有效图像,覆盖两种真实缺失形态。

回合完整性

两次动作、完整奖励与下一张帧同时保留

两类终止缺帧都不再进入颜色转换,随后的有效图像仍连续保存为 `00000.png`;完成后的 episode 目录保留两次动作和完整的 `r2.00` 奖励,证明跳过图像不会跳过环境记账。改动集中在 2 个文件,新增 6 行守卫与 41 行回归,并通过环境 Wrapper、工具和 ViZDoom 定向测试。