​​XrayGLM原理与部署

接上一篇:VisualGLM-6B——原理与部署-CSDN博客

XrayGLM技术背景与原理

XrayGLM 是一种基于 VisualGLM-6B 微调开发的多模态医学影像诊断模型,专门用于处理医学影像(如 X 光胸片)的自动诊断和报告生成任务。该模型旨在为中文医学影像分析和诊断提供有效的工具。

一、背景与需求

多模态大模型的发展现状

随着 GPT-4 和 MiniGPT-4 等模型在多模态领域的成功应用,多模态模型能够同时处理文本和图像信息,并在图像理解、描述和生成任务上展现了卓越的表现。然而,这些模型主要集中于通用领域(如图片描述、图像问答等),在医学领域的研究和应用相对较少。

医学影像分析的挑战

医学影像(如 X 光、CT 等)与普通图像在数据分布、特征表达和任务要求上存在显著差异。医学影像中的细节信息至关重要,尤其是在诊断疾病时。现有的多模态模型(如 MiniGPT-4)并没有针对医学影像的特殊性进行优化和微调,因此很难直接应用于此类任务。

二、XrayGLM 的模型设计与改进

基于 VisualGLM-6B 微调

XrayGLM 的基础是 VisualGLM-6B,这是一种支持图像和中英文文本多模态对话的语言模型VisualGLM-6B 本身基于 ChatGLM-6B,并引入了 BLIP2-Qformer 模块,使其能够将图像信息与语言模型的语义空间进行有效对齐。XrayGLM 在此基础上进行微调训练,专注于医学影像诊断任务。

  • 微调数据:XrayGLM 利用医学影像-诊疗报告对进行微调训练。数据集包括来自 OpenI 的胸部 X 光图像数据集,包含 6,459 张图像和 3,955 份诊断报告。此外,还利用 ChatGPT 构建了可用于中文训练的 X-ray 影像-诊疗报告数据对。

  • 语言模型的中英文支持:VisualGLM-6B 原生支持中英文文本,这为 XrayGLM 在中文医学影像分析上的应用提供了基础保障。相比其他仅支持英文的模型,XrayGLM 能够更好地处理中文医学影像和报告生成任务。

主要改进与提升

1、模型结构的改进

XrayGLM 采用 VisualGLM-6B 的模型架构,并针对医学影像任务进行了微调优化。它结合了以下三个部分:

  • 视觉编码器(ViT):用于提取 X 光图像的视觉特征。

  • Q-Former 模块:将视觉编码器提取的特征转化为语言模型可以理解的表示,作为桥梁连接视觉信息和语言语义。

  • ChatGLM-6B 语言模型:用于生成诊断报告或回答医学相关问题。

这种结构使得模型能够同时理解图像和文本信息,并在医学影像诊断任务上生成符合专业要求的报告。

2、数据驱动的优化策略

XrayGLM 采用了大规模的中文医学影像数据进行微调,并结合了少量高质量的标注数据,确保模型在中文医学领域的应用效果。这种策略在提升模型性能的同时,也大大减少了训练时间和计算资源的消耗。

3、医学专用 Prompt 设计

XrayGLM 在训练过程中,针对医学影像任务设计了专用的 Prompt(提示语),例如“描述这张 X 光片的诊断结果”。这种设计使得模型能够更好地理解输入的任务要求,提高生成结果的准确性和专业性。

XrayGLM 的优点

  1. 针对医学影像任务优化:XrayGLM 专门针对 X 光胸片等医学影像进行了微调训练,能够在诊断任务中生成高质量的诊断报告。

  2. 中英文双语支持:模型原生支持中英文,使其在中文医学影像分析和报告生成上具有明显优势。

  3. 高效的训练与推理:通过优化模型架构和数据使用策略,XrayGLM 实现了高效的训练和推理,能够在有限的计算资源下完成医学影像的分析任务。

  4. 多轮对话能力:基于 VisualGLM-6B 的多模态对话能力,XrayGLM 可以与用户进行多轮问答,提供更细致的诊断意见和分析结果。

三、实际应用与效果

1、医学影像诊断

XrayGLM 能够对输入的 X 光影像进行自动分析,并生成详细的诊断报告。例如,模型可以识别心脏大小、肺部阴影、异常结节等细节信息,并对是否存在炎症、积液等问题给出明确判断。这对于医生在诊断过程中提供辅助参考具有重要意义。

2、医患交流中的应用

XrayGLM 生成的诊断报告不仅仅局限于医学术语,它还可以结合上下文进行“有温度”的对话,例如用更通俗的语言解释病情,帮助患者更好地理解自己的健康状况。这种能力对于提升医患交流的质量具有重要作用。

四、未来展望

