吴天昊

吴天昊 Tianhao Wu

机电一体化硕士在读 · FAU 埃尔朗根-纽伦堡大学(德国)

Tianhao.Wu.Mechatronik@outlook.com  · GitHub  · English

关于

我是 FAU 埃尔朗根-纽伦堡大学机电一体化专业硕士生, 论文方向为学习型点云压缩:从零复现并扩展一个 SOTA 的 3D 点云属性神经编码器(稀疏卷积、多尺度熵模型、变率条件化)。 日常工作一半是研究、一半是工程——经得起推敲的率失真评测, 和能在共享 SLURM 集群上活下来的训练战役。主力技术栈为 PyTorch(稀疏 3D 用 MinkowskiEngine)。

在此之前我研究过控制回路内的学习型预测 (sEMG 驱动的遥操作阻抗预测——见下方笔记存档);两段工作的共同主线是同一个问题: 什么时候可以信任一个学习模型给出的数字,以及如何搭建能回答这个问题的测量体系?

近期动态
  • — 发布 pcc-eval-toolkit:带硬性有效性门槛的 Bjontegaard 指标、面向定率编码器的可辩护单点度量、RD 对比图——论文复现工作逼出来的评测纪律。 仓库 →
  • — 发布 slurm-resilient-training:接力式作业链、durable 断点、单写者守护——支撑数周点云编码器训练车队在 24h 墙钟集群上零断点丢失。 仓库 →
  • — 论文复现里程碑:我们从零训练的点云属性编码器,在标准 8iVFB 基准上、经交叉标定的评测协议下,达到作者发布模型的水平(两条评测线已逐点互验)。完整写作随论文发布。 笔记 →
  • — 在论文选题(学习型点云 / 3D 高斯泼溅压缩)并行期,开始自定进度的深度学习基础重修;第一天的纠错笔记见存档。
  • — 对 SINDy 后续研究做非多项式生成器下的稳健性消融(tanh 饱和 + 疲劳漂移 + 异方差噪声)。
  • — 在 sEMG 阻抗项目中把 SINDy 重构为"动力学发现 + 前向积分";短时程预测超过 LSTM。 仓库 →
  • — 开源 sEMG 驱动阻抗预测的设计空间研究(5 模型 × 3 时程,含消融与 MC-Dropout 安全性分析)。 仓库 →

论文:学习型点云属性压缩

《基于改进空间上下文建模的学习式点云属性压缩》 · Point Cloud Attribute Compression with Improved Spatial Context Modeling · FAU LMS · 2026.06 – 2026.12

问题。点云——带颜色的数百万个 3D 点——是 AR/VR 远程呈现、 自动驾驶与文化遗产数字化的基础数据,一帧人体尺度的点云未压缩就有数十 MB。 MPEG 为其制定了经典编码标准 G-PCC;研究前沿是学习型压缩: 用稀疏卷积网络端到端地学习熵模型。我的论文从零重建一个当前最好的学习型属性编码器, 并在它的熵模型上做改进。

编解码器长什么样(我实际写了什么)

一条完整的链路,不是调包:

作者没有公开属性分支的训练代码,所以这条链路是从论文正文与 MPEG 提案文档反推重建的。

已经验证的部分
最有意思的一个发现

从零训练最初明显落后于作者的结果。排查之后,差距不在实现缺陷、不在率失真权重、 不在训练时长、也不在变换容量 —— 在训练语料的密度统计。

支撑它的证据是一次排名反转:同一套权重、同一套评测口径, 在我方自建语料上我方模型更好,换到标准测试序列上作者模型更好。 排名随语料翻转,说明差距来自数据分布,而不是代码。

由此做出一把便宜的诊断工具 —— 语料位移探针: 拿已经收敛的权重,在候选语料上只训 1 个 epoch,测工作点被拖动多远。 在投进一周 GPU 时间之前,就能判断这批数据是不是你将要被评测的那个分布。 它只作用于数据集本身、不含任何编解码器,因此可以独立开源。

同一条线索还测出一条失效边界:多尺度构造在稀疏点云上显著退化。 这正是把这类方法从稠密采集内容搬向激光雷达数据时的核心障碍。

