AI视界,智“聊”健康:基于千问-VL的医疗影像问答
欢迎来到人工智能的“看图说话”时代!在本课程的最终项目中,我们将探索AI最前沿的能力——多模态理解。您将在阿里云PAI-DSW环境中,调用强大的千问-VL(Qwen2-VL)视觉语言大模型。这个模型不仅能理解文字,更能“看懂”图像。您将学习如何上传一张医疗相关的图片(如口腔X光片、皮肤镜图像等),然后像与真人专家对话一样,向AI提问关于这张图片的问题,并获得智能的回答。
实验简介
欢迎来到人工智能的“看图说话”时代!在本课程的最终项目中,我们将探索AI最前沿的能力——多模态理解。您将在阿里云PAI-DSW环境中,调用强大的千问-VL(Qwen2-VL)视觉语言大模型。这个模型不仅能理解文字,更能“看懂”图像。您将学习如何上传一张医疗相关的图片(如口腔X光片、皮肤镜图像等),然后像与真人专家对话一样,向AI提问关于这张图片的问题,并获得智能的回答。
背景知识
多模态大模型(Multimodal Large Models):传统的大语言模型(LLM)只能处理文本信息,而多模态大模型则打破了这一限制,能够同时理解和处理多种不同类型的信息,如文本、图像、音频、视频等。这使得AI能够更像人类一样,通过多种感官来感知和理解世界。
视觉语言模型 (Vision-Language Model,VLM): VLM是多模态大模型中最主要的一类,它专注于融合视觉(图像)和语言(文本)信息。千问-VL就是其中的佼佼者,它能够完成诸如图像描述、视觉问答(VQA)、识图创作等一系列复杂的跨模态任务。
视觉问答 (Visual Question Answering, VQA):这是VLM的核心能力之一。用户提供一张图片和一个关于该图片的开放性问题,模型需要结合图片内容和问题,生成一个符合逻辑的自然语言答案。这在医疗领域有巨大的应用潜力,例如,辅助年轻医生解读影像、为患者提供初步的影像解释等。
PAI-DSW:为我们提供了运行多模态大模型所需的GPU计算环境。
实验室资源方式简介
进入实操前,请确保阿里云账号满足以下条件:
个人账号资源
使用您个人的云资源进行操作,资源归属于个人。
平台仅提供手册参考,不会对资源做任何操作。
确保已完成云工开物 300 元代金券领取。
已通过实名认证且账户余额 ≥0 元。
在实验页面,当您已阅读并同意上述创建资源的目的以及部分资源可能产生的计费规则。
资源消耗说明
本场景主要涉及以下云产品和服务:PAI、对象存储OSS。
本实验预计产生资源消耗:约10元(以使用ecs.gn6i-c8g1.2xlarge规格的PAI-DSW实例进行1小时的数据处理与模型训练为例估算)。
如果您调整了资源规格、延长了使用时长,或执行了本方案以外的操作,可能导致费用发生变化,请以控制台显示的实际价格和最终账单为准。
PAI-DSW: 费用主要由DSW实例的运行时长和其规格决定。本实验选用GPU实例进行模型训练,关机后即停止计费。
对象存储 OSS: 费用由数据存储容量和少量外网下行流量(仅在下载结果时产生)决定。
领取专属权益及创建实验资源
第一步:在开始实验之前,请先点击右侧屏幕的“进入实操”再进行后续操作

第二步:本次实验需要您通过领取阿里云云工开物学生专属300元抵扣券兑换本次实操的云资源,如未领取请先点击领取。(若已领取请跳过)
重要实验产生的费用优先使用优惠券,优惠券使用完毕后需您自行承担。

实验步骤
进入DSW控制台
登录阿里云,进入机器学习PAI控制台,在左侧导航栏选择【工作空间列表】,点击进入您的工作空间

在工作空间内,选择左侧的【模型开发与训练】—【DSW(Data Science Workshop)】

创建DSW实例
点击【创建实例】

实例名称:自定义一个名称,如 medical-2d-regist
资源组(机型):为了进行深度学习模型训练,我们需要选择GPU实例。点击【筛选】,勾选【GPU】,然后选择一款有库存的GPU机型,例如 ecs.gn6i-c8g1.2xlarge(vCPU: 8, 内存: 32GiB, GPU: NVIDIA T4 16GB)
说明这是成本消耗的主要来源,请务必注意实验后及时停止或删除实例!

镜像:选择一个预置了PyTorch框架的镜像,例如 pytorch:1.12-gpu-py39-cu113-ubuntu20.04

