趴在蓝色平台上的海豹
Portfolio

Hello! 我是豹豹, 智能体后端 & AI 应用开发者

Building agent backends that turn models, tools and data into running services.

往下滑, 看项目

专题

AI 与智能体

2025 年为荣耀 PC 软件部交付的工具与算法, 2026 年自己做的智能体后端与评测.

2025 · 为荣耀 PC 软件部交付

实习期完成工具集主体交付, 获邀以未毕业状态破格入职; 连续两次提前交付两期需求.

第 1 章

企业交付

给荣耀 PC 软件部做的 RAG 评测平台

原需求只是一个评测脚本, 交付的是带完整前后端的平台, 另补 14 项需求外功能; 还查出 RAGAS 两项指标恒为满分的原因.

承接模型评测需求, 将评测脚本需求扩展为带完整前后端的 RAG 评测平台, 需求外补充 14 项功能; 发现 RAGAS 两项指标恒为满分, 定位为评测集过易且参考答案与检索段落同源导致的虚高.

这是什么 · 追问 · 看细节
  • 这是为荣耀 PC 软件部开发的大模型研发工具里的一件; 同一批交付的还有浏览器自动化工具库和文档解析入库工具链.
  • 评测可信度 -- 发现 RAGAS 两项指标恒为满分, 按指标算法逐条拆样本, 定位为评测集过易且参考答案与检索段落同源导致的虚高, 提出加入困难样本重建评测集.
追问 · 第 2 层两项指标为什么会恒为满分?

评测集过易, 且参考答案与检索段落同源, 导致虚高; 对策是加入困难样本重建评测集.

看细节

RAGAS 评测的虚高1 段

第 8 步: 两项恒满分查到原因, 提出加困难样本

演示滚到这里时加载

这一段证明: 两项恒为 1.00 来自评测集过易与参考答案同源

第 2 章

企业交付

浏览器自动化工具库, 交付荣耀

为荣耀 PC 软件部写的 Playwright 异步工具类, 脚本与智能体都能调; 带持久化登录态, 操作录制回放, 正文提取三级回退.

承接浏览器自动化需求, 交付浏览器自动化工具库: 基于 Playwright 封装异步工具类, 供脚本与智能体(Agent)调用.

这是什么 · 追问 · 看细节
  • 交给荣耀 PC 软件部的三件大模型研发工具里, 这一件管浏览器自动化; 另两件是 RAG 评测平台与文档解析入库工具链.
  • 实现持久化登录态, 操作录制与回放, 网页正文提取(三级回退), 文件下载.
看细节

浏览器自动化: 密度取正文与按日志回放1 段

9 步跑完 9/9 ok; 正文按文本密度挑出结果列表

演示滚到这里时加载

这一段证明: 网站改版后回放, 断在哪一条一眼看出

第 3 章

企业交付

划词高亮检测, 为荣耀电脑管家而做

为荣耀 PC 软件部做的端侧视觉算法: 不训练模型, 只凭截图和鼠标拖选的起止点, 分割出被选中文字的高亮区域.

为荣耀电脑管家 Magic text 划词场景, 提出基于图形学拓扑包络原理的免训练高亮区域分割算法; 测试环境下单次处理耗时由约 3 秒优化到 30 ms 以内, 无需中台部署模型.

这是什么 · 追问 · 看细节
  • 这是交给荣耀 PC 软件部的端侧视觉算法, 场景是荣耀电脑管家 Magic text 的划词: 用户拖选一段文字, 算法要从截图里找出被选中的那片高亮.
  • 荣耀方审阅完整方案后要求推进上线相关开发, 随即移植为 C++ 动态库.
  • 覆盖深浅两种界面 多行选择与不同 DPI.
追问 · 第 2 层为什么不用 YOLO 或分割网络?

当时记下的理由有两条: 高亮的颜色 场景与所处的界面都在变, 要达到同样的泛化需要大量数据集; 这个做法不需要 GPU.

看细节

免训练的高亮区域检测1 段

第 8 步: 被选中文字的高亮区域已提取

演示滚到这里时加载

这一段证明: 背景包住高亮, 高亮包住文字, 由包裹关系定出高亮簇

第 4 章

企业交付 · 荣耀 PC 软件部

文档解析与知识库入库工具链

交给荣耀 PC 软件部的入库工具链: PDF 与 Word 转成结构化 JSON; 扫描版没有文字层, 先转图片再交视觉模型识别.

承接文档解析需求, 交付文档数据结构化的知识库入库工具链: 把 PDF 与 Word 转成结构化 JSON.

这是什么 · 追问 · 看细节
  • 与 RAG 评测平台 浏览器自动化工具库一起交给荣耀 PC 软件部的大模型研发工具, 这一件把文档转成可入知识库的结构化数据.
  • 扫描版先转图片再交视觉模型识别; JSON 解析设三级容错.
看细节

文档解析: 转图识别 截头尾 三级容错1 段

Word 第 1 级接住, 扫描 PDF 第 2 级接住, 长扫描件第 3 级接住

演示滚到这里时加载

这一段证明: 长扫描件截掉中段, 编号检查查出缺图 3

第 5 章可现场演示

学术研究

利兹大学硕士课题: 开颅窗聚焦超声

零样本评估 5 个分割模型读术中超声的肿瘤边界, 再核名次: 换病例排名稳, 换提示框排名不稳; 评测与仿真另封装为 MCP 工具.

把课题的评测与仿真封装成 MCP 工具接入智能体后端; 回复与工具执行结果自动对账, 拦下'称已完成实则失败'.

这是什么 · 追问 · 看细节

以 AI Native 方式完成(855 个提交, 641 个由 Claude Code 合著).

  • 英国利兹大学的硕士课题(MSc Individual Project), 问两件事: 从术中超声里读肿瘤边界能读多准, 开颅窗下热量能送多深.
  • Agent Evaluation -- 自建对话评测集, 从工具选择 参数与执行结果三方面评估智能体, 查出模型的参数单位换算错误; 录制真实回复做离线回放, 修正判分规则后无需重复调用模型; 沿用课题重采样方法比较模型.
  • 基础模型 Evaluation -- 搭建视觉基础模型评测 pipeline, 零样本评估分割基础模型在术中超声上的边界精度; 针对排名随提示框波动的问题, 加做按病例重采样与提示扰动两类稳定性检验, 得出换病例排名稳定 换提示排名不稳的结论, 指出零样本精度依赖人工提示.
  • 针对仿真库只算声场的缺口, 自建热传导求解器补齐脑瘤声场到热剂量的仿真工具链, 并用解析解验证. 仿真前先校验配置并缩小网格预跑, 把错误配置挡在耗时仿真之前.
追问 · 第 2 层为什么用专家标注求出的框当提示, 这样量出来的是什么?

量的是给定准确框时的上限. 实际使用时拿不到这样准的框, 所以报告里写明这组数是上限.

看细节

课题: 真图上分割, 再问能否烧到1 段

同一张公开术中超声, 提示框一缩一移, 4 个模型的名次就变; 再按颅窗宽算消融深度, 智能体代跑时配置闸与对账拦错

演示滚到这里时加载

这一段证明: 框一变名次就变; 消融深度与肿瘤深度并排对照

第 6 章可现场演示

个人项目 · 自托管

每天在用的笔记编辑与秘书台

跑在家里的 NAS 上, 公网两道鉴权. 306 个提交 1260 个测试函数; 写回只追加或只改一行, 写前比对修改时间, 那边刚改过就拒写.

从手机编辑笔记起步, 长成本人每天在用的自托管工作台: 笔记编辑, 早晚报与拍板, 跨项目排期; 跑在家里 NAS 上, 公网两道鉴权, 定时收集与推送, 别的项目的编程 agent 经命令行写口读写同一份排期.

这是什么 · 追问 · 看细节
  • 本人每天在用, 由三块组成: 笔记编辑 秘书台 跨项目排期.
  • 笔记编辑: 手机浏览器里编辑 Markdown 笔记并写回磁盘; 保存时先写临时文件再原子换入, 并比对文件修改时间, 电脑端同时改过就不覆盖.
  • 秘书台: 早报 拍板 晚报三块, 数据来自笔记库与各项目仓; 收集器每天北京 06:45 与 21:45 跑, 推送排在其后 5 分钟, 把要动手的与要拍板的发到 Discord. 底栏五页: 今天 待办 项目 清单 库.
  • 跨项目排期: 面板与命令行共用同一套写口与闸; 别的仓的编程 agent 经命令行勾掉 加行 改日期, 改掉已有日期必须写理由, 理由记进当天日记.
  • 写回纪律: 只追加行或只改一行, 从不重写整节; 写前比对修改时间, 笔记那边刚改过就返回 409 并在页面上报.
  • 部署: 生产在家里的 NAS 上, systemd 用户单元跑 Web 服务 隧道 收集 推送; 公网经 Cloudflare Tunnel 与 Access, 应用层再一道 token 鉴权, 未配置 token 时除健康检查外一律返回 503; 工作站的项目读数约 5 分钟内送到 NAS.
  • 后端为 Python 标准库 HTTP 服务, 没用框架, 路由写成一张表; 前端为原生 JavaScript 加 CodeMirror 6.
  • 规模: 2026-08-14 起, 截至 2026-10-13 共 306 个提交, 1260 个测试函数. 本人负责需求拆解 架构约束与验收, 在 3 版界面原型中选定方向; 代码与自动化测试由 Claude Code 写.
  • 快速迭代: 2026.08.15 起一天半内 37 个提交; 本人逐轮实测提出修改(如搜索条点一次即退出), 指挥 Claude Code 定位根因并修复.
