YOLO目标检测实战:4000张数字病理肝脏病变数据集构建与部署

发布时间:2026/10/14 14:24:52
YOLO目标检测实战:4000张数字病理肝脏病变数据集构建与部署
做病理AI落地的人心里都清楚一套能打的数据集很多时候比模型结构本身更值钱。最近我把手头这套4000张YOLO数字病理数据集重新整理归档从WSI全切片切图、肝脏病变标注到模型训练、评估、导出部署一路走下来踩了不少坑也沉淀了不少心得。这篇文章就围绕肝脏病理病变检测这个场景展开聊一聊目标检测在数字病理里到底怎么用、YOLO系列模型该怎么调参以及那些只看论文根本发现不了的工程细节。不管是做算法研究的、搞数据标注的还是医学院里做交叉学科项目的同学都可以按这条路线完整复现一遍少走一些我走过的弯路。1. 项目到底在解决什么问题数字病理与YOLO的配合点1.1 数字病理切片的基本形态数字病理的第一步是把传统的玻璃切片通过高分辨率扫描仪变成全切片图像也就是WSI。一张肝脏穿刺切片在20倍物镜下扫描出来长宽可能达到几万像素整张图动辄几个GB。这种情况下拿整张WSI直接丢给检测模型是行不通的显存先撑不住YOLO类模型的输入通常也只有640或者1024。所以标准的做法是先把WSI切成小图块在切好的图块上做目标检测再根据切图时记录的坐标把检测框映射回原始切片。肝脏病理病变检测要处理的内容在HE染色下呈现出很典型的形态差异。肝细胞坏死区域通常会表现为细胞浆嗜酸性增强、核碎裂或消失炎性细胞浸润则以小淋巴细胞和中性粒细胞聚集为主纤维化能看到条索状的胶原沉积脂肪变性区域最明显肝细胞浆里出现大小不等的圆形空泡。这些形态特征天然适合目标检测模型去学习因为它们在局部图块里有相对清晰的视觉模式。切块环节有几个细节直接影响后续训练效果。第一切块尺寸不能随便定通常需要在512到1024之间做实验。我用1024×1024加50%重叠率能减少病灶被边界切断的概率但代价是数据量变大用512×512更细粒度小病灶更容易保留完整形态但推理时图块数量翻倍。第二切块前要过滤掉大量纯背景和正常组织的图块否则训练集里负样本占比过高模型会偏向输出“无目标”。第三一定要记录每个图块来自哪个病例、哪张切片、坐标位置这三个信息是后续数据划分和结果回溯的基石。我见过不少团队在预处理阶段只写一个简单脚本把所有有效区域切成图块就开始标注等训练出问题了才回过头查数据结果发现图块重叠率过低导致病灶被切断或者把同一患者的数据同时分到训练集和测试集。这些问题在项目初期很难察觉到了评估阶段才发现泛化指标虚高再回头重做数据集的成本非常高。1.2 为什么目标检测而不是像素分割提到肝脏病理病变检测很多人第一反应是上分割模型比如U-Net或者Mask R-CNN毕竟病变区域形态不规则矩形框看着“粗糙”。但从实际落地角度目标检测有分割模型替代不了的优势。首先是速度。YOLO是单阶段检测器一次前向推理就能输出所有目标的类别和位置处理一张1024×1024病理图块在普通显卡上能做到毫秒级响应。全切片筛查动辄几千个图块推理速度直接决定这个系统能不能嵌入到日常阅片流程。分割模型如果做同样的事尤其是像素级后处理耗时往往高出数倍到数十倍。其次是标注成本。在数字病理数据集上画一个矩形框大概几秒钟逐像素描摹一个不规则病变边界可能要几分钟到十几分钟。4000张图块的标注任务如果做分割标注人力成本会成倍增加。矩形框虽然会带上一些正常组织但对病理医生来说框本身就是一种“候选区域提示”医生在框内做复核判断效率反而更高。第三检测框方便做级联方案。我在实际项目中通常用YOLO做第一层粗筛把所有可疑区域框出来然后对框内做一次额外的分类或者轻量级分割用来精修边界。这样既保住了检测的高通量又能在关键区域获得像素级精度。相比之下如果一开始就上一个巨大的分割模型整条流程的算力和维护成本都会高很多。当然目标检测也有短板。比如矩形框会把相邻的不相关病变包在一起或者把一个大病灶分成多个重叠框。这些问题靠后处理基本能解决比如框融合、类别归一化、NMS阈值调节。综合来看在“找候选区域”这件事上YOLO是最工程化的选择这也是这套数据集采用YOLO格式的根本原因。2. 数据集设计4000张从哪里来、怎么标、怎么切2.1 从WSI到检测图块的关键预处理4000张YOLO数字病理数据集不是凭空生成的一堆图片而是从若干例肝脏穿刺或手术切除标本中系统切出来的。常规流程是先对玻璃切片做20倍扫描得到WSI再由病理医生圈出需要关注的区域通常集中在病变丰富的组织区域然后按照固定尺寸和重叠率切分成图块。切块过程中会有大量无效图块比如纯白色背景、玻璃边缘、扫描伪影这些都要用脚本自动过滤。我建议用一个简单的统计指标做过滤计算每张图块的灰度均值和标准差如果均值接近255说明这块几乎是空白如果标准差过低说明整张图颜色均匀大概率没有组织信息。保留正常肝组织图块也需要合理控制因为完全删掉正常组织会让模型失去“什么是不需要框的”参照但保留太多又会导致负样本过强。我的经验是让正常图块占整个数据集20%左右这样模型既不会把所有东西都框出来也不会因为负样本太少而过度敏感。预处理阶段还有一个容易被忽略的环节数据分层。4000张图块来自多少个病例必须在切图时记录清楚。如果同一个病例的图块同时出现在训练集和测试集模型在测试时相当于见了“熟面孔”评估结果会非常乐观。这种泄漏问题在病理数据里尤其隐蔽因为同一切片的相邻图块高度相似肉眼很难察觉。正确做法是按病例ID划分数据保证训练、验证、测试三个集合里的病例完全不重叠。图像格式也要统一。WSI扫描后常见TIFF格式YOLO训练前我会统一转成PNG或JPG并确认每个图块尺寸一致、颜色通道没有异常。有些扫描仪会输出带ICC色彩配置的图像转换后颜色可能变化最好在转换脚本里固定色彩空间。这个细节不处理训练集里出现颜色不一致的图块会让模型更关注染色差异而非病变结构。2.2 病变区域标注的边界与标签定义标注是整个数据集制作中最耗时、最需要专业判断的环节。4000张图块听起来不多但很多图块里不止一个病变框全部标完往往是数万个框。这里最忌讳的是让一个完全不懂病理的标注员闷头框因为肝脏病变类型识别高度依赖经验。我建议的标注团队配置是有病理背景的标注员负责初标另一位医生或高级标注员做复核最后对分歧区域进行仲裁。标签类别怎么定直接关系到模型能学到什么。以肝脏病理为例我通常定义五类肝细胞坏死、炎性细胞浸润、纤维化、脂肪变性、肿瘤区域。如果项目需要可以增加“假小叶”“胆管增生”等细类但类别越多标注一致性和模型难度都会上升。对于边界容易混淆的类别比如炎性浸润和坏死常并存我建议先合并成“炎症/坏死”一类等数据量足够再细分否则标注员之间的一致率会很低模型训练时会收到互相矛盾的信号。标注规范一定要写得非常具体。我踩过的坑包括标注员喜欢把多个独立小病灶用一个大框罩起来导致模型学到“大框套小目标”的错误模式还有人把框扩大到病灶周围的正常组织干扰模型对边界的判断。所以我定了几条强制规则每个框只包含一个完整的病变区域多个独立病灶拆成多个框框的边界紧贴病灶核心区域允许少量上下文但不要包进无关组织坏死区域边界模糊时以核碎裂和结构消失的核心区为准如果同一区域同时存在两种病变优先标注临床意义更重的那个类别或者允许重叠标注并在协议中说明。标注质量评估不能靠感觉。我建议每轮标注后随机抽20%的图块做双重标注计算两个标注员框之间的IoU以及类别标签的一致率。IoU大于0.7算一致类别一致率在90%以上才算通过。如果低于这个标准说明标注规范本身有歧义需要回到定义阶段去讨论。这个环节决定了数据集质量的天花板比任何训练技巧都重要。2.3 4000张数据集的划分与类别平衡4000张病理图块属于中等偏小的规模但只要分布设计合理完全够训练出一个能用于预筛查的检测模型。我常用7:2:1的比例划分为训练、验证、测试前提是严格按病例分层。更稳妥的做法是五折交叉验证尤其是当你不知道哪类病变样本太少、哪一折可能崩掉的时候交叉验证能给出更可信的指标区间。类别平衡问题不能只看图块数要统计目标框数量。因为有些图块密集分布着几十个炎性细胞灶有些图块整张只有一个纤维化区域图块数量不能反映真实样本比例。我建议做一个简单的目标框统计表看看每一类的框数占比。如果最少的类只有最多的类的十分之一就需要处理。处理小样本类别的常用方法里我最推荐复制粘贴增强和在线增强结合。复制粘贴增强的做法是把小样本病灶的小图块抠出来贴到正常组织背景上形成新图块同时自动生成对应的标注框。这个操作在病理数据里比较安全因为病变区域相对独立只要边缘颜色过渡自然模型学到的是病灶本身的形态特征。但要注意不能把一个病灶重复贴几十次否则模型会对特定纹理过拟合。另一个方法是给损失函数加class weight但它只能缓解训练失衡效果不如数据层面干预直接。数据划分时还要避免把同一张WSI的相邻图块都放进测试集。病理切片的连续性很强相邻图块的结构高度相似如果没在WSI级别或者病例级别做分割测试结果会高估模型的泛化能力。我现在的流程是先给每个病例分配唯一ID再用固定随机种子按病例ID分层抽样最后检查训练和测试集中的病例ID列表是否有重叠。3. YOLO训练全流程从PyCharm环境到损失函数调优3.1 用PyCharm快速搭好YOLO训练环境许多入门者都会在PyCharm里装YOLO我提供一个经过验证的顺滑流程。第一步先装Anaconda或者Miniconda创建一个干净的Python环境建议Python 3.10。然后激活这个环境用pip安装ultralytics和对应版本的PyTorch。PyTorch安装时要特别注意CUDA版本先用nvidia-smi查看本地显卡驱动支持的CUDA版本再去PyTorch官网选一条匹配的安装命令。装完以后在PyCharm的Settings里把项目解释器切换到刚创建的conda环境再打开Terminal验证一下yolo命令是否可用。如果只有CPU环境也能训练但速度会非常慢想认真调参至少要有一块像样的显卡。我实际遇到最多的环境问题有两个。第一个是torch和CUDA版本不匹配训练时会报显存错误或者运行时报错解决办法是重新安装与驱动匹配的torch版本。第二个是依赖包冲突ultralytics会自动安装很多依赖如果跟旧环境冲突建议不要在原环境里硬改直接新建一个环境更省心。安装依赖时网络速度慢可以配置国内镜像源但这里不展开具体命令网上一搜就有。环境搭好以后建议先用yolo detect predict跑一张公开测试图确认整套链路正常再进入训练环节。这一步能提前暴露环境问题而不是等训练到一半才返工。顺便说一句如果最终要部署到AGX Orin这类边缘设备环境搭建会完全不同PC端装的CUDA和PyTorch不一定能直接用需要按照设备厂商提供的JetPack环境重新配置这部分我会在第4.4节详细说。3.2 标注转YOLO格式与data.yaml配置YOLO格式非常简洁每张图片对应一个同名txt文件每行表示一个目标框格式为class_id x_center y_center width height其中坐标和宽高值都是相对于图片宽高的归一化浮点数。从LabelImg、CVAT或者任意标注工具转成这个格式核心就是写一个转换脚本。读取原始标注坐标除以图片的宽高得到归一化坐标保留六位小数再写入txt。类别ID要从0开始并且和data.yaml里定义的names顺序一致。下面是一个最小可用的data.yaml例子path: /path/to/your/dataset train: images/train val: images/val test: images/test nc: 5 names: 0: necrosis 1: inflammation 2: fibrosis 3: steatosis 4: tumor目录结构必须严格按照images和labels并列、train和val文件夹对应来组织。图片和标签文件的命名一致比如slide_001.jpg对应slide_001.txt。如果某个txt文件不存在YOLO会认为该图没有目标这本身没问题但要注意别让标签文件缺失的情况悄悄发生在训练集里否则等于把一个带标注的图片当作负样本训练了。配置好以后我习惯先跑一次ultralytics自带的检查命令或者用简单的Python脚本加载数据集输出几张经过增强的图片人工看一眼框是否画在正确位置上。这一步非常值得做能发现坐标转换错误、类别错位、归一化越界等问题。尤其是坐标越界只要有一个框的宽度或高度大于1训练时损失就会异常甚至直接无法收敛。3.3 模型选型、损失函数与训练参数怎么定模型选型不是越大越好。针对4000张中等规模数据集我通常从YOLOv8s开始试验如果出现过拟合退到nano如果小病灶漏检多再升到m甚至l同时把输入分辨率从640提高到1024。盲目上x或者l训练时间成倍增加但对精度提升未必明显而且更容易过拟合。模型的最佳规模需要通过小规模消融实验确定而不是一开始就堆最大参数。关于损失函数这也是近期很多人问的知识点。YOLOv8的损失主要包括分类损失和回归损失。分类损失采用BCE负责判断每个预测框对应的类别是否正确回归损失采用CIoU和DFL组合。CIoU比普通IoU多考虑了中心点距离和宽高比对病理图像里形态变化很大的病变目标更友好DFL的引入则让模型学习边界框每条边的分布而不是简单地回归四个值在小病灶定位上效果更好。理解了损失组成就不会乱调超参。默认权重在大多数任务里是合理的如果模型输出的框总是偏大或者偏小优先检查标注质量而不是急于修改损失权重。训练参数方面我的参考配置是imgsz1024batch16epochs100patience20优化器用AdamW。数据增强里mosaic对病理检测很有用能增强模型对目标尺寸变化的鲁棒性但训练后期最好把mosaic关掉因为多图拼接可能把小病灶切碎模型会学到不完整目标的错误特征。病理染色差异很大我会把HSV增强里的饱和度变化调高一点同时加一些亮度变化模拟不同扫描仪和染液批次带来的差异。但翻转增强要谨慎上下翻转通常没问题90度旋转会改变组织朝向如果病理诊断对朝向有要求就不要开。4. 实操踩坑记录训练和部署中常见的五个典型问题4.1 小病灶漏检输入分辨率与切块策略肝脏病理里的早期病变往往很小比如小灶性坏死可能只有几十像素宽。用默认640×640输入训练这些小目标在下采样后几乎消失漏检率自然高。解决这个问题的思路必须成体系第一在切图阶段控制图块大小512×512的图块能以更高分辨率保留小病灶第二训练和推理统一用1024甚至1280输入但显存占用会明显增加第三推理阶段采用滑窗检测窗口重叠率至少25%到50%确保病灶不会因为刚好落在窗口边缘而被截掉。这三个方案要一起做而不是只调一个。如果只调输入分辨率同一个小病灶可能被多个窗口重复检出后处理NMS需要相应调低热度阈值如果只增加重叠率推理时间会成倍增长。另一个很重要的做法是降低推理置信度阈值。在病理检测任务里漏检的代价通常比误检更大所以我把默认的0.25阈值降到0.1让更多可疑候选框进入医生复核列表。表面上看假阳性增加了但配合后面的规则过滤实际交互效率反而更高。还有一种针对小目标的策略是使用SAHI切片推理工具它把大图切成小带重叠的块分别推理再把结果合并。这个工具不需要重新训练适合在推理阶段直接套用。不过它本质上跟手动滑窗差不多我做项目时更倾向于写自己的推理脚本这样能完全控制坐标映射和NMS逻辑。4.2 染色差异跨中心泛化为什么变差HE染色在临床上不是标准化产品不同医院、不同试剂批次、不同染色设备都会让最终玻片颜色产生明显偏差。训练数据可能来自一家医院颜色单调模型却要部署到很多家医院结果就是本地测试mAP很高一换数据源就崩。这是病理AI落地最典型的翻车现场。为了缓解染色差异我从三个层面处理。第一是训练阶段的颜色增强随机调整RGB通道增益、饱和度和亮度让模型学会不依赖特定染色的绝对颜色值。第二是颜色归一化常用Macenko方法把每张图的染色向量对齐到一个目标模板但要注意归一化不能过度否则会把脂滴空泡和细胞形态等诊断特征也抹掉。第三是外部验证模型训练后在多中心采集的少量额外数据上做测试观察每个类别的AP变化提前发现系统性偏差。我习惯同时训练两个模型做对照一个不加颜色增强一个加强颜色增强。实测中加强版的模型在本中心数据上可能略低1到2个点但在跨中心数据上往往高6到9个点。落地时候我更看重后者因为用户遇到的情况永远比你训练集丰富得多。这个取舍要跟业务方提前讲清楚避免最后验收时只看单一mAP数字。4.3 类别不均衡与假阳性控制在肝脏病理检测中某些病变天然稀少比如早期肿瘤区域可能只有几百个框而炎症区域有上万个框。这种情况下模型会在损失函数里被大类别主导小类别几乎学不到特征。只给损失函数提高小类别权重会让模型过度敏感把形态相近的正常区域误判成小类别假阳性反而增多。我最后摸索出的一个更稳的做法是课程学习策略第一轮只训练样本量大的坏死和炎症两类等模型稳定后再把纤维化、脂肪变等小类别加进来。这样每一类都能获得足够的训练信号避免从一开始就处于严重失衡状态。配合复制粘贴增强小样本类别也能得到足够的训练实例。假阳性控制还要靠后处理和硬负样本挖掘。模型如果在正常区域频繁给框常见处理方式是统计框的面积把太小的框过滤掉更有效的方式是收集一批模型当前误判的正常图块放进训练集里当负样本重新训练。我通常训练完第一版后在验证集上跑一遍把置信度大于0.5的错误框对应的原图块抽出来找病理医生确认是否真的正常确认后再补充到数据集里。这个迭代一般做两到三轮模型假阳性会明显下降而且不会牺牲太多召回率。4.4 导出ONNX和TensorRT时的注意事项训练完成后模型一般不会直接拿PyTorch权重做部署。最常见的导出目标是ONNX再用ONNX转成TensorRT引擎。导出命令看起来简单比如yolo export modelbest.pt formatonnx但有三个我踩过的坑值得重点提醒。第一个坑是动态输入尺寸。如果部署时固定输入尺寸比如1024×1024导出时就不要开dynamic这样TensorRT能针对固定尺寸做大量优化如果需要兼容多种尺寸再考虑dynamicTrue否则推理时性能会差很多。第二个坑是NMS。ONNX导出的模型通常只包含网络前向不包含NMS后处理所以部署时必须在后处理代码里自己写NMS或者使用TensorRT提供的NMS插件。很多人以为导出后模型会自动输出最终框结果拿到一堆原始预测一时不知道怎么解析。第三个坑是版本一致性。TensorRT的engine文件与构建时的TensorRT版本、GPU型号、CUDA版本强相关把PC上构建好的engine拷贝到AGX Orin上会报反序列化错误。所以构建和部署尽量在同一个设备上完成。在AGX Orin这类边缘设备上TensorRT是提速的关键。我通常先用trtexec把ONNX转成engine开启FP16精度显存占用减少一半推理速度在多数显卡上能翻倍。转engine时还要确认输入尺寸和导出的onnx保持一致否则运行时数据维度不匹配。部署环境的PyTorch、CUDA、TensorRT版本最好整理成一份环境清单每次构建都对照检查。4.5 评估指标怎么选才能让医生认可技术团队汇报时习惯看mAP0.5但病理医生不关心这个数字。他们关心的是这个系统会不会漏掉病变以及误报多不多。如果只汇报mAP临床团队很难判断模型能不能用。因此在评估报告里我至少会展示四个维度的指标每个类别的Precision、Recall、F1-score固定每张图假阳性数量条件下的病变检出率思路接近FROC曲线按病例或患者级别统计的敏感度和特异性以及不同置信度阈值下的数据表格让业务方选择适合场景的阈值。病例级别统计尤为重要。如果4000张图块来自100个病例每例40张图块级别的Recall可能被某些重度病例的密集阳性图块拉高让人误以为模型很准。按病例统计时把“任意一张图检测到病变”视为病例阳性能更真实反映系统在临床流程中的作用。我遇到过一个案例图块级mAP看着漂亮但按病例统计后发现有一部分病变较轻的病例完全漏检因为其阳性图块数量少、置信度低果然之后把阈值下调才解决了这个问题。置信度阈值的选择要结合使用场景。如果把模型定位为医生预筛助手阈值可以低保证召回率如果要做自动化报告阈值必须高压住假阳性。没有通用的最佳阈值只有适合场景的阈值。这也是我为什么建议评估报告不要只给一个mAP而是给一组不同阈值下的性能对照让临床团队自己判断。5. 从检测框到落地对接下游分析与多模态趋势5.1 检测结果如何做二次筛查与量化检测框只是起点实际项目中更值钱的是框后分析。我的做法是拿到每个检测框的类别和坐标后再做三类处理。第一类是类别统计统计整张切片里每种病变框的数量和面积占比形成半定量指标。第二类是严重程度评估比如脂肪变性区域占组织面积的比例可以对应临床上的脂肪肝分级。第三类是空间分布可视化把检测结果映射回WSI用热力图标记高密度病变区域医生一眼就能看到整个切片里的病变分布。这个量化过程对算法的稳定性要求很高。同一张切片如果扫描两次模型输出的框不应该剧烈变化。我建议在测试集里放一些重复扫描的图块计算同一病灶框的IoU或者中心点偏移量。如果框抖动明显说明模型过拟合了染色或纹理噪声需要重新训练。另外框内区域可以用一个轻量级分类网络做二次判读确认检测到的病变类别是否准确这个后置校验能显著提升整体报告的可信度。在实际项目中检测结果通常以RTSS格式保存也就是报告系统能接受的候选框集合。后端拿到框后用坐标计算出对应的原图区域然后做高倍率截图留档。整个过程要记录模型版本、输入图块尺寸、推理参数方便日后追溯。5.2 多模态AI分析在病理中的应用趋势现在业界越来越关注多模态AI在病理里的应用这也是热词榜里高频出现的方向。肝脏病理诊断从来不只是看一张HE切片而是结合患者主诉、肝功能化验、影像学结果有时还有免疫组化标记物。YOLO检测模型在这里的价值是先把视觉模态里的候选病变区域和类别提取出来后面的多模态模型则把这些形态学特征与临床文本特征融合输出更完整的风险判断。举例来说如果模型在检测图里识别出大片坏死区域同时患者转氨酶和胆红素显著升高那么多模态模型可以综合判断为急性肝损伤高风险如果只有图像上有坏死而化验指标正常则需要进一步检查。多模态融合能够减少单纯视觉模型的误判尤其在形态学表现不典型时临床信息能提供很强的先验。做这类系统时检测模块必须非常稳定因为下游融合结果会继承上游的错误。对刚接触病理AI的人来说不要一上来就做多模态先把单模态的检测模块做扎实。4000张YOLO数据集的定位就是视觉基础层当检测模块的输入框足够干净、坐标足够精准后续的多模态特征提取才有意义。我自己的经验是先跑通一个单模态检测报告再逐步升级到多模态项目推进会顺利很多。5.3 病理AI落地前必须守住的红线聊技术到最后必须回到合规和角色边界。肝脏病理病变检测模型哪怕准确率再高也不能脱离病理医生独立出具诊断意见。它在实际流程中的定位是辅助工具帮助医生提高阅片效率和发现盲区而不是替代医生。这既是对患者负责也是技术团队保护自己的底线。数据使用必须经过伦理审批和患者知情同意涉及个人隐私的信息要完成脱敏。标注过程中需要保留完整的审计日志谁标了哪张图、什么时候改的、复核意见是什么都要有记录。模型如果走向临床辅助诊断还需要经过注册审批、多中心验证和持续质控这些流程远超单个模型训练的范畴。我建议刚开始做病理AI的个人开发者先把它当研究和工程训练任务来练手至少要在敏感数据使用和结果解释层面保持足够的谨慎。医疗AI不是“模型精度高就能上线”的简单逻辑它要求整个系统可追溯、可解释、可纠错。这也是为什么我会在项目里强调按病例划分、多层标注复核、保留推理日志这些看起来“增加工作量”的环节。它们不是技术上的装饰而是长期安全落地的基础。做了一段时间肝脏病理检测后我最大的体会是4000张图块并不算多但是标注质量和边界定义决定了后续一切工作能走多远。如果一开始对病变类别模棱两可YOLO学得再好也白搭如果从一开始就按病例分层划分数据后面的评估结果会扎实很多。最后分享一个实用小技巧训练完后不要只盯着mAP抽几张模型没见过的图块做可视化推理把框画出来贴在周报里。你会发现算法团队和病理团队的沟通会顺畅很多因为一张图能让所有人一眼看出模型到底是在做“理解题”还是真的找到了病变区域。