牙科 X 光片的质量问题,往往要到医生查看或后续流程中才暴露。此时患者可能已经离开拍摄位置,重新拍摄会增加等待时间、操作成本和不必要的辐射暴露。Henry Schein One 构建的 Image Verify 将 AI 质量验证前移到影像采集时:系统基于 Amazon SageMaker AI 实时评估 X 光片,并把结果反馈给现场人员。
这套系统在数月内从概念走向超过 10,000 个活跃地点,已处理超过 1,100 万张 X 光片,每周新增约 150 万张,并计划跨四个区域扩展到全球 40,000 个地点。真正值得工程团队关注的,不只是模型本身,而是如何让模型稳定地进入高吞吐、低延迟且涉及敏感数据的临床工作流。
实时验证改变了反馈闭环
离线质检通常以批处理方式发现问题,适合统计和模型训练,却不能及时帮助拍摄人员纠正操作。实时验证则把一次推理嵌入采集流程:影像生成后立即送入质量模型,模型返回质量状态、置信度或需要复查的原因,客户端据此提示接受、复拍或人工确认。
一个可落地的请求链路通常包含这些环节:
- 采集端生成影像,并附带设备、拍摄类型和请求追踪标识。
- 接入服务完成身份认证、格式校验和敏感字段处理。
- 推理端点执行预处理、模型推理和结果校准。
- 客户端在可接受的时延内得到判断,同时审计系统异步记录结果。
- 低置信度样本进入人工复核,而不是被强制自动判定。
这里的核心指标不能只有准确率。工程团队还应持续观察端到端延迟、超时率、按设备型号划分的错误率、低置信度比例,以及模型建议最终被操作人员接受或推翻的频率。
从单个端点扩展到数万个地点
覆盖数万个地点时,负载不会均匀到达。诊所营业时间、地区时区和批量导入都可能产生明显峰值。每周约 150 万张影像代表的是总吞吐量,容量设计还必须考虑分钟级峰值、单张影像大小、预处理开销和重试流量。
可以把同步路径控制得尽量短:对象存储保存原始影像,在线请求仅传递经过授权的对象引用或必要的图像数据;日志、指标聚合和后续分析通过异步通道完成。客户端还应设置明确的超时和降级策略。推理服务暂时不可用时,采集流程不能无限等待,可以转入人工检查或稍后验证队列。
跨四个区域部署又增加了数据驻留、模型版本一致性和故障隔离问题。实践中可以为每个区域部署独立端点与存储,在集中控制面维护模型版本和发布状态,避免把患者影像跨区域搬运。发布新模型时,先用少量流量验证延迟和业务指标,再逐步扩大覆盖范围。
可以这样实践:调用 SageMaker 实时端点
下面是一个可改造的 Python 示例。假设已经部署一个接受 JPEG 字节、返回 JSON 的 SageMaker 实时端点;实际生产协议应以模型容器的输入输出约定为准。运行前配置 AWS 凭证,将 ENDPOINT_NAME 和 XRAY_PATH 改为自己的值。
python -m pip install boto3
export AWS_REGION=us-east-1
export ENDPOINT_NAME=dental-image-quality
export XRAY_PATH=sample-xray.jpg
import json
import os
import uuid
import boto3
region = os.getenv("AWS_REGION", "us-east-1")
endpoint_name = os.environ["ENDPOINT_NAME"]
image_path = os.getenv("XRAY_PATH", "sample-xray.jpg")
runtime = boto3.client("sagemaker-runtime", region_name=region)
with open(image_path, "rb") as image_file:
image_bytes = image_file.read()
request_id = str(uuid.uuid4())
response = runtime.invoke_endpoint(
EndpointName=endpoint_name,
ContentType="image/jpeg",
Accept="application/json",
CustomAttributes=f"request-id={request_id}",
Body=image_bytes,
)
result = json.loads(response["Body"].read())
print(json.dumps({"request_id": request_id, "result": result}, indent=2))
如果容器返回类似 {"quality":"review","confidence":0.61} 的结果,业务层不应只按最高分类直接决定复拍。可以设置复核区间,并保留模型版本和请求标识:
def decide(result: dict) -> str:
confidence = float(result["confidence"])
quality = result["quality"]
if confidence < 0.75:
return "manual_review"
if quality == "acceptable":
return "accept"
return "retake_suggested"
阈值只是示例,应通过真实业务数据、临床评审和风险分析确定。还要避免把患者姓名等直接身份信息写入 CustomAttributes、应用日志或指标标签。
上线时要守住的边界
医疗影像 AI 的输出应被定义为质量辅助信号,而不是超出验证范围的诊断结论。影像质量也可能受到设备型号、曝光参数、拍摄部位和现场流程影响,因此总体指标良好并不意味着每个地点、设备或人群都同样可靠。
采用这类系统时,可以用一份简短清单约束发布:
- 明确端到端延迟目标、超时行为和人工降级路径。
- 按区域、设备和拍摄类型监控模型表现与数据漂移。
- 对模型、容器和预处理代码统一版本化,保证结果可追溯。
- 对静态数据和传输数据加密,并最小化日志中的敏感信息。
- 用影子流量或小比例流量验证新版本,再执行分阶段发布。
- 记录人工复核结果,但经过治理后才能用于再训练。
Image Verify 的规模说明,影像质量模型只有嵌入采集现场、建立清晰的失败处理机制,并具备跨区域运营能力,才能从一次模型演示变成持续运行的生产系统。