生成时间:2025年
数据集:写生油画(9张图片,1080×1439 RGB)
主题:户外草地白裙写生少女
从9张"户外白裙写生少女"图片中提取多模态特征,构建可逆特征空间,支持后续生成模型(Stable Diffusion + ControlNet)还原图片。
核心约束:
输入:
data/写生油画/images/img_1~img_9.jpgoutput/写生油画/final_score/20260302_012649_final/写生油画__img_N_合并评分.jsonoutput/写生油画/post_highlight/20260302_012917_post_highlight/写生油画__post_highlight.json输出:
output/写生油画/features/<维度名>/img_N.pngoutput/写生油画/features/<维度名>/mapping.jsonoutput/写生油画/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 |
| # | 维度 | 工具 | 格式 | 对应聚类 |
|---|---|---|---|---|
| 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个特征文件
工具:controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)
格式:PNG RGB图像,黑色背景+彩色骨架线,分辨率1080×1439
生成模型用途:ControlNet OpenPose条件控制,精确控制人物姿态
对应亮点:
关键形式特征对应:
人物姿态(评分0.80~0.95)→ 骨架关键点位置人物朝向(评分0.78~0.90)→ 骨架朝向方向人物动作(评分0.88~0.94)→ 手臂/手腕关键点工具:controlnet_aux.MidasDetector (lllyasviel/Annotators)
格式:PNG灰度图像,亮=近,暗=远,分辨率1080×1439
生成模型用途:ControlNet Depth条件控制,控制场景空间层次
对应亮点:
关键形式特征对应:
画面清晰度(评分0.60~0.75)→ 深度梯度前后关系(评分0.78)→ 深度分层工具:controlnet_aux.LineartDetector (lllyasviel/Annotators)
格式:PNG灰度图像(白线黑底),分辨率1080×1439
生成模型用途:ControlNet Lineart条件控制,控制服装褶皱和画架结构
对应亮点:
关键形式特征对应:
服装款式(评分0.82~0.85)→ 裙摆褶皱线稿人物完整性(评分0.65)→ 全身轮廓线稿工具:colorthief.ColorThief
格式:PNG色块图(640×80) + JSON{dominant_color, palette, palette_hex}
生成模型用途:IP-Adapter颜色参考 / SD色彩条件控制
对应亮点:
各图片主色调:
| 图片 | 主色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% |
工具:自定义算法(MiDaS深度图归一化)
格式:PNG灰度图像(0=完全虚化,255=完全清晰),分辨率1080×1439
生成模型用途:后处理散景合成 / ControlNet Blur条件
对应亮点:
算法说明:
工具:sklearn.cluster.KMeans(LAB色彩空间,k=6)
格式:PNG RGB彩色分割图,固定颜色编码
生成模型用途:ControlNet Segmentation条件控制
颜色编码:
对应亮点:
工具: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}
生成模型用途:色彩条件控制向量 / 后处理色调调整参考
对应亮点:
关键指标说明:
white_ratio:S<30且V>200的像素比例(白色判定)green_ratio:H∈[35,85]且S>40的像素比例(绿色判定)mean_brightness:V通道均值/255(整体亮度)mean_saturation:S通道均值/255(整体饱和度)对于每张图片,7个特征维度形成完整的控制信号组合:
图片还原 = ControlNet(
openpose=骨架图, # 控制人物姿态
depth=深度图, # 控制空间层次
lineart=线稿图, # 控制轮廓细节
seg=分割图, # 控制区域布局
bokeh=虚化遮罩, # 控制景深效果
) + IP-Adapter(
color_palette=调色板, # 控制整体色调
) + Prompt(
hsv_stats=色彩分布 # 辅助色彩描述
)
| 聚类 | openpose | depth | lineart | color_palette | bokeh | seg | hsv |
|---|---|---|---|---|---|---|---|
| cluster_1(白裙画者) | ✅主要 | - | ✅主要 | - | - | ✅辅助 | - |
| cluster_2(写生道具) | - | - | ✅主要 | ✅辅助 | - | - | - |
| cluster_3(绿白配色) | - | - | - | ✅主要 | - | ✅辅助 | ✅主要 |
| cluster_4(画中画) | - | ✅主要 | - | - | ✅主要 | - | ✅辅助 |
| cluster_5(光影氛围) | - | ✅主要 | - | - | - | ✅辅助 | - |
| cluster_6(构图视角) | ✅主要 | - | - | - | - | - | - |
| 特征维度 | 可逆性 | 说明 |
|---|---|---|
| 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
OpenPose 选择原因:人物姿态(站立/跪坐/侧身/背影)是cluster_1和cluster_6的核心,骨架图是生成模型最标准的姿态控制信号,评分最高的形式特征(人物姿态0.80~0.95)直接对应骨架关键点
MiDaS深度图 选择原因:cluster_4明确提到"虚实呼应"的空间层次,cluster_5强调"唯美梦幻"的景深效果,深度图是ControlNet景深控制的标准输入
Lineart 选择原因:白裙褶皱轮廓(服装款式评分0.82~0.85)、画架结构是cluster_1和cluster_2的核心视觉元素,线稿图保留了最精细的轮廓信息
ColorThief调色板 选择原因:cluster_3(白绿配色)和cluster_2(调色板颜料)需要精确的颜色表示,ColorThief的主色提取算法对自然场景色彩最准确
Bokeh Mask 选择原因:cluster_4专门强调"虚实呼应",需要独立的虚化区域遮罩来量化和还原散景效果,基于深度图生成保证了物理一致性
语义分割 选择原因:cluster_5(光影氛围)需要区分画布区域与现实场景区域,cluster_3需要量化白色/绿色区域比例,KMeans在LAB空间的聚类对颜色感知最准确
HSV色彩分布 选择原因:量化白色/绿色比例(cluster_3的核心指标),提供可计算的色彩控制向量,white_ratio和green_ratio是cluster_3"清新自然的绿白配色"的直接量化
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"] # 绿色比例
# 使用多个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],
)
# 查询 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%}")