|
介绍如何使用当前最先进的深度学习方法来区分图像中的前景与背景、家具与非家具,并从一张照片中提取出椅子。 jeUUa-zR3 3L5r*fa 给定一张包含家具的照片,你可以让程序自动将家具与背景分开吗? jM)C4ii.-$ 在这篇文章中,我将介绍如何使用当前最先进的深度学习来尝试解决这个问题。我不是机器学习的专家,所以我希望这个帖子对于其他希望使用这个强大新工具的非专家们有一定的帮助作用。 \}0-^(9zd 这个问题称为分割。也就是说,从这张图开始: 5 `/< v^ Cfu=u *u 到这张图: zCaT tb|@ RW'nUL?_\ 我们可以将这个遮罩应用到源图像上,获得没有背景的椅子。我们将使用一些工具来简化这个工作: }f}}A= keras - 一个非常棒的用于创建神经网络的库。 Keras是像Tensorflow这样的较低级别库的前端,它能为用户处理构建神经网络过程中存在的大量繁琐的细节。。 V9NTs8LKc U-Net - 用于图像分割的神经网络架构。 U-Net最初被设计用于生物医学图像分割(例如,在CT扫描中识别肺结节),但它也可用于分割常规2D图像。在下文将看到,即使没有大数据集,U-Net的强大功能也能让你大吃一惊。 #U
mF-c Brine - 一个数据集管理器,可以利用该管理器轻松地共享和管理图像数据集。构建模型最令人讨厌的部分就是获取和选择用于训练模型的数据集。我创建了brine来轻松共享数据集,使之能应用在PyTorch/Keras模型上。我们将使用它来下载数据集并将其与Keras进行交互。 9LJZ-/Wq 一个Github代码库 - Carvana图像遮罩挑战赛是Kaggle的一项赛事,它提出了类似的问题:将汽车从背景中扣出来。人们经常在Kaggle比赛中分享他们的解决方案,而在这个代码库中,有人分享了一个使用Keras和U-Net的解决方案。我们的目标是利用这个解决方案来解决我们当前这个家具分割问题。 ;]2s,za)qs 一个数据集 - 这是一个朋友提供的数据集。请注意,它非常的小,只包含了97张椅子和相应的遮罩。一般来说我不会指望通过这么少的数据来做很多的工作(Carvana挑战赛中提供了数千个样本),但是让我们来看看最终到底可以做到何种程度吧。 Ol_q{^ 代码 AnBJ(h 这里有一个jupyter笔记,其中包含了建立模型的所有代码。我将重点介绍其中最重要的部分,并解释它的原理。 8 .>/6M 第一步是安装数据集。由于它托管在Brine上,所以可以用一个简单的命令来实现:brine install rohan/chairs-with-masks。 k(VB+k"3 下一步是加载数据集。可以通过Brine的load_dataset函数来执行此操作:chairs = brine.load_dataset('rohan/chairs-with-masks')。该数据集包含了97个样本,每个样本是图像及其遮罩。遮罩是一个只有两种颜色的图像,蓝色代表背景,红色代表前景。 fh8j2S9J 数据集加载了,现在来加载U-Net网络。把“Kaggle-Carvana-Image-Masking-Challenge”代码库中的model目录复制下来。导入这个网络,执行model = unet.get_unet_256() 。感谢petrosgk的工作,只需调用这一个函数即可返回一个Keras内置的U-Net网络。 Keras提供了model.summary()方法来查看网络的结构,虽然从中可以看到大量的信息,但最重要的是第一个和最后一个,它告诉了我们网络期望的输入和输出的形状。 Hh;:`;}
我们可以看到输入的形状是(None, 256, 256, 3),输出的形状是(None, 256, 256, 1)。元组的第一个元素是批量的大小,所以我们现在可以忽略它。这告诉我们,网络期望的输入是一批256x256的三通道图像,并将输出一批256x256个单通道遮罩。我们的遮罩也需要匹配这个形状。 Gbpw5n;e 下一步是准备样本,使之与网络一起使用。我们将为训练数据定义一个处理函数,在样本传给网络之前需应用于每个样本。 h& |