自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病 原創(chuàng)

發(fā)布于 2024-11-15 15:29
瀏覽
0收藏

前言

隨著多模態(tài)大模型的發(fā)展,其不僅限于文字處理,更能夠在圖像、視頻、音頻方面進(jìn)行識(shí)別與理解。醫(yī)療領(lǐng)域中,醫(yī)生們往往需要對(duì)各種醫(yī)學(xué)圖像進(jìn)行處理,以輔助診斷和治療。如果將多模態(tài)大模型與圖像診斷相結(jié)合,那么這會(huì)極大地提升診斷效率。

項(xiàng)目目標(biāo)

訓(xùn)練一個(gè)醫(yī)療多模態(tài)大模型,用于圖像診斷。

剛好家里老爺子近期略感頭疼,去醫(yī)院做了腦部CT,診斷患有垂體瘤,我將嘗試使用多模態(tài)大模型進(jìn)行進(jìn)一步診斷。

實(shí)現(xiàn)過(guò)程

1. 數(shù)據(jù)集準(zhǔn)備

為了訓(xùn)練模型,需要準(zhǔn)備大量的醫(yī)學(xué)圖像數(shù)據(jù)。通過(guò)搜索我們找到以下訓(xùn)練數(shù)據(jù):

數(shù)據(jù)名稱(chēng):MedTrinity-25M

數(shù)據(jù)地址:https://github.com/UCSC-VLAA/MedTrinity-25M

數(shù)據(jù)簡(jiǎn)介:MedTrinity-25M數(shù)據(jù)集是一個(gè)用于醫(yī)學(xué)圖像分析和計(jì)算機(jī)視覺(jué)研究的大型數(shù)據(jù)集。

數(shù)據(jù)來(lái)源:該數(shù)據(jù)集由加州大學(xué)圣克魯茲分校(UCSC)提供,旨在促進(jìn)醫(yī)學(xué)圖像處理和分析的研究。

數(shù)據(jù)量:MedTrinity-25M包含約2500萬(wàn)條醫(yī)學(xué)圖像數(shù)據(jù),涵蓋多種醫(yī)學(xué)成像技術(shù),如CT、MRI和超聲等。

數(shù)據(jù)內(nèi)容:該數(shù)據(jù)集有兩份,分別是 ??25Mdemo??? 和 ??25Mfull?? 。

??25Mdemo?? (約162,000條)數(shù)據(jù)集內(nèi)容如下:

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

??25Mfull?? (約24,800,000條)數(shù)據(jù)集內(nèi)容如下:

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

2. 數(shù)據(jù)下載

2.1 安裝Hugging Face的Datasets庫(kù)

pip install datasets

2.2 下載數(shù)據(jù)集

from datasets import load_dataset

# 加載數(shù)據(jù)集
ds = load_dataset("UCSC-VLAA/MedTrinity-25M", "25M_demo", cache_dir="cache")

執(zhí)行結(jié)果:

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

說(shuō)明:

  • 以上方法是使用HuggingFace的Datasets庫(kù)下載數(shù)據(jù)集,下載的路徑為當(dāng)前腳本所在路徑下的cache文件夾。
  • 使用HuggingFace下載需要能夠訪問(wèn)https://huggingface.co/ 并且在網(wǎng)站上申請(qǐng)數(shù)據(jù)集讀取權(quán)限才可以。
    如果沒(méi)有權(quán)限訪問(wèn)HuggingFace,可以關(guān)注以下公眾號(hào)后,回復(fù) “MedTrinity”獲取百度網(wǎng)盤(pán)下載地址。

2.3 預(yù)覽數(shù)據(jù)集

# 查看訓(xùn)練集的前1個(gè)樣本
print(ds['train'][:1])

運(yùn)行結(jié)果:

{
    'image': [<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=512x512 at 0x15DD6D06530>], 
    'id': ['8031efe0-1b5c-11ef-8929-000066532cad'], 
    'caption': ['The image is a non-contrasted computed tomography (CT) scan of the brain, showing the cerebral structures without any medical devices present. The region of interest, located centrally and in the middle of the image, exhibits an area of altered density, which is indicative of a brain hemorrhage. This area is distinct from the surrounding brain tissue, suggesting a possible hematoma or bleeding within the brain parenchyma. The location and characteristics of this abnormality may suggest a relationship with the surrounding brain tissue, potentially causing a mass effect or contributing to increased intracranial pressure.'
    ]
}

使用如下命令對(duì)數(shù)據(jù)集的圖片進(jìn)行可視化查看:

# 可視化image內(nèi)容
from PIL import Image
import matplotlib.pyplot as plt

image = ds['train'][0]['image']  # 獲取第一張圖像

plt.imshow(image)
plt.axis('off')  # 不顯示坐標(biāo)軸
plt.show()

運(yùn)行結(jié)果:

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

3. 數(shù)據(jù)預(yù)處理

由于后續(xù)我們要通過(guò)LLama Factory進(jìn)行多模態(tài)大模型微調(diào),所以我們需要對(duì)上述的數(shù)據(jù)集進(jìn)行預(yù)處理以符合LLama Factory的要求。

3.1 LLama Factory數(shù)據(jù)格式

查看LLama Factory的多模態(tài)數(shù)據(jù)格式要求如下:

[
  {
    "messages":[
        {
            "content":"<image>他們是誰(shuí)?",
            "role":"user"
        },
        {
            "content":"他們是拜仁慕尼黑的凱恩和格雷茨卡。",
            "role":"assistant"
        },
        {
            "content":"他們?cè)谧鍪裁矗?,
            "role":"user"
        },
        {
            "content":"他們?cè)谧闱驁?chǎng)上慶祝。",
            "role":"assistant"
        }
    ],
    "images":[
        "mllm_demo_data/1.jpg"
    ]
  }
]

3.2 實(shí)現(xiàn)數(shù)據(jù)格式轉(zhuǎn)換腳本

from datasets import load_dataset
import os
import json
from PIL importImage

defsave_images_and_json(ds, output_dir="mllm_data"):
"""
    將數(shù)據(jù)集中的圖像和對(duì)應(yīng)的 JSON 信息保存到指定目錄。

    參數(shù):
    ds: 數(shù)據(jù)集對(duì)象,包含圖像和標(biāo)題。
    output_dir: 輸出目錄,默認(rèn)為 "mllm_data"。
    """
# 創(chuàng)建輸出目錄
ifnot os.path.exists(output_dir):
        os.makedirs(output_dir)

# 創(chuàng)建一個(gè)列表來(lái)存儲(chǔ)所有的消息和圖像信息
    all_data =[]

# 遍歷數(shù)據(jù)集中的每個(gè)項(xiàng)目
for item in ds:
        img_path =f"{output_dir}/{item['id']}.jpg"# 圖像保存路徑
        image = item["image"]# 假設(shè)這里是一個(gè) PIL 圖像對(duì)象

# 將圖像對(duì)象保存為文件
        image.save(img_path)# 使用 PIL 的 save 方法

# 添加消息和圖像信息到列表中
        all_data.append(
        {
            "messages":[
            {
                "content":"<image>圖片中的診斷結(jié)果是怎樣?",
                "role":"user",
            },
            {
                "content": item["caption"],# 從數(shù)據(jù)集中獲取的標(biāo)題
                "role":"assistant",
            },
            ],
            "images":[img_path],# 圖像文件路徑
        }
)

# 創(chuàng)建 JSON 文件
    json_file_path =f"{output_dir}/mllm_data.json"
withopen(json_file_path,"w", encoding='utf-8')as f:
        json.dump(all_data, f, ensure_ascii=False)# 確保中文字符正常顯示

if __name__ =="__main__":
# 加載數(shù)據(jù)集
    ds = load_dataset("UCSC-VLAA/MedTrinity-25M","25M_demo", cache_dir="cache")

