☰
从HE切片到基因表达谱:hist2RNA完整实践指南
2026/10/18 14:38:09 网站建设 项目流程

病理AI这股风,刮了好几年,大多数项目做的是分类、分割、预后生存分析,本质上是"看图说话"——从形态学找答案。但hist2RNA这个方向不一样,它试图做一件看起来有点"跨界"的事:直接用乳腺癌H&E染色切片,通过深度学习预测基因表达谱。我第一次看到这个设定时是有点怀疑的,一张染了色的组织切片,凭什么能推出一堆基因的表达量?但自己动手把完整流程跑下来之后,我承认这个思路确实有它的道理,而且在实际项目中相当能打。

这篇博文不聊虚的,把我做模拟项目X时的完整脉络梳理一遍:数据怎么配对、网络怎么搭、评估怎么做、部署时踩了哪些坑。不管是准备入门计算病理,还是想在自己数据集上复现类似方案,都有直接可抄的参考价值。

1. 让病理切片开口说话:hist2RNA想解决的问题,其实比基因预测更实际

1.1 形态学与转录组从来不是两套信息

很多人第一反应是:H&E切片只能看到细胞核、腺管、间质这些形态,基因表达是分子层面的东西,两者隔着十万八千里。但从病理学的角度来看,形态本身就是基因表达程序在显微镜下的投影。肿瘤区域细胞密度高、核异型明显,背后是增殖相关基因的高表达;间质区域疏松,是因为细胞外基质相关基因在起作用;淋巴细胞浸润区域,很自然对应免疫相关转录本的富集。

这意味着,组织形态和转录组之间不是无关的,而是一种多对一的复杂映射关系。hist2RNA要做的,就是用一个足够大的神经网络,把这种映射关系从数据里学出来。它不是从无到有创造信息,而是把形态中隐含的分子信息解码出来。这么说可能有点玄,但实际操作中你会发现,模型学到的attention权重,很多都落在肿瘤巢、免疫浸润边缘这些有明确生物学意义的区域。

1.2 湿实验成本与存量切片之间的死结

为什么不直接做空间转录组测序?因为贵,而且对样本要求高。新鲜冷冻样本才能做,很多医院存档的是甲醛固定、石蜡包埋的组织块,再往前翻,大量历史切片是只有H&E染色的玻片。这些切片没法回补测序,只能躺在档案室里。

如果模型能从已有H&E切片中直接预测基因表达,等于把这些存量数据盘活了。你可以对历史队列做回顾性表达谱分析,先做一次大规模"数字预筛",筛出值得做昂贵测序的样本,再针对性地做湿实验验证。这个流程对药企靶点发现、biomarker回顾性研究特别有用,成本能降一个量级。当然,hist2RNA不是要替代测序金标准,它的定位是低成本预筛和批量评估,这一点在项目立项初期就要想清楚。

1.3 什么样的团队适合介入这个方向

我个人的看法是:纯算法团队做不转,纯病理团队也做不转,它需要形态学知识、分子生物学背景和深度学习工程能力的交叉。你不要指望单靠一个公开数据集跑个模型就能做出临床可用的东西,真实的落地场景里,数据配对、染色差异、标签噪声这些问题,比模型结构本身难处理得多。如果你有病理科的合作资源,或者能接触到按患者层级切分的大型肿瘤队列数据,这个方向非常值得投入。

2. 切片与表达谱的数据配对:建模前最容易被忽视的地基工程

2.1 从全切片到patch:尺寸、分辨率与组织占比

同一个患者的一张WSI可能有两个GB,直接丢进神经网络是肯定不行的。第一步必须切成patch。我在模拟项目X里的做法是:20倍物镜分辨率下切512×512的patch,保留组织占比超过70%的有效块。这个参数不是随手定的,我做过对比实验——256×256的patch纹理信息不够,模型容易学到局部噪声;1024×1024的patch虽然特征丰富,但训练速度和显存占用翻了几倍,收益却很有限。