追问 · 第 2 层后端为什么不用框架?

依赖只要一个; 设计文档把 FastAPI 列在否掉的备选里, 理由是它要引一串依赖.

追问 · 第 2 层标准库的 HTTP 服务怎么处理并发, 一个连接卡住会不会拖住整个服务?

每个连接一个线程, 读操作设了超时; 起因是一次实测里大量连上即弃的连接把线程数顶了上去.

看细节

笔记编辑服务的保存与鉴权1 段

电脑栏拿着旧修改时间保存回 409; 对照首版按整数比, 没人改过也 409

演示滚到这里时加载

这一段证明: 降到 double 比才不误判; 鉴权回 401 401 200 503

第 7 章可现场演示

个人项目 · OpenAI Agents SDK

时间追踪智能体, 说一句话就记下

给自己用的智能体后端, 入口是 Discord; 模型自称'已确认'不算数, 代码回查用户原话.

想用说话的方式记时间与待办; 基于 OpenAI Agents SDK 做了智能体后端, 经 5 个工具函数把自然语言转成数据库操作, 13 种改写与删除先出预览, 用户确认后才执行.

这是什么 · 追问 · 看细节

基于 OpenAI Agents SDK, 智能体经 5 个工具函数把自然语言转成数据库操作; 13 种改写与删除操作先出预览, 用户确认后才执行; 10 张表(SQLite), FastAPI 接口 38 个, 561 个测试函数.

  • 个人项目, 使用者只有本人. 入口是 Discord. 一句话进来先按频道排队, 取最近几条对话当记忆, 现查数据库把正在做的事和任务列表拼进上下文; 模型从工具里挑着调, 改写和删除先过确认闸, 业务函数校验后写进 SQLite.
  • 确认闸: 改写与删除先只出预览; 模型自己说'已确认'不算数, 代码回头查用户这一轮的原话里有没有肯定词.
  • 代码由 AI 编程工具写, 需求与验收由本人做.
追问 · 第 2 层记忆是怎么做的?

每个频道留最近几条对话与最近几次工具调用, 存在进程内存里, 重启就没了; 没答完的反问另存一张表, 到时过期.

追问 · 第 2 层工具是怎么交给模型的?

每个工具一个函数加一段说明文字, 模型看说明决定调哪个 传什么参数.

看细节

时间追踪智能体的两道闸1 段

同一条四轮对话: 前闸看用户原话与上一轮预览, 后闸看回复与写操作对不对得上

演示滚到这里时加载

这一段证明: 同样四句话, 主干误执行 1 次 说做了没做 1 次; 分支两项都是 0

第 8 章

个人项目

用 Discord 在手机上指挥 Claude Code

自己在手机上用, systemd 服务常驻; 白名单与会话号校验, 用户的话放进 -- 后面.

想在手机上指挥电脑里的 Claude Code, 手机上现成的入口是 Discord; 做了一个机器人: 每个频道一条会话, 回答边生成边显示, 只响应白名单里的用户.

这是什么 · 追问 · 看细节

把 Claude Code 接进聊天频道, 每条消息启动一个命令行子进程并解析其流式 JSON 输出, 生产者与消费者两个协程边生成边更新消息; 频道到会话的映射落盘, 重启后续接; 用户白名单, 会话号经正则校验后才拼进命令行.

  • 个人项目, 自己在手机上用; 代码由 AI 编程工具写, 需求由本人定.
  • 安全上做了三件: 只响应白名单里的用户; 会话号先按格式校验再拼进命令行; 用户的话放在 -- 后面, 不会被当成命令行参数.
  • Python, discord.py 与 asyncio, 以 systemd 用户服务常驻; 2026.04 退役, 换用开源同类工具.
追问 · 第 2 层为什么每条消息起一个进程, 不用常驻进程?

实现简单; 代价是每条消息冷启动约 10 秒, 已加载的工具不能复用, 这是后来退役的原因.

追问 · 第 2 层同一个频道连着来两条消息怎么办?

有任务在跑时提示先发 !stop, 或在消息里加 !go 打断后执行.

看细节

Discord 机器人1 段

每条消息起一个子进程, 流式 JSON 边解析边改写同一条消息

演示滚到这里时加载

这一段证明: 续接会话, 超过 1900 字的回复切成两条

看全部项目

专题

视觉

第 1 章

企业交付

划词高亮检测, 为荣耀电脑管家而做

为荣耀 PC 软件部做的端侧视觉算法: 不训练模型, 只凭截图和鼠标拖选的起止点, 分割出被选中文字的高亮区域.

为荣耀电脑管家 Magic text 划词场景, 提出基于图形学拓扑包络原理的免训练高亮区域分割算法; 测试环境下单次处理耗时由约 3 秒优化到 30 ms 以内, 无需中台部署模型.

这是什么 · 追问 · 看细节

独立设计并实现免训练的高亮区域分割算法, 输入截图与鼠标拖选的起止坐标, 输出选中文字的区域掩码. 方法: 灰度量化为 16 级, 沿起止两点连成的轨迹线取样, Otsu 双阈值分三簇, 按轮廓包裹关系判定高亮簇, 形态学去毛刺.

Python 实现后移植 C++, 导出 C 接口 DLL.

  • 这是交给荣耀 PC 软件部的端侧视觉算法, 场景是荣耀电脑管家 Magic text 的划词: 用户拖选一段文字, 算法要从截图里找出被选中的那片高亮.
  • 荣耀方审阅完整方案后要求推进上线相关开发, 随即移植为 C++ 动态库.
  • 覆盖深浅两种界面 多行选择与不同 DPI.
追问 · 第 2 层为什么不用 YOLO 或分割网络?

当时记下的理由有两条: 高亮的颜色 场景与所处的界面都在变, 要达到同样的泛化需要大量数据集; 这个做法不需要 GPU.

看细节
示意图, 自绘高亮区域分割处理链示意: 左边一张带高亮文字和起止两点连线的示意截图, 右边依次为双边滤波, 灰度量化, 沿轨迹取样, 分三簇, 包裹关系判定, 形态学, 最后输出高亮区域掩码
处理链: 截图与起止两点 → 滤波 → 量化 → 沿轨迹取样 → 分三簇 → 包裹关系判定 → 形态学. 示意截图为自绘, 不是产品界面.

演示见 AI 与智能体 第 3 章

第 2 章可现场演示

学术研究

利兹大学硕士课题: 开颅窗聚焦超声

零样本评估 5 个分割模型读术中超声的肿瘤边界, 再核名次: 换病例排名稳, 换提示框排名不稳; 评测与仿真另封装为 MCP 工具.

让组内评测结果与仿真可被复用, 将其封装为 MCP 工具接入智能体后端; 针对模型称已完成实则失败的问题, 将回复与工具执行结果自动对账并拦截; 自建对话评测集, 从工具选择 参数与执行结果三方面评估智能体.

这是什么 · 追问 · 看细节

在 23 例术中超声上零样本评估 5 个 SAM 变体, 最优者 Dice 0.858, HD95 2.82 mm. 换病例重采样 10000 次, 最优者保持第一的概率 0.957; 提示框加扰动后 69 个组合里 55 个名次改变.

  • 英国利兹大学的硕士课题(MSc Individual Project), 问两件事: 从术中超声里读肿瘤边界能读多准, 开颅窗下热量能送多深.
  • Agent Evaluation -- 自建对话评测集, 从工具选择 参数与执行结果三方面评估智能体, 查出模型的参数单位换算错误; 录制真实回复做离线回放, 修正判分规则后无需重复调用模型; 沿用课题重采样方法比较模型.
  • 基础模型 Evaluation -- 搭建视觉基础模型评测 pipeline, 零样本评估分割基础模型在术中超声上的边界精度; 针对排名随提示框波动的问题, 加做按病例重采样与提示扰动两类稳定性检验, 得出换病例排名稳定 换提示排名不稳的结论, 指出零样本精度依赖人工提示.
  • 针对仿真库只算声场的缺口, 自建热传导求解器补齐脑瘤声场到热剂量的仿真工具链, 并用解析解验证. 仿真前先校验配置并缩小网格预跑, 把错误配置挡在耗时仿真之前.
追问 · 第 2 层为什么用专家标注求出的框当提示, 这样量出来的是什么?

量的是给定准确框时的上限. 实际使用时拿不到这样准的框, 所以报告里写明这组数是上限.

看细节

课题: 真图上分割, 再问能否烧到1 段

同一张公开术中超声, 提示框一缩一移, 4 个模型的名次就变; 再按颅窗宽算消融深度, 智能体代跑时配置闸与对账拦错

演示滚到这里时加载

这一段证明: 框一变名次就变; 消融深度与肿瘤深度并排对照

第 3 章可现场演示

学术研究

论文 MelanoGAN-PPO: 黑色素瘤分类

英文论文: 皮肤镜图里黑色素瘤只占约 1.8%, 用 GAN 在线换入生成样本, 再以 Off-policy PPO 配给少数类更重奖惩的奖励表.

皮肤镜图像里黑色素瘤约占 1.8%, 全判良性的准确率也很高: 论文用 GAN 在线换入同类生成样本, 把分类写成强化学习, 用 Off-policy PPO 与给少数类更重奖惩的奖励表训练.

这是什么 · 追问 · 看细节
  • 一篇英文论文, 全文 26 页, 做皮肤镜图像的黑色素瘤分类.
  • 数据是 SIIM-ISIC 黑色素瘤分类挑战赛(ISIC-2020)的皮肤镜图: 去掉 425 张重复后 32,701 张, 其中黑色素瘤 581 张.
  • 模型用三个空洞卷积层提特征再合并分类. 训练写成一串决策: 每张图是一个状态, 网络的判定是动作, 判对判错按奖励表给奖惩, 经验进回放记忆, 用 Off-policy PPO 更新; 多数类的奖惩是 ±λ(0<λ<1), 少数类的奖惩绝对值更大.
  • 数据增强在线做: 每张图按概率保留, 否则换成生成器画的同类新图; 生成器另加重建损失, 用来缓解模式崩溃.
追问 · 第 2 层为什么不直接看准确率?

黑色素瘤只占约 1.8%, 全判良性的准确率也很高; 论文按 F 值与几何平均比较, 这两个指标适合类别失衡的数据.

追问 · 第 3 层奖励表里的 λ 怎么定?

论文稿写 λ 按多数类与少数类的数量比调, 比例越大 λ 越小, 并在 0 到 1 之间每 0.1 一档扫过.

看细节

少数类怎么不被漏掉1 段

示意: 56 张里 1 张黑色素瘤, 直接训练准确率 98.2% 却漏掉它; 换 PPO 加奖励表, 准确率不变, 抓到它

演示滚到这里时加载

这一段证明: 奖励表让少数类不被全判良性吞掉

第 4 章

学术研究

利兹大学的语义 SLAM 机器人

给移动机器人加语义: 把一套公开的语义 SLAM 代码(ORB-SLAM2 稠密建图加 FCAF3D 三维检测)装进 WSL2 编过去, 读源码写了流程记录.

2024 年在利兹给移动机器人加语义: 把一套公开的语义 SLAM 代码(ORB-SLAM2 稠密建图加 FCAF3D 三维检测)在 WSL2 的 Ubuntu 18.04 上装起来编过去, 读过源码并写了流程记录.

这是什么 · 追问 · 看细节

把一套公开的语义 SLAM 代码(ORB-SLAM2 稠密建图加 FCAF3D 三维检测)在自己的环境里装起来编过去, 读过它的源码并写了流程记录.

  • 在利兹大学读硕士期间做的课题, 想让一台移动机器人建图的同时认出场景里的物体.
  • SLAM 与检测的代码包出自别人的公开仓; 本人改的是编译配置 路径与依赖, 算法没有动.
  • 环境是 WSL2 里的 Ubuntu 18.04, ROS Melodic, CUDA 11.3, PyTorch 1.12.1; 编 ORB-SLAM2 时碰到 Eigen 的兼容问题, 去掉了编译选项里的 -march=native; PCL 版本由 1.7.2 改成 1.8.1, 补了缺的头文件.
  • 另起了两个上位机小工具: 安卓遥控 App 做到界面与蓝牙状态监测, 串口日志工具做到串口连接与导出; 3 月用这台机器人做过一次导盲场景的课程展示.
看细节

从空地图逐关键帧建语义地图1 段

16 个关键帧建成地图, 框乘位姿链落进 map, SORT 把同一物体合成一个

演示滚到这里时加载

这一段证明: 16 个关键帧建成地图, 同一物体多次看到只留一个框

第 5 章

学术研究

动态环境语义 SLAM · 本科毕设

燕山大学本科优秀毕业设计. 运动物体上的特征点会让位姿估计出错; 以两帧差分与 FCN 语义分割剔除这些点, 在公开数据集上实验.

动态环境里落在运动物体上的特征点会让位姿估计出错; 以两帧差分与 FCN 语义分割剔除动态物体上的特征点, 在 KITTI TUM-VI TUM 公开数据集上实验; 2021 届燕山大学本科优秀毕业设计.

这是什么 · 追问 · 看细节
  • 燕山大学的本科毕业设计, 题目自选; 论文《动态环境下移动机器人语义 SLAM 研究》评为燕山大学本科优秀毕业设计.
看细节

动态点剔除与底盘1 段

公开序列真帧: 人身上的点整块剔掉, ATE 75.7 → 44.7 cm

演示滚到这里时加载

这一段证明: 下位机按运动学与增量式 PI 让小车过转角

第 6 章

竞赛 · 队长

工训赛垃圾分类机器, 从省赛到国赛

全国总决赛金奖(生活垃圾智能分类赛项正赛成绩全国第一), 河北省赛特等奖. 机器识别垃圾分进四类桶; 本人在 YOLOv5s 上写应用层, 定上下位机串口协议.

比赛机器要识别投进来的垃圾并分到四类桶; 在 Jetson TX2 上部署 YOLOv5s 并自写应用层, 设计上下位机串口协议; 全国总决赛金奖 / 队长(生活垃圾智能分类赛项正赛成绩全国第一).

这是什么 · 追问 · 看细节

把一个现成的检测模型用到比赛的机器上: 单件模式累计 4 次才上报, 多件模式记下每件的类别与位置逐件下发, 决赛现场 29 秒分完 10 件.

  • 燕山大学参赛队, 本人任队长. 先拿第七届河北省大学生工程训练综合能力竞赛特等奖, 再进中国大学生工程实践与创新能力大赛'智能+'赛道全国总决赛, 获生活垃圾智能分类赛项金奖; 燕山大学官网新闻写这支队省选赛第一名晋级, 总决赛初赛河北赛点第一, 最终该赛项正赛成绩全国第一.
  • 在 Jetson TX2 上部署 YOLOv5s, 自写应用层; 校赛阶段在 K210 上跑 YOLOv2; 为多人协作撰写数据集制作教程.
  • 下位机一直往上发状态, 上位机看到'要下一件'才回一帧, 里面是这一件的类别和坐标.
  • 本人做的是上位机应用层, 转接板的原理图与 PCB, 校赛版下位机与 4 篇文书; 省赛国赛版下位机与机械由队友完成.
追问 · 第 2 层帧头对不上或校验不过怎么办?

上位机每处理完一帧图像读一次串口缓冲区, 只解析前 8 个字节; 帧头或校验不对就作废这一次, 没有做重新对齐. 校赛版下位机逐字节收, 帧头对不上就回到起点.

看细节

工训赛垃圾分拣1 段

决赛: 10 件分 4 批落进托盘, 编号最大的先发, 每件回一帧 8 字节

演示滚到这里时加载

这一段证明: 29.0 s 分完 4 类 10 件, 第 10 件坐标填 999

第 7 章

竞赛

电赛四轴: 线缆巡检的视觉端

全国大学生电子设计竞赛(河北赛区)本科生组一等奖. 赛题是四旋翼沿线缆巡检找异物; OpenMV 上写视觉端: 色块检测, 直线交点判直角, 与飞控串口通信.

电赛题目是四旋翼沿线缆巡检, 识别线上的异物; 在一块 OpenMV 上做视觉端: 色块检测, 巡线的直线交点与直角判断, 与飞控的串口帧; 河北赛区本科生组一等奖 / 队长, 负责无人机机器视觉与飞控开发.

这是什么 · 追问 · 看细节

