水印情缘,opencv模拟ai人脸欺骗的探赜索隐

lovebet 1

——第二期:关于塑造简单动态眨眼

本身开掘小编好像跟水印有缘。。。。

1、搜求背景

随着人工智能的进步,ai人脸识别已经成为人工智能应用中不得缺点和失误的一有些,各行各业都起来用那几个新生技术,收缩审查批准开销,增添审核功效,然而人工智能终究跟人还是有异样的,因为人工智能的对面部的论断是经过重重算法跟模型磨练,才会进一步正确,所以有不少人为看起来10分假的图,人工智能总结后是能够通过的。

比方说一张人脸,借使是不是是本身人脸的多少个评定标准是:1、人脸跟本身身份证照片相似度达9/10。二、检查实验的人是个活体。满意那多个尺码ai的鉴定即使通过,但是那四个规范化实在都以足以伪造的,比方说找小编的图片,通过才具手腕让眼睛嘴巴动起来,ai就会咬定成活体,并且与作者相似度异常高,因而就通过了,这种情景我们称为ai人脸欺骗。

由此本期的商量就是透过opencv让静态人脸上的眸子动起来,从而模仿照片为自家且是活体的职能,模拟ai人脸诈骗。

记得此前刚学C#最怕图片相关的操作,后来时常和他打交道(经常生活)

二、要求动用的第1方依赖库

V一应该是最后归中举的水印了,项目里面繁多也都是那样搞

OpenCV

OpenCV是1个跨平台的计算机视觉库,是开源的,能够动用在主流操作系统上,举例:Linux、windows、Android和Mac
os操作系统上。它由一名目许多的c函数和少些的c++类构成,同时也提供了Python、Ruby、MATLAB等接口,实现了图像管理和计算机视觉方面包车型地铁过多通用算法。本次的东施东施效颦ai人脸棍骗,主要用的正是以此开源库。

http://www.cnblogs.com/dunitian/p/4939369.html

Pillow 与PIL

PIL:Python Imaging
Library,已经是Python平台事实上的图像管理规范库了。PIL成效相当强劲,但API却分外轻易易用。
由于PIL仅支持到Python
二.7,加二〇一7年久失修,于是一批志愿者在PIL的根底上创建了同盟的本子,名字叫Pillow,帮助最新Python
三.x,又参与了数不完新特征,由此,我们得以一贯设置使用Pillow。

 

三、意况的搭建

V二加多了剪贴板功效,删除了文字水印作用

python版本:2.7

本子信赖库:

当即的新特色:

pip:9.0.1
$brew install pip

单个图片水印

安装pillow:5.0.0
$pip install pillow

lovebet 2

安装pillow-PIL 0.1dev
$pip install pillow

多文件直接水印

numpy 1.14.1
$pip install numpy

此处或然会遇到已经设置numpy一.0.8rc1不可能卸载的问题,请参见链接:
http://blog.csdn.net/hqzxsc2006/article/details/51602654

lovebet 3

OpenCV-python 3.3.0.10
$brew install OpenCV

万一蒙受Permissiondenied安装退步,请加上sudo重试。
除了上述的本子,还亟需1个python编辑器,推荐用pycharm。

亲测在实事求是情况下搭建情形进度相比较麻烦,而且轻巧境遇各样难点。提出通过pycharm搭建一个虚拟意况来得以落成。

网页图片批量转

四、用python达成静态图变动态图

先是附上静图变动图的源码:

#静态图片变动图代码
import os
import numpy
from PIL import Image, ImageDraw
import cv2
left = cv2.imread("/Users/aa/PycharmProjects/untitled1/left.png")
right = Image.open("/Users/aa/PycharmProjects/untitled1/right.png")
classifier = cv2.CascadeClassifier("/Users/aa/PycharmProjects/untitled1/haarcascade_eye.xml")
count = 0
while count > -1:
    img = cv2.imread("/Users/aa/PycharmProjects/untitled1/timg.jpg")
    Face = img[55:136, 170:255]
    eyeRects = classifier.detectMultiScale(img, 1.2, 2, cv2.CASCADE_SCALE_IMAGE, (20, 20))
    key = cv2.waitKey(1)
    if len(eyeRects) > 0:
        for faceRect in eyeRects:
            x, y, w, h = faceRect
            cv2.rectangle(img, (int(x), int(y)), (int(x) + int(w), int(y) + int(h)), (0, 255, 0), 2, 0)
            ex_show=cv2.resize(left,(w,h),interpolation=cv2.INTER_CUBIC)
            #Y1=y+55
            #Y2=(y+h)+55
            #X1=x+170
            #X2=(x+w)+170
            if key == ord('p'):
               #img[ Y1:Y2, X1:X2]=ex_show
               #Face[y:y+h, x:x+w]=ex_show
               img[y:y+h, x:x+w]= ex_show
    cv2.imshow('video', img)
    cv2.resizeWindow('video',1280,720)
    if key == ord('q'):
        break
