feature_extraction_report.md 14 KB

写生油画系列 - 多模态特征提取研究报告

生成时间:2025年
数据集:写生油画(9张图片,1080×1439 RGB)
主题:户外草地白裙写生少女


一、任务概述

1.1 核心目标

从9张"户外白裙写生少女"图片中提取多模态特征,构建可逆特征空间,支持后续生成模型(Stable Diffusion + ControlNet)还原图片。

核心约束

  • ❌ 不能保存图片本身,只能保存提取的特征
  • ✅ 特征必须是生成模型友好的控制信号(非纯文字描述)
  • ✅ 特征需与制作表(合并评分JSON)对应到具体段落/实质/形式/特征

1.2 数据结构

输入

  • 9张图片:data/写生油画/images/img_1~img_9.jpg
  • 合并评分JSON:output/写生油画/final_score/20260302_012649_final/写生油画__img_N_合并评分.json
  • 亮点JSON:output/写生油画/post_highlight/20260302_012917_post_highlight/写生油画__post_highlight.json

输出

  • 特征文件:output/写生油画/features/<维度名>/img_N.png
  • 映射文件:output/写生油画/features/<维度名>/mapping.json
  • 总览文件:output/写生油画/features/overview_mapping.json

二、亮点聚类分析

从亮点JSON中提取的6个聚类:

聚类ID 主题 类型 涉及图片
cluster_1 优雅的白裙画者 实质 全部9张
cluster_2 充满艺术气息的写生道具 实质 img_1,4,5,6,7,8,9
cluster_3 清新自然的绿白配色 形式 img_1,4,5,7,8
cluster_4 虚实呼应的画中画结构 形式 img_1,2,3
cluster_5 唯美梦幻的光影氛围 形式 img_2,3,7
cluster_6 巧妙的摄影构图视角 形式 img_4,5,6,9

三、特征提取方案

3.1 特征维度总览

# 维度 工具 格式 对应聚类
1 openpose_skeleton OpenposeDetector PNG骨架图 cluster_1, cluster_6
2 depth_map MidasDetector PNG灰度深度图 cluster_4, cluster_5
3 lineart_edge LineartDetector PNG线稿图 cluster_1, cluster_2
4 color_palette ColorThief PNG色块+JSON cluster_3, cluster_2
5 bokeh_mask 自定义(MiDaS深度归一化) PNG灰度遮罩 cluster_4
6 semantic_segmentation sklearn KMeans(LAB) PNG彩色分割图 cluster_1,3,5
7 color_distribution OpenCV calcHist(HSV) JSON向量+PNG cluster_3, cluster_4

总计:9张图片 × 7维度 = 63个特征文件

3.2 各维度详细说明

维度1:OpenPose 骨架图 (openpose_skeleton)

工具controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)
格式:PNG RGB图像,黑色背景+彩色骨架线,分辨率1080×1439
生成模型用途:ControlNet OpenPose条件控制,精确控制人物姿态

对应亮点

  • cluster_1(优雅的白裙画者):骨架图直接编码人物站立/跪坐/侧身/背影等姿态,是还原"优雅姿态"的核心控制信号
  • cluster_6(巧妙的摄影构图视角):骨架位置反映人物在画面中的构图位置

关键形式特征对应

  • 人物姿态(评分0.80~0.95)→ 骨架关键点位置
  • 人物朝向(评分0.78~0.90)→ 骨架朝向方向
  • 人物动作(评分0.88~0.94)→ 手臂/手腕关键点

维度2:MiDaS 深度图 (depth_map)

工具controlnet_aux.MidasDetector (lllyasviel/Annotators)
格式:PNG灰度图像,亮=近,暗=远,分辨率1080×1439
生成模型用途:ControlNet Depth条件控制,控制场景空间层次

对应亮点

  • cluster_4(虚实呼应的画中画结构):深度图区分前景画架/人物与背景草地,支持"画中画"的空间层次还原
  • cluster_5(唯美梦幻的光影氛围):深度梯度反映景深程度,支持大光圈散景效果

关键形式特征对应

  • 画面清晰度(评分0.60~0.75)→ 深度梯度
  • 前后关系(评分0.78)→ 深度分层

维度3:Lineart 线稿图 (lineart_edge)

工具controlnet_aux.LineartDetector (lllyasviel/Annotators)
格式:PNG灰度图像(白线黑底),分辨率1080×1439
生成模型用途:ControlNet Lineart条件控制,控制服装褶皱和画架结构

对应亮点

  • cluster_1(优雅的白裙画者):白裙褶皱轮廓、发型线条是人物形象的核心线稿信息
  • cluster_2(充满艺术气息的写生道具):画架结构、调色板轮廓的精细线稿

关键形式特征对应

  • 服装款式(评分0.82~0.85)→ 裙摆褶皱线稿
  • 人物完整性(评分0.65)→ 全身轮廓线稿