切patch的时候有个容易忽略的细节:边缘的组织碎片和空白区域要先过滤。计算组织占比可以用Otsu阈值分割或者简单的亮度统计,把背景区域排除掉。这一步看起来不起眼,但如果不过滤,模型会花大量注意力在无意义的空白区域上,训练效率和最终表现都会受影响。实测下来,加入过滤之后,同样的训练轮数,验证集相关系数能提升2到3个百分点。

2.2 基因标签的配对逻辑:患者级还是区域级

这是整个数据工程里最关键的概念。一张WSI对应一套基因表达谱,但切片上的不同区域,真实表达是有差异的。如果只有患者级的表达谱,你就只能假设这张切片整体代表了这个患者的平均转录状态,然后把同一个标签复制给所有patch。这是一种强假设,但也是绝大多数公开数据集的现状。

如果手上有空间转录组配对数据,那就更理想——每个spot的表达谱可以对应到切片上的小块区域,训练标签的粒度更细,模型的信号也更强。但空间转录组数据量少,通常只能作为辅助训练集或者预训练来源。模拟项目X里用的是患者级标签来训练,区域级数据只用于最后的热力图验证,可以很好地平衡数据量和标签粒度问题。

2.3 数据划分的泄漏陷阱:必须按患者切分

这个坑我见过不少人踩过,而且踩了还不自知。如果做patch级随机切分,同一患者的patch会同时出现在训练集和验证集里,模型相当于见过"半个"验证样本再去做预测,指标会虚高得非常好看,但一上真实场景就崩。正确做法是先把患者列表按比例划分,再在患者内部切patch,保证验证集和测试集里的患者,在训练阶段完全不可见。

还有一个隐蔽的泄漏源:同一个患者在不同时间点、不同部位取的组织块,看起来是独立样本,但形态和表达模式高度相似。如果这些样本横跨训练集和测试集,也属于某种程度的泄漏。所以做划分时,最好用患者维度,而不是样本维度。宁可训练数据少一点,也要保证评估结论是可信的。

2.4 染色归一化与增强:把批次差异按下去

H&E染色的批次效应是绕不开的痛点。不同医院、不同染色批次、不同扫描仪,出来的颜色差异肉眼可见。模型要是把染色风格当作特征去学,泛化能力会很差。我用的方案是Macenko染色归一化,先把每张切片归一化到一个参考切片上,再加上随机的亮度、对比度扰动,作为增强手段。这里有个细节要提醒:归一化的参考切片要从训练集里选,而且要固定住,不能每次换,否则参考信息的泄漏会无声无息地渗进模型里。

增强策略上,随机翻转、旋转90度、小角度旋转都有效,但我建议不要做太强的颜色抖动——组织形态识别的核心是细胞核、腺管结构,颜色过度变化反而会破坏形态语义。经验是染色归一化加轻度几何增强,稳定性和效果最均衡。

3. 网络骨架设计:轻量编码器加注意力池化,如何扛起多基因回归

3.1 整体架构:编码、聚合、回归三段式

hist2RNA的完整流程可以拆成三个部分:patch编码器把每个patch变成特征向量,聚合模块把一张切片的所有patch特征合并成切片级表示,回归头输出一组基因的表达预测值。用伪代码来表达,大概是这个结构:

# 伪代码:hist2RNA 推理主流程 patches = extract_patches(wsi, size=512, mag=20) # [N, 3, 512, 512] patch_features = encoder(patches) # [N, D] agg_weight, agg_feature = attention_pooling(patch_features) # [N, 1], [D] gene_pred = regression_head(agg_feature) # [G]

这套设计的特点是:输入尺度可伸缩,N可以随切片大小变化,训练时可以从每张切片采样固定数量的patch组成batch,推理时则一次性处理整张切片的全部patch。因为每个patch编码时是独立的,前面那层的计算可以分批并行,整体吞吐很容易打上去。

3.2 为什么用轻量CNN做编码器,而不是直接上Transformer

我见过不少团队一上来就想着用视觉Transformer当特征提取主干,理由是基因预测任务复杂,模型越大越准。但真实数据量通常撑不起这种野心:公开的配对数据往往只有几百个患者,每个患者即使切成上千patch,有效信息量和独立样本数也就是几百的量级。在这种数据规模下,Vision Transformer很容易过拟合,而且训练成本和显存占用成倍增长。

