基于Qwen2-VL模型针对 ImageToText 任务进行微调训练 - 数据处理

基于Qwen2-VL模型针对 ImageToText 任务进行微调训练 - 数据处理

flyfish

给定的图像生成一段自然语言描述。它的目标是生成一个或多个句子,能够准确地描述图像中的主要内容、物体、动作、场景等信息。例如,对于一张包含一只狗在草地上奔跑的图像,ImageToText 可能会生成 “一只狗在绿色的草地上快乐地奔跑” 这样的文字描述。

数据集描述

Image-caption task的数据集,包含train和valid
数据集简介
mscoco 2014的image caption数据集。

数据集支持的任务
支持image caption任务

数据集的格式和结构
数据格式
包含image_id, caption, image等信息。


数据集加载方式

from modelscope.msdatasets import MsDataset
ds = MsDataset.load("coco_2014_caption", namespace="modelscope", split="train")
print(ds[0])

请添加图片描述
生成的数据集格式

[
  {
    "id": "identity_12801",
    "conversations": [
      {
        "from": "user",
        "value": "/home/sss/datasets/1/coco_2014_caption/467265.jpg"
      },
      {
        "from": "assistant",
        "value": "A group of young people standing in the middle of a street."
      }
    ]
  },
  {
    "id": "identity_12802",
    "conversations": [
      {
        "from": "user",
        "value": "/home/sss/datasets/1/coco_2014_caption/227117.jpg"
      },
      {
        "from": "assistant",
        "value": "Oven light on in a kitchen with wooden countertops. "
      }
    ]
  },
  ......

完整代码如下

import os
import pandas as pd
import json
import argparse
from modelscope.msdatasets import MsDataset

class CocoCaptionProcessor:
    """COCO 2014 Caption数据集处理器"""

    def __init__(self, max_data_number=500, dataset_dir='coco_2014_caption', csv_file='coco2014.csv'):
        """
        初始化CocoCaptionProcessor
        
        :param max_data_number: 最大处理的数据量
        :param dataset_dir: 数据集保存目录
        :param csv_file: CSV文件路径
        """
        self.max_data_number = max_data_number
        self.dataset_dir = dataset_dir
        self.csv_file = csv_file
        self.image_paths = []
        self.captions = []

    def download_and_process(self):
        """从ModelScope下载并处理COCO 2014 Caption数据集"""
        if not os.path.exists(self.dataset_dir):
            ds = MsDataset.load('modelscope/coco_2014_caption', subset_name='coco_2014_caption', split='train')
            total = min(self.max_data_number, len(ds))
            os.makedirs(self.dataset_dir, exist_ok=True)

            for i in range(total):
                item = ds[i]
                image_id = item['image_id']
                caption = item['caption']
                image = item['image']

                image_path = os.path.abspath(f'{self.dataset_dir}/{image_id}.jpg')
                image.save(image_path)

                self.image_paths.append(image_path)
                self.captions.append(caption)

                if (i + 1) % 50 == 0:
                    print(f'Processing {i+1}/{total} images ({(i+1)/total*100:.1f}%)')

            df = pd.DataFrame({
                'image_path': self.image_paths,
                'caption': self.captions
            })
            df.to_csv(self.csv_file, index=False)
            print(f'Data processing completed, processed a total of {total} images.')
        else:
            print(f'{self.dataset_dir} directory already exists, skipping data processing.')

    def generate_conversations_json(self, output_file='coco2014.json', train_ratio=0.8):
        """根据CSV文件生成对话格式的JSON文件,并按给定比例分割训练集和验证集"""
        df = pd.read_csv(self.csv_file)
        conversations = []

        for i in range(len(df)):
            conversations.append({
                "id": f"identity_{i+1}",
                "conversations": [
                    {"from": "user", "value": df.iloc[i]['image_path']},
                    {"from": "assistant", "value": df.iloc[i]['caption']}
                ]
            })

        # 分割训练集和验证集
        split_index = int(len(conversations) * train_ratio)
        train_conversations = conversations[:split_index]
        val_conversations = conversations[split_index:]

        with open(output_file.replace('.json', '_train.json'), 'w', encoding='utf-8') as f:
            json.dump(train_conversations, f, ensure_ascii=False, indent=2)

        with open(output_file.replace('.json', '_val.json'), 'w', encoding='utf-8') as f:
            json.dump(val_conversations, f, ensure_ascii=False, indent=2)

        print(f'Generated JSON files for training and validation sets.')


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="Process COCO 2014 Caption Dataset.",
        epilog="Example usage: python script.py --max_data_number 100 --dataset_dir ./data --csv_file ./output.csv"
    )
    
    # 参数分组,让帮助信息更清晰
    data_options = parser.add_argument_group('Data Options')
    data_options.add_argument('--max_data_number', type=int, default=16000, 
                              help='Maximum number of data entries to process (default: %(default)s)')
    data_options.add_argument('--dataset_dir', type=str, default='coco_2014_caption', 
                              help='Directory to save the dataset (default: %(default)s)')
    data_options.add_argument('--csv_file', type=str, default='./coco2014.csv', 
                              help='Path to save the CSV file (default: %(default)s)')

    output_options = parser.add_argument_group('Output Options')
    output_options.add_argument('--output_file', type=str, default='coco2014.json', 
                                help='Base name for output JSON files (default: %(default)s)')
    output_options.add_argument('--train_ratio', type=float, default=0.8, 
                                help='Ratio of data to use for training set (default: %(default)s)')

    args = parser.parse_args()

    processor = CocoCaptionProcessor(
        max_data_number=args.max_data_number,
        dataset_dir=args.dataset_dir,
        csv_file=args.csv_file
    )
    processor.download_and_process()
    processor.generate_conversations_json(output_file=args.output_file, train_ratio=args.train_ratio)