维度4:色彩调色板 (color_palette)

工具colorthief.ColorThief
格式:PNG色块图(640×80) + JSON{dominant_color, palette, palette_hex}
生成模型用途:IP-Adapter颜色参考 / SD色彩条件控制

对应亮点

  • cluster_3(清新自然的绿白配色):调色板精确捕获白色和绿色的具体色值
  • cluster_2(充满艺术气息的写生道具):调色板上的油画颜料颜色

各图片主色调

图片 主色HEX 白色比例 绿色比例
img_1 #48623c 2.4% 62.8%
img_2 #8a9c68 23.9% 33.8%
img_3 #e2ebea 19.5% 42.1%
img_4 #707443 13.4% 30.7%
img_5 #315b36 28.7% 32.4%
img_6 #7d9194 5.1% 16.0%
img_7 #47603b 2.4% 41.9%
img_8 #ceccc9 7.1% 71.2%
img_9 #e4ebef 30.7% 36.5%

维度5:Bokeh 虚化遮罩 (bokeh_mask)

工具:自定义算法(MiDaS深度图归一化)
格式:PNG灰度图像(0=完全虚化,255=完全清晰),分辨率1080×1439
生成模型用途:后处理散景合成 / ControlNet Blur条件

对应亮点

  • cluster_4(虚实呼应的画中画结构):遮罩区分清晰的主体区域和虚化的背景区域,直接支持"虚实呼应"效果的还原

算法说明

  1. 读取MiDaS深度图(已在维度2中生成)
  2. 将深度值归一化为[0,1]作为清晰度权重
  3. 高斯平滑(σ=21)消除边缘噪声
  4. 输出为灰度PNG

维度6:语义分割图 (semantic_segmentation)

工具sklearn.cluster.KMeans(LAB色彩空间,k=6)
格式:PNG RGB彩色分割图,固定颜色编码
生成模型用途:ControlNet Segmentation条件控制

颜色编码

  • 🟤 白色 → 白裙/亮区
  • 🟢 绿色 → 草地/植被
  • 🟫 棕色 → 画架/木质结构
  • 🔵 天蓝 → 天空/远景
  • 🟡 肤色 → 人物皮肤
  • ⚫ 灰色 → 其他

对应亮点

  • cluster_1(优雅的白裙画者):白色区域精确定位白裙范围
  • cluster_3(清新自然的绿白配色):绿色/白色区域比例量化配色
  • cluster_5(唯美梦幻的光影氛围):分割图反映画布区域与现实场景的空间关系

维度7:HSV 色彩分布 (color_distribution)

工具OpenCV cv2.calcHist(HSV空间,H:18bins,S:8bins,V:8bins)
格式:PNG直方图可视化(1200×300) + JSON{hist_h, hist_s, hist_v, white_ratio, green_ratio, mean_brightness, mean_saturation}
生成模型用途:色彩条件控制向量 / 后处理色调调整参考

对应亮点

  • cluster_3(清新自然的绿白配色):white_ratio和green_ratio量化白绿配色比例
  • cluster_4(虚实呼应的画中画结构):mean_brightness反映整体光照水平

关键指标说明

  • white_ratio:S<30且V>200的像素比例(白色判定)
  • green_ratio:H∈[35,85]且S>40的像素比例(绿色判定)
  • mean_brightness:V通道均值/255(整体亮度)
  • mean_saturation:S通道均值/255(整体饱和度)

四、可逆特征空间设计

4.1 特征组合策略

对于每张图片,7个特征维度形成完整的控制信号组合:

图片还原 = ControlNet(
    openpose=骨架图,      # 控制人物姿态
    depth=深度图,          # 控制空间层次
    lineart=线稿图,        # 控制轮廓细节
    seg=分割图,            # 控制区域布局
    bokeh=虚化遮罩,        # 控制景深效果
) + IP-Adapter(
    color_palette=调色板,  # 控制整体色调
) + Prompt(
    hsv_stats=色彩分布     # 辅助色彩描述
)

4.2 聚类-特征对应矩阵

聚类 openpose depth lineart color_palette bokeh seg hsv
cluster_1(白裙画者) ✅主要 - ✅主要 - - ✅辅助 -
cluster_2(写生道具) - - ✅主要 ✅辅助 - - -
cluster_3(绿白配色) - - - ✅主要 - ✅辅助 ✅主要
cluster_4(画中画) - ✅主要 - - ✅主要 - ✅辅助
cluster_5(光影氛围) - ✅主要 - - - ✅辅助 -
cluster_6(构图视角) ✅主要 - - - - - -

4.3 特征可逆性分析

