基于感知损失的实时风格迁移与超分辨率重建
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
许多经典的图像问题都可以被看成是图像变换任务,算法接受一个输入图像,然后输出变换之后的图像。最常见的例子就是图像处理中的取噪、超分辨重建、图像彩色化等问题,输入的图像是退化低质量图像(噪声、低分辨率、灰度化)得到的输出是一个彩色、高分辨率、高质量的图像,此外这类变换还包括图像语义分割、深度评估。以前基于卷积神经网络来解决这类问题通常采用的是像素基本的损失,但是这种方法训练得到模型拟合标注数据与输出结果之后的感知不同,作者正是基于这点提出了基于感知的损失来训练纠正这种偏差。
像素基本损失
在像素基本对比两幅图像、如果两幅图像感知相同,但是像素不同,像素损失就会造成很大偏差。
感知损失
基于高阶卷积神经网络特征实现感知比较,不做像素基本的损失。
作者基于感知损失实验了两个图像处理任务,均取得了比较好的效果
图像风格迁移任务
图像超分辨
显示如下:
模型主要分为两个部分,图像变换网络与感知损失网络,其中损失网络在训练过程种保持不变,主要是采用预训练的图像分类网络如VGG16。定义感知损失来分别度量风格与内容的感知不同,实现最优化得到训练模型。相关的损失表示如下:
出了上述损失之外,作者还定义了两个低阶的损失,一个是简单的像素损失,另外一个是全变分正则化损失。
风格迁移的实验结果
超分辨实验结果
源码下载地址:
https://github.com/jcjohnson/fast-neural-style
预训练模型下载
bash models/download_style_transfer_models.sh
OpenCV DNN使用预训练模型输出结果:
演示代码:
inWidth = 256
inHeight = 256
h, w = frame.shape[:2]
inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight),
(103.939, 116.779, 123.68), swapRB=False, crop=False)
# 执行风格迁移
net.setInput(inp)
out = net.forward()
print(out.shape)
t, _ = net.getPerfProfile()
freq = cv.getTickFrequency() / 1000
label = "FPS : %.2f" % (1000 / (t / freq))
# 解析输出
out = out.reshape(3, out.shape[2], out.shape[3])
print("ddddddddd", out.shape)
out[0] += 103.939
out[1] += 116.779
out[2] += 123.68
out /= 255.0
out = out.transpose(1, 2, 0)
print("new shape", out.shape)
out = np.clip(out, 0.0, 1.0)
# rescale与中值模糊,消除极值点噪声
cv.normalize(out, out, 0, 255, cv.NORM_MINMAX)
out = cv.medianBlur(out, 5)
# resize and show
result = np.uint8(cv.resize(out, (w, h)))
cv.putText(result, label, (5, 25), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
cv.imshow('Fast Style Demo', result)
cv.imwrite("D:/result_%d.png"%index, result)
好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~