VLMs训练详细流程
本文字数:631 字 | 阅读时长 ≈ 2 min

VLMs训练详细流程

本文字数:631 字 | 阅读时长 ≈ 2 min

图片处理

pad

def expand2square(pil_img, background_color=(127, 127, 127)):
    """最简单的模式:将图片填充为正方形"""
    # 输入: 1024x768 的图片
    # 输出: 1024x1024 的正方形图片
    
    # 步骤:
    # 1. 创建 1024x1024 的灰色背景画布
    # 2. 在画布中央粘贴原图
    # 3. 上下各填充 128 像素的灰色区域 ((1024-768)/2 = 128)
    
    结果示意图:
    +----------------------+
    |     灰色填充        |  128px
    |----------------------|
    |                      |
    |       原图          |  768px
    |                      |
    |----------------------|
    |     灰色填充        |  128px
    +----------------------+
        1024px

highres

def process_highres_image(image, processor, grid_pinpoints="448,672,896"):
    """高分辨率模式:生成一个缩略图和多个高清局部图"""
    # 输入: 1024x768 的图片
    # 输出: [缩略图(224x224)] + [16个patch(224x224)]
    
    步骤:
    # 1. 将图片填充为正方形 (1024x1024)
    # 2. 生成一张224x224的缩略图
    # 3. 将1024x1024的图片分割为16个224x224的patch
    
    结果示意图:
    缩略图:     分割后的patch:
    +----+      +---+---+---+---+
    |    |      | 1 | 2 | 3 | 4 |
    |缩略|      +---+---+---+---+
    |图  |      | 5 | 6 | 7 | 8 |
    +----+      +---+---+---+---+
                | 9 |10 |11 |12 |
                +---+---+---+---+
                |13 |14 |15 |16 |
                +---+---+---+---+

anyres

def process_anyres_image(image, processor, grid_pinpoints="[(896,672), (1024,768)]"):
    """任意分辨率模式:保持原始比例"""
    # 输入: 1024x768 的图片
    # 输出: [缩略图(224x224)] + [12个patch(224x224)]
    
    步骤:
    # 1. 选择最佳目标分辨率 (1024x768)
    # 2. 生成一张224x224的缩略图
    # 3. 将图片分割成3x4网格的patch
    
    结果示意图:
    缩略图:     分割后的patch (3行4列):
    +----+      +---+---+---+---+
    |    |      | 1 | 2 | 3 | 4 |
    |缩略|      +---+---+---+---+
    |图  |      | 5 | 6 | 7 | 8 |
    +----+      +---+---+---+---+
                | 9 |10 |11 |12 |
                +---+---+---+---+

crop_split

def process_highres_image_crop_split(image, data_args):
    """裁剪分割模式:先裁剪中心,再分割"""
    # 输入: 1024x768 的图片
    # 假设 crop_resolution=768, split_resolution=256
    
    步骤:
    # 1. 从中心裁剪出768x768的正方形
    # 2. 将正方形分割为9个256x256的patch
    
    结果示意图:
    原图裁剪:              分割为patch:
    +----------------+     +---+---+---+
    |  裁掉的部分   |     | 1 | 2 | 3 |
    |+------------+ |     +---+---+---+
    || 保留的中心 | |     | 4 | 5 | 6 |
    || 768x768部分| |     +---+---+---+
    |+------------+ |     | 7 | 8 | 9 |
    +----------------+     +---+---+---+

关键区别:

  1. pad: 保留全部内容,但添加填充
  2. highres: 保留全部内容,同时提供整体和局部细节
  3. anyres: 保持原始比例,适应不同尺寸
  4. crop_split: 只保留中心区域,但提供更多细节

使用场景:

  1. pad: 当模型要求正方形输入,且不能丢失图片边缘信息
  2. highres: 需要同时分析图片整体和局部细节时
  3. anyres: 处理各种不同尺寸的图片,且需要保持原始比例
  4. crop_split: 主要关注图片中心区域的细节时

这些处理方法的选择通常取决于:

  1. 下游任务的需求(是否需要细节/全局信息)
  2. 模型的输入要求
  3. 计算资源的限制
  4. 是否可以接受信息丢失