XrayGLM 在医学影像分析方面展现了很大的潜力,但也有进一步提升的空间:

  1. 更多医学影像类型的支持:目前 XrayGLM 主要针对 X 光胸片进行微调,可以考虑扩展到 CT、MRI 等其他类型的医学影像数据。

  2. 引入更多的专业知识:通过引入更多的医学专业知识,如病历数据、手术记录等,可以进一步提升模型的诊断精度和专业性。

  3. 增强多轮对话能力:进一步优化模型在多轮对话中的表现,使其能够在更复杂的医疗场景下提供精准、连贯的回答。

XrayGLM 基于 VisualGLM-6B 进行了针对医学影像的微调训练,是一个能够有效处理医学影像自动诊断和报告生成的多模态模型。它在中文医学影像分析领域具有明显优势,并为未来多模态大模型在医学中的应用提供了有力支持。

XrayGLM部署

项目地址:GitHub - WangRongsheng/XrayGLM: 🩺 首个会看胸部X光片的中文多模态医学大模型 | The first Chinese Medical Multimodal Model that Chest Radiographs Summarization.

部署该模型,我认为最好是先将底层模型VisualGLM-6B部署成功,将VisualGLM-6B成功代表着大部分的环境都配备好了,需要的很多依赖也都安装好了。一开始我尝试直接部署XrayGLM,但是出了很多问题,后面我重开服务器直接部署底层模型VisualGLM-6B,然后在VisualGLM-6B部署成功的基础上部署XrayGLM,整个过程就很顺利,也没有报什么错。

VisualGLM-6B部署可以参考我的上一篇博客:VisualGLM-6B——原理与部署-CSDN博客

一、下载模型文件

云服务器的话可以先开一下学术加速。

克隆XrayGLM repo:

 git clone https://github.com/WangRongsheng/XrayGLM.git

此处除了XrayGLM模型文件,我还建议下载一下chatglm-6b模型,因为我们的模型运行需要chatglm-6b的支持,它主要负责文本生成部分的内容。所以后续开始推理模型文件的时候,推理文件会自动从hugging face上拉取chatglm-6b文件。但是之前也提过,hugging face是国外的网站,直接拉取几乎都会报网络连接超时的错误。当然,你开一下学术加速可能可以解决。

总之,还是建议直接去官网下载chatglm-6b模型到服务器上,然后更改涉及文件中的相关路径,建议全部写成绝对路径。

chatglm-6b模型下载地址:GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型

https://huggingface.co/THUDM/chatglm-6b

二、准备数据集

中文数据集已经放到了指定文件夹下面:

英文数据集也是,放到了文件夹下面:

现在需要的就是下载影像数据集,放到指定位置——./XrayGLM/data/Xray/ 目录下

影像下载:百度网盘 请输入提取码

下载本地后上传服务器,然后在指定目录下面解压缩即可:

三、配置虚拟环境及安装依赖

虚拟环境仍然使用部署VisualGLM-6B时配置好的虚拟环境,其实大部分环境都配的差不多了。

然后进入XrayGLM模型文件,安装依赖:

pip install -r requirements.txt

推荐使用国内源

​pip install -i Simple Index -r requirements.txt

四、模型推理

XrayGLM是官方在VisualGLM-6B基础上,用医学数据集训练得到的新模型,我们可以自己对其进行微调,改变参数设定然后训练得到指定步数的权重模型文件。

但是官方已经给出了微调300步和微调3000步的模型了,不想花时间微调模型的可以直接在hugging face上下载这两个模型:

https://huggingface.co/wangrongsheng/XrayGLM-300/tree/main

https://huggingface.co/wangrongsheng/XrayGLM-3000/tree/main

注意,上述3000步的模型,只需要下载3000这个文件夹里面的模型文件即可,不需要下载全部模型文件。

下载模型后上传服务器,并且将这两个模型文件的大文件夹拖拽到XrayGLM/checkpoints/ 目录下面。

然后记得更改相关文件里面对应的路径为现在你自己模型文件的绝对路径。

目前,我们要加载的推理模型是 "checkpoints/XrayGLM-300"或"checkpoints/XrayGLM-3000"。

tokenizer 依然是 chatglm-6b,它已经被下载到我自己的本地路径 "/root/autodl-tmp/THUDM/chatglm-6b"。

推理模型需要运行下面的指令:

python cli_demo.py --from pretrained checkpoints/XrayGLM-300 --prompt_zh '详细描述这张胸部X光片的诊断结果'

python cli_demo.py --from pretrained checkpoints/XrayGLM-3000 --prompt_zh '详细描述这张胸部X光片的诊断结果'

model 使用 checkpoints/XrayGLM-300 路径。

tokenizer 使用 "/root/autodl-tmp/THUDM/chatglm-6b" 路径。