四旋翼巡检机器人的视觉端(OpenMV, MicroPython): 色块检测, 巡线的直线交点与直角判断, 与飞控的串口帧, 板上按键调阈值与曝光时间; 6 月底至 8 月初迭代 13 个版本.

  • 燕山大学参赛队, 本人任队长; 获全国大学生电子设计竞赛(河北赛区)本科生组一等奖, 证书由河北省教育厅颁发.
  • 异物用色块检测找, 阈值在 LAB 空间里定; 巡线用霍夫直线检测和线性回归, 要认出直角时求两条直线的交点再判夹角.
  • 测试环境的干扰会影响识别, 所以在板子上做了一个用按键调阈值和曝光时间的小界面, 能切到二值画面看效果, 参数存成文件, 调参不用接电脑.
  • 识别结果按飞控的串口协议打成帧发过去.
追问 · 第 2 层LAB 阈值怎么定的?

在板上用按键调 L A B 六个上下限, 对着二值画面看, 调好存文件.

追问 · 第 2 层串口帧长什么样?

帧头两个字节, 后面是功能字 长度 数据与和校验; 点 线 方框三类检测结果各用一个功能字(0xF2 0xF3 0xF4).

看细节

整机巡检: 融合 定高 光流 巡线 定位1 段

传感器融合 → 起飞定高 → 光流定点 → 巡线转弯 → 色块报警与标签降落; 巡线每帧走 0731 移植的判定与 13 字节串口帧

演示滚到这里时加载

这一段证明: 落地, 离标签中心 4.1 cm(仿真)

第 8 章

竞赛

测温口罩与尺寸测量, 两道电赛题

两道电赛赛题, 代码自写. G 题: OpenMV 加云台找目标, 按填充率判形状, 测距换算尺寸; F 题: 判口罩读额温, 经 ESP8266 放到网页.

2020 电赛 F G 题: OpenMV 加舵机云台找目标, 按色块填充率判形状, 测距换算尺寸; 口罩与额温经 STM32 汇总, 由 ESP8266 放到网页. 代码自写, 开发到 2021 年春.

这是什么 · 追问 · 看细节
  • 两道都是电赛的赛题, 代码自己写, 一直改到第二年春天: G 题做非接触的形状判别与尺寸测量, F 题做口罩识别加额温测量.
  • G 题: 舵机云台带 OpenMV 巡航, 连续检出 15 帧后转追踪, 按色块中心偏离画面中心的像素数调舵机, 偏差小于 5 像素就锁定并打激光; 再按色块填充率判圆 三角 方, 用激光测距读数乘像素长换算尺寸.
  • F 题: 三块板分工: OpenMV 判口罩, STM32 读额温并汇总, ESP8266 把结果放到网页上, 网页每 500 毫秒取一次数据.
追问 · 第 2 层尺寸怎么从像素换成厘米?

VL53L1X 测出距离, 乘色块外接框长边的像素数, 再乘标定系数 0.970, 除以画面宽 160; 系数用已知 185 毫米的物体在 65 像素处标出来.

追问 · 第 2 层为什么用填充率判形状?

圆约占外接框的四分之三多, 三角约一半, 方接近满; 按区间切开, 不用拟合轮廓, OpenMV 上一帧就能出结果.

看细节

云台测尺寸与测温口罩1 段

OpenMV 按填充率判形状, 测距换算尺寸; 口罩与额温经 STM32 和 ESP8266 送上网页.

演示滚到这里时加载

这一段证明: 填充率判形状, 测距换尺寸; 额温口罩上网页

第 9 章

个人项目

车载感知立项: 禾赛 40 线雷达加相机

车内屏画点云 检测框与鸟瞰, 主机 Jetson TX1, 只看不控. 已定需求 画面与算力账, 实测了候选相机, 还没有代码.

给车做一套只看不控的感知显示: 车顶 40 线雷达加 USB 相机, 主机 Jetson TX1, 车内屏画点云 检测框与鸟瞰, 遥测经 WebSocket 推给安卓车机. 已定需求 画面 算力账, 实测了候选相机, 还没有代码.

这是什么 · 追问 · 看细节
  • 方案是车顶一台禾赛 Pandar40P(40 线激光雷达)加 USB 相机, 主机 Jetson TX1, 跑 ROS 1 Melodic; 只做感知与显示, 不接车辆控制. 下面几段是立项文档里定下的, 仓里还没有代码.
  • 管线: 雷达解包 → 地面分割与降采样 → 欧式聚类出 3D 框 → 相机画面跑 YOLOv8n, 雷达点投到图像上给每个框配距离 → 车内屏 1920×720 上屏; 遥测按冻结的 schema 每秒 10 次推给安卓车机.
  • 算力账按画面反推: CPU 约 2.6-2.9 核, GPU 约 75-110%, YOLO 与渲染同抢一块 GPU, 同跑估 12-18 fps, 卡在需求 10-15 的下沿之上.
  • 相机选型靠台架实测: 一台 1920×1200 下 83.7 fps, 很可能是全局快门; 另一台锁 20 ms 零增益反而更亮, 与没有红外截止片一致.
追问 · 第 3 层做到哪一步了?

立项: 需求规格 画面方案 算力预算与相机实测已落文档, 仓里还没有代码; 演示里的管线按这些文档画, 不是跑出来的.

看细节

雷达加相机一帧上屏1 段

雷达点云 聚类 相机 YOLO 投影上车内屏, 遥测 10 Hz 推给车机; 右侧是 TX1 的算力账(估算).

演示滚到这里时加载

这一段证明: 一帧上屏, 遥测推给车机, 相机掉线能退化

看全部项目

专题

嵌入式与端侧

第 1 章

学术研究

在河北光纤实验室做可见光定位

几盏 LED 各用一个频率闪, 接收端要认出每盏灯再算位置; 本人在 STM32F4 上做接收端: 双 ADC 同步采样, 512 点 FFT 按调制频率认灯.

几盏 LED 各用一个频率闪, 接收端要认出每盏灯再算位置; 在 STM32F4 上做接收端: 双 ADC 同步采样, 512 点 FFT 按调制频率区分各灯, 由 PSD 四路电流计算光斑位置, 并实现三边测量定位算法.

这是什么 · 追问 · 看细节

室内可见光定位接收端(STM32F4, C): 定时器触发双 ADC 同步采样, DMA 传输, 512 点 FFT(CMSIS-DSP)按调制频率区分各灯; 由位置敏感探测器(PSD)的四路电流计算光斑位置, 并实现了三边测量定位算法.

  • 本科时在河北光纤实验室光纤传感器研究团队期间的经历, 本人做的是室内可见光定位的接收端.
  • 探测器是一块二维的位置敏感探测器, 前面装一只镜头, 出四路电流, 先过互阻放大变成电压, 再放大 滤波, 进 ADC.
  • 第 n 号灯的频率是基频的 n 倍, 接收端按频点认灯; 用四路电流的比例算光斑在探测器上的位置, 同一组的三盏灯凑齐就做三边测量.
追问 · 第 2 层采样率为什么取 59733 赫兹这样一个不整的数?

它是灯的基频的 51.2 倍: 取 512 个点时, 基频正好落在第 10 个频点.

看细节

可见光定位1 段

leddata5 的真实采样已收完, 板上频谱第 20 点最高

演示滚到这里时加载

这一段证明: 三个圆交出位置; 遮挡的那一帧 error:-2 被丢掉, 下一帧照常

第 2 章

学术研究 · 河北光纤实验室

干涉式光纤陀螺仪的上位机

光纤传感器研究团队的陀螺仪, 本人写上位机: STM32 经串口读陀螺数据, 逐字节解帧并校验, 送串口屏显示, 断线时屏上显示 OFFLINE.

本科在实验室做干涉式光纤陀螺仪的上位机: STM32 经串口读陀螺数据, 逐字节解帧并校验, 结果送到串口屏的组态界面显示, 断线时屏上显示 OFFLINE.

这是什么 · 追问 · 看细节
  • 本科时在河北光纤实验室光纤传感器研究团队, 团队做干涉式光纤陀螺仪, 本人写它的上位机; 当时组会汇报里这一部分的主要内容是数据处理与转发.
  • 陀螺数据走一路 460800 波特的串口; 解帧用逐字节的状态机: 帧头 99 66 A5, 5 字节数据, 末字节是前 8 字节之和加 1, 对不上就回到起点.
  • 超过 1500 毫秒收不到数据, 屏上显示 OFFLINE.
  • 工程基于正点原子的串口实验例程与 ST 库; 本人改动的是陀螺数据解析 定时与串口屏界面这些文件, 文件日期都在 2021-01.
看细节

光纤陀螺上位机1 段

陀螺插着, 字节流逐字节进解帧状态机

演示滚到这里时加载

