AI格斗游戏强化学习实战:从环境封装到自对弈调参
1. Day3 从搭积木到跑起来先把前两天的账跟自己对清楚说实话AI格斗项目最容易被低估的不是算法而是“把环境接到训练流程里”这件事。我这边项目做到第三天才真正体会到什么叫“跑通和跑起来是两码事”。1.1 第一、二天我到底搭了什么Day1 我基本是在搞地形和角色动作映射。初始化一个2D格斗场景有左右两个角色地面、血量条、受击硬直、简单帧判定。动作层面只做了六种前冲、后撤、轻拳、重拳、下蹲、格挡。全部用离散指令驱动一个按键对应一个动作没有方向键的组合输入。Day2 把角色的“可观测状态”抽了出来坐标、朝向、血量、距离、当前动作编号、是否在硬直中。动作空间也用数字编号比如0代表轻拳、1代表重拳。同时还写了一个固定规则AI只会按时间循环出“前冲、轻拳、重拳、后撤”像个木桩一样站在那里挨打。这个木桩AI在Day2结束的时候已经能稳定和玩家角色对打不会崩场景。但Day2的“AI”其实不算真AI它是脚本是规则表。真正让格斗角色学会打架得靠强化学习这也就是Day3要动手的事情。1.2 第三天开始前的自我提问到了第三天早晨我先看了两天前留下的两段记录动作映射是否稳定是。角色不会穿模受击硬直正常。规则木桩AI是否能循环完整连招是。但它的行为是完全确定的玩家背板就能打赢。对着这个状态我给自己列了个问题清单现在能不能把木桩AI当成陪练开始训练一个能自己决策的动作选择器如果直接用神经网络输出动作概率应该用什么状态输入打一拳给多少分、挨一拳扣多少分这个数字怎么定才合理训练多久能看到角色不原地抽搐而是真的会前冲追击这些问题没有标准答案只能通过实际跑数据来回答。Day3的核心目标也因此确定让角色首次获得“根据当前局面选择动作”的能力并跑通一整套训练闭环。我还在本子上写了一条“及格线”新模型在500局内胜率至少达到对木桩AI的40%。如果连这个都达不到说明环境或奖励设计有硬伤得回头修。1.3 一个容易被忽略的小习惯先定指标再训练很多人做AI项目喜欢先把代码调通再想指标我Day1也是这么干的结果每天都不知道自己到底有没有进步。第三天我改掉了这个习惯先定了三个指标指标计算方式及格线单局胜率智能体获胜局数 / 总对局数≥40%单局血量差智能体剩余血量 − 对手剩余血量平均值 ≥0平均单步奖励整局累计奖励 / 总步数≥ −0.2这三个指标一个看结果、一个看过程、一个看训练信号是否合理。它们会在训练过程中持续记录不进只存在于脑子里。事实证明这个习惯帮了大忙。因为Day3中午第一次训练时单步奖励从 −1.0 慢慢爬到了 −0.3看起来有上升趋势但胜率只有8%。如果只看胜率我会以为训练失败了但结合单步奖励在上升我判断是“局部最优”而不是“环境错误”。后面调整了探索率才走出来。2. 环境封装把2D格斗模拟器改成强化学习能啃的接口“AI格斗项目”里最不性感但最关键的一步就是给模拟器套上一层标准化接口。如果这一步做得糙后面每次调试都会浪费大量时间。Day3上午我最先做的事情不是写神经网络而是封装环境。2.1 状态描述不是越多越好要挑“能决策的信息”我一开始想的是把所有东西都塞进状态坐标精确到浮点、血量精确到个位、动作编号、连击数、帧数。结果得到一维50多维状态训练又慢又容易过拟合。后来我把状态空间收敛成了21维分成四组角色自身信息当前X坐标、当前Y坐标、当前血量、当前朝向、所在硬直帧数8维。对手信息对手X坐标、对手Y坐标、对手血量、对手朝向、对手当前动作编号9维这里动作编号用了one-hot的一部分。双方关系信息水平距离、垂直距离、谁在攻击范围内3维。规则信息当前局剩余时间1维。这21个维度已经能给到一个格斗智能体足够的基础决策依据。硬直帧数这个维度是我后来加了因为它在格斗游戏里特别关键对手硬直时你该追击自己硬直时你只能挨打或等结束。所有数值在进模型之前都做了归一化坐标除以场景宽度和高度血量除以100时间除以总时间。不归一化的话神经网络很难收敛这个坑我吃了三次。2.2 动作接口离散动作比连续控制更适合格斗格斗游戏指令本质是离散的你按的是轻拳、重拳、格挡而不是“力度0.7的左勾拳”。所以动作空间直接用整数编号一批固定指令0站立防御1下蹲2前冲3后撤4轻拳5重拳6跳跃模型输出的是7个动作的概率或Q值环境接到动作ID后执行对应帧序列。这种设计让探索更有效率因为真实玩家输入也是离散按键。换成连续控制反而会让角色出现滑稽的抖动。2.3 奖励设计把“打架直觉”翻译成数字第三天我把奖励拆成了两部分单帧奖励 局终奖励。单帧奖励是我每一帧结算的命中对手1.0被对手命中−0.8成功防御住一次攻击0.2没有发生任何事−0.01这个惩罚很轻用来防止角色原地发呆局终奖励是整局比赛结束时结算的获胜10失败−10平局双方血量同时归零0这套设计有一个讲究单帧奖励教给智能体“什么是好的动作倾向”局终奖励教给智能体“什么是这个游戏的真正目标”。我刻意把单帧奖励做得相对小避免智能体为了每回合多刮一刀而放弃整体胜局。来看封装后的核心逻辑class FightingEnv: def reset(self): # 初始化场景、角色位置、血量、朝向 # 返回归一化后的状态向量 return self._get_state() def step(self, action): # 根据动作ID让当前角色执行一帧 # 模拟器的物理更新位移、受击判定、硬直 # 计算这一帧的奖励、是否结束、当前状态 reward self._compute_reward() done self._check_round_end() return self._get_state(), reward, done, {}这段代码看起来很简单但真正折磨人的是_compute_reward()里面的判定顺序。格斗游戏一帧之内可能发生多个事件你出拳打中对手同时对手的反击也打中了你的胳膊。这时候该给正奖励、负奖励还是零我采用了“先判定后结算”的顺序谁先产生有效命中就算谁的另一方不计分避免出现一回合双方都获得高奖励的刷分漏洞。2.4 一个实战心得奖励表先写注释再写代码我建议在写策划逻辑之前先在代码里写一段注释把每个奖励的触发条件用语言描述清楚。比如# 命中判定攻击框与受击框相交且攻击者不在硬直中 # 防御判定受击者当前处于防御状态则攻击方不给正奖励受击方给防御分这比对着数值表调试容易十倍。因为我中途发现一个问题当智能体血量极低时它应该更激进搏命但我的奖励系统没有这个机制它反而会一直防守直到被活活耗死。这个发现最终导致我在局终奖励里额外加了一项“血量差”后面第4节会细说。3. 第一次训练跑通网络结构、经验回放和“先挨打后学坏”封装好环境之后我下午的任务是让模型真正开始更新参数。这一步也是绝大多数“看起来像AI项目”死掉的地方代码能写出来但训练曲线一直不涨。3.1 网络结构为什么先选了小MLP而不是卷积我们这个项目里的输入是21维向量不涉及画面像素所以用不到卷积神经网络。我选择了一个简单的多层感知机形状是[128, 128, 64]输入21维输出7个动作的Q值。第一层全连接128激活函数用ReLU第二层128第三层64输出层不激活直接给Q值。整体参数量很小在CPU上训练也完全够用。这个网络结构是模仿经典DQN的“输出Q值”范式而不是输出概率。对于格斗这种动作序列强相关的场景DQN能更好处理连续决策。在代码层面做如下定义import torch import torch.nn as nn class SmallMLP(nn.Module): def __init__(self, state_size21, action_size7): super().__init__() self.fc1 nn.Linear(state_size, 128) self.fc2 nn.Linear(128, 128) self.fc3 nn.Linear(128, 64) self.out nn.Linear(64, action_size) self.relu nn.ReLU() def forward(self, x): x self.relu(self.fc1(x)) x self.relu(self.fc2(x)) x self.relu(self.fc3(x)) return self.out(x)这段代码没有特别之处但它是整个Day3训练的脊柱。如果它崩溃其他一切都白搭。3.2 经验回放为什么要打乱样本顺序在开训之前我先建了一个经验回放池。每个时间步生成一条样本存成一个五元组当前状态、执行动作、获得奖励、下一状态、是否结束。回放池容量我设为10000条当池子满了之后旧的样本会被弹出。训练时从回放池里随机抽取64条样本计算损失。这个设计是为了解决两个问题打破样本之间的时间相关性。如果连着训练超级相近的帧模型容易过拟合到一个局部片段。提高数据利用效率。一局对战几百帧如果只拿当前一帧去训练后面的帧都没被学到太浪费了。为了处理每局结束后的“片段结束”状态我在计算目标Q值时做了截断当样本标记为结束就不把下一状态的Q值加进来因为后面没有合法动作了。3.3 探索策略从“乱打”开始才是健康的训练初期模型是随机初始化Q值没有任何意义。如果直接按Q值选动作角色大概率会永远不动。所以我用了ε-greedy策略也就是以 ε 的概率随机挑选动作以 1−ε 的概率选取当前Q值最高的动作Day3我给ε设置了初始值0.8然后每更新100步减小一点直到最低0.1。这意味着前几百局里角色有80%的概率在乱按按钮被打得鼻青脸肿很正常。等到后面模型有了基本判断再逐渐降低探索率稳定利用学会的经验。有朋友问我为什么把ε初始设这么高原因很简单面对一个固定规则AI随机动作虽然菜但至少覆盖了“前冲、格挡、出拳”这些基本行为。一格斗游戏如果连随机探索都没有策略就永远走不出原地站立或重复格挡的局部最小值。3.4 实测中遇见的第一个失误“原地发呆”与“纯防守”中午跑了一个小时我发现智能体在约20%的对局里直接原地站着不动。原因不是网络算不出来而是ε降至0.1之后模型认为“什么都不做”的Q值最高。我在日志里查了奖励曲线发现平均步数奖励虽然上升但负值依旧很大因为智能体站在原地挨打每一帧都吃 −0.8 的被攻击惩罚。但模型为什么还选择站立因为在它当前Q值表里站立不动的长期回报并不比“出拳后反被击中”更差。这就是探索不足带来的保守偏好。我的处理办法是把“原地不动”时间统计出来如果连续超过十帧不动就强制给它一个 −0.05 的额外惩罚同时把探索率下限从0.1提到0.15。这样模型被迫在更多状态下尝试动作而不是龟缩。解决之后胜率从8%慢慢爬到22%。虽然还远低于及格线但至少能看出模型在往正确的方向走了。4. 血量差距、体位奖励和攻击判定的量化调参很多人以为AI格斗项目到了能训练就已经成功大半嗯其实真正痛苦的阶段才刚刚开始。因为环境一旦接入训练你会立刻面对一连串“为什么我的AI像个脑残”的问题。Day3下午的时间几乎全部花在了调参上。4.1 攻击判定里藏着的三个大坑第一个坑判定区域是“攻击框”而不是“角色贴图”。如果攻击框没有跟随角色位置和朝向更新会出现拳头已经打到空气、但判定为命中的情况。我的解决方式是每一帧都从两个角色的骨骼节点重新生成攻击框并裁剪掉过远区域。第二个坑硬直触发时机。格斗游戏里“被打中”之后有硬直这时候角色不能防御也不能反击。我最初判定没写清楚导致同一招在硬直期间能连续命中多次一帧吞掉好几格血。后来我给每一次受击事件设了一个“最小间隔帧数”防止一次性内抽血失控。第三个坑防御状态如何处理。如果角色处于格挡状态攻击命中时不应该给命中奖励也不该给对方扣血。这一步要放在奖励计算前面完成否则会出一个非常搞笑的情况双方同时按格挡和出拳结果双方都觉得自己“赢了”。4.2 奖励系数的敏感性测试奖励系数不是固定不变的我用了三组参数对比测试参数设置被命中惩罚行为倾向方案A−0.3冲得很猛经常被打成筛子方案B−0.8变成了“挨打立刻格挡”的龟壳方案C−0.5 防御加成行为终于有了分寸方案B是很多新人会踩的坑因为惩罚过大智能体彻底放弃进攻只会防御。站在人类角度看防御是最安全的动作站在训练角度看防御让模型几乎收不到正奖励能学到的东西非常有限。方案A又太激进模型觉得被打一下才扣0.3那不如多打中对手一次完全忽略了防守。最后我选择方案C再叠加一个“成功防御”的0.2正奖励才让攻防之间有了平衡。4.3 为什么第三天就直接引入“血量差奖励”我在前面提到局终奖励里加了一项血量差。这是我在晚上复盘时发现的当智能体只剩1滴血、对手满血时它仍然倾向于龟缩防守因为Q值表里防守带来的“短期不挨打”收益高于出拳带来的“可能被反杀”风险。这种局面在人类格斗选手身上极其少见因为人类知道只要被碰一下就死不如上去搏命。但对AI来说它没有“紧张感”只有数值。我的解决方案局终奖励从10/−10修改为10 − (双方血量差×0.2)当智能体获胜时失败时奖励为−10 (双方血量差×0.2)这样模型在快死的时候会更倾向去抓机会而不是一味防守。这个改动看似简单但让胜率从22%升到了31%因为它修正了“残局策略”这个盲区。4.4 体位奖励让模型学会占身位而不只是出拳格斗游戏里站位往往比出拳更关键。如果你一直贴着对手甚至走到对手身后攻击命中率会大幅提升。我试过给“与对手距离小于一个身位”的每个帧加0.05的正奖励结果模型学会了疯狂前冲冲到距离过近后又开始乱出拳完全无视防守。于是我调整了体位奖励的计算方式双方距离在0.8至1.5倍攻击范围之间每帧0.03双方距离小于0.8倍攻击范围每帧−0.02鼓励它注意距离控制双方距离大于2倍攻击范围每帧−0.02鼓励它主动接近这样一来模型开始学会在“可攻击但不至于太近”的位置来回移动。这是第三天训练曲线开始出现明显拐点的原因之一。4.5 奖励叠加过多会出问题不过奖励项并不是越多越好。我一度为了补齐所有细节把奖励设计成五六个项的加权和结果模型学出来的策略非常机械化甚至出现“接近对手得到0.03然后立刻退回去再接近”这样刷奖励的循环。最后我忍痛删掉了两个次要奖励项让目标函数尽量简洁。这个教训非常值钱在AI格斗项目里奖励函数是给模型写的“说明书”而不是给它开的“菜单”。5. 分布式对局与自对弈我为什么提前启动自对战很多人做AI格斗项目刚开训的那一两天都死磕固定规则AI等觉得差不多了才去搞自对弈。我在Day3傍晚就急着把自对弈挂上了原因很直接固定规则AI的行为太可预测模型很容易抓到它的“固定套路”并专门针对形成“背板”式策略而不是真正的格斗能力。5.1 自对弈训练的两种方式我采用的方式很简单同时保存两个模型一个主模型、一个对手模型。每训练数百局后将主模型复制给对手模型然后继续让两者对战。刚开始两者水平都低互相对着乱打学到的东西很散。但如果持续迭代主模型就能同时产生两个效果防守更强因为它要面对一个越来越难缠的对手。进攻更多样因为对手不会像固定AI那样站桩挨打迫使其探索更多连招组合。我用的核心代码逻辑大致如下if episode % 200 0: opponent_model.load_state_dict(main_model.state_dict()) opponent_model.train(False)同时我还留了一个固定规则AI作为“回归对照组”。每训练500局就让主模型跟固定规则AI打十局看胜率是否还在合理范围。如果主模型在自对弈里打得很好却完全打不过固定规则AI说明它已经偏离了基本逻辑得回溯调整。5.2 自对弈的坑远比想象中多第一个坑双方都太弱的时候自对弈容易让模型学到“磨时间”玩法。因为谁都打不死谁比赛总是打到超时智能体发现只要不断后退就能靠时间耗尽平局或低概率胜利。我的处理办法是给每局加了时间上限并在超时后根据血量差判定胜负。不然模型会觉得“站在远处互相张望”是最优策略。第二个坑灾难性遗忘。主模型不断更新可能在某一段时间内疯狂学习一种特定反制策略结果把之前学会的防守能力全忘了。唯一的解决思路是持续用小规模固定AI回归发现胜率下坠就回滚到上一个稳定存档。5.3 Day3的自对弈实验结果傍晚我跑了一个半小时的分布式对局四路并行每路都是两个模型互打。最终结果很有意思单路模型胜率35%左右动作单调老是出重拳。两路混合数据的模型胜率能到41%开始出现“前冲取消出拳”这类试探性动作。四路混合数据的模型胜率反而下降可能是因为不同路的模型行为差异太大经验池里混入过多互斥信息。就这么一个结果让我想通了一件事自对弈不是模型越多越好而是要先保证“对战双方之间的水平差距不能太大”。如果两个模型水平差太多弱的一方只能被动挨打几乎学不到任何有意义的经验。所以在Day3结束时我暂时放弃了四路混训改回两条路的单联训。等Day4再把对手模型的更新周期调得更细。6. 晚上的失败统计第三天真正学会的东西Day3晚上我把白天的所有日志统计完做出了一张“失败表”这比成功记录更重要。发现的问题基本上都集中在奖励设计、探索策略和测试方法上。6.1 失败案例一“跳但不攻击”让模型躲掉所有追击白天我为了鼓励角色使用跳跃给“腾空状态”每帧加了0.02的正奖励。于是模型学出一个很脏的策略开局就跳起来在空中待满整局因为跳跃状态能持续获得奖励。这个问题看起来像个笑话但非常容易发生。我的解决方法是腾空状态下如果超过15帧没有造成任何命中或位移增益就削减该状态的正奖励并额外给每次落地一个−0.05的惩罚。最终跳跃的使用率从“全场飞”变成“只用于跨过攻击”。6.2 失败案例二最后一滴血时突然变蠢这个问题就是我前面提到的残局策略缺陷。在剩余血量很低时模型倾向于放慢节奏甚至会连续后撤把“生存希望”寄托在时间耗尽后的平局判定上。经过血差修正后模型虽然改善了但还是会出现一次“必输局”时乱出拳送人头的现象。我没有在Day3彻底解决此问题而是给Day4留下了一个待办针对残局单独设置一个“低血量激励区间”当智能体血量低于20%时提高攻击动作的奖励权重降低防御动作的权重。6.3 失败案例三模型开始学会“刷行为”有一次我把命中奖励提高到1.5模型立即学会了通过打空气来触发无伤害命中判定靠“虚假命中”获得奖励。这个问题的根源是我在判定命中的时候没有区分“命中空气”和“命中目标”。我把攻击判定逻辑重新梳理了一遍只有当攻击框和对手受击框相交时才触发命中奖励。这个看起来是理所当然的规则但在实现时因为状态同步问题漏了条件判断。6.4 关于Day3结束时的三点经验第一不要只盯着胜率曲线。胜率会抖动很大尤其在小批量样本下。我选择结合平均单步奖励和受击/命中次数比来看趋势。如果是“命中次数在上升”那就说明模型在变好如果只是“奖励在上升”有可能是奖励漏洞。第二把固定规则AI当成永久回归集。无论自对弈做得多花哨我都保留一份固定规则AI的十局对局记录存放在单独的文件里。任何版本迭代之后都能用同一份回归报告来对照。否则你根本不知道某一次改动到底是变好还是变坏。第三保存模型的节奏应该和“可验证性”绑定。我每训练200局或自对弈切换后都自动存一个带时间戳的模型文件。这样即使后来发现某个版本出现策略退化也能一键回滚。没有版本管理的AI训练后期只能靠头铁。写到这Day3的工作基本收尾。今晚我整理的日志和模型存档会直接成为Day4“残局策略专项”的基础。格斗AI这个东西三天只能算搭了几根骨架真正的血肉还得靠后面一天一天填出来。如果你也在做类似的项目希望这些来自实坑的记录能帮你少走几步弯路。

