使用LLaMA-Factory微调Qwen2.5-VL-3B 的目标检测任务-数据集格式转换(voc 转 ShareGPT)

一、LLaMA-Factory + Qwen2.5-VL + ShareGPT 格式要求

ShareGPT 格式就是多轮对话的 list,每条数据如下:

复制代码
[
  {
    "conversations": [
      {"from": "user", "value": "<image>\n请标注图片中的所有目标及其类别和位置。"},
      {"from": "assistant", "value": "[{\"category\": \"person\", \"bbox\": [50, 100, 200, 300]}]"}
    ],
    "image": "相对路径/xxx.jpg"
  },
  ...
]

注意:

  • 字段是 "from" 而不是 "role"

  • 图片路径通常为相对路径,实际训练时配合 --image_folder 参数;

  • 你可以有任意多轮(这里只做单轮QA,适合目标检测)。

二、VOC批量转ShareGPT格式完整脚本

因为我的标注信息.xml和原始图像在同一个目录下,还有嵌套的文件夹;

下面脚本会递归遍历你的VOC根目录,自动配对xml和图片,生成ShareGPT格式的JSON。

复制代码
import os
import json
import xml.etree.ElementTree as ET

def find_files_recursive(root_dir, exts):
    file_list = []
    for root, dirs, files in os.walk(root_dir):
        for file in files:
            if file.lower().endswith(exts):
                abs_path = os.path.join(root, file)
                rel_path = os.path.relpath(abs_path, root_dir)
                file_list.append(rel_path)
    return file_list

def get_img_path(xml_path, all_img_paths):
    xml_base = os.path.splitext(xml_path)[0]
    for ext in ['.jpg', '.jpeg', '.png', '.bmp']:
        img_path = xml_base + ext
        if img_path in all_img_paths:
            return img_path
    return None

def voc_to_sharegpt(voc_data_dir, output_json_path):
    xml_files = find_files_recursive(voc_data_dir, ('.xml',))
    img_files = find_files_recursive(voc_data_dir, ('.jpg', '.jpeg', '.png', '.bmp'))
    img_files_set = set(img_files)

    dataset = []
    for xml_rel in xml_files:
        xml_abs = os.path.join(voc_data_dir, xml_rel)
        img_rel = get_img_path(xml_rel, img_files_set)
        if img_rel is None:
            continue

        tree = ET.parse(xml_abs)
        root = tree.getroot()
        objs = []
        for obj in root.findall('object'):
            name = obj.find('name').text
            bbox = obj.find('bndbox')
            xmin = int(float(bbox.find('xmin').text))
            ymin = int(float(bbox.find('ymin').text))
            xmax = int(float(bbox.find('xmax').text))
            ymax = int(float(bbox.find('ymax').text))
            objs.append({'category': name, 'bbox': [xmin, ymin, xmax, ymax]})
        if not objs:
            continue

        # ShareGPT 格式(提示词根据自己的需求修改)
        entry = {
            "conversations": [
                {"from": "human", "value": "<image>\n请标注图片中的所有目标及其类别和位置。"},
                {"from": "gpt", "value": json.dumps(objs, ensure_ascii=False)}
            ],
            "images": data_dir +"/"+img_rel.replace("\\", "/")
        }
        dataset.append(entry)

    with open(output_json_path, 'w', encoding='utf-8') as f:
        json.dump(dataset, f, ensure_ascii=False, indent=2)
    print(f"转换完成!共 {len(dataset)} 条,输出至 {output_json_path}")

# 示例用法:假设VOC数据在 ./myvocdata
if __name__ == '__main__':
    voc_data_dir="./myvocdata"
    output_json_path="sharegpt_qwen25vl.json"
    voc_to_sharegpt(voc_data_dir,output_json_path)

然后运行该python脚本会生成 sharegpt_qwen25vl.json文件,截取部分如下所示:

相关推荐
zl_vslam10 小时前
SLAM中的非线性优-3D图优化之相对位姿Between Factor(七)
人工智能·算法·计算机视觉·3d
源码技术栈10 小时前
Java智能诊所管理系统源码 SaaS云门诊运维平台源码
java·大数据·运维·人工智能·源码·诊所·门诊
The Straggling Crow10 小时前
理解训练 vs 推理时对计算图、内存、精度的不同要求
人工智能
阿杰学AI10 小时前
AI核心知识33——大语言模型之ASR(简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·语音识别·asr·自动语音识别
安徽正LU o561-6o623o710 小时前
(露)转棒疲劳仪 大鼠转棒疲劳仪 小鼠转棒疲劳仪
人工智能
北京耐用通信10 小时前
工业通信升级利器:耐达讯自动化Ethernet/IP转CC-Link网关让IO模块兼容无忧!
网络·人工智能·科技·物联网·网络协议·自动化·信息与通信
用户24629320676710 小时前
标书智能体(三)——生成标书正文代码+提示词
人工智能
凌晨一点的秃头猪10 小时前
SIFT尺度不变特征变换
人工智能·计算机视觉
JEECG低代码平台10 小时前
Jeecg AI 应用开发平台 v1.0.0,首个开源版本发布
人工智能·开源
强化学习与机器人控制仿真10 小时前
Holosoma 开源人形机器人强化学习训练部署框架
人工智能·stm32·神经网络·机器人·强化学习·具身智能·人形机器人