| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- """
- 生成每个特征维度的 mapping.json 文件
- 记录特征与制作表的对应关系
- """
- import os
- import json
- WORKDIR = os.path.dirname(os.path.abspath(__file__))
- OUTPUT_DIR = os.path.join(WORKDIR, 'output', 'features')
- # 读取所有制作表数据
- all_data = {}
- for i in range(1, 10):
- with open(os.path.join(WORKDIR, 'input', f'写生油画__img_{i}_合并评分.json'), 'r', encoding='utf-8') as f:
- all_data[f'img_{i}'] = json.load(f)
- # 读取亮点数据
- with open(os.path.join(WORKDIR, 'input', '写生油画__post_highlight_简化版.json'), 'r', encoding='utf-8') as f:
- highlights = json.load(f)
- # ============================================================
- # 1. OpenPose 骨架 - mapping
- # ============================================================
- openpose_mapping = {
- "dimension": "openpose_skeleton",
- "description": "人体姿态骨架图,使用OpenPose提取关节点坐标,捕捉人物的站姿、跪姿、侧身等姿态",
- "tool": "controlnet_aux.OpenposeDetector (lllyasviel/ControlNet)",
- "format": "PNG (黑底彩色骨架图)",
- "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_6 (引导视线的构图技巧)"],
- "mappings": []
- }
- # 每张图片的骨架对应关系
- pose_info = {
- "img_1": {"段落": "段落1.1", "段落名称": "人物", "姿态描述": "侧身背对镜头,站立作画,右手持笔,左手持调色板"},
- "img_2": {"段落": "段落2.1", "段落名称": "人物", "姿态描述": "背对镜头,站立作画,逆光轮廓"},
- "img_3": {"段落": "段落3.1", "段落名称": "人物", "姿态描述": "背对镜头,跪坐在草地上作画"},
- "img_4": {"段落": "段落4.1", "段落名称": "人物", "姿态描述": "侧身面对镜头,站立,右手持笔上举,左手持调色板"},
- "img_5": {"段落": "段落5.1", "段落名称": "人物", "姿态描述": "近景,上半身,左手持调色板特写"},
- "img_6": {"段落": "段落6.1", "段落名称": "人物", "姿态描述": "侧身背对,过肩视角,右手持笔作画"},
- "img_7": {"段落": "段落7.1", "段落名称": "人物", "姿态描述": "侧脸特写,双手捧玫瑰花,闭眼闻花"},
- "img_8": {"段落": "段落8.1", "段落名称": "人物", "姿态描述": "侧身面对镜头,站立作画"},
- "img_9": {"段落": "段落9.1", "段落名称": "人物", "姿态描述": "背对镜头,远景,全身站立作画"},
- }
- for img_name, info in pose_info.items():
- # 找到对应段落的评分
- img_data = all_data[img_name][0]
-
- # 找到人物段落的形式评分
- person_score = 0
- for sub in img_data.get('子段落', []):
- if '人物' in sub.get('名称', ''):
- person_score = sub.get('形式', {}).get('评分详情', {}).get('combined_score', 0)
- break
-
- openpose_mapping["mappings"].append({
- "图片": img_name,
- "特征文件": f"{img_name}.png",
- "段落ID": info["段落"],
- "段落名称": info["段落名称"],
- "维度": "实质",
- "特征路径": f"子段落.{info['段落']}.形式",
- "具体特征": "拍摄角度 / 构图",
- "姿态描述": info["姿态描述"],
- "亮点关联": "cluster_1 (优雅的白裙写生少女) / cluster_6 (引导视线的构图技巧)",
- "参考评分": person_score
- })
- with open(os.path.join(OUTPUT_DIR, 'openpose_skeleton', 'mapping.json'), 'w', encoding='utf-8') as f:
- json.dump(openpose_mapping, f, indent=2, ensure_ascii=False)
- print("openpose_skeleton/mapping.json 生成完成")
- # ============================================================
- # 2. Depth Map - mapping
- # ============================================================
- depth_mapping = {
- "dimension": "depth_map",
- "description": "深度图,使用MiDaS提取场景空间深度信息,捕捉前景人物/画架与背景草地/树木的层次关系",
- "tool": "controlnet_aux.MidasDetector (lllyasviel/Annotators)",
- "format": "PNG (灰度深度图,亮=近,暗=远)",
- "highlight_clusters": ["cluster_4 (唯美梦幻的光影与景深)", "cluster_3 (清新雅致的白绿配色)"],
- "mappings": []
- }
- depth_info = {
- "img_1": {"段落": "段落1", "段落名称": "户外绘画场景", "景深特征": "中景,人物/画架在前景,绿色树木在远景,轻微虚化"},
- "img_2": {"段落": "段落2", "段落名称": "户外绘画场景", "景深特征": "逆光,背景强烈虚化,人物轮廓光,梦幻散景"},
- "img_3": {"段落": "段落3", "段落名称": "户外绘画场景", "景深特征": "跪姿,人物低于正常视角,背景建筑远景"},
- "img_4": {"段落": "段落4", "段落名称": "户外绘画场景", "景深特征": "侧前方视角,人物与画架同一景深平面"},
- "img_5": {"段落": "段落5", "段落名称": "户外绘画场景", "景深特征": "近景特写,调色板在最近景,背景极度虚化"},
- "img_6": {"段落": "段落6", "段落名称": "户外绘画场景", "景深特征": "特写,极浅景深,背景完全虚化"},
- "img_7": {"段落": "段落7", "段落名称": "人物与玫瑰花", "景深特征": "侧脸特写,玫瑰花在最近景,背景草地虚化"},
- "img_8": {"段落": "段落8", "段落名称": "户外绘画场景", "景深特征": "中景,人物与画架在前景,背景树木虚化"},
- "img_9": {"段落": "段落9", "段落名称": "户外绘画场景", "景深特征": "远景,人物较小,背景建筑和树木可见"},
- }
- for img_name, info in depth_info.items():
- depth_mapping["mappings"].append({
- "图片": img_name,
- "特征文件": f"{img_name}.png",
- "段落ID": info["段落"],
- "段落名称": info["段落名称"],
- "维度": "形式",
- "特征路径": f"形式.清晰度 / 段落关系.段内关系.景深",
- "具体特征": "清晰度 / 景深",
- "景深描述": info["景深特征"],
- "亮点关联": "cluster_4 (唯美梦幻的光影与景深)",
- "参考评分": all_data[img_name][0].get('形式', {}).get('清晰度', {}).get('评分详情', {}).get('combined_score', 0)
- })
- with open(os.path.join(OUTPUT_DIR, 'depth_map', 'mapping.json'), 'w', encoding='utf-8') as f:
- json.dump(depth_mapping, f, indent=2, ensure_ascii=False)
- print("depth_map/mapping.json 生成完成")
- # ============================================================
- # 3. Lineart Edge - mapping
- # ============================================================
- lineart_mapping = {
- "dimension": "lineart_edge",
- "description": "线稿/边缘图,使用Lineart检测器提取图像轮廓线条,捕捉人物轮廓、服装褶皱、画架结构等",
- "tool": "controlnet_aux.LineartDetector (lllyasviel/Annotators)",
- "format": "PNG (白底黑线线稿图)",
- "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_2_props (构建叙事的写生道具)"],
- "mappings": []
- }
- lineart_info = {
- "img_1": {
- "段落": "段落1.1.2", "段落名称": "身体", "维度": "形式",
- "特征": "服装款式", "描述": "白色长裙轮廓线,袖子宽松,腰部收紧,裙摆飘逸,背部系带细节"
- },
- "img_2": {
- "段落": "段落2.1.2", "段落名称": "身体", "维度": "形式",
- "特征": "服装款式", "描述": "白色长裙轮廓,V字露背设计,A字裙摆,逆光轮廓光"
- },
- "img_3": {
- "段落": "段落3.1.2", "段落名称": "身体", "维度": "形式",
- "特征": "服装款式", "描述": "跪坐姿态下白裙轮廓,裙摆自然垂坠,背部V字系带"
- },
- "img_4": {
- "段落": "段落4.2", "段落名称": "画架", "维度": "形式",
- "特征": "构图", "描述": "画架三脚架结构线条,画布矩形轮廓,人物与画架的空间线条关系"
- },
- "img_5": {
- "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
- "特征": "颜色", "描述": "调色板轮廓,颜料堆积纹理线条,手部握持姿态"
- },
- "img_6": {
- "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
- "特征": "笔触", "描述": "画布上油画笔触线条,颜料堆叠纹理,画框轮廓"
- },
- "img_7": {
- "段落": "段落7.2.1", "段落名称": "花朵", "维度": "实质",
- "特征": "清晰度", "描述": "玫瑰花瓣层叠轮廓,花瓣边缘线条,茎叶结构"
- },
- "img_8": {
- "段落": "段落8.1.2", "段落名称": "身体", "维度": "形式",
- "特征": "服装款式", "描述": "白色长裙轮廓,侧身姿态线条,手持画笔动作"
- },
- "img_9": {
- "段落": "段落9.1.2", "段落名称": "身体", "维度": "形式",
- "特征": "服装款式", "描述": "远景全身白裙轮廓,露背设计,裙摆及地"
- },
- }
- for img_name, info in lineart_info.items():
- lineart_mapping["mappings"].append({
- "图片": img_name,
- "特征文件": f"{img_name}.png",
- "段落ID": info["段落"],
- "段落名称": info["段落名称"],
- "维度": info["维度"],
- "特征路径": f"子段落.{info['段落']}.形式.{info['特征']}",
- "具体特征": info["特征"],
- "线稿描述": info["描述"],
- "亮点关联": "cluster_1 (优雅的白裙写生少女) / cluster_2_props (写生道具)"
- })
- with open(os.path.join(OUTPUT_DIR, 'lineart_edge', 'mapping.json'), 'w', encoding='utf-8') as f:
- json.dump(lineart_mapping, f, indent=2, ensure_ascii=False)
- print("lineart_edge/mapping.json 生成完成")
- # ============================================================
- # 4. Color Palette - mapping
- # ============================================================
- color_palette_mapping = {
- "dimension": "color_palette",
- "description": "主色调调色板,使用ColorThief提取图片的8个主要颜色,捕捉白绿配色、调色板颜料色彩等",
- "tool": "colorthief (Python库)",
- "format": "PNG (色块可视化) + JSON (颜色数值)",
- "highlight_clusters": ["cluster_3 (清新雅致的白绿配色)", "cluster_2_texture (斑斓厚重的油画颜料)"],
- "mappings": []
- }
- palette_info = {
- "img_1": {
- "段落": "段落1", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "色彩饱和度", "描述": "主色:纯白(白裙)、草绿(背景)、深棕(调色板)、多彩颜料色"
- },
- "img_2": {
- "段落": "段落2", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "色彩饱和度", "描述": "逆光色调:暖黄光晕、白色、绿色,整体偏暖"
- },
- "img_3": {
- "段落": "段落3", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "色彩饱和度", "描述": "白绿配色,远景建筑灰色,整体清新"
- },
- "img_4": {
- "段落": "段落4", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "色彩饱和度", "描述": "明亮自然光,白裙纯白,绿色鲜艳,调色板多彩"
- },
- "img_5": {
- "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
- "特征": "颜色", "描述": "调色板颜料色:深绿、浅绿、蓝、红、黄、白、紫、黑等10+种颜色"
- },
- "img_6": {
- "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
- "特征": "色彩", "描述": "画布油画色:绿色、蓝色为主,夹杂白、黄、紫、棕,颜料堆叠"
- },
- "img_7": {
- "段落": "段落7", "段落名称": "人物与玫瑰花", "维度": "形式",
- "特征": "色彩饱和度", "描述": "白玫瑰纯白、肤色米白、绿色背景,整体清新淡雅"
- },
- "img_8": {
- "段落": "段落8", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "色彩饱和度", "描述": "白绿配色,光线均匀,整体明亮清新"
- },
- "img_9": {
- "段落": "段落9", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "色彩饱和度", "描述": "远景色调,绿色鲜艳,白裙洁净,远处建筑浅灰"
- },
- }
- for img_name, info in palette_info.items():
- color_palette_mapping["mappings"].append({
- "图片": img_name,
- "特征文件_PNG": f"{img_name}.png",
- "特征文件_JSON": f"{img_name}.json",
- "段落ID": info["段落"],
- "段落名称": info["段落名称"],
- "维度": info["维度"],
- "特征路径": f"形式.{info['特征']}",
- "具体特征": info["特征"],
- "色彩描述": info["描述"],
- "亮点关联": "cluster_3 (清新雅致的白绿配色) / cluster_2_texture (斑斓厚重的油画颜料)"
- })
- with open(os.path.join(OUTPUT_DIR, 'color_palette', 'mapping.json'), 'w', encoding='utf-8') as f:
- json.dump(color_palette_mapping, f, indent=2, ensure_ascii=False)
- print("color_palette/mapping.json 生成完成")
- # ============================================================
- # 5. Bokeh Mask - mapping
- # ============================================================
- bokeh_mapping = {
- "dimension": "bokeh_mask",
- "description": "景深虚化遮罩,基于深度图和清晰度分析推导,捕捉大光圈浅景深效果,区分清晰主体与虚化背景",
- "tool": "自定义算法 (MiDaS深度图 + 拉普拉斯清晰度)",
- "format": "PNG (灰度遮罩,亮=清晰主体,暗=虚化背景)",
- "highlight_clusters": ["cluster_4 (唯美梦幻的光影与景深)"],
- "mappings": []
- }
- bokeh_info = {
- "img_1": {"段落": "段落1.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木轻微虚化,人物/画架清晰"},
- "img_2": {"段落": "段落2.3", "段落名称": "背景", "维度": "形式", "特征": "光照", "描述": "逆光强烈虚化,背景散景(Bokeh)效果明显,光斑圆形"},
- "img_3": {"段落": "段落3.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景建筑和树木虚化,人物清晰"},
- "img_4": {"段落": "段落4.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木虚化,人物与画架清晰"},
- "img_5": {"段落": "段落5.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景极度虚化,调色板和手部清晰"},
- "img_6": {"段落": "段落6.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景完全虚化,极浅景深,人物和画布清晰"},
- "img_7": {"段落": "段落7.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景草地虚化,人物侧脸和玫瑰花清晰"},
- "img_8": {"段落": "段落8.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "背景树木虚化,人物和画架清晰"},
- "img_9": {"段落": "段落9.3", "段落名称": "背景", "维度": "形式", "特征": "清晰度", "描述": "远景,整体清晰度较高,背景建筑可见"},
- }
- for img_name, info in bokeh_info.items():
- bokeh_mapping["mappings"].append({
- "图片": img_name,
- "特征文件": f"{img_name}.png",
- "段落ID": info["段落"],
- "段落名称": info["段落名称"],
- "维度": info["维度"],
- "特征路径": f"子段落.{info['段落']}.形式.{info['特征']}",
- "具体特征": info["特征"],
- "景深描述": info["描述"],
- "亮点关联": "cluster_4 (唯美梦幻的光影与景深)"
- })
- with open(os.path.join(OUTPUT_DIR, 'bokeh_mask', 'mapping.json'), 'w', encoding='utf-8') as f:
- json.dump(bokeh_mapping, f, indent=2, ensure_ascii=False)
- print("bokeh_mask/mapping.json 生成完成")
- # ============================================================
- # 6. Semantic Segmentation - mapping
- # ============================================================
- seg_mapping = {
- "dimension": "semantic_segmentation",
- "description": "语义分割图,基于颜色聚类将图像分割为主要语义区域:白裙人物/绿色背景/调色板/画架/画布/皮肤",
- "tool": "sklearn.KMeans + OpenCV (LAB颜色空间聚类)",
- "format": "PNG (彩色分割图,不同颜色代表不同语义区域)",
- "highlight_clusters": ["cluster_1 (优雅的白裙写生少女)", "cluster_3 (清新雅致的白绿配色)", "cluster_5 (虚实呼应的画中画结构)"],
- "mappings": []
- }
- seg_info = {
- "img_1": {
- "段落": "段落1", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "构图", "描述": "分割区域:白裙人物(右侧60%)、绿色背景(左上40%)、画架(左侧)、画布(中央)"
- },
- "img_2": {
- "段落": "段落2", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "构图", "描述": "分割区域:人物背影(中央)、逆光背景(上方亮区)、绿色草地(下方)"
- },
- "img_3": {
- "段落": "段落3", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "构图", "描述": "分割区域:跪坐人物(右侧)、画架(中央)、草地(前景)、树木+建筑(背景)"
- },
- "img_4": {
- "段落": "段落4", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "构图", "描述": "分割区域:侧身人物(右侧)、空白画布(左侧)、绿色背景(上方)"
- },
- "img_5": {
- "段落": "段落5.1.3", "段落名称": "调色板", "维度": "实质",
- "特征": "颜色", "描述": "分割区域:白色服装(大面积)、多彩调色板(中央)、绿色背景(下方)"
- },
- "img_6": {
- "段落": "段落6.2.1", "段落名称": "画布", "维度": "实质",
- "特征": "内容主题", "描述": "分割区域:人物背部(右侧)、油画画布(中央左侧)、虚化绿色背景"
- },
- "img_7": {
- "段落": "段落7", "段落名称": "人物与玫瑰花", "维度": "实质",
- "特征": "花朵颜色", "描述": "分割区域:人物侧脸(右侧)、白色玫瑰(中央)、绿色虚化背景"
- },
- "img_8": {
- "段落": "段落8", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "构图", "描述": "分割区域:侧身人物(右侧)、空白画布(左侧)、绿色背景(上方)"
- },
- "img_9": {
- "段落": "段落9", "段落名称": "户外绘画场景", "维度": "形式",
- "特征": "构图", "描述": "分割区域:远景人物(右侧小)、画架(右侧)、大面积草地(左侧)、树木+建筑(背景)"
- },
- }
- for img_name, info in seg_info.items():
- seg_mapping["mappings"].append({
- "图片": img_name,
- "特征文件": f"{img_name}.png",
- "段落ID": info["段落"],
- "段落名称": info["段落名称"],
- "维度": info["维度"],
- "特征路径": f"形式.{info['特征']}",
- "具体特征": info["特征"],
- "分割描述": info["描述"],
- "亮点关联": "cluster_1 / cluster_3 / cluster_5"
- })
- with open(os.path.join(OUTPUT_DIR, 'semantic_segmentation', 'mapping.json'), 'w', encoding='utf-8') as f:
- json.dump(seg_mapping, f, indent=2, ensure_ascii=False)
- print("semantic_segmentation/mapping.json 生成完成")
- # ============================================================
- # 7. Color Distribution - mapping
- # ============================================================
- dist_mapping = {
- "dimension": "color_distribution",
- "description": "HSV色彩分布向量,包含色相/饱和度/明度直方图及统计特征,量化白绿配色比例、整体亮度等",
- "tool": "OpenCV calcHist (HSV颜色空间)",
- "format": "JSON (数值向量) + PNG (色相直方图可视化)",
- "highlight_clusters": ["cluster_3 (清新雅致的白绿配色)", "cluster_4 (唯美梦幻的光影与景深)"],
- "mappings": []
- }
- dist_info = {
- "img_1": {"段落": "段落1", "特征": "色彩饱和度", "描述": "白色比例高(白裙),绿色比例高(背景),中等亮度"},
- "img_2": {"段落": "段落2", "特征": "光照", "描述": "逆光高亮,整体亮度偏高,暖黄色调"},
- "img_3": {"段落": "段落3", "特征": "色彩饱和度", "描述": "白绿配色,整体清新,远景建筑降低饱和度"},
- "img_4": {"段落": "段落4", "特征": "色彩饱和度", "描述": "明亮自然光,高饱和度绿色,白色纯净"},
- "img_5": {"段落": "段落5.1.3", "特征": "颜色种类", "描述": "调色板多色,绿色主导,白色服装大面积"},
- "img_6": {"段落": "段落6.2.1", "特征": "色彩", "描述": "画布绿蓝色调,背景虚化绿色,整体饱和度高"},
- "img_7": {"段落": "段落7", "特征": "色彩饱和度", "描述": "白色主导(玫瑰+服装),绿色背景,整体淡雅"},
- "img_8": {"段落": "段落8", "特征": "色彩饱和度", "描述": "白绿配色,光线均匀,整体明亮"},
- "img_9": {"段落": "段落9", "特征": "色彩饱和度", "描述": "远景色调,绿色鲜艳,白色洁净,整体清新"},
- }
- for img_name, info in dist_info.items():
- dist_mapping["mappings"].append({
- "图片": img_name,
- "特征文件_JSON": f"{img_name}.json",
- "特征文件_PNG": f"{img_name}.png",
- "段落ID": info["段落"],
- "段落名称": "户外绘画场景",
- "维度": "形式",
- "特征路径": f"形式.{info['特征']}",
- "具体特征": info["特征"],
- "色彩描述": info["描述"],
- "亮点关联": "cluster_3 (清新雅致的白绿配色)"
- })
- with open(os.path.join(OUTPUT_DIR, 'color_distribution', 'mapping.json'), 'w', encoding='utf-8') as f:
- json.dump(dist_mapping, f, indent=2, ensure_ascii=False)
- print("color_distribution/mapping.json 生成完成")
- print("\n=== 所有 mapping.json 生成完成 ===")
|