因为我把chatglm-6b下载到了本地目录下,所以对整个cli_demo.py做出一定的调整,可以通过在命令行参数中分别指定 model 和 tokenizer 的路径来实现这一点:

# -*- encoding: utf-8 -*-

import os
import sys
import torch
import argparse
from transformers import AutoTokenizer
from sat.model.mixins import CachedAutoregressiveMixin
from sat.quantization.kernels import quantize

from model import VisualGLMModel, chat
from finetune_XrayGLM import FineTuneVisualGLMModel
from sat.model import AutoModel


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--max_length", type=int, default=2048, help='max length of the total sequence')
    parser.add_argument("--top_p", type=float, default=0.4, help='top p for nucleus sampling')
    parser.add_argument("--top_k", type=int, default=100, help='top k for top k sampling')
    parser.add_argument("--temperature", type=float, default=.8, help='temperature for sampling')
    parser.add_argument("--english", action='store_true', help='only output English')
    parser.add_argument("--quant", choices=[8, 4], type=int, default=None, help='quantization bits')
    parser.add_argument("--from_pretrained", type=str, default="/root/autodl-tmp/THUDM/visualglm-6b", help='pretrained model path')
    parser.add_argument("--tokenizer_path", type=str, default="/root/autodl-tmp/THUDM/chatglm-6b", help='tokenizer path')
    parser.add_argument("--prompt_zh", type=str, default="描述这张图片。", help='Chinese prompt for the first round')
    parser.add_argument("--prompt_en", type=str, default="Describe the image.", help='English prompt for the first round')
    args = parser.parse_args()

    # Load model from pretrained checkpoint
    model, model_args = AutoModel.from_pretrained(
        args.from_pretrained,
        args=argparse.Namespace(
            fp16=True,
            skip_init=True,
            use_gpu_initialization=True if (torch.cuda.is_available() and args.quant is None) else False,
            device='cuda' if (torch.cuda.is_available() and args.quant is None) else 'cpu',
        )
    )
    model = model.eval()

    if args.quant:
        quantize(model.transformer, args.quant)

    model.add_mixin('auto-regressive', CachedAutoregressiveMixin())

    # Load tokenizer from local path
    tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_path, trust_remote_code=True)

    if not args.english:
        print('欢迎使用 XrayGLM 模型,输入图像URL或本地路径读图,继续输入内容对话,clear 重新开始,stop 终止程序')
    else:
        print('Welcome to XrayGLM model. Enter an image URL or local file path to load an image. Continue inputting text to engage in a conversation. Type "clear" to start over, or "stop" to end the program.')
    
    with torch.no_grad():
        while True:
            history = None
            cache_image = None
            if not args.english:
                image_path = input("请输入图像路径或URL(回车进入纯文本对话): ")
            else:
                image_path = input("Please enter the image path or URL (press Enter for plain text conversation): ")

            if image_path == 'stop':
                break
            if len(image_path) > 0:
                query = args.prompt_en if args.english else args.prompt_zh
            else:
                if not args.english:
                    query = input("用户:")
                else:
                    query = input("User: ")
            
            while True:
                if query == "clear":
                    break
                if query == "stop":
                    sys.exit(0)
                try:
                    response, history, cache_image = chat(
                        image_path, 
                        model, 
                        tokenizer,
                        query, 
                        history=history, 
                        image=cache_image, 
                        max_length=args.max_length, 
                        top_p=args.top_p, 
                        temperature=args.temperature,
                        top_k=args.top_k,
                        english=args.english,
                        invalid_slices=[slice(63823, 130000)] if args.english else []
                        )
                except Exception as e:
                    print(e)
                    break
                sep = 'A:' if args.english else '答:'
                print("XrayGLM:"+response.split(sep)[-1].strip())
                image_path = None
                if not args.english:
                    query = input("用户:")
                else:
                    query = input("User: ")


if __name__ == "__main__":
    main()

接下来就可以直接运行推理指令了:

python cli_demo.py --from_pretrained checkpoints/XrayGLM-300 --tokenizer_path /root/autodl-tmp/THUDM/chatglm-6b --prompt_zh '详细描述这张胸部X光片的诊断结果'

需要注意的一点是,输入最好一口气输完,用到delete键很有可能导致“not a string”的报错。

并且,我发现许多图像应答的首次回答都比较简短,需要提示“具体描述”这类提示词才会有较长的应答。

XrayGLM-3000也是如此:

至于模型微调,可以参考官方的文档和讲解视频,官方已经在某站发过了该模型的相关讲解视频,主要是关于该模型的技术背景介绍以及模型的部署和微调的大致流程:【官方教程】XrayGLM微调实践_哔哩哔哩_bilibili

同时,官方的报告文件下载: https://pan.baidu.com/s/1gfdpyfT6EVnygMPDO_iwvQ?pwd=8wpc

提取码: 8wpc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值