产品狗一枚,入坑AI,今天向大家介绍下图像识别非常重要的工具Unet,简单介绍其原理。
Unet在自动驾驶、马赛克修复、残破图片还原、医学图像识别等方面有重要应用,具体介绍自行搜索或者问AI吧,但是Unet的原理对于没有系统化学习过的人来说是很难懂的,尤其涉及到一些专业词汇和算法公式,劝退了一波初学者。因此根据我的理解,在这里尝试不用专业词汇解释Unet的原理,或许能有一些帮助。
想要了解Unet原理的同学应该都见过这张图,分别是下采样、上采样的过程,但这个过程受专业词汇影响理解起来非常懵逼,简单来说这个U型图分左右两部分,左边的下采样是为了让Unet理解让他识别的图形是什么,右边上采样是让Unet识别出学到的图形在原图的哪些区域。
理解到这个流程的概念,再来看看什么是下采样、上采样。
下采样
可以在图中看到左边有4层三道杠,具体什么算法不用着急,从里面的参数可以看到每层三道杠有两组数值,比如:572×572 570×570 568×568,1 64 64,前面一组代表图片的分辨率,后面一组代表图片的解析带宽,然后每往下走一层,分辨率都会下降一倍,而解析带宽都会翻一倍,直至最后分辨率变成64×64,带宽变为512。
这个过程相当于,每次训练的时候,先把图片的每个像素扫一遍,提取一些图片上的特征,然后把图片的分辨率缩小一倍,再逐个像素扫一遍,提取图片上的特征,当然因为图片尺寸变小了,扫描图片的次数也会翻倍,这样可以提取更丰富的特征,如此往复4次直至最终输出的图片分辨率只有32×32,然后再卷一次1024的特征扫描,交给上采样处理,整个过程相当于:
可以看到,每次下采样,随着图片分辨率的下降,图片也会丢失一半的细节,但这更方便找到关键特征,就像盲人摸象,刚开始的时候大家都先一个盲人整体摸一下大象什么形状,其实这个盲人是很懵逼的,但是再叫64个盲人摸一个570×570像素的大象,之后每次分辨率缩小就等于都把大象卸掉一半,同时摸象的人再翻一倍,并且每个人都记下自己摸过的样子,再叫128个盲人摸284×284的大象,再反复折腾几次,直到最后又叫了1024个盲人摸一个32×32分辨率的象,每次摸象的盲人对大象是什么形状心里就有数了。
上采样
接前面,当每个盲人摸完大象后,为了证明他们都摸明白了,就得让他们把摸过的大象部件用陶土捏回去,这个过程和下采样正好反过来,第一次有1024个盲人捏出自己摸过的样子,此时图片分辨率只有28×28,别问32×32是怎么变成28×28的,问就是信息损耗。然后把这28×28的图片和前面1024人摸过的人再对比下捏出来的形状,该调的调,该修的修,这个调修技术上叫跳跃连接,然后再让512个盲人接着前面1024人捏出来的土坯零件,按照他们摸过的记忆补充细节,该调的调,该修的修,然后再重复,直到最后64个人捏回了388×388的大象,此时新捏出来的大象虽然和原来的大象有些细节不一样,但这些盲人终于搞明白什么是大象,以后只要在动物园里摸到大象,他们就可以指着大象说:这就是大象。
原图的人工标记
在实际下采样的时候,并不是发一张飞机的照片给到Unet,它就知道要去摸飞机了,还需要给它提供一份飞机的定义,相当于我们要把飞机的特征手动标记出来,并且是各个角度、各种类型的飞机的原图照片+特征标记,每个样本和对应的标记都让Unet摸一摸,以后它就可以自动识别出飞机了,比如当你带着Unet开飞机的时候,它老远就能识别出前方过来的是飞机而不是天上的云,叫你开上去创死他,开玩笑,躲开他。当然了你又会问特征标记是什么,具体是怎么样的?还是拿飞机举个例子:
请忽略粗糙的抠图,训练时向下采样输入原图和标记图,两者尺寸、分辨率必须保持一致,当然标记也还有其他类型的文件格式,比如json。然后下采样时Unet就像盲人一样分层分级的摸标记和原图上的重叠的部分(编码器),再分层分级的把摸过的形状特征捏回来(解码器),并且边摸边对照之前摸过的样子,基本上就八九不离十了。
额外补充
可以看到下采样和上采样的每一次处理都会带来一定分辨率的损失(失真),所以Unet也无法做到100%的分割或者识别,但可以通过增加样本的训练、优化每次采样的算法来提高准确率、减少失真,那么Unet的基本原理就介绍到这里,感谢观看~!