一、个人任务
在近期的项目中,我主要XrayGLM模型的微调工作,旨在使其能够更准确地识别胸部X光片图像并给出相应的诊疗报告。此外,为了构建一个用户友好的交互平台,我还负责了后端代码编写,主要是接口API的连接设计。
二、任务1——效果对比
这部分工作由我和团队成员宗亚静共同完成,具体的结果如下:
2.1 微调
- 数据准备:收集并整理了包含正常和异常胸部X光片图像的数据集,并对数据进行了预处理。
- 模型加载:加载了预训练的VisualGLM模型,并准备了必要的工具和库。
- 模型微调:使用准备好的数据集对模型进行微调,调整模型的参数以更好地适应新的数据分布。
2.2 效果对比
- 微调前:模型在某些复杂病例上的识别准确率较低,容易误判。
- 微调后:模型在识别准确率、召回率和F1值等关键指标上均有所提升,特别是在复杂病例上的表现更为出色。
三、任务2——后端代码编写
为了实现前端页面与微调后模型的交互,我负责编写了后端代码,并设计了相应的API接口。以下是我的实现过程:
3.1 API设计
定义了一个名为/getAnswer
的POST接口,用于接收前端发送的请求,并返回模型的推理结果。该接口接收一个包含文本、图像编码和历史对话的JSON对象作为输入,并返回包含诊疗报告、历史对话和状态信息的JSON响应。
3.2 接口实现
在api.py
文件中,我使用FastAPI框架实现了/getAnswer
接口。接口内部调用了infer_util.py
中的相关函数来处理输入数据并调用模型进行推理。推理结果经过处理后,被封装为一个JSON对象并返回给前端。
以下是api.py
中的关键代码片段:
from sat.model import AutoModel
from infer_util import generate_input, chat, is_chinese
from fastapi import FastAPI, Request
import json
import torch
from datetime import datetime
import uvicorn
gpu_number = 0
model, tokenizer = get_infer_setting(gpu_device=gpu_number)
app = FastAPI()
@app.post('/getAnswer')
async def xray_glm(request: Request):
# 解析前端发送的JSON数据
json_post_raw = await request.json()
request_data = json.loads(json.dumps(json_post_raw))
# 处理输入数据并调用模型进行推理
input_text, input_image_encoded, history = request_data['text'], request_data['image'], request_data['history']
# ...(省略了部分参数设置和数据处理代码)
with torch.no_grad():
answer, history, _ = chat(None, model, tokenizer, input_text, history=history, image=input_image, **gen_kwargs)
# 封装响应数据并返回给前端
now = datetime.now()
time = now.strftime("%Y-%m-%d %H:%M:%S")
response = {
"result": answer,
"history": history,
"status": 200,
"time": time
}
return response
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8080, workers=1)
在infer_util.py
文件中,定义了一些辅助函数来处理输入数据、调用模型进行推理以及生成输出。这些函数被api.py
中的xray_glm
函数所调用。
四、总结
在本阶段,我不仅成功地对XrayGLM模型进行了微调,提高了其在胸部X光片图像识别任务上的性能,还设计并实现了一个高效、稳定的后端API接口。这个接口为前端页面提供了与模型进行交互的能力,使用户能够方便地获取诊疗报告并与模型进行交流对话。本阶段让我对深度学习模型的微调、后端开发以及API设计有了更深入的理解和实践经验。