进行中,尚未成为结论。把图像压缩里的 checkerboard 空间上下文 迁移到稀疏点云的属性熵编码上:按坐标奇偶分两批,先解锚点、再解非锚点, 目标是保住上下文增益的同时,把解码从逐点串行降到常数遍。 目前只有单序列、单码率点、单随机种子的初步数字 —— 这不是 BD-rate 结果,我也不把它当作 BD-rate 报告。完整的率失真评测正在进行。
这套工作实际用到的东西
PyTorch稀疏卷积 / MinkowskiEngine多尺度 & 八叉树表示 条件熵模型算术编码 (torchac)率失真优化 比特级一致性验证MPEG G-PCC / AI-PCC 通用测试条件 TMC13pc_errorBD-rate / BD-PSNR HPC / SLURM 多臂并行训练C++ 参考软件阅读与改造

笔记

算不上博客,只是把研究思考的阶段性写作留档,下次有人问起时可以直接指过去。

复现一个学习型编码器教会我的"诚实评测"

论文的核心任务听起来很简单:拿一个 SOTA 学习型点云属性编码器,从零复现其训练,然后尝试改进。 三个月下来,我真正想放上幻灯片的不是某个数字——而是一份"评测会怎样悄悄骗你"的清单, 以及为阻止它而搭建的测量体系。

基准是一台仪器,而仪器需要标定。早期我们的数字与论文数字的分歧, 会随着用哪条评测路径而变号。解法是计量学的,不是机器学习的: 把作者发布的模型跑过我们的管线,要求其发表数字逐位复现,然后才信任对我们自己模型的任何测量。 这次交叉标定抓出了分块-整帧协议差异、模型边界处的色彩空间约定不匹配、 条件输入的单位约定——每一个的影响都超过一篇典型论文声称的改进量。

被拒绝的度量也是结果。BD-rate 需要两条合格曲线;定率模型每个序列只有一个点。 我的第一反应——用局部斜率把点投影到参考曲线上——其实是在悄悄假设自己模型的曲线形状,被导师指了出来。 可辩护的版本只在参考曲线上插值、拒绝外推、并在图例里明说。我把这套拒绝语义做成了小型库, 因为我见过的每个压缩项目都在截稿压力下把 Bjontegaard 重新实现得很糟。

训练可靠性也是评测问题。只有背后的训练完好无损,数字才有可比性。 在 24h 墙钟的共享集群上,让一支 200+ epoch 的训练车队不出一个损坏 checkpoint, 需要一套显式设计:启动即预约继任者的作业链、epoch 索引调度的 durable 断点、 以及强制"一条训练线永远只有一个写者"的守护进程。全部内容连同促成它们的事故记录, 都在上面链接的第二个仓库里。

论文结果本身——复现最终落在哪里,以及 checkpoint 平均与收尾调度实验的发现——将随论文一起写出。 工具不必等待。

早期研究笔记存档 — 控制、遥操作与 sEMG(2026-05;保留英文原文)

Foundations refresher, day 1 — re-walking deep-learning basics before thesis kickoff

Before reading deeper into the learned-compression literature for thesis work, I am running a structured re-walk through the foundations of deep learning — slowly enough to actually look at each piece. The PyTorch use in the sEMG project below sat on top of architectural priors I had taken on trust; the goal of this refresher is to put those priors back on first-principles ground before they become invisible scaffolding under thesis-level work.

Day 1 covered the basics in one pass: what deep learning does mechanically (rule-finding from examples rather than rule-writing), how a neural network is structured (neuron → layer → depth as a feature ladder), how training works (loss as a scalar, gradient descent as blindfolded descent, learning rate as step size), and the overfitting / underfitting distinction with the four standard remedies (more data, L2 regularisation, dropout, early stopping). The textbook material I won’t rehash. What is worth recording from a day 1 is what I caught myself getting wrong:

Negative weights. I had been carrying the implicit picture that a “more important” feature gets a larger weight. Working through a toy “should I go to the beach” example forced the point that suppressing a decision is just as legitimate as supporting it, and the way a network represents “this feature pushes against the answer” is a weight with negative sign and large magnitude. Trivial in hindsight; not how I had been visualising it.

Depth as a strict ladder, not a soft metaphor. I knew “deep” meant many layers, and that early layers learn simple features. What I had not internalised is that each layer’s input vocabulary is literally the previous layer’s output. Edges → shapes → eye → face isn’t a slogan but the actual data flow, and “eye” is just a stable activation in some middle layer that the next layer uses as a primitive. That makes depth a different kind of design choice than I had treated it as — it controls the maximum composition height of the features the network can express, not just the parameter count.

