【大模型】使用llamafactory 训练 qwen2.5-VL 的目标检测任务
前言
截止到目前,目标检测的功能还是yolo模型落地性更强。但大模型也已经全面开花,所以也尝试下使用大模型来完成目标检测的训练,看看其效果如何,看看它在目标检测上有怎样的优势。
本次选用qwen2.5-VL,一开始使用github上阅读性强的工程训练,总觉得差些意思。
于是决定自己手搓个大模型训练推理工程,emm…,预测效果也是差强人意。
兜兜转转还是使用个高star的工程,先跑通得到想要的效果。后面再阅读核心代码掌握大模型训练过程吧
一 llama factory的部署
【大模型】LLaMA-Factory的环境配置、微调模型与测试 的第二章节,已经介绍了工程安装步骤,整个过程比较流畅。(其余章节介绍了在文本上的大模型微调的过程)
二 llama factory的配置文件介绍
github上给出的训练命令:
以此为切入点,来看看训练自己模型时需要关注的内容,这里先陈列出examples/qwen2_5vl_lora_sft.yamldata/mllm_demo.jsonl2.1 配置文件 【qwen2_5vl_lora_sft.yaml】
该文件中配置了大模型训练过程中所有的参数,包括:model 模型的选择与配置、method 训练方式、dataset 数据集、output 训练时输出信息、train 训练参数。
现阶段要跑通工程需要关注的有:model、datasetmodel 模型的设置
【examples/qwen2_5vl_lora_sft.yaml】 中的model_name_or_path设置为自己微调的大模型名称,工程会自动从huggingface中拉取模型。但这种方式不建议,网络限制和不稳定等原因,会让下载过程很不稳定。设置为已经下载到本地大模型的绝对路径。该方式需要提前将大模型下载下来对应文件【data/dataset_info.json】的 mllm_demo,内容如下:2.2 数据集配置文件 【data/mllm_demo.json】&【data/dataset_info.json】data/mllm_demo.json最小单元内容如下:
对应data/dataset_info.json内容如下:
这两个文件中,设置的变量命名是有对应性的。对应效果如下图所示:图片上半部分为dataset_info.json 的内容,下半部分为 mllm_demo.json的内容。相同颜色的框内的变量命名一定是要一致的。
dataset数据集的关联 &&【data/dataset_info.json】
【examples/qwen2_5vl_lora_sft.yaml】 中的 dataset: mllm_demo
...{"mllm_demo":{"file_name":"mllm_demo.json", # 数据文件 "formatting":"sharegpt", # 数据格式 "columns":{"messages":"messages","images":"images"},"tags":{"role_tag":"role","content_tag":"content","user_tag":"user","assistant_tag":"assistant"}},}三 使用llamafacotry训练目标检测3.1 qwen2.5-VL-3B 的下载
使用modelscope 下载qwen2.5-VL-3B模型首先确定虚拟环境中安装了modelscope
本人尝试用的下载方式为图中圈出的两种3.2 训练数据的格式转换
已有的目标检测框保存的格式为labelme的json格式。现在需要将该种标签,转换成与mllm_demo一致的数据格式。
一般的数据处理,仅在生成训练时需要的jsonl 时,使用官方提供的smart_resize 获取图片resize后应该有的尺寸,使用该尺寸处理检测框,无需resize图片。图片的resize操作,放在工程的图像预处理中。
但这里为了尽可能减少出错的可能性,同时处理了图片和标签,将训练的图片和标签一开始就对齐,保存到新的路径下。
【图像与边界框的协同处理】Qwen2.5-VL使用Vision Transformer架构需要将图片分割成28×28的patch输入尺寸必须是28的倍数固定尺寸便于批处理避免内存溢出(通过max_pixels限制)避免太小影响效果(通过min_pixels保证)保持空间关系相对位置不变:如果原始框在图片中心,缩放后仍在中心相对大小不变:框与图片的比例关系保持不变注意:由于需要同时满足"能被28整除"和"保持宽高比"这两个要求,在实际操作中存在内在矛盾。当原始图片尺寸不是28的倍数时,完美保持宽高比在数学上是不可能的。因此,smart_resize函数采取了一种近似保持的策略:
1. 分别调整:将高度和宽度分别四舍五入到最接近的28的倍数
2. 轻微形变:接受由此产生的轻微纵横比变化(通常在1-3%范围内)
3. 权衡选择:相较于填充法(增加无效像素)或裁剪法(丢失图像信息),这种轻微形变是更好的权衡这种处理在保持图像主要内容不变的同时,确保了模型输入要求关键注意事项a 坐标系统:始终是绝对像素坐标,不是相对坐标(百分比)b 舍入处理:使用round()四舍五入,可能引入1像素误差c 边界保护:防止坐标超出图像边界d 保持有效性:确保转换后仍然是有效的矩形(x2≥x1, y2≥y1)
为了工程的可观整洁,在根目录创建文件夹【LL_own】。
创建数据处理脚本【LL_own/data_deal.py】,在实验阶段,尽可能的保持问题可控性,我将图片resize到固定的、模型可接受的尺寸,同时将标签同等映射处理。具体实现如下:
生成文件【LL_own/qwen_det2/train.jsonl】【LL_own/qwen_det2/resized_imgs/*】jsonl 文件可用于模型训练。
【生成的数据结束后,进行可视化】代码如下3.3 配置文件的修改
如第二章节介绍,
我们需要修改两个文件内的配置。3.4 开启微调训练
【data/dataset_info.json】
...,"train_det":{"file_name":"/home/LL/workfile_2026/12-QwenVL/LLaMA-Factory/LL_own/qwen_det2/train.jsonl","formatting":"sharegpt","columns":{"messages":"messages","images":"images"},"tags":{"role_tag":"role","content_tag":"content","user_tag":"user","assistant_tag":"assistant"}}}【examples/train_lora/qwen2_5vl_lora_sft.yaml】
复制文件:
cp examples/train_lora/qwen2_5vl_lora_sft.yaml examples/train_lora/qwen2_5vl_own.yaml 修改文件:
### modelmodel_name_or_path: /home/LL/llm_models/Qwen2.5-VL/Qwen/Qwen2___5-VL-3B-Instruct image_max_pixels:262144video_max_pixels:16384trust_remote_code:true### methodstage: sft do_train:truefinetuning_type: lora lora_rank:8lora_target: all ### datasetdataset: train_det template: qwen2_vl cutoff_len:2048max_samples:20000# 注意:该参数会限制训练样本数量overwrite_cache:truepreprocessing_num_workers:16dataloader_num_workers:4### outputoutput_dir: ./LL_own/save/train_detect_3B # 注意:根据自己实际情况修改logging_steps:10save_steps:500plot_loss:trueoverwrite_output_dir:truesave_only_model:falsereport_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]### trainper_device_train_batch_size:8# 注意:符合自己的显存大小gradient_accumulation_steps:8learning_rate:1.0e-5# 注意:学习率根据自己实际情况修改num_train_epochs:6.0lr_scheduler_type: cosine warmup_ratio:0.1bf16:trueddp_timeout:180000000resume_from_checkpoint:null### eval# val_size: 0.1# per_device_eval_batch_size: 1# eval_strategy: steps# eval_steps: 500纵横比不变:不会发生形变
计算效率考虑
# 约束2: 像素总数在指定范围内 min_pixels =56×56=3,136 像素 max_pixels =14×14×4×1280=1,003,520 像素 # 14×14是patch网格,4是某种设计参数,1280是模型维度 检查像素数:644×420=270,480 像素,在 3136 和 1003520之间 最终尺寸:644×420 像素 模型输入要求
# 约束1: 能被factor整除。调整后的尺寸必须是28的倍数# 这是因为Vision Transformer使用28×28的patch# new_height % 28 == 0、new_width % 28 == 0round(640/28)×28=23×28=644(宽度) round(428/28)×28=15×28=420(高度) 方式二:
from modelscope.hub.snapshot_download import snapshot_download # 定义模型ID和本地目标路径 model_id ='qwen/Qwen2.5-VL-3B-Instruct' local_dir ='~/llm_models/Qwen2.5-VL'# 下载模型 model_dir = snapshot_download(model_id, cache_dir=local_dir, revision='master')print(f"模型已下载至: {model_dir}")方式一:
modelscope download --model Qwen/Qwen2.5-VL-3B-Instruct --local_dir [本地下载路径]modelscope官网 搜索qwen2.5-VL,最终找到界面如下。

四 训练好的模型的推理
训练结束后,得到lora模型,为了方便后续的使用,所以实现了脱离llamafactory的推理。图片的resize送进大模型推理预测结果解析检测框的反向映射
可得到正确的检测结果。
五 其他
模型合并、合并后的推理,都比较简单,就不记录了。