cv2.destroyAllWindows()

以上内容及代码均基于英特网检索和参考别人的代码,结合自个儿的沉思和领会,自身写的代码,上边内容会分析代码每一句代表的意思以及功能,并且自身也绘制了1部分数学模型图,帮衬大家对眼睛识别及替换的规律有更加深厚的知情。

第二我们初阶入看重库,用它的image跟ImageDraw包来管理图片

import os

import numpy

from PIL import Image, ImageDraw

import cv2

接下来先读取一张主图:

img = cv2.imread("/Users/aa/PycharmProjects/untitled1/timg.png")

格式为:img =
cv2.imread(”文件路线”),暗中同意是彩色的,假使想要青色能够这么设置:img=cv二.imread(“文件路线”,0),前边的参数决定图片的情调。

接下来大家再用:

cv2.imshow('video', img)

来查看图片是不是出示寻常,显示的结果是那样子的:

lovebet 4

34c492850f998791c9c78d0aa34d91fe.png

导入成功,想要眼睛动起来,首先大家得先识别出眼睛所在的区域。那时候能够用2个现有的经过磨练的人眼识别xml扶助,文件名字:haarcascade_eye.xml,这一个xml在英特网也能找到,导入那么些xml并确立3个对象。

classifier = cv2.CascadeClassifier("/Users/dingjingjing058/Downloads/haarcascade_eye.xml")

经过对象调用xml的detectMultiScale函数并且赋值给叁个变量。

eyeRects = classifier.detectMultiScale(img, 1.2, 2, cv2.CASCADE_SCALE_IMAGE, (20, 20))

那条代码的情致,就是在整张图片中,识别出人眼的区域。

detectMultiScale这么些函数的用法笔者就不详细说了,粗略的说一下每贰个参数的意义:

detectMultiScale函数介绍:
参数一:image–待检验图片,一般为灰度图像加速检查测试速度
参数2:objects–被检查实验物体的矩形框向量组;
参数三:scaleFactor–表示在左右一遍相继的扫描中,找寻窗口的百分比全面。默感觉一.1即每一回搜寻窗口依次扩充百分之10;
参数四:minNeighbors–表示结合检查测试对象的隔壁矩形的纤维个数(默感觉二个)。
假使结合检查实验对象的小矩形的个数和小于minneighbors – 1
都会被拔除。如果min
neighbors 为 0,
则函数不做别的操作就回来全体的被检候选矩形框,这种设定值一般用在用户自定义对检查评定结果的组成程序上;
参数5:flags–flags–要么使用暗许值,要么使用CV_HAAR_DO_CANNY_PRUNING,如若设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会利用Canny边缘检测来清除边缘过多或过少的区域,因而这几个区域常常不会是人脸所在区域;
参数陆、柒:minSize和maxSize用来界定获得的靶子区域的限定。

接下来就是把识别出来的人眼区域画3个矩形,画矩形的代码是这么的:

