V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Richard14
V2EX  ›  Python

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

  •  1
     
  •   Richard14 · 2021-11-17 00:52:24 +08:00 · 2305 次点击
    这是一个创建于 1132 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    谢谢大家!

    9 条回复    2021-11-18 10:27:28 +08:00
    LeeReamond
        1
    LeeReamond  
       2021-11-17 06:07:40 +08:00
    非专业,不过 1 印象里类似超分这种算法确实是几层卷积,(印象里早期层数很少),后来好像要在后面加逆卷积层
    ejdjxidbsn
        2
    ejdjxidbsn  
       2021-11-17 06:55:19 +08:00
    1: 是的
    2: 进网络前的时候做图像变换,出网络后做相反操作
    3: 看什么滤镜吧,搜索 style transfer
    4: 这种不会用 cnn ,直接 mlp ,用可能最大的 feature 数量,对于不足的填 0
    Cola90
        3
    Cola90  
       2021-11-17 09:16:09 +08:00
    pix2pix,dcgan,cyclegan 里面应该都有你需要的函数
    princelai
        4
    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
        5
    jaredyam  
       2021-11-17 11:30:32 +08:00
    就你的前两个问题来说:

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

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

    超分应该是这个领域比较常见的需求,我昨晚看了一些开源项目,曾经感觉这些似乎都是很深层的网络实现的,但是看 waifu2x 之类比较老的超分似乎层数非常浅。通过模拟代码我能大概理解它的思路,但是因为个人精力有限,从准备数据集开始 check 每一行代码的逻辑比较累,而且不保证自己理解正确,难免有疏漏,所以想问问论坛里有没有大佬能在比较高的抽象层次用自然语言描述一下具体是这种转换是怎么做出来的,我感觉对我会很有帮助。
    Richard14
        7
    Richard14  
    OP
       2021-11-17 13:17:24 +08:00
    @jaredyam 还有一个点就是我看源码不太理解它切割图片又合成的逻辑。。真的不会在边缘产生硬边界吗。。。因为比如对于原图来说是一串连续的 255 ,如果切割开来了,其中某些点对于神经网络来说,周围的值从 255 变成 0 了,这会影响预测的吧
    XiSH
        8
    XiSH  
       2021-11-17 19:57:40 +08:00
    @Richard14 切割图片是为了节省资源
    Juszoe
        9
    Juszoe  
       2021-11-18 10:27:28 +08:00   ❤️ 2
    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. 这种场景用图神经网络更好些
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   883 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:55 · PVG 03:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.