# 保存數(shù)據(jù)集中的圖像和 JSON 信息
    save_images_and_json(ds['train'])

運(yùn)行結(jié)果:

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

4. 模型下載

本次微調(diào),我們使用阿里最新發(fā)布的多模態(tài)大模型:??Qwen2-VL-2B-Instruct?? 作為底座模型。

模型說(shuō)明地址:https://modelscope.cn/models/Qwen/Qwen2-VL-2B-Instruct

使用如下命令下載模型

git lfs install
# 下載模型
git clone https://www.modelscope.cn/Qwen/Qwen2-VL-2B-Instruct.git

5. 環(huán)境準(zhǔn)備

5.1 機(jī)器環(huán)境

硬件:

  • 顯卡:4080 Super
  • 顯存:16GB

軟件:

  • 系統(tǒng):Ubuntu 20.04 LTS
  • python:3.10
  • pytorch:2.1.2 + cuda12.1

5.2 準(zhǔn)備虛擬環(huán)境

# 創(chuàng)建python3.10版本虛擬環(huán)境
conda create --name train_env pythnotallow=3.10

# 激活環(huán)境
conda activate train_env

# 安裝依賴(lài)包
pip install streamlit torch torchvision

# 安裝Qwen2建議的transformers版本
pip install git+https://github.com/huggingface/transformers

6. 準(zhǔn)備訓(xùn)練框架

下載并安裝LLamaFactory框架的具體步驟,請(qǐng)見(jiàn)【課程總結(jié)】day24(上):大模型三階段訓(xùn)練方法(LLaMa Factory)中 準(zhǔn)備訓(xùn)練框架 部分內(nèi)容,本章不再贅述。

6.1 修改LLaMaFactory源碼以適配transformer

由于Qwen2-VL使用的??transformer???的版本為??4.47.0.dev0??,LLamaFactory還不支持,所以需要修改LLaMaFactory的代碼,具體方法如下:

第一步:在 ??llamafactory??? 源碼中,找到 ??check_dependencies()??? 函數(shù),這個(gè)函數(shù)位于 ??src/llamafactory/extras/misc.py??? 文件的第 ??82?? 行。

第二步:修改 ??check_dependencies()?? 函數(shù)并保存

# 原始代碼
require_version("transformers>=4.41.2,<=4.45.2", "To fix: pip install transformers>=4.41.2,<=4.45.2")
# 修改后代碼
require_version("transformers>=4.41.2,<=4.47.0", "To fix: pip install transformers>=4.41.2,<=4.47.0")

第三步:重新啟動(dòng)LLaMaFactory服務(wù)

llamafactory-cli webui

這個(gè)過(guò)程可能會(huì)提示 ImportError: accelerate>=0.34.0 is required for a normal functioning of this module, but found accelerate==0.32.0. 如遇到上述問(wèn)題,可以重新安裝accelerate,如下:

# 卸載舊的 accelerate
pip uninstall accelerate

# 安裝新的 accelerate
pip install accelerate==0.34.0

7. 測(cè)試當(dāng)前模型

第一步:?jiǎn)?dòng)LLaMa Factory后,訪問(wèn)http://0.0.0.0:7860

?第二步:在web頁(yè)面配置模型路徑為 ??4.步驟?? 下載的模型路徑,并點(diǎn)擊加載模型

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)


第三步:上傳一張CT圖片并輸入問(wèn)題:“請(qǐng)使用中文描述下這個(gè)圖像并給出你的診斷結(jié)果”

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

由上圖可以看到,模型能夠識(shí)別到這是一個(gè)CT圖像,顯示了大概的位置以及相應(yīng)的器官,但是并不能給出是否存在診斷結(jié)果。

8. 模型訓(xùn)練

8.1 數(shù)據(jù)準(zhǔn)備

第一步:將 ??3.2步驟?? 生成的mllm_data文件拷貝到LLaMaFactory的data目錄下