相关新闻

Differentiating hype from practical applications of large language models in medicine -- a primer...

Differentiating hype from practical applications of large language models in medicine -- a primer...

文章主要内容总结 本文聚焦大型语言模型(LLMs)在医学领域的应用,旨在区分其 hype 与实际价值,为医疗从业者提供参考。核心内容包括: LLMs 的本质与局限:LLMs 是基于 Transformer 架构的深度学习模型,通过大规模文本训练实现自然语言处理,但本质是“统计语言模仿者”,…

2026/10/18 3:46:21 阅读更多 →
Niagara External Render Target:GPU级跨系统数据通信详解

Niagara External Render Target:GPU级跨系统数据通信详解

1. 这不是“渲染目标切换”,而是 Niagara 系统级通信能力的落地切口看到标题里“Communicate with External Render Targets”这个短语,很多刚接触 Niagara 的人第一反应是:“哦,就是把粒子效果输出到另一个纹理上,比如…

2026/10/18 3:46:21 阅读更多 →
Mac磁盘告急?CleanMyMac CLI:终端清理工具的完整评测与上手指南

Mac磁盘告急?CleanMyMac CLI:终端清理工具的完整评测与上手指南

【免费下载链接】cleanmymac-cli Clean Xcode, Docker, Homebrew, and developer caches, remove project and AI artifacts, analyze storage, and reclaim disk space from the Terminal. 项目地址: https://gitcode.com/gh_mirrors/cl/cleanmymac-cli 点击查看 免…

