这是我最近在Twitter和Vimeo上发布的网络摄像头PIX2PIX演示的源代码和验证模型。它使用深度学习或投入一些流行语:深卷积有条件的生成对抗网络自动编码器。
视频1
视频2
概述
此特定回购中的代码实际上与Pix2Pix,Gans甚至深度学习无关。它只是加载任何预训练的TensorFlow模型(只要它符合一些约束),将其馈送为处理后的网络摄像头输入,并显示模型的输出。碰巧的是,我训练和使用的模型是Pix2Pix(下面的详细信息)。
即这些步骤可以总结为:
1。数据
我从Wikimedia的Google Art Project中刮过了来自世界各地的艺术收藏。许多图像都是丰富的白色家伙的古典肖像,因此我只使用了大约150个收藏品,试图将数据保持在地理和文化上的多样性(我使用的完整列表)。但是数据仍然非常以欧元为中心,因为一个欧洲博物馆可能会有数百或数千次扫描,但只有8次来自阿拉伯博物馆的扫描。
我下载了图像的300px版本,然后运行了批处理过程:
- 将它们重新列为256×256(不保留纵横比)
- 运行AA简单的边缘检测过滤器(OpenCV Canny)
我还运行了一个批处理过程,从图像中取出了多个农作物(而不是不均匀的调整大小),但我还没有对此进行训练。我还开始研究XIE和TU(原始Pix2Pix Paper所使用的),而不是Canny Edge检测,而是研究了更好的“整体上巢边缘检测”(又名HED),但尚未对此进行培训。
这是由preprocess.py脚本完成的(对不起,没有命令行参数,编辑脚本以更改路径和设置,应该是相当自言自语的)。
可以在这里看到一小部分培训数据的样本 – 包括训练有素的模型的预测。右列是原始图像,最左列的列是预处理版本。这两个图像被送入Pix2Pix网络,作为要训练的“对”。中间列是该模型学会仅给定最左边的列产生的方法。 (图像显示了每个训练迭代 – 即从左侧的数字,从20,000到58,000,因此,您在页面上越越越逐渐变得更好)。
我还训练了无条件的gan(即在相同的培训数据上进行普通的dcgan。下面可以看到其输出的一个示例。(这是生成类似于训练数据的“完全随机”的图像)。
2。训练
训练和体系结构是由Isela等人(又称Pix2pix)直接向上“图像到图像的翻译”。我在@AffineLayer(Christopher Hesse)的Tensorflow端口训练,这也是近期传播传播的“ Skult-to-cat-demo”的动力。他还写了一个很好的教程,介绍了Pix2Pix的工作原理。非常感谢作者(以及他们构建的每个人)为制造代码开源的人!
我只对Tensorflow-Pix2Pix训练代码进行了一个无限的更改,也就是说,以人为可读的名称向发电机输入和输出添加TF.Identities ,以便我可以轻松地喂食和获取Tensors。因此,如果您想在此应用程序中使用自己的模型,则需要做同样的事情。 (或记下输入/输出张量名称,并相应地修改JSON,以下更多内容)。
您可以从“版本”选项卡中下载我验证的模型。
3。预处理和预测
该特定应用程序的作用是加载验证的模型,对网络摄像头输入进行实时预处理,然后将其馈送到模型。我使用OpenCV进行了旧式的基本计算机视觉的预处理。这确实非常最小和基本。您可以在下面看到GUI(GUI使用pyqtgraph)。
不同的场景需要不同的设置。
例如,对于“现场动作”,我发现Canny可以提供更好的(IMHO)结果,这就是我在首批视频中使用的。阈值(Canny_T1,Canny_T2)取决于场景,细节和所需的外观。
如果您的图像中有很多噪音,则可能需要添加一点点的pre_blur或pre_median 。或与他们一起玩“艺术效果”。例如,在第一个视频中,在1:05-1:40左右,我添加了大量的中位数(值约为30-50)。
对于绘制场景(例如第二视频),我发现自适应阈值比Canny(即禁用Canny和启用自适应阈值)更有趣的结果,尽管您可能会不同意。
对于完全静态输入(即,如果您冻结捕获量,禁用相机更新),则输出可能会闪烁很小的量,因为该模型对同一输入做出了不同的预测 – 尽管这通常非常微妙。但是,对于现场摄像机供稿,输入中的噪声可能会在输出中闪烁很多,尤其是由于噪声较高或适应性阈值的敏感性很高,因此某些时间模糊可能会有所帮助。
在进入模型之前, Accum_W1和accam_W2用于输入的时间模糊:new_image = old_image * w1 + new_image * w2(因此,理想情况下,它们应该加起来多达一个或接近)。
prediction.pre_time_lerp和post_time_lerp也做时间平滑:new_image = old_image * xxx_lerp + new_image *(1- xxx_lerp)pre_time_lerp是在进入模型之前,并且post_time_lerp是在模型中出现的。
任何时间模糊的零都会使它们禁用它们。这些值取决于您的口味。对于上面的两个视频,我都设置了所有PRE_MODEL模糊(即Accam_W1,Accum_W2和pre_time_lerp),并设置为零,并使用不同的post_time_lerp设置播放,范围从0.0(非常闪烁和闪烁)到0.9(非常缓慢,淡淡,淡淡的和“梦想”)。通常,我最喜欢的范围约为0.5-0.8。
使用其他型号
如果您想使用其他模型,则需要设置类似于下面的json文件。这里的动机是,我实际上在应用程序/型号文件夹中有一堆JSON,我可以动态扫描和重新加载,并且模型数据在其他磁盘上存储在其他磁盘上,并且该应用程序可以自动在运行时和规模输入/输出等自动加载和交换模型。
{
\"name\" : \"gart_canny_256\", # name of the model (for GUI)
\"ckpt_path\" : \"./models/gart_canny_256\", # path to saved model (meta + checkpoints). Loads latest if points to a folder, otherwise loads specific checkpoint
\"input\" : { # info for input tensor
\"shape\" : [256, 256, 3], # expected shape (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
\"range\" : [-1.0, 1.0], # expected range of values
\"opname\" : \"generator/generator_inputs\" # name of tensor (\':0\' is appended in code)
},
\"output\" : { # info for output tensor
\"shape\" : [256, 256, 3], # shape that is output (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
\"range\" : [-1.0, 1.0], # value range that is output
\"opname\" : \"generator/generator_outputs\" # name of tensor (\':0\' is appended in code)
}
}
要求
- Python 2.7(也可能与3.x一起使用)
- Tensorflow 1.0+
- OPENCV 3+(也可能与2.4+一起使用)
- pyqtgraph(仅用0.10测试)
仅在Ubuntu 16.04上进行测试,但应在其他平台上工作。
我使用的是Anaconda Python发行版,它几乎带有您需要的所有内容,然后(希望)很简单:
-
从https://www.co*n*ti*nuum.io/downloads下载并安装Anaconda
-
安装TensorFlow https://www.**te*nsorflow.org/install/(如果您拥有Anaconda-,则通常很简单,因为包括大多数依赖关系)
-
安装openCV和pyqtgraph
conda install -c menpo opencv3 conda安装pyqtgraph
致谢
无限再次感谢
- Isla等人的Pix2Pix和@Affinelayer(Christopher Hesse)用于Tensorflow端口
- Radford等人的DCGAN和 @carpedm20(Taehoon Kim)用于TensorFlow端口
- Tensorflow团队
- 无数其他人直接或间接地为上述贡献的人,或开放自己的研究,使上述研究成为可能
- 我的妻子与我一起工作银行度假以清理我的代码并上传此存储库。