这一段证明: 标定写回标度因数; 拔掉陀螺屏上 OFFLINE, 插回恢复

第 3 章

竞赛 · 队长

工训赛垃圾分类机器, 从省赛到国赛

全国总决赛金奖(生活垃圾智能分类赛项正赛成绩全国第一), 河北省赛特等奖. 机器识别垃圾分进四类桶; 本人在 YOLOv5s 上写应用层, 定上下位机串口协议.

比赛机器要识别投进来的垃圾并分到四类桶; 在 Jetson TX2 上部署 YOLOv5s 并自写应用层, 设计上下位机串口协议; 全国总决赛金奖 / 队长(生活垃圾智能分类赛项正赛成绩全国第一).

这是什么 · 追问 · 看细节

设计上下位机串口协议(8 字节帧, 帧头加和校验, 保持型与单次型两类标志位); 转接板原理图与 PCB(13 路超声波 4 路步进电机 4 路舵机); 校赛版下位机固件(STM32F103 标准库, 定时器 PWM 驱动舵机).

  • 燕山大学参赛队, 本人任队长. 先拿第七届河北省大学生工程训练综合能力竞赛特等奖, 再进中国大学生工程实践与创新能力大赛'智能+'赛道全国总决赛, 获生活垃圾智能分类赛项金奖; 燕山大学官网新闻写这支队省选赛第一名晋级, 总决赛初赛河北赛点第一, 最终该赛项正赛成绩全国第一.
  • 在 Jetson TX2 上部署 YOLOv5s, 自写应用层; 校赛阶段在 K210 上跑 YOLOv2; 为多人协作撰写数据集制作教程.
  • 下位机一直往上发状态, 上位机看到'要下一件'才回一帧, 里面是这一件的类别和坐标.
  • 本人做的是上位机应用层, 转接板的原理图与 PCB, 校赛版下位机与 4 篇文书; 省赛国赛版下位机与机械由队友完成.
追问 · 第 2 层帧头对不上或校验不过怎么办?

上位机每处理完一帧图像读一次串口缓冲区, 只解析前 8 个字节; 帧头或校验不对就作废这一次, 没有做重新对齐. 校赛版下位机逐字节收, 帧头对不上就回到起点.

看细节

工训赛垃圾分拣1 段

决赛: 10 件分 4 批落进托盘, 编号最大的先发, 每件回一帧 8 字节

演示滚到这里时加载

这一段证明: 29.0 s 分完 4 类 10 件, 第 10 件坐标填 999

第 4 章

竞赛

测温口罩与尺寸测量, 两道电赛题

两道电赛赛题, 代码自写. G 题: OpenMV 加云台找目标, 按填充率判形状, 测距换算尺寸; F 题: 判口罩读额温, 经 ESP8266 放到网页.

2020 电赛 F G 题: OpenMV 加舵机云台找目标, 按色块填充率判形状, 测距换算尺寸; 口罩与额温经 STM32 汇总, 由 ESP8266 放到网页. 代码自写, 开发到 2021 年春.

这是什么 · 追问 · 看细节
  • 两道都是电赛的赛题, 代码自己写, 一直改到第二年春天: G 题做非接触的形状判别与尺寸测量, F 题做口罩识别加额温测量.
  • G 题: 舵机云台带 OpenMV 巡航, 连续检出 15 帧后转追踪, 按色块中心偏离画面中心的像素数调舵机, 偏差小于 5 像素就锁定并打激光; 再按色块填充率判圆 三角 方, 用激光测距读数乘像素长换算尺寸.
  • F 题: 三块板分工: OpenMV 判口罩, STM32 读额温并汇总, ESP8266 把结果放到网页上, 网页每 500 毫秒取一次数据.
追问 · 第 2 层尺寸怎么从像素换成厘米?

VL53L1X 测出距离, 乘色块外接框长边的像素数, 再乘标定系数 0.970, 除以画面宽 160; 系数用已知 185 毫米的物体在 65 像素处标出来.

追问 · 第 2 层为什么用填充率判形状?

圆约占外接框的四分之三多, 三角约一半, 方接近满; 按区间切开, 不用拟合轮廓, OpenMV 上一帧就能出结果.

看细节

云台测尺寸与测温口罩1 段

OpenMV 按填充率判形状, 测距换算尺寸; 口罩与额温经 STM32 和 ESP8266 送上网页.

演示滚到这里时加载

这一段证明: 填充率判形状, 测距换尺寸; 额温口罩上网页

第 5 章

个人项目 · 3 天装车

装在自己车上的车机控制台

车机是全志 T3, 安卓 4.4, 蓝牙模块没有公开接口. 装车实测发现滚动卡顿, 修完绘制耗时中位数 31.03 ms 降到 1.24 ms.

想让车上的老车机当一块数据屏; 以 Claude Code 开发 Android 应用, 3 天装车运行; 装车实测发现页面滚动卡顿, 指挥 Claude Code 定位根因并修复, 绘制耗时中位数 31.03 ms 降到 1.24 ms.

这是什么 · 追问 · 看细节

车机(Allwinner T3, Android 4.4.2)的蓝牙模块无公开接口, 逐条在真机上验证接口行为, 记录在案 26 条, 其中 12 条经真机验证.

本人实测发现滚动卡顿, 指挥 Claude Code 定位根因(每次触摸都重新折行全文)并修复(改为一次折行加二分查找); 按系统帧统计验收: 绘制耗时中位数 31.03 ms 降到 1.24 ms, 超时帧 18/25 降到 0/128.

  • 车机是全志 T3, 安卓 4.4; 从立项到装车 3 天, 47 个提交. 个人项目, 装在自己的车上; 代码由 Claude Code 写, 需求与装车实测由本人做.
  • 车机的蓝牙模块没有公开文档, 能用的接口只能从系统广播和 AIDL 的事务码里一条条试; 每条结论记进一本账, 标明是真机上验过的还是猜的.
  • 扫描那次的修法写进了代码: 每次绑定服务先发一条停止搜索, 扫描键加了一个到点必停的期限.
追问 · 第 2 层模块什么时候会拒绝命令?

搜索状态下拒绝一切命令, 也不接受连接, 安卓重启清不掉这个状态; 发一条停止搜索后, 配对列表马上读了出来.

看细节

老车机当数据屏1 段

车机开着 DEMO 模式, 假想巡检车的日志自己滚

演示滚到这里时加载

这一段证明: 改前改后各滑 6 次: Draw 中位数 31.03 → 1.24 ms

第 6 章

个人项目

车载感知立项: 禾赛 40 线雷达加相机

车内屏画点云 检测框与鸟瞰, 主机 Jetson TX1, 只看不控. 已定需求 画面与算力账, 实测了候选相机, 还没有代码.

给车做一套只看不控的感知显示: 车顶 40 线雷达加 USB 相机, 主机 Jetson TX1, 车内屏画点云 检测框与鸟瞰, 遥测经 WebSocket 推给安卓车机. 已定需求 画面 算力账, 实测了候选相机, 还没有代码.

这是什么 · 追问 · 看细节
  • 方案是车顶一台禾赛 Pandar40P(40 线激光雷达)加 USB 相机, 主机 Jetson TX1, 跑 ROS 1 Melodic; 只做感知与显示, 不接车辆控制. 下面几段是立项文档里定下的, 仓里还没有代码.
  • 管线: 雷达解包 → 地面分割与降采样 → 欧式聚类出 3D 框 → 相机画面跑 YOLOv8n, 雷达点投到图像上给每个框配距离 → 车内屏 1920×720 上屏; 遥测按冻结的 schema 每秒 10 次推给安卓车机.
  • 算力账按画面反推: CPU 约 2.6-2.9 核, GPU 约 75-110%, YOLO 与渲染同抢一块 GPU, 同跑估 12-18 fps, 卡在需求 10-15 的下沿之上.
  • 相机选型靠台架实测: 一台 1920×1200 下 83.7 fps, 很可能是全局快门; 另一台锁 20 ms 零增益反而更亮, 与没有红外截止片一致.
追问 · 第 3 层做到哪一步了?

立项: 需求规格 画面方案 算力预算与相机实测已落文档, 仓里还没有代码; 演示里的管线按这些文档画, 不是跑出来的.

看细节

雷达加相机一帧上屏1 段

雷达点云 聚类 相机 YOLO 投影上车内屏, 遥测 10 Hz 推给车机; 右侧是 TX1 的算力账(估算).

演示滚到这里时加载

这一段证明: 一帧上屏, 遥测推给车机, 相机掉线能退化

第 7 章

个人项目 · 装在自家门口

迎客松: 电视盒改成门屏加录像机

一天上线. 晶晨 S905L3B 电视盒刷成 Armbian, 第一版屏只有 5 帧, 量过几种画法的单帧耗时后改成直写帧缓冲…