特征维度 可逆性 说明
openpose_skeleton ⭐⭐⭐⭐⭐ ControlNet OpenPose是最成熟的姿态控制方案
depth_map ⭐⭐⭐⭐ ControlNet Depth可精确控制空间层次
lineart_edge ⭐⭐⭐⭐⭐ ControlNet Lineart对轮廓还原度极高
color_palette ⭐⭐⭐⭐ IP-Adapter可有效迁移色调风格
bokeh_mask ⭐⭐⭐ 需后处理合成,依赖深度图质量
semantic_segmentation ⭐⭐⭐⭐ ControlNet Seg可控制区域布局
color_distribution ⭐⭐⭐ 辅助描述,需结合其他特征使用

五、文件结构

output/写生油画/features/
├── overview_mapping.json          # 总览映射(所有维度汇总)
├── openpose_skeleton/
│   ├── img_1.png ~ img_9.png     # 骨架图
│   └── mapping.json              # 维度映射
├── depth_map/
│   ├── img_1.png ~ img_9.png     # 深度图
│   └── mapping.json
├── lineart_edge/
│   ├── img_1.png ~ img_9.png     # 线稿图
│   └── mapping.json
├── color_palette/
│   ├── img_1.png ~ img_9.png     # 色块图
│   ├── img_1.json ~ img_9.json   # 色彩数据
│   └── mapping.json
├── bokeh_mask/
│   ├── img_1.png ~ img_9.png     # 虚化遮罩
│   └── mapping.json
├── semantic_segmentation/
│   ├── img_1.png ~ img_9.png     # 分割图
│   └── mapping.json
└── color_distribution/
    ├── img_1.png ~ img_9.png     # 直方图可视化
    ├── img_1.json ~ img_9.json   # 分布数据
    └── mapping.json

六、关键技术决策

  1. OpenPose 选择原因:人物姿态(站立/跪坐/侧身/背影)是cluster_1和cluster_6的核心,骨架图是生成模型最标准的姿态控制信号,评分最高的形式特征(人物姿态0.80~0.95)直接对应骨架关键点

  2. MiDaS深度图 选择原因:cluster_4明确提到"虚实呼应"的空间层次,cluster_5强调"唯美梦幻"的景深效果,深度图是ControlNet景深控制的标准输入

  3. Lineart 选择原因:白裙褶皱轮廓(服装款式评分0.82~0.85)、画架结构是cluster_1和cluster_2的核心视觉元素,线稿图保留了最精细的轮廓信息

  4. ColorThief调色板 选择原因:cluster_3(白绿配色)和cluster_2(调色板颜料)需要精确的颜色表示,ColorThief的主色提取算法对自然场景色彩最准确

  5. Bokeh Mask 选择原因:cluster_4专门强调"虚实呼应",需要独立的虚化区域遮罩来量化和还原散景效果,基于深度图生成保证了物理一致性

  6. 语义分割 选择原因:cluster_5(光影氛围)需要区分画布区域与现实场景区域,cluster_3需要量化白色/绿色区域比例,KMeans在LAB空间的聚类对颜色感知最准确

  7. HSV色彩分布 选择原因:量化白色/绿色比例(cluster_3的核心指标),提供可计算的色彩控制向量,white_ratio和green_ratio是cluster_3"清新自然的绿白配色"的直接量化


七、后续使用指南

7.1 读取特征文件

import json
from PIL import Image

# 读取总览映射
with open("output/写生油画/features/overview_mapping.json") as f:
    overview = json.load(f)

# 读取单张图片的所有特征
img_name = "img_1"
img_features = overview["image_overview"][img_name]["features"]

# 加载骨架图
skeleton = Image.open(img_features["openpose_skeleton"]["file"])
# 加载深度图
depth = Image.open(img_features["depth_map"]["file"])
# 读取色彩分布数据
hsv_data = img_features["color_distribution"]["json_data"]
white_ratio = hsv_data["white_ratio"]  # 白色比例
green_ratio = hsv_data["green_ratio"]  # 绿色比例

7.2 ControlNet 生成示例

# 使用多个ControlNet条件还原图片
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel

# 加载多个ControlNet
controlnets = [
    ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose"),
    ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-depth"),
    ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-lineart"),
]

# 条件图像
condition_images = [skeleton, depth, lineart]

# 生成
result = pipe(
    prompt="a girl in white dress painting outdoors in a green meadow, elegant pose, bokeh background",
    image=condition_images,
    controlnet_conditioning_scale=[0.8, 0.6, 0.7],
)

7.3 按聚类查询特征

# 查询 cluster_3(绿白配色)涉及的图片和对应特征
cluster_info = overview["cluster_overview"]["cluster_3"]
for img_name in cluster_info["图片列表"]:
    img_data = overview["image_overview"][img_name]
    hsv = img_data["hsv_summary"]
    print(f"{img_name}: 白={hsv['white_ratio']:.1%}, 绿={hsv['green_ratio']:.1%}")