2026/10/18 3:46:21 阅读更多 →

最新新闻

园区网实训报告全流程:从VLAN规划到NAT配置

园区网实训报告全流程:从VLAN规划到NAT配置

每年实训季我都会收到一堆让人头大的报告,拓扑图贴得挺漂亮,配置命令密密麻麻占了好几页,但你随便挑一句问“为什么网关要放在核心交换机上”,对方多半答不上来。实训报告既然叫“报告”,它就不是配置命令的粘贴板。它…

2026/10/18 4:38:32 阅读更多 →
RTP.NET实战指南:从实时传输协议到C#音视频开发示例

RTP.NET实战指南:从实时传输协议到C#音视频开发示例

简介:RTP.NET是一款基于.NET框架实现的RTP实时传输库,面向需要处理音视频、VoIP及流媒体等实时数据的C#开发者。库内封装了RTPSession会话管理、参与者标识、数据包化、负载类型识别、事件驱动API与丢包恢复等关键机制,能够显著降低基于RTP构…

2026/10/18 4:38:32 阅读更多 →
CSC联培推荐信写作规范:科研叙事、证据链与可验证性

CSC联培推荐信写作规范:科研叙事、证据链与可验证性

简介:本资源是一份专为申请国家留学基金委(CSC)联合培养博士研究生项目的高校导师定制的推荐信模板,面向国内高校硕博导师、研究生院管理人员及拟申报CSC联培项目的博士生本人。模板严格对标CSC校内评审要求,完整覆盖被…