一天把一台 ARM 电视盒做成门口的迎客屏加录像机: 第一版只有 5 帧, 量过几种画法的单帧耗时后改成直写帧缓冲; 录像降分辨率后 CPU 占用由 2.2 核降到 0.5 核.

这是什么 · 追问 · 看细节

ARM 电视盒上的门屏与录像: 软件渲染直写 framebuffer(实测三种画法的单帧耗时后选定, 1080p 15 帧); ffmpeg 转 x264 分段录像, 降分辨率后 CPU 占用由 2.2 核降到 0.5 核.

  • 一台晶晨 S905L3B 电视盒刷成 Armbian, 接上 USB 摄像头, 一边当门口的迎客屏, 一边分段录像; 一天 10 个提交上线.
  • 第一版走图形库的 GL 路径, 只有 5 帧; 量过几种画法的单帧耗时后, 架构定成图形库只负责画, 输出自己写进帧缓冲.
  • U 盘拔了就录到板上的存储里, 插回来自动切回去; 三个服务交给 systemd, 断电重启 25 秒全部回来.
  • 个人项目, 装在自家门口; 代码由 Claude Code 写, 板上的耗时也是它量的; 刷机时短接和接线由本人动手, 屏上放什么 每一轮砍什么由本人定.
追问 · 第 2 层U 盘热插拔为什么一开始不挂载?

fstab 里的条目只在开机时挂, 运行中插盘不触发, 加了一条 udev 规则.

看细节

迎客屏与录像机1 段

真机截屏: 第一版门屏只有 5 帧

演示滚到这里时加载

这一段证明: 门屏 5 → 15-20 fps, 录像 2.2 → 0.5 核

第 8 章

个人项目

旧手机变网络摄像头: mydroidcam

一周 31 个提交的 Flutter 应用: 手机端 HTTP 服务输出 MJPEG 视频流, WebSocket 远程控制相机, 电脑端用脚本取流显示.

想让旧手机有点用处, 把它当摄像头: 一周做出一个 Flutter 应用, 手机端 HTTP 服务输出 MJPEG 视频流, WebSocket 远程控制相机.

这是什么 · 追问 · 看细节

手机网络摄像头应用(Flutter, 2024.04): 相机控制(分辨率 变焦 曝光 闪光灯 自动与手动对焦 切换镜头), 手机端 HTTP 服务输出 MJPEG 视频流, WebSocket 远程控制相机.

  • Flutter 写的手机应用, 31 个提交. 相机这一侧能调分辨率 变焦 曝光 闪光灯, 能切自动与手动对焦, 也能切换镜头.
  • 试过把推流放到单独的 isolate 里, 流出来了, 但访问视频地址时报 505; 隔天退回单线程的写法, 把相机管理收成一个对象, 推流和远程控制都经过它.
  • 电脑上用一个 Python 脚本取流显示.
  • 个人项目; 开发中用 GPT 与 Claude 对话生成代码, 需求由本人一步步拆给它们, 包的用法由本人查好资料贴给它们.
追问 · 第 2 层为什么用 MJPEG?

仿的是 DroidCam; 当时的选型表写 MJPEG 方便网络传输.

看细节

视频流四环节1 段

手机逐像素转码编 JPEG, multipart 推流; 电脑两种拼帧; 编码慢于 33 ms 时延迟越积越多

演示滚到这里时加载

这一段证明: 按长度拼帧不怕缩略图; 只留最新帧延迟不涨

第 9 章

个人项目 · 长期在跑

自家 homelab 里的三机同步引擎

systemd 每 10 分钟拉起一次, 笔记在笔记本 工作站 NAS 三台之间同步; 冲突时保留两份, 配 216 条断言的回归测试.

一部手机加三台机器的随身工作站: 手机上起 Termux 与 proot Debian 当终端, 笔记在三台之间同步; 以 Claude Code 开发 bash 同步引擎, 冲突时保留两份, 配 216 条断言的回归测试.

这是什么 · 追问 · 看细节

Android 动态壁纸(以 Claude Code 开发, 2026.08): 锁屏每 0.5 秒渲染一次系统日志流; 不依赖 Gradle, 以脚本串起 aapt2 javac d8 zipalign 与签名六步构建.

  • 三台机器是笔记本 工作站与 NAS; 同步引擎 898 行 bash, 回归测试 822 行, 以 Claude Code 开发.
  • 两边同时改了同一个文件, 远端的当正本, 本机的另存成一个带主机名和时间的冲突副本, 副本也会被同步出去.
  • 本人带笔记本去没信号的地方, 发现它断网时一直在重试, 提出先判断有没有网; 引擎加断网预检时, 测试由 150 条断言扩到 216 条, 原有 150 条未改动.
  • 由 systemd 定时器每 10 分钟拉起一次; 每个同步的仓有一个状态文件, 笔记编辑服务的首页徽章读的就是它.
  • 手机一端是一台刷了 LineageOS 的手机: 锁屏壁纸每 0.5 秒渲染一次系统日志流, 解锁换成机队面板; Termux 开机起 sshd, 桌面小部件一键进 proot Debian 里的 tmux 常驻会话. 配置推回手机要经 /sdcard 中转, 并从设备现有目录抄 SELinux context. 代码由 Claude Code 写, 需求 真机验收与版式参数由本人定.
  • proot 的 link() 有 bug, dpkg 原子更新崩在 link 那步, 状态库 status 整个丢失; 先后猜过 seccomp 与 AppArmor, 实测后都撤回; 不能原地修, 改用 apt-get download 加 dpkg-deb -x 只解包装上 tmux.
  • 配置层用 GNU Stow 管理, dotfiles 里 113 个脚本, 其中 tmux 相关的 41 个. 常驻服务之一是本地出图网页(Gradio), 以 systemd 用户服务运行, 支持文生图与参考图编辑, 每张图旁写一份元数据 JSON.
追问 · 第 2 层为什么用 bash 不用 Python?

文档写的是引擎纯 bash+git+coreutils, 零第三方.

追问 · 第 2 层测试自己写错了怎么发现?

断言的期望值出自对旧脚本行为的对照与四轮双审的实跑复现.

看细节

homelab: 手机终端与三机同步1 段

锁屏 logcat 壁纸, 推配置, proot 排障, 冲突降级, 216 条断言一屏跑完

演示滚到这里时加载

这一段证明: 冲突时两份都留, 216 条断言全过

看全部项目

专题

AI Native 开发

AI Native 的工作方式: 计划 审查 验收写成规程, 对 AI 的输出按实测验收.

第 1 章可现场演示

学术研究

利兹大学硕士课题: 开颅窗聚焦超声

零样本评估 5 个分割模型读术中超声的肿瘤边界, 再核名次: 换病例排名稳, 换提示框排名不稳; 评测与仿真另封装为 MCP 工具.

让组内评测结果与仿真可被复用, 将其封装为 MCP 工具接入智能体后端; 针对模型称已完成实则失败的问题, 将回复与工具执行结果自动对账并拦截; 自建对话评测集, 从工具选择 参数与执行结果三方面评估智能体.

这是什么 · 追问 · 看细节

以 AI Native 方式完成(855 个提交, 641 个由 Claude Code 合著).

  • 英国利兹大学的硕士课题(MSc Individual Project), 问两件事: 从术中超声里读肿瘤边界能读多准, 开颅窗下热量能送多深.
  • Agent Evaluation -- 自建对话评测集, 从工具选择 参数与执行结果三方面评估智能体, 查出模型的参数单位换算错误; 录制真实回复做离线回放, 修正判分规则后无需重复调用模型; 沿用课题重采样方法比较模型.
  • 基础模型 Evaluation -- 搭建视觉基础模型评测 pipeline, 零样本评估分割基础模型在术中超声上的边界精度; 针对排名随提示框波动的问题, 加做按病例重采样与提示扰动两类稳定性检验, 得出换病例排名稳定 换提示排名不稳的结论, 指出零样本精度依赖人工提示.
  • 针对仿真库只算声场的缺口, 自建热传导求解器补齐脑瘤声场到热剂量的仿真工具链, 并用解析解验证. 仿真前先校验配置并缩小网格预跑, 把错误配置挡在耗时仿真之前.
追问 · 第 2 层为什么用专家标注求出的框当提示, 这样量出来的是什么?

量的是给定准确框时的上限. 实际使用时拿不到这样准的框, 所以报告里写明这组数是上限.

看细节

课题: 真图上分割, 再问能否烧到1 段

同一张公开术中超声, 提示框一缩一移, 4 个模型的名次就变; 再按颅窗宽算消融深度, 智能体代跑时配置闸与对账拦错

演示滚到这里时加载