我的选择是ResNet-18或者更轻量的MobileNet类主干,输出512维特征就足够了。病理patch内部的形态识别,本质上是纹理和细胞结构特征,浅层CNN完全可以胜任。Transformer类模型可以在聚合阶段使用——用一两个self-attention层对patch特征交互建模,能带来一点收益,但数据量不够时收益很小,我最后也没有保留。记住"efficient"这个定位:结构上够用即可,没必要为了复杂度牺牲可复现性。

3.3 聚合层的取舍:平均池化、注意力池化还是排序池化

聚合层选择很影响最终效果。平均池化把所有patch平等对待,简单稳定,但关键patch的信息会被大量无信息patch稀释;最大池化只关注最显著的patch,容易丢掉分布在多个patch上的联合信号;注意力池化是最好的折中——让模型自己学会给每个patch分配权重。

我实现在聚合层用了一个门控注意力机制,给每个patch生成一个0到1之间的分数,然后对所有patch特征做加权求和。项目X里做了一个小消融:平均池化的基因级相关系数大概0.44左右,最大池化还更低一点,门控注意力能到0.58。差距很显著,而且注意力分数后续还能用来做热力图可视化,一举两得。你如果自己实现,DeepMIL那套attention pooling代码改一改就能直接用。

3.4 回归头与损失设计:防止模型坍缩到均值

基因表达回归任务和一般分类任务最大的不同在于:输出维度很多,而且标签是长尾分布。如果直接套用MSE损失,模型很快会发现一个"聪明"的作弊方式——所有基因都预测训练集的均值,MSE已经很低了,但相关系数几乎是0。这是我在第一次实验里踩到的坑,损失曲线看着一路下降,实际预测结果却毫无用处。

解决办法是组合损失:MSE保证数值准确性,再加上一个Pearson相关损失,鼓励预测谱和真实谱的形状一致。对标签做log1p变换也能显著改善长尾问题——高表达基因和低表达基因的差异达到几个数量级,直接回归原始值会完全被高表达主导。最后,加了一点L2正则让输出控制在合理范围,整体效果比单用MSE强很多。

4. 结果评估的正确姿势:相关系数之外,还要盯住误差与生物学可解释性

4.1 评估协议:按基因算还是按样本算,要分开看

hist2RNA的结果评估,业界没有统一标准,我的建议是双线并行:一是按样本评估,对每个患者,计算预测表达谱和真实表达谱之间的Spearman相关,反映整张切片的预测质量;二是按基因评估,对每个基因,跨患者计算预测值和真实值的相关,反映单个基因的可预测性。

这两个指标会给出完全不同的视角。按样本看,平均相关系数能做到0.6左右,说明整体表达趋势预测得不错;按基因拆开看,会发现大多数基因相关系数在0.3到0.5之间,只有少数标志性基因能上0.7。所以发布结果时,不能只报一个全局漂亮数字,要拆开报告,让读者知道模型的真实能力边界在哪。最好再加一个"top-K高表达基因命中率"——预测出的高表达基因里,有多少真的在真实谱中高表达,这对实际筛选场景更重要。

4.2 哪些基因学得会,哪些基因天生学不会

做误差分析时,把基因按功能分组统计相关系数,能得到一张很有信息量的表。增殖相关基因、免疫标志物基因(比如淋巴细胞标志物)、激素受体相关基因,预测效果都很好,因为这些基因的表达会直接体现在形态上——增殖活跃意味着核分裂象多,免疫浸润意味着淋巴细胞密集。结构性表达基因,比如细胞角蛋白这类管家基因,本身变异不大,相关系数不高但不代表失败。

最难预测的是突变驱动的基因和低表达基因。突变状态在形态上的投影极其微弱,甚至没有投影,模型最多只能学到一些间接关联,相关系数低是正常的。低表达基因因为测量噪声大,预测值和真实值都稳定不到哪里去,相关自然就低。分析这组基因时,你会对"模型上限在哪里"有清醒认识——它学的是组织形态与表达程序的映射,不是基因调控的全过程。

4.3 误差来源与热力图:让模型告诉你它看到了什么