cv2.rectangle(img, ((x1,y1) , (X2,Y2), (0, 255, 0), 2, 0)

个中X一,Y一是矩形的左上角坐标,X二,Y贰是矩形的右下角坐标。依据那么些坐标来绘制三个矩形。

唯独我们怎么遵照人眼识别的点来画矩形呢?用贰个for循环在xml里遍历一下faceRect其壹函数,遍历的代码就这样:

 if len(faceRects) > 0:

    for faceRect in eyeRects:

        x, y, w, h = eyeRect

        cv2.rectangle(img, (int(x), int(y)), (int(x) + int(w), int(y) + int(h)), (0, 255, 0), 2, 0)

兴许相比空虚,我们就以油画2个坐标,原点为右上角的点,图像的宽为x轴,高为y轴,然后画矩形正是用x跟y轴的坐标。

规律图如下,上述代码就会绘制出来上边包车型地铁那幅图。

lovebet 5

87cd3d2523f3558e06736805437a4960.png

下一场我们再来运维后的人眼识别结果,识别成功:

lovebet 6

bf77601b1e7ab5f69900a16614f4196b.png

识假成功之后,怎么把那个静态图片造成2个动态的图纸呢?那时候大家就要求替换矩形内部的图像,首先先把要换图的区域给一定出来,用那某些代码定位:

img[ y:(y + h), x:(x + w)]

那行代码的意趣是把y一=y y2=y+h,x一=x
,X二=x+w,把那四根线重叠的有的给抠出来,如下图威尼斯绿阴影部分:

lovebet 7

e2fcefdc7aac9e352dd09d9a2ab5a861.png

然后再置换来别的一张图片,大家先是导入要替换眼睛有个别的图纸,并让图片适应框的分寸。

ex_show=cv2.resize(left,(w,h),interpolation=cv2.INTER_CUBIC)

下一场把刚刚圈出来的卓殊区域,替换来这张图纸:

img[ y:(y + h), x:(x + w)]=ex_show

lovebet,接下来就水到渠成,效果如下图所示:

lovebet 8

d4ee1ceae2b75072d16159bb4f9d7f6d.png

接下来怎么让这几个图动起来呢,我们就设定按钮盘有些开关的时候,那张图纸才会交替,那样不断按这些按键,图片就成为动图啦。

if key == ord('p'):

          img[ y:(y + h), x:(x + w)]=ex_show

如此壹幅动态识别替换眼睛有个别的动图就完了啦,那样就足以用静态图片不断绝外交关系换眼睛有个别以创设是活体的效应,从而瞒过人工智能。

lovebet 9

五、识别正确度优化的贯彻

上述内容是自家对源码的思量和了然,以下内容是本身在源码的功底上和煦写的局地优化代码,让眼部的辨认更精准。

尽管大家成功的产生了人眼识别并替换其余图片,不过大家都发掘,上海体育场所的鉴定识别部分不太标准,有1对早已辨认到腋下去了,那么大家怎么让识别范围进一步的正确吗?

我的主张正是,框定3个区域,比方说人脸,然后让眼睛识别就在那几个区域内开展,那样的话正确度会大大的提升。

于是乎决定先把人脸局地的坐标先抠出来:

Face = img[55:136, 170:255]

接下来在抠出来的图中间实行遍历,识旁人眼。

if len(faceRects) > 0:

    for faceRect in eyeRects:

        x, y, w, h = faceRect

        cv2.rectangle(Face, (int(x), int(y)), (int(x) + int(w), int(y) + int(h)), (0, 255, 0), 2, 0)

接下来再运维一下,大家开掘早已把矩形正确的固化到眼睛的片段啦。

lovebet 10

f611b7d068c8a40b5ee9470d31fe6c96.png

而是此时我们开采运维程序,会意识替换图片的时候跑偏了。为何会跑偏呢?原来大家在抠出来的图中画矩形的时候,矩形已经不是以全方位图片为原点,而是以抠出来的图的左上角坐标为原点,那时候的x,y是对峙于坐标(55,170)而设置的,再来看我们轮换图片的代码:

img[ y:(y + h), x:(x + w)]=ex_show

可是大家轮换图片的时候,照旧是以原图为参照的,那时候的x,y识别到的
是以原图左上角为原点,x,y为矩形左上角点的部分。那时候大家得把抠出来的图的坐标再还原到原图上,从而识别替换部分的坐标:

lovebet 11

b60bf26acc1f488cf0be97f3ac402845.png

于是替换图片的坐标应该改成这么:

Y1=y+55

Y2=(y+h)+55

X1=x+170

X2=(x+w)+170

if key == ord('p'):

   img[ Y1:Y2, X1:X2]=ex_show

其实还有一种越发简明的方法,没有错就是一贯把替换区域也改成以抠出来的图为参照:

Face[y:y+h, x:x+w]=ex_show       

这般1幅高精度的人眼识别动图就做出来啊!

lovebet 12

2b5aa56c9c578d6a6f395339e3dff2a1.png

那段代码中抠出来的人脸坐标是写死的只是为了更便宜明白它的标准进度,之后能够换到智能人脸识别,先把人脸识别出来,然后把人脸的一部分抠出来再开始展览人眼识别,其实跟上述的原理同样的,只然则把写死的这一个坐标img[55:136,170:255]替换来变量坐标而已。

聊起底,本期只是做四个特意基本的尝试搜求,在那一个进程中也赶过了众多主题材料,情状上,境遇了累累情况搭建的标题,比如说设置了未来依旧鞭长莫及导入image跟imageview的包,最终通过搭建虚拟情状解决了难题,举例人眼识别不太精准总是识别到其余东西。那期做的只是一个格外轻便的人眼识别然后替换的兑现,早先时期会尝试完成人眼蒙版过渡得更自然-接近于真实人眼的睁眼闭眼的上行下效,然后让识别尤其的正确,不会识别到其余地点。中期会尝试加上嘴巴的甄别,让静态图片的嘴巴达成动态张闭,以及静态图摇头的机能的得以完成。

word文档图片批量转

lovebet 13

剪贴板图片水印

lovebet 14

自动化配置,针对天涯论坛编辑器的剪贴板水印等

http://www.cnblogs.com/dunitian/p/5377097.html

 

V三变态水印。铺满+浅背景黑水印,暗背景浅水印

http://www.cnblogs.com/dunitian/p/5895133.html

V3引进了异步效能。是帮朋友设计的,Ta在婚纱拍录职业,每日加水印消耗大批量时日,我编了这一个软件之后,Ta每一天只要点一下,全体下班

像这么的:

lovebet 15lovebet 16

 

这样的

lovebet 17lovebet 18

 

 

作者以为事情如同此停止了,可是。。。。

有一天Ta的上司看见了,哟,软件真方便,点一下就好了啊~~

下一场建议了多少个一贯不曾过的需求==》水印不许加脸上!

 

他们都手工业达成,不加脸上反而省了光阴。。。

于是乎朋友有苦命的手工业水印水印。。。

 

于是乎~~V多少人脸识别版本出现了

 

事先自个儿用的是Face++,有免费版本的,后来自己很多都规划好模型和算法了

lovebet 19

用起来开采===》

lovebet 20

免费版的您调用速度给您卡的凝固的,非得逼你花钱,而且1柒遍调用陆遍直接系统繁忙!笔者去

lovebet 21

lovebet 22
正确度也就一般般:另壹个人吗?

lovebet 23

你感到她们是1个女子拍婚纱?

lovebet 24

借使用Face++的自身得以提供多少个key:

4a7evRnYJprlIlOyIbVmrXQpOHxaryUH
TWkJ8ONzLHGftTooYvO51oyfLyc4hHaf

APIURL:apicn.faceplusplus.com

7b1b47699e1e4834b4e5cc6d5da24964
N5U-S2MJAy6ikL5ghj3bGhgc-ozg0MqQ

0df565d6e2a56d30a100686779ada46f
hO1Ox6df2oym7QKBb562_VRywxwHBj6d

0ef14fa726ce34d820c5a44e57fef470
4Y9YXOMSDvqu1Ompn9NSpNwWQFHs1hYD

 

新生想起来几年前本身在C#吧写的一篇文章,是介绍微软的人脸识别

下一场作者又翻了翻:

第2是那多个地方:

https://dev.projectoxford.ai/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236

lovebet 25

https://www.microsoft.com/cognitive-services/zh-cn/subscriptions

lovebet 26

在线调试

https://dev.projectoxford.ai/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236/console

 

废话不多说了,说下主见,因为急用,所以盘算先弄第壹个本子(有越来越好思路能够说一下)

首先个版本==》平衡Key算法,获得坐标后先把人脸抠出来,水印实现后再贴上去

其次个版本==》进步速度,大图就先缩略图,然后上传,获得关键点按百分比求出真实坐标

其叁本子==》一套算法来得以达成一点差异也没有水印

 

过一段时间你就看见了~~~先睡觉,养精神,前几日早起职业~

 

相关文章