这问题大有意思,今日左右无事,就当放松,搭了一个模型实现了一下你这个想法,证明溪岸图确实是董源真迹。
按照传统人类的做法,就是基于已确认为董源真迹的作品总结出董源的一些风格特征,再对溪岸图进行鉴定,也就是你说的《潇湘图》《夏景山图》《夏山图》《龙宿郊民图》。这个鉴定过程就是靠嘴皮子啦,谁也不会服谁,否则也不会有争论了不是。
机器学习也是类似的,只需要给模型“观看”非董源作品和董源的作品,这就是所谓的训练数据集。等模型基于训练数据集学会了如何分辨董源和非董源的作品,就拥有了关于董源作品风格的知识。再给模型看溪岸图,模型就知道溪岸图是否为董源所作了。
总之,道理是很简单的,难地在于如何构建数据集,董源存世作品很少,如果我们让模型遍览一千多年来的作品,目的却只是分辨董源,那很多作品等于白看,毕竟看齐白石的花鸟对鉴定董源的山水画并没有什么用。而且数据集不能失衡,董源的作品就那么几幅,非董源的作品数不胜数,神经网络模型是很蠢的,你给他看1000幅画,只有5幅是董源,那他会认为所有的画都不是董源的,因为这样99.5%的可能性不会错。
所以这个数据集里非董源的作品贵在精不在多,最佳的选择便是和董源类似风格的非董源作品,我大概选了同时代的李成,范宽的作品,后人的仿董源作品,风景类似的作品和董源的老师荆浩的作品一共十二幅。就不全部列举了,包括了荆浩《匡庐图》,李成《晴峦萧寺图》,范宽《雪景寒林图》,范宽《雪山萧寺图》,范宽《溪山行旅图》,吴伟《寒山积雪图》,宋代佚名《溪山暮雪图》。。。
五幅董源的作品,十二幅非董源的作品,不算太失衡,比例还算可以接受。
直接把画输入模型当然是不可以的,这就涉及到中国画的风格特点问题,中国画风格最关键的着眼点是什么?是笔墨,也就是说,大结构并不是进行风格鉴定的关键,要给模型弄一个放大镜,让他盯着作品的细部看!
所以预处理的策略就是无论输入的作品是挂轴还是卷轴画,每次都只要模型观看一个正方形的细部,而且随机改变放大倍数,同时还进行随机镜像反转,随机明暗对比读调整等数据增广方法,输入模型的图片大概是这样的:
总之,最后模型相当于是用不同的放大倍数,不同的光照条件,对着每幅图片学习了几百次的样子。当然还可以让他继续学下去,但似乎学了几百次之后基本就学会了,下面告诉你为什么我知道模型学会了。
模型我使用的是一个简单的ResNet18的神经网络,太大了不行,毕竟数据有限,模型太大了会造成过拟合。我原本担心数据不够,其实是够的,因为高清的手卷作品非常大,拿着放大镜看局部其实可以生成非常多的输入图片了,再加上改变光照,对比度,放大倍数之类的数据增广手段,用ResNet18应该是刚刚好。
学习曲线如下图所示:
横轴是训练的步数,你可以认为是用放大镜看了多少图片,我每隔40幅图片记录一次,横轴是训练损失,损失越低越好,随着训练的进行损失变低,说明这个鉴定问题是能解决的,神经网络确实通过观察学到了东西,慢慢地能进行区分了。当然到了后期就学不动了,这是数据量所限。
在训练的过程中,我同时不停的让模型鉴定一幅模型没见过的非董源作品,让模型输出一个“此作品为董源作品”的可能性:
虽然模型在训练的过程中一度认为此作品为董源作品的可能性为60%,经过长时间的训练,最终可能性稳定在了10%左右,也就是说,模型认为这幅作品不太可能是董源的作品。训练的时候模型并没有看过这幅作品,却如此肯定的认为这不是董源作品,说明模型还是学到东西了。
这幅作品三个局部:
而模型在训练过程中对《溪岸图》的判断是这样变化的:
能看出来一开始模型啥都不懂,自然认为溪岸图为董源作品可能性是0,但随着训练的进行,慢慢的可能性稳定在了80%,也就是说,模型认为溪岸图是董源的作品。
另外,我是把溪岸图分成了36份分别让模型鉴定的,最终30个局部被鉴定为董源作品,6个局部被鉴定为不是,可见模型还是相当自信的。
用上了我的Nvidia 1080Ti之后,我的电脑学会鉴定董源只用三十分钟,而我,估计怎么都是学不会的…