第二步:將 ??4.步驟?? 下載的底座模型Qwen2-VL 拷貝到LLaMaFactory的model目錄下

第三步:修改 LLaMaFactory data目錄下的dataset_info.json,增加自定義數(shù)據(jù)集:

"mllm_med":{
"file_name":"mllm_data/mllm_data.json",
"formatting":"sharegpt",
"columns":{
"messages":"messages",
"images":"images"
},
"tags":{
"role_tag":"role",
"content_tag":"content",
"user_tag":"user",
"assistant_tag":"assistant"
}
},

8.2 配置訓(xùn)練參數(shù)

訪問(wèn)LLaMaFactory的web頁(yè)面,配置微調(diào)的訓(xùn)練參數(shù):

  • Model name:??Qwen2-VL-2B-Instruct??
  • Model path:??models/Qwen2-VL-2B-Instruct??
  • Finetuning method:??lora??
  • Stage :??Supervised Fine-Tuning??
  • Dataset:??mllm_med??
  • Output dir:??saves/Qwen2-VL/lora/Qwen2-VL-sft-demo1??

配置參數(shù)中最好將 ??save_steps?? 設(shè)置大一點(diǎn),否則訓(xùn)練過(guò)程會(huì)生成非常多的訓(xùn)練日志,導(dǎo)致硬盤(pán)空間不足而訓(xùn)練終止。

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

點(diǎn)擊Preview Command預(yù)覽命令行無(wú)誤后,點(diǎn)擊Run按鈕開(kāi)始訓(xùn)練。 訓(xùn)練參數(shù)

llamafactory-cli train \
--do_train True \
--model_name_or_path models/Qwen2-VL-2B-Instruct \
--preprocessing_num_workers 16 \
--finetuning_type lora \
--template qwen2_vl \
--flash_attn auto \
--dataset_dir data \
--dataset mllm_med \
--cutoff_len 1024 \
--learning_rate 5e-05 \
--num_train_epochs 3.0 \
--max_samples 100000 \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 8 \
--lr_scheduler_type cosine \
--max_grad_norm 1.0 \
--logging_steps 5 \
--save_steps 3000 \
--warmup_steps 0 \
--optim adamw_torch \
--packing False \
--report_to none \
--output_dir saves/Qwen2-VL-2B/full/Qwen2-VL-sft-demo1 \
--bf16 True \
--plot_loss True \
--ddp_timeout 180000000 \
--include_num_input_tokens_seen True \
--lora_rank 8 \
--lora_alpha 16 \
--lora_dropout 0 \
--lora_target all

訓(xùn)練過(guò)程

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

訓(xùn)練的過(guò)程中,可以通過(guò) ??watch -n 1 nvidia-smi?? 實(shí)時(shí)查看GPU顯存的消耗情況。

經(jīng)過(guò)35小時(shí)的訓(xùn)練,模型訓(xùn)練完成,損失函數(shù)如下:

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

損失函數(shù)一般降低至1.2左右,太低會(huì)導(dǎo)致模型過(guò)擬合。

8.3 合并導(dǎo)出模型

接下來(lái),我們將 ??Lora補(bǔ)丁??? 與 ??原始模型?? 合并導(dǎo)出:

  1. 切換到??Expert?? 標(biāo)簽下
  2. Model path: 選擇Qwen2-VL的基座模型,即:??models/Qwen2-VL-2B-Instruct??
  3. Checkpoint path: 選擇lora微調(diào)的輸出路徑,即??saves/Qwen2-VL/lora/Qwen2-VL-sft-demo1??
  4. Export path:設(shè)置一個(gè)新的路徑,例如:??Qwen2-VL-sft-final??
  5. 點(diǎn)擊??開(kāi)始導(dǎo)出?? 按鈕

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

導(dǎo)出完畢后,會(huì)在LLaMaFactory的根目錄下生成一個(gè) ??Qwen2-VL-sft-final?? 的文件夾。

9. 模型驗(yàn)證

9.1 模型效果對(duì)比