真实切片中,取样位置本身就是误差来源。同一个肿瘤,取材区域不同,切片上的组织构成就不同,配对的表达谱自然不同。如果你有多张重复切片,可以算一下重复样本本身的一致性,这个一致性就是你的标签噪声下限。模型表现是不可能超过标签噪声上限的,这一点在团队对齐预期时一定要讲清楚。

为了验证模型学到的确实是生物学信号,而不是什么伪相关的纹理特征,我会把门控注意力分数映射回切片坐标,叠加到原始病理图像上做热力图。做的结果很有意思:模型对肿瘤巢区域和免疫浸润边缘分配了很高的权重,间质区域的权重相对低。这种可解释性分析很能提高团队和合作方对模型的信任度,远比你拿着一张correlation的散点图去汇报有效果。

5. 从离线实验到真实部署:复现hist2RNA时反复踩过的坑

5.1 三种隐蔽的数据泄漏,比想象中更容易混进实验

第一种是patch级随机切分,前面已经说过了。第二种是染色归一化的参考切片选择不当——如果归一化是在全数据集范围内做的,参考切片的统计信息会隐式参与训练集和测试集,造成信息泄漏。解决办法是先划分训练集,再从训练集内部确定参考切片和统计参数,固定后应用到所有划分。第三种更隐蔽:预处理阶段如果用了全切片级的统计特征(比如全局亮度、对比度,或者全片标准化),这些统计量同样会携带测试集信息。凡是在切片级别做的任何统计计算,都要保证它只来自训练集。

还有一种非常隐蔽的泄漏形式:如果训练集和测试集来自同一个扫描平台、同一个实验室,并且切片的扫描批次非常接近,模型可能学到"仪器指纹"。快速验证方法是把测试集换到另一个来源的数据上,指标如果断崖式下跌,说明你的模型多半学了批次特征而不是生物特征。

5.2 显存与吞吐优化:一张全切片怎么才能跑得动

一张40倍放大的完整WSI,patch数量可能达到数万个,一次性全部进GPU显存是不现实的。我的做法是流水线式推理:先在CPU上用slide读取库切patch,按批次送回GPU做前向,特征存到内存,最后统一做attention聚合和回归。推理吞吐瓶颈常常不在GPU,而在硬盘I/O和图像解码。解决方案是提前把WSI转成金字塔格式的tiles并缓存到本地,或者用高效的tifffile读取。实测单张肠癌级别大小的WSI,在单个消费级显卡上十几分钟能出结果,优化后可以压进十分钟以内。

训练阶段的显存问题,主要是patch采样策略解决的。每次迭代从每张切片随机采样一定数量的patch进入batch,而不是把一整张切片的全部patch塞进去。这样能把batch size控制在合理范围,同时保留切片内随机性,也算一种隐式的数据增强。

5.3 落地部署时的临床信任问题

离线评测和实际使用之间,还隔着"信任"这道坎。如果只是做科研筛选,全局相关0.6已经能用了;但真要辅助临床决策或者回顾性队列分析,只给一个预测值是不够的,得给不确定性。我的建议是在回归头基础上加一个简单的MC Dropout,推理时多次前向取均值和方差,输出一个置信区间。表达量预测方差大的样本,可以便宜地标记为"低置信度",交给湿实验验证。

另一个自检方法是做所谓的"数字免疫组化"验证:选择一批有明确形态对应关系的基因(比如淋巴细胞标志物),预测它们的表达量,再用真实的免疫组化染色切片做对比评分。虽然不能完全对齐,但趋势一致就能说明模型学到的特征有生物学基础。这个过程会比较繁琐,但对推动项目进入实际应用是值得的。

多说一句我自己的体会:真正让项目效果出现质变的,往往不是网络结构换了什么新模块,而是数据配对够不够严格、标签噪声有没有控住、泄漏通道有没有堵死。把地基做扎实,再用一个简单的编码器加注意力池化的架构,已经能在乳腺癌基因表达预测任务上打出一个很可用的成绩。hist2RNA这个方向,胜在思路清晰,输在容易把问题复杂化——保持简单,盯紧数据,反而能走得更远。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询