Underfitting ≠ a worse case of overfitting. Asked to classify a hypothetical model with 70% train / 68% test accuracy, I called it overfitting because both numbers looked bad. The correct label is underfitting: both numbers being low and close to each other points to insufficient capacity, not memorisation. The two diseases need opposite treatments — underfitting wants more capacity or longer training; overfitting wants regularisation, dropout, or more data. Catching this confusion now is much cheaper than catching it later, embedded in a real experiment where the data and the architecture are both moving.

Day 2 will move into hand-writing a small model in PyTorch to make the learning-rate and overfitting points concrete; from there into CNNs, then into the learned-compression specifics (autoencoders, quantisation, entropy coding, hyperprior) that the thesis area runs on. Substantive updates to this site will probably come when those last pieces start to load.


Robustness check: does SINDy still win when the generator isn’t polynomial?

After writing the SINDy follow-up below I went back to a concern that had been sitting at the edge of my own thinking. The synthetic generator I used mixes a constant linear matrix from stiffness to sEMG and adds additive heteroscedastic-in-sEMG noise. That data-generating process sits structurally inside SINDy’s degree-2 polynomial hypothesis class. A reader who has worked with sparse-regression methods would reasonably ask: did SINDy win because it discovered the generator, or because the generator happened to be in its model class? Until I checked, I couldn’t tell.

So I ran an ablation. Trajectories unchanged; the sEMG observation model gains three pieces of structure SINDy cannot fit cleanly: (1) tanh saturation on the linear mixing (emg = tanh(2·W·K)), modelling motor-unit recruitment plateaus; (2) slow fatigue drift on W (W_eff(t) = W₀ + 0.25·ΔW·sin(0.2π·t)), making the observation map time-varying; (3) a state-dependent noise floor (σ ∝ σ₀ + 0.08·‖K‖) on top of the existing amplitude-proportional component. Same 6/2 split, same horizons, same SINDy hyperparameters. Ridge, SINDy, ESN, and an MLP baseline (MLPRegressor with hidden_layer_sizes=(48, 24), substituting for the PyTorch LSTM in the easy run so this ablation runs in a torchless environment; both play the same “high-capacity neural baseline” role) all run on both generators.

Stiffness error at 100 ms horizon — robustness ablation Easy (linear W, additive noise) vs Hard (tanh + fatigue drift + heteroscedastic noise). Lower is better. 60 50 40 30 20 10 0 mean stiffness error 34.9 51.9 Ridge +49% 16.2 17.1 SINDy +6% 26.6 37.9 ESN +42% 21.9 39.8 MLP +82% four methods, two generators easy generator (linear sEMG) hard generator (tanh + fatigue)
Stiffness error at the 100 ms horizon. SINDy is the only method whose error does not change materially between the two generators (+6%); Ridge, ESN, and MLP all degrade by 40–80%. Full 4×3×2 table (position + stiffness, three horizons, four methods, both generators) on GitHub.

The good news. SINDy as a predictor holds up. Position error is essentially unchanged across the two generators (3.9 / 3.9 mm at 50 ms, 7.0 / 7.0, 12.4 / 12.4). Stiffness degrades only marginally (8.5→8.9, 16.2→17.1, 29.2→31.3). The other three methods take a clean hit on stiffness: Ridge +49%, ESN +42%, MLP +82% at 100 ms. The mechanism, I think, is that SINDy’s discovered position dynamics rely heavily on state-based extrapolation (dx/dt ends up mostly a function of state, not sEMG), so corrupting the sEMG observation barely touches the prediction.

The qualification I owe the SINDy follow-up below. The discovered equations grow. On the easy generator SINDy kept [1, 5, 3, 12, 12, 11] nonzero terms across the six state components (44 total). On the hard generator it keeps [5, 11, 7, 22, 22, 16] (83 total) — nearly twice as dense. The “sparse polynomial a human can read” framing I leaned on in the post below becomes much weaker once the sEMG isn’t linear: a 22-term degree-2 polynomial is still much smaller than the full feature library, but it is no longer the kind of equation you would print on a slide and reason about by eye. So that artefact-as- interpretation claim was specific to the linear sEMG–K map; under realistic sEMG nonlinearity, SINDy still works as a predictor, but it works as a denser curve-fit, not as a transparent equation.