其他保持默认,选择完成后点击【确定】

等待约2-3分钟,直到实例状态变为“运行中”

进入JupyterLab环境
在DSW实例列表中,找到刚刚创建的实例,点击右侧的【打开】
返回JupyterLab的启动器(Launcher)页面,点击【Python 3 (PyTorch 1.12)】
创建一个新的Notebook文件

准备环境
!pip install -U "modelscope" "transformers" "torch !pip install Pillow在下一个单元格中,导入本实验所需的所有Python库。
from modelscope import snapshot_download from transformers import Qwen2VLForConditionalGeneration, AutoTokenizer, AutoProcessor import torch from qwen_vl_utils import process_vision_info # 确保这个工具函数存在 from PIL import Image # 这是一个辅助函数,用于从输入消息中提取图像信息 def process_vision_info(messages): image_inputs = [] for msg in messages: if msg["role"] == "user": for content in msg["content"]: if content["type"] == "image": image_inputs.append(content["image"]) return image_inputs, [] # 本次实验不涉及视频 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(f"Using device: {device}")
下载千问-VL多模态大模型
- 重要
重点说明: 我们将从ModelScope平台下载Qwen2-VL模型。为了在16GB显存的GPU上顺利运行,我们选择经过Int8量化的版本(Qwen2-VL-2B-Instruct-GPTQ-Int8),它在保持高性能的同时,显著降低了显存占用。
- 重要
注意: 第一次运行此代码会下载模型文件(约2GB),需要等待几分钟。
model_dir = snapshot_download("qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8") print(f"模型已下载至: {model_dir}")
构建医疗影像问答函数
让我们随机抽取一组处理后的图像,直观地看一下退化效果。
# 加载模型和处理器 processor = AutoProcessor.from_pretrained(model_dir) model = Qwen2VLForConditionalGeneration.from_pretrained( model_dir, torch_dtype=torch.float16, device_map="auto" ) def ask_qwen_vl(image_path_or_url, question): """ 向Qwen-VL模型提供图片和问题,并获取回答的函数。 """ print(f"\n===== 正在处理图片问答 =====\n图片: {image_path_or_url}\n问题: {question}\n") # ✅ 加载图像为 PIL.Image 对象 try: image = Image.open(image_path_or_url).convert("RGB") except Exception as e: print(f"无法加载图像: {e}") return # 1. 构建多模态输入格式(注意 image 是 PIL 对象) messages = [{ "role": "user", "content": [ {"type": "image", "image": image}, # ✅ 使用图像对象 {"type": "text", "text": question}, ], }] # 2. 预处理输入 text_prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) image_inputs, _ = process_vision_info(messages) inputs = processor(text=[text_prompt], images=image_inputs, padding=True, return_tensors="pt").to(device) # 3. 模型生成回答 generated_ids = model.generate(**inputs, max_new_tokens=512) generated_ids_trimmed = [out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)] # 4. 解码并输出结果 answer = processor.batch_decode(generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] print("【模型的回答】:") print(answer)
开始智能影像问答
现在,最有趣的部分来了!您可以找一些医疗相关的图片(可以是网络链接,也可以上传到DSW环境中提供本地路径),向AI提问。
实践与探索:口腔X光片问答: 找一张口腔全景X光片,尝试提问:
“这张X光片里大概有多少颗牙齿?”
“右下角那颗长歪了的牙齿是什么?”
“这张图片里能看到蛀牙吗?”
# 示例1:使用本地图片路径 xray_image_path = "oral-xray.png" xray_question = "请描述一下这图片,它是什么?" ask_qwen_vl(xray_image_path, xray_question)
清理资源
为避免产生不必要的个人扣费,实验完成后请务必按照以下步骤清理所有资源!
释放PAI-DSW实例
返回 机器学习PAI控制台 的DSW实例列表页面
找到本次实验创建的实例,点击右侧的【停止】

等待实例状态变为“已停止”后,为确保完全释放,再次点击右侧的【...】更多操作,选择【删除】

在弹出的确认框中点击【停止实例】/【删除实例】

等待一段时间检查是否删除成功

删除OSS数据和Bucket
进入 对象存储OSS控制台,找到为本次实验创建的Bucket,点击进入
选中所有上传的数据文件和文件夹,点击【删除】,返回Bucket列表,选中该Bucket,点击【删除】,根据提示完成删除操作(可能需要清空碎片)

关闭实验
在完成实验后,点击 结束实操

点击 取消 回到实验页面,点击 确定 跳转实验评分

请为本次实验评分,并给出您的建议,点击 确认,结束本次实验