这一段证明: 框一变名次就变; 消融深度与肿瘤深度并排对照

第 2 章

个人项目 · 3 天装车

装在自己车上的车机控制台

车机是全志 T3, 安卓 4.4, 蓝牙模块没有公开接口. 装车实测发现滚动卡顿, 修完绘制耗时中位数 31.03 ms 降到 1.24 ms.

想让车上的老车机当一块数据屏; 以 Claude Code 开发 Android 应用, 3 天装车运行; 装车实测发现页面滚动卡顿, 指挥 Claude Code 定位根因并修复, 绘制耗时中位数 31.03 ms 降到 1.24 ms.

这是什么 · 追问 · 看细节

本人实测发现滚动卡顿, 指挥 Claude Code 定位根因(每次触摸都重新折行全文)并修复(改为一次折行加二分查找); 按系统帧统计验收: 绘制耗时中位数 31.03 ms 降到 1.24 ms, 超时帧 18/25 降到 0/128.

在车机上实测发现扫描与连接都没反应, 手机也连不上; 查出的原因是 AI 写的设备页发过"开始搜索"却从没发"停止". AI 在这件事上前后下过两个错判断("固件不支持", "模块卡死"), 都被推翻.

  • 车机是全志 T3, 安卓 4.4; 从立项到装车 3 天, 47 个提交. 个人项目, 装在自己的车上; 代码由 Claude Code 写, 需求与装车实测由本人做.
  • 车机的蓝牙模块没有公开文档, 能用的接口只能从系统广播和 AIDL 的事务码里一条条试; 每条结论记进一本账, 标明是真机上验过的还是猜的.
  • 扫描那次的修法写进了代码: 每次绑定服务先发一条停止搜索, 扫描键加了一个到点必停的期限.
追问 · 第 2 层模块什么时候会拒绝命令?

搜索状态下拒绝一切命令, 也不接受连接, 安卓重启清不掉这个状态; 发一条停止搜索后, 配对列表马上读了出来.

看细节
滚动卡顿修复示意: 改前每次触摸都对全文重新折行再绘制, 绘制耗时中位数 31.03 ms; 改后只折行一次, 触摸时二分查找再绘制, 中位数 1.24 ms
改前改后的处理流程, 数字取自改前改后的系统帧统计. 示意图, 自绘.

演示见 嵌入式与端侧 第 5 章

第 3 章

个人项目 · 长期在跑

自家 homelab 里的三机同步引擎

systemd 每 10 分钟拉起一次, 笔记在笔记本 工作站 NAS 三台之间同步; 冲突时保留两份, 配 216 条断言的回归测试.

一部手机加三台机器的随身工作站: 手机上起 Termux 与 proot Debian 当终端, 笔记在三台之间同步; 以 Claude Code 开发 bash 同步引擎, 冲突时保留两份, 配 216 条断言的回归测试.

这是什么 · 追问 · 看细节

多机文件同步引擎(bash, 898 行)及其回归测试(822 行, 31 个场景, 216 条断言, 全部在沙箱仓库中运行): 覆盖冲突降级 副本尺寸守卫 失败报错 幂等与锁. 以 Claude Code 开发.

一个长期在跑的基础设施脚本: 冲突时保留两份, 失败时报出来, 同一条命令重复跑没有副作用.

  • 三台机器是笔记本 工作站与 NAS; 同步引擎 898 行 bash, 回归测试 822 行, 以 Claude Code 开发.
  • 两边同时改了同一个文件, 远端的当正本, 本机的另存成一个带主机名和时间的冲突副本, 副本也会被同步出去.
  • 本人带笔记本去没信号的地方, 发现它断网时一直在重试, 提出先判断有没有网; 引擎加断网预检时, 测试由 150 条断言扩到 216 条, 原有 150 条未改动.
  • 由 systemd 定时器每 10 分钟拉起一次; 每个同步的仓有一个状态文件, 笔记编辑服务的首页徽章读的就是它.
  • 手机一端是一台刷了 LineageOS 的手机: 锁屏壁纸每 0.5 秒渲染一次系统日志流, 解锁换成机队面板; Termux 开机起 sshd, 桌面小部件一键进 proot Debian 里的 tmux 常驻会话. 配置推回手机要经 /sdcard 中转, 并从设备现有目录抄 SELinux context. 代码由 Claude Code 写, 需求 真机验收与版式参数由本人定.
  • proot 的 link() 有 bug, dpkg 原子更新崩在 link 那步, 状态库 status 整个丢失; 先后猜过 seccomp 与 AppArmor, 实测后都撤回; 不能原地修, 改用 apt-get download 加 dpkg-deb -x 只解包装上 tmux.
  • 配置层用 GNU Stow 管理, dotfiles 里 113 个脚本, 其中 tmux 相关的 41 个. 常驻服务之一是本地出图网页(Gradio), 以 systemd 用户服务运行, 支持文生图与参考图编辑, 每张图旁写一份元数据 JSON.
追问 · 第 2 层为什么用 bash 不用 Python?

文档写的是引擎纯 bash+git+coreutils, 零第三方.

追问 · 第 2 层测试自己写错了怎么发现?

断言的期望值出自对旧脚本行为的对照与四轮双审的实跑复现.

看细节

homelab: 手机终端与三机同步1 段

锁屏 logcat 壁纸, 推配置, proot 排障, 冲突降级, 216 条断言一屏跑完

演示滚到这里时加载

这一段证明: 冲突时两份都留, 216 条断言全过

第 4 章

个人项目

照柳比歇夫记时间的手机应用

每天画成一个圆, 一段记录是圆上的一个扇形. 开发时先让模型总结桌面版的功能, 再从易到难排成一轮轮指令, 每轮附一张文件结构图.

把桌面上的时间记录器移植到手机: 以 AI 编程工具开发一个 Flutter 应用, 时间记录 待办 笔记 统计四个模块, 带云端同步与本地定时提醒; 按功能清单逐条验收, 10 天勾掉 71 条.

这是什么 · 追问 · 看细节

时间记录 待办 笔记 统计四个模块, 云端同步(LeanCloud)与本地定时提醒; 以 AI 编程工具开发, 本人负责需求拆解与迭代计划, 按功能清单逐条验收(10 天勾掉 71 条), 设计时钟视图的交互.

  • 个人项目: 本人原先在电脑上有一个记时间的桌面程序, 这是它的手机移植. 它照柳比歇夫的办法记时间: 记下每件事的起止, 每天画成一个圆, 一段记录是圆上的一个扇形.
  • 开头让模型把桌面版的功能总结出来, 再按从易到难排成一轮轮的指令, 每一轮带一张文件结构图; 之后的功能记在一张清单上, 做完一条勾一条.
  • 个人项目; 代码由 AI 编程工具写, 需求与验收由本人做.
看细节

24 小时表盘: 模拟时钟走一上午1 段

模拟时钟 ×900 走过上午: 表盘随时刻转, 现在恒在顶端; 同一个 5° 桶里的 4 个标签径向错开

演示滚到这里时加载

这一段证明: 现在恒在顶端, 同桶标签径向错开

第 5 章

个人项目 · 成形于利兹大学课题

给 AI 写代码立规矩的 agent 工具集

规程是在硕士课题里一条条长出来的; 按退出码判的闸挂在 Claude Code 的 7 个事件上, 28 条 hook.

用 AI 写代码会跳步骤, 会把没验证的东西当结论; 把计划 审查 验收写成 9 个 skill 与一组 hook, 2026.07 起所有项目通用, 新项目一条命令起好骨架.

这是什么 · 追问 · 看细节

把计划 审查 验收写成 9 个 skill 与一组 hook.

  • 这套规程成形于本人在利兹大学的硕士课题: 计划 审查 验收 账本与 hook 大半是在课题仓里一条条长出来的, 后来升为所有项目通用. 写计划一份, 审计划一份, 做完验收一份, 引用的事实要换个来源再核一份; 另有一组检查脚本在 agent 动作前后自动跑.
  • 结论台账逐条标明有无外部验证.
  • 承重的几条规则不只写在 prompt 里, 另写成在模型外跑 按退出码判的闸: 本机 Claude Code 在 7 个事件上挂了 28 条 hook; 课题仓有写作闸与提交数据闸; 时间追踪智能体的 prompt 字数由测试锁住.
  • 前一版是 2026-04 的自媒体 skill 体系: 22 个 skill 用契约文件与状态文件串成一条内容生产流程, 一次建出后人工通读审不过来.
  • 规则与取舍由本人定, 改动由 agent 执行, 本人批准后提交.
追问 · 第 2 层讲一个因为这套约束没做好而出的问题, 怎么排查解决的?

