AI 拼图的探讨
2019-12-29 12:20:00 Author: xz.aliyun.com(查看原文) 阅读量:514 收藏

引子

很早之前就有 Misc 拼图题的存在了,也出现了一些奇奇怪怪的解决方法,包括但不限于以下:

  • PPT 拼图
  • 打印手工拼图
  • Word 拼图
  • PS 平台
  • CAD 拼图
  • 时间排序拼图

今年 HXB 也出了个 AI 拼图题,有点意思,所以今年圣诞节,我们 Venom 也安排的一场圣诞挑战。

本来是分 Easy,Middle,Hell 的,但是感觉 Easy 太简单了,就没安排了。

底图是这个样子的

Meta

  • size: 2560x1600

Easy

easy

Meta

  • part size: 32x20
  • number: 6400

easyx

Meta

  • part size: 16x10
  • number: 25600

Solution

看图说话,就是非常非常 easy。整个图片上除了 secret 文字就没有别的干扰了。因此解决方案就非常简单了

因为给出了底图和碎图,所以可以根据碎图去分割底图为同样大小的碎片。

可以通过分别对底图碎片和 secret 图碎片进行哈希,替换相同哈希的内容后得到哈希不同的碎片,即为 secret 文字的碎片。在组合为大图。

[+] Source   : origin.png
[+] Part     : easy/01JbXsY3sZ.png
[+] Output   : easy.png
[+] ExtColor : #fff
[+] puzzleDiffHash
[+] m = 80, n = 80
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Hash Diff Num : 668
[+] Merge Image
[+] Success! And use 4.248577 s

[+] Source   : origin.png
[+] Part     : easyx/007Mgv3beP.png
[+] Output   : easyx.png
[+] ExtColor : #fff
[+] puzzleDiffHash
[+] m = 160, n = 160
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Hash Diff Num : 1698
[+] Merge Image
[+] Success! And use 12.901666 s

碎片分割越小,secret文字越大,使用哈希对比的方法越准确。也可以用 Middle 或者 Hell 的方法。

Middle

Meta

  • part size: 32x20
  • number: 6400
  • 干扰直线 * 100 [width=(3, 6)]
  • 干扰曲线 * 100 [width=(3, 6)]
  • 干扰文本 * 20

Solution

复杂度瞬间上升 N 倍,主要是多了很多干扰,单纯的 hash 比对是不可能的了。

这时候考虑三种特殊的哈希算法

  • 图像均值哈希算法 Average Hash - ahash
  • 图像感知哈希算法 Perceptual Hash - phash
  • 图像差异哈希算法 Difference Hash - dhash

我这里是利用差异哈希算法实现的


[+] Source   : origin.png
[+] Part     : middle/00CJwpvuuk.png
[+] Output   : middle.png
[+] ExtColor : #fff
[+] puzzleDiffHash
[+] m = 80, n = 80
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Compare Image
[+] Merge Image
[+] Success! And use 19.097951 s

虽然没能完全还原,但是 secret 已经清晰可见了。

低配 Hell

Meta

  • part size: 16x10
  • number: 25600
  • 干扰直线 * 100 [width=(5, 8)]
  • 干扰曲线 * 100 [width=(5, 8)]
  • 干扰文本 * 30

Solution

解决方案应该不是,毕竟给的图都是高清无码无损大图。挑战难度主要在于验证机器低配,干扰复杂度++,最大干扰线粗细接近碎片高度,碎片数量多。

参考方案

  • 低采样点RGB比对
  • 纯【哈希】和【差异哈希】排除一部分碎片,剩下的用全 RGB 比对

反正我的解决方案是无脑比对全 RGB,逐个选用相似度最高的

[+] Source   : origin.png
[+] Part     : hell/03RVA5m7Pm.png
[+] Output   : hell.png
[+] ExtColor : #fff
[+] puzzleDiffRGB
[+] m = 160, n = 160
[+] Cut and Hash Source Image
[+] Hash Part Image
[+] Compare Image
[+] Finish Compare
[+] Merge Image
[+] Success! And use 104.166225 s

我是在本地跑的

VerifyServer

验证服务跑出的结果

高配 Hell [只是个设想]

么得图

Meta

  • part size: 16x10
  • number: 25600
  • 干扰直线 * 100 [width=(5, 8)]
  • 干扰曲线 * 100 [width=(5, 8)]
  • 干扰文本 * 30
  • 不给原图
  • png -> jpg 有损格式是不是会被吊打

解决方案大概是边界模糊匹配,具体我也不懂啊

Others

大概了解了一下选手们的解决方案。结果我哭了。

选手甲

选手乙

Ending

大佬们都用CUDA,,,我很绝望啊。

我不懂算法、、所以不要吐槽哈、、机器学习???不存在的。


文章来源: http://xz.aliyun.com/t/7002
如有侵权请联系:admin#unsafe.sh