What this updates in my own thinking. Two things. First, on prediction robustness I owe SINDy more credit than I would have given it yesterday — the accuracy genuinely doesn’t care about the kind of observation-model violations I expected to break it. Second, the broader point I had been pulling toward — that the value of a “discoverable” dynamics method is the readable artefact, not the headline number — is not free. The artefact is only readable when the data-generating process itself is close to sparse-polynomial. Real human sEMG presumably isn’t, and that is the test the result above does not pass. Code: sindy_robustness.py.


Discovering equations vs fitting them: a SINDy follow-up

I went back to the same simulated peg-in-hole data and put SINDy in the comparison, this time the way it is actually meant to be used: learn the differential equations d(state)/dt = f(state, sEMG) directly from data, keep only the sparse terms via Lasso, and integrate the current state forward to the prediction horizon. Not static regression.

The result inverted my expectation. On position error, SINDy gives 3.9 mm at 50 ms and 7.0 mm at 100 ms — roughly twice as good as the next method (Ridge) at both windows. ESN takes over at 200 ms with 10.6 mm. On stiffness, SINDy is best at every horizon. LSTM, with ~32 k parameters against ~3 k training samples, finishes last across the board (22–24 mm) — the textbook overfitting regime, and simulation does not produce the kind of long-tail nonlinearity that would force a network to earn its capacity.

What I keep coming back to is not the numbers. It is the artefact: SINDy keeps 1 nonzero term in dx/dt, 5 in dy/dt, 3 in dz/dt, and 11–12 in each stiffness component. These are sparse polynomials a human can read. I can print the equation, change one coefficient, see the effect. That is a different research object than the hidden state of an LSTM.

Where this leaves me: when data is consistent with a compact set of equations, finding those equations is more honest than fitting an input-output map. Whether real human-in-the-loop sEMG behaves that way is the next thing I want to find out. Code and full numbers: semg-impedance-prediction on GitHub.


Predicting What the Operator Means: A Design Sketch for Physics-Constrained Tele-Impedance Delay Compensation

This is a research proposal I have been sketching on my own while applying for thesis topics in this area. It is not an ongoing project — there is no trained model yet. I worked it through end-to-end as a way of stress-testing my own understanding before submitting applications that ask exactly this kind of question.

In teleoperation, communication delays of 50–200 ms are unavoidable, and they make the remote robot react late to the operator's intent. The question I keep coming back to: can deep learning predict the operator's future trajectory and joint stiffness from their surface EMG, far enough in advance to mask that delay — without breaking safety guarantees?

The answer, as I have read into the literature, looks like a layered system rather than a single black box. Surface EMG already leads force output by 30–80 ms (well documented in the sEMG-force literature), and energy-observer safety nets from the teleoperation literature catch the worst case. What seems to be missing is the middle layer: a learned model that explicitly predicts intent 100–500 ms into the future, slotted in between the natural sEMG lead and the safety controller.

Physics-Constrained Prediction Network — sEMG → Future Trajectory & Stiffness proposed architecture — no model has been trained yet Input (14-dim) sEMG ×8 pos ×3 · vel ×3 Pre-trained Encoder NinaPro · planned Channel Attention 2-layer LSTM hidden = 48 Temporal Attention Softplus heads K ≥ 0 Future trajectory (3) + stiffness (3) 100 – 500 ms ahead (Δt = teleoperation latency) low-confidence (MC-Dropout) Fallback: classical energy-based safety controller used when network is not confident Physics-informed loss MSE + λ · ‖∂K/∂t‖² (bounded stiffness rate)
Proposed end-to-end architecture (no model trained yet): a learned component would occupy a precise gap between the natural sEMG lead and the classical safety controller.

Architecture I sketched. A pre-trained encoder (NinaPro, 40 subjects) consumes 8-channel sEMG plus position and velocity (14-dim input). Channel attention reweights the muscle channels; a 2-layer LSTM (hidden = 48) tracks dynamics; temporal attention summarises the recent window; softplus heads produce the next trajectory and a positive-definite stiffness vector. A physics-informed loss penalises the rate-of-change of stiffness, so the model can't cheat by predicting wild swings.