车机项目里, Claude Code 先后下过"固件不支持"与"模块卡死"两个判断, 都被推翻: 前一个由它自己做对照后撤回; 后一个在本人报告重启后还是一样之后, 它接着查出是扫描发了开始却从没发停止, 修法写进了代码.

看细节

六道模型外的闸1 段

agent 往 AGENTS.md 加了一条规则, 改文件后的 hook 拦回其中一句

演示滚到这里时加载

这一段证明: 六道闸各拦一次, 照提示改后放行

第 6 章

个人项目 · 数据工程

6521 条速记的多 agent 合并流水线

自己的速记要并进笔记库, 又不放心让模型直接改笔记: 每处改动先过另一个 agent 审查与本人在审批网页上的裁决(294 次), 再由不含模型的脚本写入.

6521 条速记(含 2948 张截图)清洗后并进笔记库: 原始导出切成结构化记录, OCR 补全截图文字, 对既有笔记查重后按 66 个 tag 合并; 写入前唯一锚定校验, 重跑幂等, 每批条数守恒对账.

这是什么 · 追问 · 看细节
  • 背景: 本人的速记攒了 6521 条, 很多条只有一个链接或一张截图; 要把它们并进自己的笔记库, 又不放心让模型直接改笔记. 数据源与抽取: 速记原文之外, 2948 张截图经 OCR 取回文字; 链接背后的视频走字幕接口, 没有字幕的走语音转写. 抽取层不用模型.
  • 规范化: 按 tag 把原始导出切成结构化记录(批次 行号 时间 tag 原文), 切片时先记条数.
  • 查重与分流: 每条归入六种去向之一(并入已有笔记 新建节点 待办 省身 待指示 标记待确认); 并入前先对既有笔记查重, 已有的不重复写.
  • 写入与幂等: 写入由不含模型调用的脚本执行, 插入位置在目标文件里唯一命中才写, 否则拒绝; 内容已在目标里就跳过, 重跑不会双写.
  • 对账: 每批要求切出来的条数等于各去向条数之和; 66 个 tag 两轮走完, 前后 29 天; 收尾核对查出六处记账错, 内容没有丢失.
  • 人工审核: 自建审批网页, 并入稿按 hunk 显示锚点与新增行; 本人逐条裁决 294 次: 整单元通过 87, 返工 41, 逐条翻案 166.
  • 分工: 处理规则由本人口述十二条, 流水线由 Claude Code 据此搭建; 分诊 执笔 交叉审由多个 agent 做, 写的不审自己写的.
追问 · 第 2 层多个 agent 之间怎么交换信息, 怎么不互相覆盖?

每个 agent 只写自己的单元目录; 写入阶段一个目标文件只归一个 agent, 串行走; 单元目录里的状态文件最后才写, 审批网页以它为就绪信号.

追问 · 第 2 层怎么知道没丢条目?

每批先记切出来的条数, 要求等于各去向条数之和.

追问 · 第 2 层重跑或中途恢复时, 怎么不把同一段写两次?

写入脚本先查要插的内容是否已在目标文件里, 在就跳过; 同一个目标文件只归一个写入者串行写, 不让两个 agent 同时落同一个文件.

看细节

审批网页与落盘器1 段

8 条合成速记分诊完, 执笔 agent 交出两个 hunk, 等本人在审批页裁决

演示滚到这里时加载

这一段证明: 锚点命中 2 处被拒, 换锚写入, 重跑幂等跳过, 8 条去向守恒

第 7 章

个人项目

职位页抽取器与职位地图

只处理公开职位页, 不碰登录墙验证码; 另有职位地图, 坐标迭代反解成 WGS-84 落图.

给智能体用的网页抽取工具: 公开职位页进, 统一的 JSON 出; 优先读页面里的 JobPosting 结构化数据, 浏览器后端不可用时自动退回 HTTP.

这是什么 · 追问 · 看细节
  • 个人项目: 想让智能体读得懂公开的职位页, 先做了这个抽取器. Node.js 命令行工具, 供智能体调用, 把公开职位页抽成统一的 JSON(14 个字段).
  • 三种抓取后端(HTTP, Playwright, Firecrawl), 浏览器后端不可用时自动退回 HTTP.
  • 只处理公开可访问的职位页, 不处理登录墙与验证码.
  • 后来做了一张职位地图: 单位地址按全称 门牌 道路三级查询定位, 名字或区对不上的命中拒掉, 高德的 GCJ-02 坐标迭代反解成 WGS-84 再落到底图.
看细节

职位页到地图1 段

职位页抽成 JSON, 地址逐级查询: 蜀锦路配到蜀金路, 名字校验拒掉; 高德坐标反解后差 361 m, 再落图

演示滚到这里时加载

这一段证明: 模糊命中被拒掉, 坐标纠偏后落图

第 8 章可现场演示

个人项目

第一批用 AI 写代码的小工具

边做边熟悉 vibe coding 的一批小工具: 搜索栏 悬浮窗 WSL 面板 strip-exif 去元数据.

GPT 出来后最早一批用 AI 写代码做的小工具, 拿来熟悉 vibe coding: 2024 年用 PyQt5 写的文件搜索栏 摄像头悬浮窗 WSL 面板, 后来的房间布局器与抹图片元数据不动像素的 strip-exif.

这是什么 · 追问 · 看细节
  • 个人项目. 本人最早用 AI 写代码做的是搜索栏 悬浮窗 WSL 面板这几件, 是第一批用 AI 写出来的代码, 边做边熟悉 vibe coding 的做法; 房间布局器与 strip-exif 是后来同一路数的小工具.
  • 搜索栏(2024-03): 双击 Ctrl 呼出, 接 Everything 的文件搜索接口; 按住 Ctrl 时系统连发按下事件, 一度被当成双击反复弹出, 加'首次按下'标志后修掉; 打字时计时器去抖, 停手 800 毫秒才搜一次, 新搜索开始前先停掉旧线程.
  • 摄像头悬浮窗 AbsCam(2024-03): 置顶无边框窗口, 可拖框裁剪 鼠标穿透; 每帧取前台窗口所在的屏, 把自己挪到那块屏顶部居中.
  • WSL 面板(2024-04): wsl --list --verbose 的输出是 UTF-16, 去掉空字节再按正则拆列; WSL 的资源占用在 Windows 上只看得到 vmmem 进程, 由后台线程每 3 秒累加一次.
  • 房间布局器(2026-06): L 形房间里拖桌子, 撞墙时两个轴各自二分逼近, 桌子沿墙滑动; 以 Claude Code 开发, 16 个测试.
  • JPEG 照标记逐段走: 遇 APP1(EXIF)与 COM 跳过, 其余段照抄, 从 SOS 起把熵编码数据原样拷贝, 解码后像素逐字节相同. 对照: 用 Pillow 打开再存, EXIF 也没了, 但像素变了, 注释段还在.
  • PNG TIFF 这类无损格式走另一条路: 用 Pillow 按像素重建一份, 元数据不带过去.
  • 目录批量模式两处问题由盲测暴露: 已有 .clean 文件时崩溃, 输出被当成输入再处理; 两次提交修复并补测试.
  • 同期还写了 UniScraper(2024-06, PyQt6): 9 个手机尺寸的网页并排盯三家二手站的最新上架, 共用一份持久化配置.
追问 · 第 2 层为什么不直接用 Pillow 打开再存?

JPEG 是有损格式, 解码再编码会改像素; 只删元数据段, 熵编码数据一个字节都不碰, 像素才能逐字节不变.

追问 · 第 3 层有什么没处理?

方向标记 Orientation 也在 APP1 里, 随 APP1 一起删掉, 手机竖拍的照片抹完可能横着显示; 修法是保留一个只含方向标记的最小 APP1, 还没做.

看细节

第一批小工具的难点2 段

  1. 1PyQt 四个工具未玩
  2. 2抹元数据未玩

四格依次演: 按住 Ctrl 不算双击, 悬浮窗跟屏, UTF-16 输出拆表, 桌子撞墙沿墙滑.

演示滚到这里时加载

这一段证明: 双击不误判, 跟屏, 拆表, 沿墙滑

接着看: 抹元数据不动像素

按 JPEG 标记逐段走, 删 APP1 与 COM, 像素哈希不变; 对照: 解码再编码, 像素变了.

演示滚到这里时加载

这一段证明: 删 2 段, 像素哈希不变; 重存则变

看全部项目

档案

全部项目

每张卡点开有细节与追问. 按方向筛选; 关系较远的项目折在最后.

更多: 关系较远的项目

联络末页

联系我

看完想聊聊, 用下面任一种方式都能找到我.

微信
laurienotbald
附件
简历下载PDF
微信二维码, 扫码添加 laurienotbald
微信扫码

实名简历请电话索取, 或加微信(手机号加不上微信)