第一步:在LLaMa Factory中卸載之前的模型

第二步:在LLaMa Factory中加載導(dǎo)出的模型,并配置模型路徑為 ??Qwen2-VL-sft-final??

第三步:加載模型并上傳之前的CT圖片提問(wèn)同樣的問(wèn)題

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

可以看到,經(jīng)過(guò)微調(diào)后的模型,可以給出具體區(qū)域存在的可能異常問(wèn)題。

9.2 實(shí)際診斷

接下來(lái),我將使用微調(diào)后的模型,為家里老爺子的CT片做診斷,看看模型給出的診斷與大夫的異同點(diǎn)。

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

我訓(xùn)練了一個(gè)醫(yī)療多模態(tài)大模型幫家里老人看病-AI.x社區(qū)

我總計(jì)測(cè)試了CT片上的52張局部結(jié)果,其中具有代表性的為上述三張,可以看到模型還是比較準(zhǔn)確地診斷出:腦部有垂體瘤,可能會(huì)影響到眼部。這與大夫給出的診斷和后續(xù)檢查方案一致。

不足之處

訓(xùn)練集:

  • 多模態(tài):本次訓(xùn)練只是采用了MedTrinity-25Mdemo數(shù)據(jù)集,如果使用MedTrinity-25Mfull數(shù)據(jù)集,效果應(yīng)該會(huì)更好。
  • 中英文:本次訓(xùn)練集中使用的MedTrinity-25Mdemo數(shù)據(jù)集,只包含了英文數(shù)據(jù),如果將英文標(biāo)注翻譯為中文,提供中英文雙文數(shù)據(jù)集,相信效果會(huì)更好。
  • 對(duì)話數(shù)據(jù)集:本次訓(xùn)練只是使用了多模態(tài)數(shù)據(jù)集,如果增加中文對(duì)話(如:中文醫(yī)療對(duì)話數(shù)據(jù)-Chinese-medical-dialogue),相信效果會(huì)更好。

前端頁(yè)面:

  • 前端頁(yè)面:本次實(shí)踐曾使用streamlit構(gòu)建前端頁(yè)面,以便圖片上傳和問(wèn)題提出,但是在加載微調(diào)后的模型時(shí),會(huì)出現(xiàn):??ValueError: No chat template is set for this processor?? 問(wèn)題,所以轉(zhuǎn)而使用LLaMaFactory的web頁(yè)面進(jìn)行展示。
  • 多個(gè)圖片推理:在Qwen2-VL的官方指導(dǎo)文檔中,提供了??Multi image inference?? 方法,本次未進(jìn)行嘗試,相信將多個(gè)圖片交給大模型進(jìn)行推理,效果會(huì)更好。

內(nèi)容小結(jié)

  • Qwen2-VL-2B作為多模態(tài)大模型,具備有非常強(qiáng)的多模態(tài)處理能力,除了能夠識(shí)別圖片內(nèi)容,還可以進(jìn)行相關(guān)的推理。
  • 我們可以通過(guò)??LLaMaFactory?? 對(duì)模型進(jìn)行微調(diào),使得其具備醫(yī)療方面的處理能力。
  • 微調(diào)數(shù)據(jù)集采用開(kāi)源的MedTrinity-25M數(shù)據(jù)集,該數(shù)據(jù)集有兩個(gè)版本:25Mdemo和25Mfull。
  • 訓(xùn)練前需要對(duì)數(shù)據(jù)集進(jìn)行預(yù)處理,使得其適配LLaMaFactory的微調(diào)格式。
  • 經(jīng)過(guò)微調(diào)后的多模態(tài)大模型,不但可以詳細(xì)地描述圖片中的內(nèi)容,還可以給出可能的診斷結(jié)果。

?

本文轉(zhuǎn)載自公眾號(hào)一起AI技術(shù) 作者:Dongming

原文鏈接:??https://mp.weixin.qq.com/s/_NFvbMlbH7N5YSdo2OoiIQ??


?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