最近在考虑怎么去噪去水印的问题,这种任务跟我们之前介绍的,无论ResNet还是其变形都不同,之前介绍的都是一个特征提取网络(如ResNet等)+全连接层,输出的是概率,无论是图像分类,还是目标检测等,最后输出的都是分类的概率。但是如果我们考虑图像去水印去噪,它的逻辑应该是输入一个待清理的图像,输出的是一个去噪去水印之后的图像,也就是说需要做像素级别的预测(对于原图像的每个像素值,需要预测其目标值)。
于是需要关注一些这类的网络,如UNet,不过UNet的思想是继承自FCN的,所以先对FCN做一层梳理。
1. 语义分割
在讲FCN之前,有必要先简单介绍一下语义分割,详细介绍可以看这个:https://zhuanlan.zhihu.com/p/37801090
看图就最容易理解了:
就是输入一个图像,然后输出该图像上每个像素的类别,也可以理解为输出的是右边的一个图像。这个使用场景也很多,如自动驾驶,医学图像等。
跟语义分割相关的还有两个领域,一个是实例分割,一个是全景分割,这三个领域相关,但又不同,常常容易混淆。有机会再细说。
2. 传统CNN网络
刚才说了,传统的网络是卷积层+全连接层,卷积层用于特征提取,而全连接层用于计算分类概率等(当然也可以预测目标的bbox):
全连接层的输出,其实就是类似上图中的红色框框的部分,一个概率分布。
3. 全卷积网络FCN
而FCN改变了这种状况,没有再使用全连接层来输出概率,而是使用反卷积来输出图像(特征图),这也是称为全连接网络的原因,事后诸葛亮的角度其实也不复杂:
和普通的卷积网络差别最大的就是网络的最后是一层反卷积层(红色框框的部分),从而实现像素级别的预测。
在前面的卷积层,随着卷积层级的加深,特征图通道数不断增加,而分辨率不断下降,到反卷积之前,分辨率已经降到了输入分辨率的1/32,这时如果只是使用一个反卷积进行上采样,那这个反卷积就得直接将分辨率扩大为原来的32倍,虽然可以增加跳层连接(残差连接),但是效果依然是不会太好的。
上面图示分成了3条路径,也对应了三个模型:
论文也给出了一些效果:
从这个图示来看,32倍上采样的模型,显然丢失了很多细节,边界效果比较差。8倍和16倍效果差不多,8倍好像还好一些,但是效果其实也是很差强人意吧。
4. 语义分割和图像去噪去水印有什么不同?
因为有人已经使用UNet来做这方面的内容(虽然之前试过公开的模型效果比较一般,不过使用自己的训练数据,估计还是能得到一个相对比较好的结果的),所以我们关注的主要是UNet,而FCN只是一个前奏,从前面的介绍也能看到FCN这个思想很好,能实现端到端的像素级预测,但是这个网络本身还是比较粗糙,也远没有UNet结构优美,所以就不细细介绍了。
说回我们要做的去噪去水印,这和上面所说的语义分割有什么区别呢?最大的区别就是噪声和水印可能是和文档的文字叠加在一起的,并不能够说网络预测这些像素是水印或者噪声就能够将这些像素去掉,但是上面说的语义分割没有这些烦恼。
所以,可能的途径是,输入原图和有噪声或者水印的图像,经过网络预测一个图像,然后计算这个预测的图像和原图的损失值。大致思想应该是这样。
2020-10-11