Ablation plan. Before fixing the architecture, the right move is a systematic comparison of five sequence models — Linear, 1D-CNN, GRU, LSTM, TCN — and then ablations over hidden size, depth, attention placement, and input modality (raw vs. filtered sEMG, with vs. without position and velocity). Pre-training would be followed by leave-one-subject-out fine-tuning so that any cross-user numbers stay honest.

Trust the model, but verify. Uncertainty would be estimated with MC-Dropout. When confidence drops, the system falls back to a classical energy-based safety controller — the learned prediction is only used when it has earned it.

What I like about this problem is the cleanliness of the separation: physics provides a hard prior (positive stiffness, bounded rate-of-change), a classical controller provides a safety floor, and deep learning fills a well-defined gap (a multi-step-ahead horizon that adaptive filters can't reach). The point isn't "deep learning everywhere" — it is deciding precisely where in the loop a learned component earns its place. That kind of decision-making, more than any single architecture, is what I want to keep working on.


Toward Multimodal Predictive Systems for Action-Time Prediction

The SINDy follow-up on the sEMG impedance design-space study (see Discovering equations vs fitting them above) left me with a sharper version of a question I had only been gesturing at before. The follow-up replaced LSTM-with-architectural-priors as the protagonist with SINDy used as a dynamics learner — learn d(state)/dt = f(state, sEMG) from data, keep only sparse terms via Lasso, integrate forward to the target horizon. On the same synthetic peg-in-hole data, SINDy gave 3.9 mm at 50 ms and 7.0 mm at 100 ms — roughly twice as good as the next method — while LSTM, with ~32 k parameters against ~3 k samples, finished last across the board.

Position prediction error (mm) — design-space follow-up Synthetic peg-in-hole, fixed 6/2 train/test split (shared across the 4 methods). Lower is better. ★ best at horizon. 30 25 20 15 10 5 0 mean position error (mm) 3.9 8.7 9.7 22.0 50 ms 7.0 9.7 10.7 23.4 100 ms 12.4 12.1 10.6 24.3 200 ms prediction horizon SINDy (dynamics discovery) Ridge ESN LSTM
Position error on a fixed 6/2 train/test split (users 0–5 train, users 6–7 test), shared across all four methods. Note this differs from the original 5-method study, which used leave-one-subject-out; the LSTM number here (24.3 mm at 200 ms) and the LSTM number in the earlier study (28.5 mm at 200 ms) are not directly comparable.

The numbers matter, but what stuck with me is the artefact. SINDy keeps 1 nonzero term in dx/dt, 5 in dy/dt, 3 in dz/dt. The full prediction model fits on one page; each equation is a sparse polynomial a human can read, falsify, and retrain in seconds. When the prediction is wrong at 200 ms, you can look at the equation and tell where the assumption broke. That is a qualitatively different research object from the hidden state of a recurrent network.

This is what reframes the original “safety fallback” problem for me. The earlier instinct was that even a low-error learned model has to defer to a classical, energy-based safety controller as a backup, because no one knows how to be accountable for what a black box would do in a situation no one has thought through. Causal ML is the obvious candidate, and I do not want to dismiss it — I just have not yet, in my reading so far, found a clean way to fit a causal-graph formulation into the kind of inner control loop this problem lives in; that read is provisional. But the SINDy result points to a different path I had not considered before: don’t bolt an interpretability layer onto a black-box prediction, don’t try to constrain it from the outside — make the prediction object itself something you can inspect.

The direction that pulls me — and I want to be upfront, it is an area I am only beginning to read into — is multimodal predictive systems in which the model’s belief about the future is itself a physically grounded, observable, checkable artefact. Sparse-polynomial discovery from sensor data is one minimal example: a 200 ms prediction is a few lines of algebra you can step through. Learned physical simulators are another: a predicted half-second unfolds in 3D and you watch it. They share the property that “is this prediction safe to act on?” can be answered by inspecting the prediction itself, not by adding an external filter beside it.

That reframing changes the problem from “make the AI prediction more interpretable” to “make the AI’s future the thing we inspect”. I do not pretend to know which architectural family — diffusion priors, video transformers, learned simulators, neural physics — does this best, or whether the framing survives contact with real human sEMG, which has cross-talk, fatigue drift, and motion artifacts the simulator does not produce. The next phase is to find out. That is exactly why it is the direction I want to spend it on.