### 快速部署 Qwen2-VL-7B 视觉大模型的最佳实践 #### 准备环境 为了确保顺利部署 Qwen2-VL-7B 模型,建议先安装必要的依赖工具并配置开发环境。这包括但不限于 Git LFS 以及 Python 环境设置。 ```bash git lfs install ``` 此命令用于初始化 Git Large File Storage (LFS),这对于处理大型文件(如预训练模型权重)至关重要[^2]。 #### 获取预训练模型 通过克隆仓库来获取已经预先训练好的 Qwen2-VL-7B 模型: ```bash git clone https://www.modelscope.cn/Qwen/Qwen2-VL-7B-Instruct.git /root/sj-tmp ``` 上述代码片段展示了如何从指定 URL 下载所需资源到本地路径 `/root/sj-tmp` 中。 #### 设置推理框架 对于高效的在线推理服务构建,推荐采用 vLLM 推理库作为支撑平台之一。它能够提供高性能的同时保持较低延迟特性,非常适合于生产环境中运行大规模语言模型。 ```python from transformers import AutoModelForCausalLM, AutoTokenizer import torch model_name_or_path = "/root/sj-tmp" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained(model_name_or_path) device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) ``` 这段 Python 代码说明了加载 tokenizer 和 model 的过程,并将其迁移到 GPU 或 CPU 上执行进一步的任务[^3]。 #### 实现简单交互界面 为了让用户更方便地与已部署的大规模视觉语言模型互动,可以创建一个简易的 Web 应用程序接口(API)或者图形化用户界面(GUI)。这里给出基于 Flask 构建 RESTful API 的例子: ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict(): input_text = request.json.get('input') inputs = tokenizer(input_text, return_tensors="pt").to(device) outputs = model.generate(**inputs) result = tokenizer.decode(outputs[0], skip_special_tokens=True) response = {"output": result} return jsonify(response), 200 if __name__ == "__main__": app.run(host='0.0.0.0', port=8080) ``` 以上脚本定义了一个 HTTP POST 方法 '/predict' 来接收 JSON 请求体中的输入文本字符串,经过编码转换成张量形式送入模型预测后返回解码后的输出结果给客户端应用程序使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二分掌柜的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值