2026/10/18 4:38:32 阅读更多 →
TIPC入门实战:从零跑通Linux集群消息收发

TIPC入门实战:从零跑通Linux集群消息收发

写这篇的时候,我刚从一个集群调测现场回来,趁着热乎劲把TIPC入门阶段该知道的东西整理出来。这个系列做到第六篇,前几篇要么在讲原理,要么在讲内核实现,不少读者反馈说看得懂但上手还是懵。所以这篇定位很明确&#xf…

2026/10/18 4:38:32 阅读更多 →
重读RFC 793:TCP协议底层行为与状态机实现精要

重读RFC 793:TCP协议底层行为与状态机实现精要

1. 为什么今天还要亲手翻RFC 793?不是有现成译文吗?“RFC 793翻译(TCP的主体内容)”——看到这个标题,很多刚接触网络协议的人第一反应是:网上早就有中文版了,GitHub上搜一搜、CSDN点开就看&…

2026/10/18 4:38:32 阅读更多 →
图像相似度匹配实战:从特征向量到向量检索的完整方案

图像相似度匹配实战:从特征向量到向量检索的完整方案

我第一次被图像相似度匹配这个技术按在地上摩擦,是在一个UI自动化测试项目里。当时需求很简单:把待测页面截图和历史基线截图丢给程序,告诉我这两个页面是不是同一个页面。我第一反应是直接逐像素对比,结果被动态文案、加载动画、…

2026/10/18 4:37:32 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →