一、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 ETdef 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_listdef 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 + extif img_path in all_img_paths:return img_pathreturn Nonedef 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:continuetree = ET.parse(xml_abs)root = tree.getroot()objs = []for obj in root.findall('object'):name = obj.find('name').textbbox = 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文件,截取部分如下所示: