一、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文件,截取部分如下所示:
