6 幅合成画、两组特征。按「用色与画风」排序,前三全是红的(红圆粗笔、红方粗笔、红圆细笔); 按「形状轮廓」排序,前三变成红圆粗笔、蓝圆粗笔、蓝方粗笔。两组前三只重合 1 / 3。
上一节在时间轴上找内容,这一节在静态图上换问法:你是想找「同一幅画」还是「同一种画风」? 这两个问题的答案不一样。
一、同一幅图,两种「像」
「像」这个词在图像检索里至少有两个意思:用色像和轮廓像。 用色像:都是红色调的,都偏粗笔重彩。这是风格层面的像。 轮廓像:都是圆的,构图相近。这是内容层面的像。 两个都要,就得有两组特征。Demo 用颜色均值加边缘密度抓前者,用 8 维边缘方向直方图抓后者。 结果很干脆:换一组特征,前三名几乎换了另一批,只重合 1 个。
二、为什么两组特征会分得这么开
颜色组只看整体色调,跟画的是什么完全无关。所以它把三幅红色的画排在一起,不管其中一幅是方是圆。 边缘方向组只看轮廓走向,跟颜色完全无关。所以它把三幅圆形的画排在一起,不管其中一幅是红是蓝。 两组特征各自「瞎」了一半,合起来才是完整的。这就是多特征检索的基本动机。 所以问题不是「哪组特征更好」,是「你要找什么」。目标变了,特征就得换。
三、真实画作检索比这难得多
Demo 的 6 幅画是我用正弦纹理加色块合成的,干净到不真实。 真实画作有三个麻烦:笔触是三维的(有高光有阴影)、 色调靠环境光(同一幅画不同拍照条件颜色差很多)、构图千变万化(圆和方这种分法根本不存在)。 所以真实系统用的是在大量画作上训出来的卷积特征,而且通常要训练集里包含同一位画家的多幅作品, 才能学到「这个人怎么画」。 这也解释了一个常见困惑:为什么用通用图像检索去搜画风,效果很差——通用特征学的是「照片里有什么」, 不是「这笔触是谁的」。
四、界面上的清单(我没有跑)
书里用 VGG 的多边形标注来勾画作里的主体区域。沙箱没有浏览器,没跑。 1. 把画作图片导入 VIA。 2. 建多边形属性,沿主体轮廓点一圈,闭合。 3. 给每条标注加一个风格标签(比如「浓彩」「线描」)。 4. 导出 JSON,把多边形区域裁出来当检索的输入。 5. 对裁出来的区域算特征、入库。 第 4 步容易被跳过:很多人直接拿整幅画算特征,结果背景、签名、画框全算进去了。 先把主体框出来再算,效果差别很明显。
五、动手 Demo:绘画检索:换个特征,检索就换了意思
造 6 幅 64×64 的合成画(3 种颜色 × 圆或方 × 粗细两种正弦纹理); 算两组特征——颜色均值 3 维加边缘密度 1 维,以及 8 维边缘方向直方图; 以「红圆粗笔」为查询,分别在两组特征下排前四,比前三的重合度。
col = a.reshape(-1, 3).mean(0) # 颜色均值
edge = float(np.abs(np.diff(a.mean(2), axis=1)).mean()) * 6.0
v = np.concatenate([col / np.linalg.norm(col), [edge]])
ang = (np.arctan2(gy, gx) + math.pi) / (2 * math.pi) # 梯度方向
hist[b] = mag[(ang >= b / 8.0) & (ang < (b + 1) / 8.0)].sum()
实跑输出:
--------------------------------------------------------------------
绘画检索:换个特征,检索就换了意思
--------------------------------------------------------------------
图库 6 幅(3 色 × 2 形状 × 2 种笔触)
特征 A 颜色均值 3 维 + 边缘密度 1 维(抓用色与画风)
特征 B 8 维边缘方向直方图(抓形状轮廓)
查询作品 红圆粗笔
按「用色与画风」排前 4:
名次 作品 余弦
-----------------------
1 红圆粗笔 1.0000
2 红方粗笔 0.9993
3 红圆细笔 0.9938
4 蓝圆粗笔 0.9846
按「形状轮廓」排前 4:
名次 作品 余弦
-----------------------
1 红圆粗笔 1.0000
2 蓝圆粗笔 0.9984
3 蓝方粗笔 0.9949
4 红方粗笔 0.9947
特征 A 的前三 红圆粗笔、红方粗笔、红圆细笔
特征 B 的前三 红圆粗笔、蓝圆粗笔、蓝方粗笔
两组前三的重合 1 / 3
同一幅查询图,换一组特征,前三名几乎换了另一批。特征 A 认的是「用色像」,特征 B 认的是「轮廓像」。
这就是「以图搜同款」和「找同一种画风」的分界:两者要的不是同一种相似。想两者兼顾,只能把两组特征拼起来再调权重。
两组特征都是我手工定的,维度只有 4 和 8,玩具量级。真实风格检索用的是在大量画作上训过的网络,特征有几百维。
颜色组前四:红圆粗笔 1.0000、红方粗笔 0.9993、红圆细笔 0.9938、蓝圆粗笔 0.9846。 前三全是红的,第四才换色——但 0.9846 已经很高了,说明颜色组的区分度其实不强。 形状组前四:红圆粗笔 1.0000、蓝圆粗笔 0.9984、蓝方粗笔 0.9949、红方粗笔 0.9947。 前两个是圆,后两个是方,分得对。 两组前三只重合 1 / 3(只有查询自己)。 这个数字是这一节最该记的:同一幅图,换个特征,检索结果几乎全换。 两组余弦都在 0.98 以上,说明这 6 幅画彼此都很像——毕竟是同一种合成方式。 真实图库的余弦分布会散得多。
30 秒实验
- 把边缘密度的倍数从 6 改成 1 和 20,看颜色组的排序怎么变。
- 把两组特征拼起来(12 维),看前三会变成哪三幅。
- 想一想:为什么用通用图像特征搜画风效果差?
常见误区
- 「一组特征能同时抓风格和内容」——通常抓一个就丢一个。
- 「余弦高就是真像」——这 6 幅画彼此都 0.98 以上。
- 「直接拿整幅画算特征」——背景和签名会混进来,得先框主体。
自测三问(点开对答案)
1. 「用色像」和「轮廓像」分别靠什么特征抓? —— 用色靠颜色均值加边缘密度,轮廓靠边缘方向直方图。 2. 为什么两组前三只重合 1 个? —— 两组特征各自只看一个维度,一个色盲一个形盲,排序自然不同。 3. 真实画作检索为什么比这个 Demo 难得多? —— 笔触有立体感、色调受拍摄条件影响、构图千变万化,合成图的干净假设全不成立。检索讲完了。最后一节收口:把标好的东西写成标准文件,还得能通过校验。
- ☐ (本节完,下一节 7.2.5 实例5:标注图像信息)