热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python图片马赛克工具:photomosaic

编者注:文章中有很多有用的链接,如果需要查看链接内容,请查看原文。微信公众号文章无法链接到外部地址。使用机器学习&相似性搜索从你的家庭照片

  编者注:文章中有很多有用的链接,如果需要查看链接内容,请查看原文。微信公众号文章无法链接到外部地址。

  使用机器学习 & 相似性搜索从你的家庭照片中创建有趣的图片马赛克、GIF和壁画。

  

  如果你想使用一个很酷的网络界面,那就上传你的照片,我会打印出来邮寄给你,快来试试我的服务

  :photofun.strikingly。(之后我们会删除所有照片。)

  

  因为我很容易沉迷于某些东西,所以你也可以(虽然这与photomosaics无关,但却可以让你的相册更酷)将面部蒙太奇特效贴到一个特定的人的脸上:

  

  这利用了一个嵌入网络,一个有优势的简单的线性分类器,和一个扭曲矩阵将每个图像的眼睛对齐,并对其进行合适的比例调整。你只需要建立一个文件夹,里面有几个例子,这样它就可以知道应该包括哪张脸部照片。

  它是如何运行的?

  我们正在做一项非常古老技术的数字版本-创建马赛克:

  

  除了不使用实体瓷砖图片,你可以使用你的照片集,表情符号,或任何你想要的数字图片集。

  找一张目标照片,比如说一张全家福。你可以使用以其他图像作为图案块的“codebook”算法重新创建目标图像作为马赛克。如果你能够智能地搜索并选择图案块集中最好的“codebook”算法图片,你就可以任意地对目标图片进行更好的重建。

  本项目将目标图像分割成图案块(使用scale参数控制块大小),对于每个图案块补丁,使用L2相似性度量法(使用Facebook的faiss库进行超快查找) 来找到最接近的codebook算法图案块来替换它。

  

  因为这个查找非常快,你甚至可以对视频中的每一帧都这样做并创建视频马赛克(见video.py)。如果你感兴趣的话,你还可以使用performance.py运行一系列有趣的性能指标。

  安装

  确保你已经安装了:

  Docker

  XQuartz (版本: 2.7.5或更高) 如果你想运行interactive.py OpenCV GUI浏览器的话就安装,否则就不需要安装它。 .

  对于 XQuartz库,打开远程设置,然后退出并重启XQuartz (!).

  我只在Mac OS X上测试过,但是由于它是Docker化的,所以应该可以在Docker运行的任何地方运行!

  接下来,构建Docker镜像并运行一个容器:

  

  如果你想通过SSH连接到Docker容器上,运行上述命令后执行以下命令:

  sh enter.sh

  最后,也是最重要的,收集一些你想要用来创建图像(作为马赛克图案块)或创建马赛克(把你的照片/视频变成马赛克)的照片和视频。我把过去几年的iPhone照片/视频都放在一个文件夹里,你可以在下面看到一些很酷的效果。

  Photomosaic脚本

  请注意,所有这些脚本的默认设置都是使用缓存的,这意味着一旦你以一定的比例(即:图案块大小)索引了一个特定文件夹中的照片之后,就不需要再做一次。

  

  如果你从文件夹中添加或删除一个文件,photomosaic会智能地进行重新索引。缓存索引的pickle文件默认存储在缓存文件夹中。

  1)使用图像创建马赛克

  使用一组其他图像重新构建一个图像,缩小图像尺寸并将其作为图案块。

  

  参数:

  --savepath: 保存位置. %s是默认文件名 ,%d 是比例。

  --target: 使用其他图片进行重构的目标图片

  --codebook-dir: 用来使用codebook算法创建图案块的图片

  --scale: 将要创建的图案块多大/小. 方向比例最大值

  --height-aspect: 高度方向

  --width-aspect:宽度方向

  --vectorization-factor: 如果查询之前缩小特征向量 (一般不需要调整此项)

  2)创建马赛克视频

  对视频的每一帧进行同样的操作。

  例子(Tipper 音乐会):

  

  保存路径输出仅使用*.mp4,目前只支持mp4。

  参数:

  --target:用其他图案块图像重新构建的目标视频

  --codebook-dir: 用来使用codebook算法创建图案块的图片

  --scale: 创建的图案块多大/小. 方向比例最大值.

  --height-aspect: 高度方向

  --width-aspect: 宽度方向

  --savepath: 视频文件输出目录 (仅以.MP4扩展名测试过)

  ffmpeg用于音频拼接,因为OpenCV并不能真正处理这些。

  你也可以在这里调整高宽比,但这些和其他的都是可选参数。

  3) 交互式探究马赛克比例

  不确定哪个比例看起来最好?想尝试一些不同的设置吗?运行以下命令。

  然后只要按下s键,你就可以将选择的比例保存到磁盘上!

  或者,按ESC退出窗口而不保存。

  

  参数:

  --target: 使用其他图案块图像创建的目标图像

  --codebook-dir: 用于创建图案块的图像(codebook)

  --min-scale:按照此比例开始(整数)

  --max-scale:允许用户增加比例到此值(整数)

  --savepath:保存位置。%s 是初始文件名,%d 是比例

  你也可以在这里调整高宽比,但这些和其他的都是可选参数。

  4)从带有各种不同图案块比例的一连串马赛克创建GIF

  这将创建一系列各种比例的马赛克,然后将它们组合在一起,形成每秒具有指定帧的GIF。你可以用—ascending参数来调整顺序。

  

  如果你选择了一个很大的数值范围,预计要等待一个半小时左右,这取决于你的机器。

  注意,第一次在容器上运行它时,你可能会看到一个“a Imageio: "ffmpeg-linux64-v3.3.1" was not found on your computer; downloading it now.”的消息,这很正常。

  优化GIF文件大小

  如果你简单地运行上述操作,你可能会得到一个200 MB的GIF文件,这技术教程很荒谬。最简单的补救方法是使用像gifsicle这样的工具。

  以下是我的建议:

  $ brew install gifsicle

  $ gifsicle -O3 --resize-height 400 --colors 256 totally/reasonable/sized.gif

  例如,我使用该命令将一个130 MB的GIF压缩为2MB。EZgif是一个非常好的在线工具,可以以不同的权重压缩gif文件,但它们只能支持100MB以内的gif文件。

  其它设置

  下面是一些其他设置,允许你调整可视化输出。

  1) 随机性(--randomness)

  如果你想给你的图片马赛克带来一点混乱,使用随机性参数。

  它是[0,1)范围内的一个浮点数,这是给定的图案块被填充的概率,不是使用codebook中最接近的块,而是完全随机的。

  例(以0.05的随机性):

  

  2) 视频马赛克稳定性(--stabilization-threshold)

  视频马赛克只是图片马赛克功能的重复应用。因此,帧与帧之间的微小变化可能会导致视频中相同的对象使用不同的图案块显示。这并不可怕,但它影响视觉稳定性,因为它总是在变化。

  --stabilization-threshold 是一个浮点数,表示该块的前一段距离的一部分。我们只有在以下情况下才会更换那个位置的图案块:

  &#96;current closest tile"s distance&#96; <&#96;--stabilization-threshold&#96; * &#96;last frame"s distance&#96;

  否则&#xff0c;我们只需要保持图案块与该帧一样。这是一个粗略的稳定性探索法&#xff0c;在未来我会进行改进。

  3) 不透明度(--opacity)

  一些图片马赛克有点欺骗性&#xff0c;它只是在原始图像上按指定比例叠加带有马赛克图案块。这是一个很流行的技术&#xff0c;我决定引入它。只需使用--opacity 标志即可:

  

  4) 最佳-K (--best-k)

  你可能会注意到你的许多图片赛克将有大块区域的颜色相似&#xff0c;所以一个单一的图像将被平铺在你的大部分图像。如果你想加入一点(合理的)随机性&#xff0c;而不是使用(--randomness)功能&#xff0c;你可以使用--best-k参数。

  在每个图案块上&#xff0c;使用--best-k参数,&#xff0c;k个优先匹配项将被随机选择&#xff0c;按距离大致进行反向加权(因此“更接近”的图像最有可能)。

  这是与上面相同的图像&#xff0c;但使用了 --best-k 5参数:

  

  面部蒙太奇效果

  我真的很想做面部蒙太奇&#xff0c;尽管它们和图片马马赛克没有任何关系&#xff0c;本部分就是!

  简单来说&#xff0c;就是使用一个人的不同照片来创建GIF&#xff0c;并将全部照片对齐到此人的脸部。

  工作原理:.

  1.将只包含你想加入蒙太奇效果的脸部图像的照片(例如你自己)放在一个文件夹(--target-face-dir)。自拍照片是最好的选择。

  2.将包含其他脸部图像的照片放在一个文件夹(--other-face-dir),越多越好。不要加入你的脸部照片。如果你真的很缺少其他人 的照片/有很多合影&#xff0c;那就把自己P掉。

  3.将你想要用来绘制蒙太奇效果的照片目录放在一起(--photos-dir)。

  作为一个开始&#xff0c;我已经在media/faces/other_faces (不太可能是你的脸部照片)中加入了450张脸部图片的学术数据集(Caltech Faces Dataset)。如果你出于学术原因使用的话&#xff0c;请务必引用它们和dlib库。

  如果你想要更好的准确度&#xff0c;我会试着在--target-face-dir 和 --other-face-dir 目录添加至少100张照片。我添加了这一点&#xff0c;使用face_montage.py运行的 结果是大约每300张照片有1个错误正片(在运行

  create_gif_from_photos_folder.py步骤之前很容易将其删除)。

  你可以从这个地方找到更多随机的脸部照片。

  总之&#xff0c;以下是更详细的描述来帮助你运行人脸嵌入&#xff0c;训练线性分类器&#xff0c;对人脸进行对齐:

  

  然后&#xff0c;要将它们实际编译成GIF&#xff0c;要在上面的描述中使用--savedir参数&#xff0c;然后运行:

  

  将这两个步骤分开很好&#xff0c;因为你可能想要从第一步创建的文件夹中删除错误正片和不好看的图片&#xff0c;不然会搞乱生成的GIF中你想要的每秒多少帧。我在嵌入过程中实现了缓存&#xff0c;但是运行一组完整的照片(仅我有耐心运行的照片库部分就有4000多张照片)仍然需要一些时间。

  使用 ffprobe / ffmpeg

  本项目中的一些例程使用了来自视频/音频文件的参数。我经常通过转到一个单独的进程来直接调用命令行程序&#xff0c;虽然有点麻烦&#xff0c;但是也可以完成任务。

  FFProbe是一个很好的工具&#xff0c;命令行接口非常强大。推荐你阅读此指南来掌握它。

  类似地&#xff0c;ffmpeg使音频/视频流的拼接和重组变得容易。以下是一些具体的ffmpeg资源:

  ffmpeg编码课程

  ffmpeg教程

  数字视频简介

  图片魔法

  转换工具用来制作GIF也很不错:

  $ cd your/cool/folder/with/jpg/images

  $ convert -delay 5 -layers optimize *.jpg output.gif

  然后&#xff0c;你可能想使用gifsicle技巧来压缩/调整GIF的大小&#xff0c;使其变成合适大小。

  单元测试

  有一个小型的(但令人尴尬的是不完整的)测试套件&#xff0c;你可以使用它进行测试:

  sh test.sh

  目前资料还不是很全


推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 本文介绍了使用SSH免密登录的步骤,包括生成公私钥、传递公钥给被登录机、修改文件权限的操作。同时提醒用户注意私钥的传递方式,建议使用U盘等离线方式传递。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • linux 禁止指定ip访问
    linux中如何禁止指定的ip访问呢?比如被别人暴力破解,被别人使用不同的密码尝试登录:所以我想直接禁用这些ip的访问.怎么办呢?解决方案:修改配置文件etchosts.deny把 ... [详细]
author-avatar
MySeptember
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有