如果想用机器学习锐化图片,应该如何定义网络的输出和损失函数?

2021-11-17 00:52:24 +08:00
 Richard14

初学者,学习完基础知识后有一些问题,请教一下论坛里机器学习方面的大佬。

1 、我想做个试手项目,比如利用机器学习对 1920*1080 的图片进行锐化。因为数据集非常好获取,锐化随便就可以算,感觉是个比较好上手的项目。我在学习的过程中见过线性回归(输出一个值,然后利用 MSELoss 计算损失),以及分类(输出 10 个值,softmax+交叉熵)两种输出模式,如果想由图片得到图片的话应该如何定义输出呢?比如要得到 n*m 的图片,难道输出值是一个 n*m 的矩阵,然后计算每个像素和目标值的平均差值吗?

2 、如果上述网络做完之后,比如训练是 16:9 的图片训练的,实际生产环境需要输入 21:9 的图片又该怎么办呢?我的一个想法是比如统一训练 256*256 的输入,然后无论图片多大,统一裁成若干个标准块输入。不过这种情况的话不会在接缝处产生一个不和谐的缝隙吗?

3 、目前这类图片转换滤镜的需求,有什么成熟的(免费可获取的)已经训练好的网络,可供迁移过来进行微调吗?

4 、和上述问题无关,我思考想要做的项目时产生一个疑问,就是如何统合一些完全不相干的信息,比如如果要利用我的个人信息预测我的收入,那么我的父母、兄弟、朋友,作为不同的自然人,他们每个人的职业年龄等信息可以预测出一个他们的个人数据,然后如果要和我产生联系的话,要如何把这一些(不确定数量的,且互相比较独立的)数据在网络中统合起来呢?

我有考虑过直接把所有数据 Flatten 变成一层并相加,但是总感觉不太合逻辑。而且关系上来讲,比如父母这种的影响肯定比朋友大,如果直接拉成一条线然后用 cnn 预测的话,那岂不是说有一个有钱的朋友和有一个有钱的父母对于网络来说效果是一样的,这不合逻辑。

===========================

谢谢大家!

2305 次点击
所在节点    Python
9 条回复
LeeReamond
2021-11-17 06:07:40 +08:00
非专业,不过 1 印象里类似超分这种算法确实是几层卷积,(印象里早期层数很少),后来好像要在后面加逆卷积层
ejdjxidbsn
2021-11-17 06:55:19 +08:00
1: 是的
2: 进网络前的时候做图像变换,出网络后做相反操作
3: 看什么滤镜吧,搜索 style transfer
4: 这种不会用 cnn ,直接 mlp ,用可能最大的 feature 数量,对于不足的填 0
Cola90
2021-11-17 09:16:09 +08:00
pix2pix,dcgan,cyclegan 里面应该都有你需要的函数
princelai
2021-11-17 10:14:57 +08:00
回答下第四个问题,flatten 然后 concat 成为 1 维没问题,前提是每个人的父母、兄弟、朋友数量固定,例如父母是个 1x4 的向量,concat 后必须是 1x12,1-4 是父母特征,5-8 是兄弟特征,9-12 是朋友特征,每个人都在固定的位置上模型网络就能知道是谁该怎么给权重,但是不是每个人都有兄弟、朋友甚至父母。

另一个是构建图网络,用 GNN,GCN,GAT 这些网络,你们的关系就是边,每个人是一个节点。
jaredyam
2021-11-17 11:30:32 +08:00
就你的前两个问题来说:

机器学习可以写一厚本书,计算机视觉也可以。显然,你提到的方法和想法都是还没有入门的结果。就锐化这个目的来讲,这种尺度过于主观,目前图像编辑软件用到的方法属于数字信号(图像)处理的范畴,根本不需要用数据驱动。如果你想说的是超分辨算法,也即将当前图像进行大尺寸映射仍能保持较高的锐度,这属于计算机视觉中的一个方向,你可以直接 google ,开源项目不胜枚举,拿来跑跑就可以了。以你目前的阶段,不建议在细节( Loss )设计上深挖,可以理解一般开源项目的 pipeline 设计(尤其是数据预处理、输入输出设计)就好了。
Richard14
2021-11-17 13:10:48 +08:00
@jaredyam 感谢回复。

我的目的是(希望能)掌握一种 General 的由 A 图片转化到 B 图片的训练方式,姑且不论效果(关于效果的改进以我的理解应该是通过调整网络实现的),我不是很理解应该用什么样的输出模式,在网上搜索也没总结出什么有效信息,所以来论坛问一下。我目前的想法是,比如在训练分类的时候,他都是有一套固定的评价体系,比如 softmax+交叉熵然后再反向传递,要提高精度需要调整的只是细节的网络结构部分,我认为图转图应该也是这样?提高精度可以靠修改网络解决,然后输入和输出模式相对应该比较固定。

超分应该是这个领域比较常见的需求,我昨晚看了一些开源项目,曾经感觉这些似乎都是很深层的网络实现的,但是看 waifu2x 之类比较老的超分似乎层数非常浅。通过模拟代码我能大概理解它的思路,但是因为个人精力有限,从准备数据集开始 check 每一行代码的逻辑比较累,而且不保证自己理解正确,难免有疏漏,所以想问问论坛里有没有大佬能在比较高的抽象层次用自然语言描述一下具体是这种转换是怎么做出来的,我感觉对我会很有帮助。
Richard14
2021-11-17 13:17:24 +08:00
@jaredyam 还有一个点就是我看源码不太理解它切割图片又合成的逻辑。。真的不会在边缘产生硬边界吗。。。因为比如对于原图来说是一串连续的 255 ,如果切割开来了,其中某些点对于神经网络来说,周围的值从 255 变成 0 了,这会影响预测的吧
XiSH
2021-11-17 19:57:40 +08:00
@Richard14 切割图片是为了节省资源
Juszoe
2021-11-18 10:27:28 +08:00
1. 实际上早期大部分超分算法就是用简单的 MSELoss ,每个 pixel 求个平方差,我决定作为初学练习项目用 MSE 就足够了。现在做超分大部分用的 GAN 来做,Loss 会比较复杂,通常是结合"L1 loss ,perceptual loss, GAN Loss"。推荐一个比较新的项目 https://github.com/xinntao/Real-ESRGAN
2. 对于不同比例的图片,我们会填充黑边使得输入比例相同,另一种方法就是你说的切成 tile ,因为有 L1 Loss 约束,接缝处也不会产生缝隙。
3. 风格迁移的场景,经典的有 cyclegan 、pix2pix
4. 这种场景用图神经网络更好些

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815899

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX