taoCMS-基于php+sqlite最小巧的CMS http://www.taocms.org/ taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善的CMS管理系统 2021-10-26 taoCMS-基于php+sqlite最小巧的CMS 1239 Openconnect VPN 服务端 ocserv 的部署

ocserv(Openconnect VPN Server)是一款开源的、兼容Cisco Anyconnect VPN的VPN服务端软件。由于思科在网络设备中的特殊地位,思科的V...
 
 
ocserv(Openconnect VPN Server)是一款开源的、兼容Cisco Anyconnect VPN的VPN服务端软件。由于思科在网络设备中的特殊地位,思科的VPN一直未被特殊照顾(其实这个VPN握手过程特征应该是较为明显的)。目前状况下通讯较为稳定,干扰较小。主要优势是多平台的支持,Windows、Android、iOS都能找到它的客户端。往往可以作为shadowsocks等代理的补充。
下面简要介绍一下部署过程,以在Ubuntu系统中的部署为例。

主页: http://www.infradead.org/ocserv/

下载页面: ftp://ftp.infradead.org/pub/ocserv/

首先在上面的下载页面中找到最新的Release后使用wget下载并解压:

Shell

wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.9.2.tar.xz
tar -Jxvf ocserv-0.9.2.tar.xz
cd ocserv-0.9.2必选依赖包:

Shell

apt-get install libgnutls28-dev可选依赖包:

Shell

apt-get install pkg-config libwrap0-dev libpam0g-dev liblz4-dev libseccomp-dev libreadline-dev libnl-route-3-dev编译工具:

apt-get install build-essential autogen编译安装:

Shell

./configure && make
make install接下来是配置,建立

/ etc / ocserv

文件夹来存储相关的配置文件:

1. 下载下来的ocserv中的

doc 文件夹中有 sample . config 这一例子文件,将其拷贝至 / etc / ocserv
,命名为

ocserv . conf

,用来存储ocserv的配置信息;

2. 新建

/ etc / ocserv / ocpasswd

文件用来存储用户名密码

3. 将PEM格式的服务器证书,存储至

/ etc / ocserv / server - cert . pem

文件中(包含证书链中的中级证书)

4. 将PEM格式的服务器私钥,存储至

/ etc / ocserv / server - key . pem

文件中

5. 将PEM格式的根证书,存储至

/ etc / ocserv / ca - cert . pem

文件中

(PS:想要客户端连接没有证书错误提示的,可以试试使用StartSSL的免费证书。)

接着修改

/ etc / ocserv / ocserv . conf

文件:

设置认证方式为plain,存储文件改成刚才设置的

/ etc / ocserv / ocpasswd

文件:

auth = "plain[/etc/ocserv/ocpasswd]"可以修改允许同时连接的最大客户端数:

max-clients = 16同一个账号能连接的最大客户端数:

max-same-clients = 2修改ocserv使用的端口(客户端连接时候不填写端口的话默认使用443 使用非443端口时候,服务器填写:域名:端口号 这样的形式):

tcp-port = 443
udp-port = 443修改服务器证书和私钥配置:

server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/server-key.pem修改根证书配置:

ca-cert = /etc/ocserv/ca-cert.pem建议将dpd和cookie-timeout改大,避免客户端网络波动时候总是掉线以及无法及时自动重连:

dpd = 600
cookie-timeout = 32400配置VPN子网的的网段:

ipv4-network = 10.250.250.0
ipv4-netmask = 255.255.255.0配置DNS服务器:

dns = 8.8.8.8
dns = 8.8.4.4将其他私有地址排除,不路由:

no-route = 192.168.0.0/255.255.0.0
no-route = 172.16.0.0/255.240.0.0
no-route = 169.254.0.0/255.255.0.0
no-route = 127.0.0.0/255.0.0.0添加自启动,下面给出一个init.d脚本的sample,放到

/ etc / init . d / ocserv

并给上755权限:

点击展开全部内容

配置自启动,使用update-rc.d命令:

Shell

update-rc.d ocserv defaults启动:

service ocserv start添加用户,例:用户名testuser,密码test,用户组vpnusers:

ocpasswd -c /etc/ocserv/ocpasswd -g vpnusers vpnuser然后连续两次键入密码即可。

修改

/ etc / sysctl . conf

打开ipv4_forward:

net.ipv4.ip_forward = 1执行以下命令使其生效:

Shell

sysctl -p配置iptables转发,注意和前面配置的网段保持一致:

Shell

iptables -A FORWARD -s 10.250.250.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.250.250.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -o vpns+ -j ACCEPT
iptables -A FORWARD -i vpns+ -j ACCEPT

]]>
taoCMS-基于php+sqlite最小巧的CMS 2021-10-05 02:10:02
1238 人脸识别中的活体检测
早在指纹识别应用中就有针对于活体手指的检测技术,即使机器只对真人活体指纹产生识别反应,对其他一切物质不作识别,用于指纹识别产品如考勤机、门禁系统等。活体指纹识别的原理比较简单:如识别皮肤的温度、人体皮肤的电容值等。

本文主要是针对人脸识别应用中出现的人脸活体检测做简要调研及论述。有关人脸检测相关内容可以参考我的另一篇文章——人脸检测与深度学习 传送门~知乎专栏

引言——人脸识别技术迈向更高层次的一大障碍:活体检测

随着线上支付的不断普及,相关的人脸识别等技术正在中国不断进步。近日,麻省理工科技评论评出全球十大突破技术,其中由“刷脸支付——Paying with Your Face”榜上有名。

技术突破:人脸识别技术如今已经可以十分精确,在网络交易等相关领域已被广泛使用。

重大意义:该技术提供了一种安全并且十分方便的支付方式,但是或许仍存在隐私泄露问题

目前基于深度学习的发展,我认为还有一个问题就是存在被伪造合法用户人脸的攻击的风险。

——————————————- 更新补充分割线 ————————————————

评论区有问到这方面的开源代码,我这边没有仔细找过,在github找了一些相关代码,没有验证过,汇总了一下希望对大家有帮助:

1.C++代码 github.com/allenyangyl/

2.github.com/rienheuver/f

3.github.com/OeslleLucena

4.论文Person Specific Face Anti-Spoofing with Subject Domain Adaptation 对应的代码——github.com/jwyang/Perso

5.github.com/zboulkenafet

6.论文Face anti-spoofing based on color texture analysis基于颜色纹理分析的代码——github.com/zboulkenafet

7.github.com/pp21/Guided-

8.3d头套的github.com/Marco-Z/Spoo

9.github.com/number9473/n

10.下文中提到的几个数据库的下载链接:github.com/number9473/n

11.活体检测在人脸识别系统中处于的位置,大部分现有的系统是没有活体检测的:

12.文中文献[11]的基于图像失真特征提取分析的活体检测的整体框架图:

(15年4月TIFS的提出一种基于图像失真分析(IDA)的人脸活体检测方法。IDA特征向量分别由镜面反射(打印纸张或者LCD屏幕3维)、模糊程度(重采集—散焦2维)、图像色度和对比度退化(对比度失真15维)、颜色多样性(打印机或LCD颜色分辨率有限等101维)四种典型特征组成(121维向量),通过输入基于SVM的集成分类器(ensemble classfier),训练分类出二值真伪结果(voting scheme——用于判断视频攻击的情况,超过50%帧数为真即认定为活体))

其他一些有意思的参考

1.github.com/4x7y/FakeIma

2.github.com/waghaoxg/whx

——————————————— 以下正文 ——————————————————

和指纹、虹膜等生物特征相比,人脸特征是最容易获取的。人脸识别系统逐渐开始商用,并向着自动化、无人监督化的趋势发展,然而目前人脸识别技术能识别人脸图像的身份但无法准确辨别所输入人脸的真伪。那么如何自动地、高效地辨别图像真伪抵抗欺骗攻击以确保系统安全已成为人脸识别技术中一个迫切需要解决的问题。

通常意义上的活体检测是当生物特征信息从合法用户那里取得时,判断该生物信息是否从具有生物活体的合法用户身上取的。活体检测的方法主要是通过识别活体上的生理信息来进行,它把生理信息作为生命特征来区分用照片、硅胶、塑料等非生命物质伪造的生物特征。

人脸识别技术面临着三种欺诈手段:

下面通过学术论文、专利发明和企业研发等三方面进行调查:

(一) 学术论文方面

人脸活体检测的学术研究机构主要有中科院自动化所李子青团队、瑞士IDAIP研究室高级研究员Sebastien Marcel主导的Biometrics group、英国南安普顿大学机器视觉系教授Mark S. Nixon所属的视觉学习与控制研究组和国际生物特征识别著名专家Anil K. Jain所在的密歇根州立大学生物特征识别研究组。近些年上述机构所著的关于活体检测的高质量文章陆续发表在IEEE TIFS/TIP等一些顶级期刊,同时Springer于2014年出版了由Sebastien Marcel等编著的《Handbook of Biometric Anti-Spoofing》,书中深入介绍了指纹、人脸、声音、虹膜、步态等生物特征识别反欺骗的方法,还对涉及的性能评估指标、国际标准、法律层面、道德问题等作了阐述,为生物特征识别反欺骗技术的进一步发展作出重要贡献。

1. 综述文献[1]将活体检测技术分为运动信息分析、纹理信息分析、活体部位分析三种,文中讨论了基于真伪图像存在的非刚性运动、噪声差异、人脸背景依赖等特性形成的分类器性能。

2. 文献[2]介绍了一个公开的人脸活体检测验证数据库(PHOTO-ATTACK),在数据库(PRINT-ATTACK)的基础上进行了扩展,添加移动手机拍摄照片和高分辨率屏幕照片。同时文中提出了一种基于光流法的前后景相关性分析来辨别影像真伪,取得较好的性能。

3. 文献[3]针对多生物识别欺骗稳健性的提高,提出一种异常检测新技术,首先通过中值滤波器来提高传统集成方法中求和准则的容差,再通过一种基于bagging策略的检测算法提高检测拒绝度,该算法融合了2D-Gabor特征、灰度共生矩阵(GLCM)多种特征、傅里叶变换的频域信息,特征提取后得到3种特征向量,使用主成分分析(PCA)降维选取形成混合特征,输入bagging分类器并获得检测结果,实验表明算法具有较高准确性。

4. 文献[4]提出一种基于颜色纹理分析的活体检测算法,通过LBP描述子提取联合颜色(RGB、HSV和YCbCr)纹理信息来表征图像,将信息输入SVM分类器进行真伪辨别。

5. 14年TIP的文献[5]提出一种基于图像质量评价的方法来增强生物特征识别的安全性,使用25种图像质量分析指标(列出较关键的几个有:像素差异性分析、相关性分析、边缘特征分析、光谱差异性、结构相似性、失真程度分析、自然影像估计),该方法只需要一张图片就可以区别真伪,适用于多种生物特征识别场合,速度快,实时性强,且不需要附近设备及交互信息。

6. 14年12月发表在TIFS的文献[6]提出一种反欺骗能力评估框架—Expected Performance and Spoofability (EPS)Framework,针对现有反欺骗系统作性能评估,创新性地指出在一定条件下验证系统将失去二值特性转变为三类:活体合法用户、无用攻击者(zero-effort)和欺骗攻击者,EPS框架主要通过测量系统期望达到的FAR(错误接受无用率)和SFAR(错误接受欺骗率)及两者之间的范围,同时考虑系统被欺骗的成本和系统存在的弱点,并量化为单一的值用来评价系统优劣。

7. 15年5月发表在TIFS的文章[7]针对视频回放攻击提出一种基于visual rhythm analysis的活体检测方法,文中指出:由于静态背景易获得,基于背景的方法显得容易被破解;利用照片的旋转和扭曲也可以轻易模拟并欺骗基于光流法的活体检测系统;当攻击视频包含头部、嘴唇、眼睛等动作可以容易通过基于运动交互的系统;文中对傅里叶变换后的视频计算水平和垂直的视觉节奏,采用三种特征(LBP、灰度共生矩阵GCLM、HOG)来对visual rhythm表征与降维,利用SVM分类器和PLS(偏最小二乘)来辨别视频真伪。

8. 15年4月TIFS的文章[8]提出一种基于局部纹理特征描述子的活体检测方法,文中将现有的活体检测方法分为三类:动态特征分析(眨眼)、全局特征分析(图像质量)和局部特征分析(LBP、LBQ、Dense SIFT)。提出的方法对一系列特征向量进行独立量化或联合量化并编码得到对应的图像标量描述子,文中实验部分给出不同局部特征对应的性能。

9. 15年8月TIP的文章[9]在面向手机端的人脸识别活体检测的需求,根据伪造照片相对于活体照片有光照反射特性呈现出更加均衡扩散缓慢的特点,提出一种基于图像扩散(反射)速度模型(Diffusion Speed Model)的活体检测方法,通过引入全变差流(TV)来获得扩散速度,在得到的扩散速度图基础上利用LSP编码(类似LBP)获取的局部速度特征向量作为线性SVM分类器的输入,经分类区分输入影像的真伪。

10. 15年12月TIP文献[10]提出一种基于码本(codebook)算法的新型人脸活体检测方法,根据重采样导致伪造影像出现的条带效应和摩尔纹等噪声现象,文中通过三个步骤来完成分类,第一步:计算视频噪声残差,通过将原始视频和经高斯滤波以后的视频作残差得到噪声视频,再对其作二维傅里叶变换得到频域信息,可以看到伪造视频的幅度谱和相位谱中呈现出明显的摩尔纹及模糊等区别,计算得到相关时频描述子。第二步通过码本算法迭代选取最能表示的descriptor,经过编码将这些描述子转化成新的矩阵表示(矩阵不能直接拿来分类),故用池化(pooling)方法(列求和或取最大值)得到输入向量。第三步利用SVM分类器或PLS(偏最小二乘)对输入向量分类判断其真伪。

11. 15年4月TIFS的文献[11]提出一种基于图像失真分析(IDA)的人脸活体检测方法,同时给出了一个由多种设备采集的人脸活体检测数据库(MSU-MFSD)。IDA特征向量分别由镜面反射(打印纸张或者LCD屏幕3维)、模糊程度(重采集—散焦2维)、图像色度和对比度退化(对比度失真15维)、颜色多样性(打印机或LCD颜色分辨率有限等101维)四种典型特征组成(121维向量),通过输入基于SVM的集成分类器(ensemble classfier),训练分类出二值真伪结果(voting scheme——用于判断视频攻击的情况,超过50%帧数为真即认定为活体)。

12. 几种公开的人脸活体检测数据库:

(二)专利发明方面

对于以研发产品为主的公司来说,用户的体验是检验产品成功的最重要的标准之一。下面从用户的配合程度来分类人脸活体检测技术。

(1) 根据真人图像是一次成像的原理,其比照片包含更多的中频细节信息,专利1[12]首先采用DoG滤波器获取图像信息中的中频带信息,然后通过傅里叶变换提取关键特征,最后通过logistic回归分类器对提取和处理后的特征信息辨析和分类,已达到所识别的图像为真实人脸还是照片人脸的目的。优点:不添加额外的复制设备、不需要用户的主动配合、实现简单、计算量小且功能独立;缺点:采集的正反样本要全面,只针对照片。

(2) 专利2[13]是通过检测人脸的眼睛区域是否存在亮瞳效应来区分真实人脸和照片视频中的人脸。亮瞳效应的判断是利用亮暗瞳差分图像的眼睛区域是否存在圆形亮斑而定。另外,采集亮瞳图像所涉及的设备包括红外摄像头和由LED灯做成的红外光源。优点:照片和视频都可以,使可靠性增加;缺点:需额外的设备。

(3) 专利3[14]利用共生矩阵和小波分析进行活体人脸检测。该方案将人脸区域的灰度图像首先进行16级灰度压缩,之后分别计算4个灰度共生矩阵(取矩阵为1,角度分别为0。、45。、90。、135。),然后在灰度共生矩阵的基础上再提取能量、熵、惯性矩和相关性四个纹理特征量,再次分别对四个灰度共生矩阵的4个纹理特征量求均值和方差;同时对原始图像利用Haar小波基进行二级分解,提取子带HH1,HH2的系数矩阵后求均值和方差;最后将所有的特征值作为待检测样本送入训练后的支持向量机中进行检测,分类识别真实和假冒人脸图像。优点:不需添加额外的辅助设备、不需要用户降低了计算复杂度,提高了检测准确率;缺点:只针对照片欺骗。

(4) 专利4[15]是一种基于HSV颜色空间统计特征的人脸活体检测方法,该方案将人脸图像从RGB颜色空间转换到YCrCb;然后进行预处理(肤色分割处理、去噪处理、数学形态学处理和标定连通区域边界处理)后获取人脸矩形区域的坐标;再对待检测的人脸图像分图像块,并获取待检测的人脸图像中的左右图像块的三个颜色分量的特征值;最后将归一化的特征值作为待检测样本送入训练好的支持向量中进行检测,确定包含人脸的图像是否为活体真实人脸图像。优点:不需添加额外的辅助设备和用户的主动配合,降低了人脸认证系统延时和计算复杂度,提高了检测准确率;缺点:只针对照片欺骗,阈值的设置为经验值。

(5) 专利5[16]使用的活体识别方法为通过摄像头在一定时间内拍摄多张人脸照片,预处理后提取每张照片的面部本特征信息,将先后得到的面部特征信息进行对比分析获取特征相似度,设置合理阈值,若相似度在阈值范围内,则认为有微表情产生,识别为活体,否则为非活体。优点:不需要人脸部做大量的表情配合动作;缺点:只针对照片欺骗。

(6) 专利6[17]主要基于人脸3D模型对所述人脸形状进行归一化处理,并获得所述人脸形状相对于人脸3D模型的旋转角度,将连续多帧图像的旋转角度连成一条曲线,判断该曲线是否满足设定要求,若满足,判断角度最大的一帧图像中人脸肤色区域面积比例是否大于K,若是,则判断为真实人脸,否则为虚假人脸。优点:误报率降低,速度快,用户体验好;缺点:需较大的计算时间和空间开销。

(7) 专利7[18]公开一种基于背景比对的视频和活体人脸的鉴别方法。首先对输入视频的每一帧图像进行人脸位置检测,很据检测出的人脸位置确定背景比对区域;然后选取输入视频中和背景比对区域在尺度空间上的极致点作为背景比对区域的特征点,得到背景特征点集Pt;再用Gabor小波变换描述图像I在背景特征点集Pt的特征,根据此结果定义活体度量L;如果活体度量L大于阈值θ,判断为活体,否则视为假冒视频。优点:解决仅通过单个摄像头进行视频人脸和活体人脸的计算机自动鉴别问题,不需用户配合,实时性较好;缺点:只针对视频欺骗。

(8) 专利8[19]提供了一种具有活体检测功能的双模态人脸认证方法。首先建立存储有已知身份人脸的可见光训练图像和近红外外训练图像的数据库;然后通过图像采集模块同时采集待认证人头部的可见光图像和近红外图像;采用人的脸部的人脸近红外图像与人脸可见光图像双模态特征的联合识别。优点:提高了识别认证精度,有效避免人脸存在较大变化情况下识别失败的问题,避免照片或者模型欺骗;缺点:需红外设备。

(9) 为更好地防止活体检测中的照片和视频剪辑方式等欺诈行为,专利9[20]不同之处在于,用户并不知道系统发出何种指令,要求用户做出何种动作,而且用户实现也并不知晓系统要求的动作完成次数。原因在于,预先定义了一个动作集(包括眨眼、扬眉、闭眼、瞪眼、微笑等),用户在进行活体检测时,系统每次都从动作集中选择一种或若干种动作,随机指定完成动作的次数,要求用户在规定的时间内完成它们。优点:更好地防止活体检测中的照片和视频剪辑方式等欺骗行为,活性检测的可靠性和安全性更高;缺点:需用户主动配合,容易受外部环境影响。

(10) 专利10[21]主要利用人脸面部运动和生理性运动来判断是照片还是真实人脸。人脸检测结果框内的人脸面部运动是在眼睛和嘴附近进行判断,依据运动区域中心坐标和人脸的眼睛的位置坐标之间,以及和嘴的位置坐标之间的欧式距离是否小于预定阈值。确定人脸生理性运动是根据运动区域内的运动方向为垂直方向的原理。优点:可靠性提高;缺点:只针对照片欺骗。

(11) 专利11[22]根据光流场对物体运动比较敏感,而真实人脸的眼部在姿势校正和眨眼过程中又比照片产生更大的光流,利用LK算法计算输入视频序列中相邻两帧的光流场,求得光流幅值,得到幅值较大的像素点数所占的比重,若比例足够大则标定为眼部发生了运动,从而判定为真实人脸。优点:系统的隐蔽性和安全性增强。缺点:只针对照片欺骗。

(12) 专利12[23]也是定位眼睛和嘴巴区域。根据采集的图片帧数(包含面部中眼睛和嘴巴等关键点)和特征平均差异值(由采集的两帧图片对应的特征值的加权欧式距离获得)的计算次数与预设值的比较,以及平均差异值与阈值的比较来判定是否为真实人脸。优点:解决了采用三维深度信息进行人脸活体检测时,计算量大的问题,以及应用场景约束的情况。

(13) 专利13[24]公开一种活体人脸的快速识别方法,其方案为:首先输入连续的人脸图像(若相邻两幅人脸图像不为同一状态则予以丢弃,重新多幅连续的人脸图像),对每幅人脸图像确定瞳孔位置并裁出人眼区域;然后通过支持向量机训练方法和AdaBoost训练方法对睁眼和闭眼样本进行训练,最后判断眼珠睁闭状态,若存在眨眼过程则通过活体判别。优点:有效拒绝非真实人脸欺骗识别,计算速度提高,不受应用场景的约束;缺点:需用户主动配合。

(14) 专利14[25]通过判断连续多帧图像中所获的眼睛或嘴巴区域的属性变化值(上眼皮的距离变化值或上下嘴唇间的距离变化值)的规律是否符合真实人脸的变化规律,若是,则判断为真实人脸,否则为虚假人脸。所采用的技术核心:将当前帧与前t帧的眼睛或嘴巴区域合并成一张图,采用基于深度学习的回归方法输出两帧图像中属性变化值,重复该步骤直至获得每帧图像的属性变化值;将所有属性变化值按帧时间顺序组成一向量,对各向量的长度进行设定,然后利用SVM分类器对所述向量进行分类,再判断分类结果是否满足设定动作下的真实人脸的变化规律。优点:检测精度高、速度快,针对照片和视频欺骗;缺点:需用户主动配合。

(15) 专利15[26]是通过眨眼动作进行活体检测。首先对人脸检测与眼睛定位;然后眼部区域截取,从归一化处理后的图像中图像中计算眼睛的开合程度;运用条件随机场理论建立用于判断眨眼动作的模型。优点:可仅通过单个摄像头进行鉴别;缺点:需用户主动配合,只针对照片欺骗。


(三)企业研发应用方面

对支付宝人脸登陆系统的活体检测功能进行了实际测试(iphone5S,支付宝最新版本9.5.1,人脸识别和活体检测模块是独立的,其活体检测只有采用了眨眼模式,之前还有点头),检测结果如下:

结论:

1.根据调查结果的实际应用技术,针对三种主要的欺骗手段,目前有以下几种应用广泛的活体检测方法:

2.从用户配合、对光照影响、是否需要附加设备、抵挡攻击、用户体验等方面对比了人脸识别系统中活体检测应用较多的7类具体方法,形成下表:

3.随着人脸识别系统的发展和演进,综上所述,研究开发一种新型高效鲁棒性好的人脸活体检测技术应该满足以下几个条件:

在线实时处理。活体检测过程应与人脸识别同时进行,越来越多的移动端需求给实时性提出越来越高的要求;

受光照等外界影响小。人脸识别验证系统的应用面临着许多场景,活体检测技术应满足多场景、多终端应用的要求,鲁棒性强;

用户界面自然,交互少,欺骗代价高。基于运动等的检测方法对用户来说,增加一系列的交互操作,不仅复杂度增加,可能需要附加的硬件设备支撑,所以新型的活体检测技术应该具有良好的用户体验,同时使得欺骗攻击的代价尽可能的高,保证安全性;

对欺骗有着优异的检测能力,同时对人脸识别特征提取起辅助作用。基于纹理或图像特征的活体检测方法是未来的主要趋势,那么这些特征的提取和分类同样能给人脸识别带来益处。

4.一种可行的人脸活体检测框架:根据总结发现,纯粹的基于和(sum-rule)的理念可能并不适合活体检测,就好比“木桶效应”,伪造攻击只要抓住了短板,一样可以破解大部分基于sum-rule的方法。一种较好的方法是与此对应的多层次结合的概念,结合文献5、8、10、11所述的相关图像特性,可以着眼于图像全局特性分析(质量)和局部特性分析(LBP等)相结合。


参考文献

[1] O. Kahm and N. Damer, “2d face liveness detection: An overview,” inb Biometrics Special Interest Group (BIOSIG), 2012 BIOSIG-Proceedings of the International Conference of the. IEEE, 2012, pp. 1–12.

[2] A. Anjos, M. M. Chakka, and S. Marcel, “Motion-based countermeasures to photo attacks in face recognition,” IET Biometrics, vol. 3,no. 3, pp. 147–158, 2013.

[3] Wild P, Radu P, Chen L, et al. Robust multimodal face and fingerprint fusion in the presence of spoofing attacks[J]. Pattern Recognition, 2016, 50: 17-25.

[4] Boulkenafet Z, Komulainen J, Hadid A. face anti-spoofing based on color texture analysis[C]//Image Processing (ICIP), 2015 IEEE International Conference on. IEEE, 2015: 2636-2640.

[5] Galbally J, Marcel S, Fierrez J. Image quality assessment for fake biometric detection: Application to iris, fingerprint, and face recognition[J]. Image Processing, IEEE Transactions on, 2014, 23(2): 710-724.

[6] Chingovska I, Rabello dos Anjos A, Marcel S. Biometrics evaluation under spoofing attacks[J]. Information Forensics and Security, IEEE Transactions on, 2014, 9(12): 2264-2276.

[7] Pinto A, Robson Schwartz W, Pedrini H, et al. Using visual rhythms for detecting video-based facial spoof attacks[J]. Information Forensics and Security, IEEE Transactions on, 2015, 10(5): 1025-1038.

[8] Gragnaniello D, Poggi G, Sansone C, et al. An investigation of local descriptors for biometric spoofing detection[J]. Information Forensics and Security, IEEE Transactions on, 2015, 10(4): 849-863.

[9] Kim W, Suh S, Han J J. Face Liveness Detection From a Single Image via Diffusion Speed Model[J]. Image Processing, IEEE Transactions on, 2015, 24(8): 2456-2465.

[10] Pinto A, Pedrini H, Robson Schwartz W, et al. Face Spoofing Detection Through Visual Codebooks of Spectral Temporal Cubes[J]. Image Processing, IEEE Transactions on, 2015, 24(12): 4726-4740.

[11] Wen D, Han H, Jain A K. Face spoof detection with image distortion analysis[J]. Information Forensics and Security, IEEE Transactions on, 2015, 10(4): 746-761.

[12] 李冀,石燕,谭晓阳.一种应用于人脸识别的活体检测方法及系统:中国,101999900.2013-04-17.

[13] 秦华标,钟启标.基于亮瞳效应的人脸活体检测方法:中国,103106397.2013-05-15.

[14] 毋立芳,曹瑜,叶澄灿等.一种基于灰度共生矩阵和小波分析的活体人脸检测方法:中国,103605958.2014-02-26.

[15] 严迪群,王让定,刘华成等.一种基于HSV颜色空间特征的活体人脸检测方法:中国,103116763.2013-05-22.

[16] 傅常顺,杨文涛,徐明亮等.一种判别活体人脸的方法:中国,104361326.2014-02-18.

[17] 陈远浩.一种基于姿态信息的活体检测方法:中国,104794465.2015-07-22.

[18] 潘纲,吴朝晖,孙霖.基于背景比对的视频和活体人脸的鉴别方法:中国,101702198.2011-11-23.

[19] 徐勇,文嘉俊,徐佳杰等.一种活体检测功能的双模态人脸认证方法和系统:中国,101964056.2012-06-27.

[20] 王先基,陈友斌.一种活体人脸检测方法与系统:中国,103440479.2013-12-11.

[21] 丁晓青,王丽婷,方驰等.一种基于人脸生理性运动的活体检测方法及系统:中国,101159016.2008-04-09.

[22] 马争鸣,李静,刘金葵等. 一种在人脸识别中应用的活体检测方法:中国,101908140.2010-12-08.

[23] 黄磊,任智杰. 一种人脸活体检测方法及系统:中国,103679118.2014-03-26.

[24] 彭飞. 一种活体人脸的快速识别方法:中国,103400122.2013-11-20.

[25] 陈元浩. 一种基于相对属性的活体检测方法:中国,104794464.2015-07-22.

[26] 吴朝晖,潘纲,孙霖. 照片人脸与活体人脸的计算机自动鉴别方法:中国,100592322.2010-02-24.

https://zhuanlan.zhihu.com/p/25401788
]]>
taoCMS-基于php+sqlite最小巧的CMS 2021-08-14 20:08:26
1236 架构师必须知道的架构设计原理

一、前言

如果一个技术已经存在3年,比如现在很火的前端技术react和vue等,那么我能预估这个技术大致还有3年的生命期,再久就不确定了;如果一个架构或设计原则已经存在15年,例如单一职责和依赖倒置原则,我可以预期它还有15年甚至更久的生命期。原则是比具体技术更抽象,更接近事物本质,也更经得起时间考验的东西。这些原则沉淀在架构师的脑海中,最终内化成他的mindset,以潜意识方式影响和指导他的架构和设计工作。

一晃我在软件研发行业工作十多个年头了,前面大部分时间做架构设计和开发,现在转型做研发管理。随着时间的推移,很多技战术细节性的东西(工具,框架,编程语言)在我脑海中渐渐模糊,但是一些平时学习积累起来,并且在实践中加深体会的软件架构设计和组织原则,这些原则性的东西却丝毫没有被时间冲淡,反而愈加清新。现在即使我不在一线开发,但这些沉淀下来的原则仍然潜移默化地影响我的日常管理和部分架构设计指导工作。我想有必要总结一下那些业界知名,给我留下深刻印象的软件架构设计和组织原则,和大家一起分享。

二、软件设计原则

GRASP通用职责分配软件模式

来自Craig Larman的软件设计书《UML和模式应用》[附录1],Larman在书中提出软件设计的关键任务是职责分配,并提炼总结出9种(5种核心+4种扩展)软件职责分配模式,这些模式是比GoF设计模式更抽象的元模式。

1. 信息专家(Information Expert)

为对象分配职责的通用原则 – 把职责分配给拥有足够信息可以履行职责的专家

2. 创建者(Creator)

将创建A的职责赋给B,如果至少下面一种情况为真:

  • B“包含”或者聚合A

  • B记录A的实例

  • B密切地使用A

  • B拥有A的初始化数据

3. 低耦合(Low Coupling)

赋予职责使得对象间的耦合度尽可能低,最小化对象间的依赖和变更影响,最大化重用。

4. 高内聚(High Cohesion)

赋予职责使得每个对象的职责尽可能保持聚焦和单一,易于管理和理解。

5.控制器(Controller)

把职责赋予系统、设备或者子系统的表示类(门面控制器),或者某个用例的表示类(用例控制器),让控制器接收事件并协调整个系统的运作。

6. 多态(Polymorphism)

将职责分配给多个具有同名方法的多态子类,运行时根据需要动态切换子类,让系统行为变得可插拔。

7. 纯虚构(Pure Fabrication)

针对真实问题域中不存在,但是设计建模中有用的概念,设计虚构类并赋予职责。

8. 间接(Indirection)

在两个或者多个对象间有交互的情况下,为避免直接耦合,提高重用性,创建中间类并赋予职责,对象的交互交由中间类协调。

9. 受保护的变化(Protected Variation)

简单讲就是封装变化。识别系统中可能的不稳定或者变化,在不稳定组件上创建稳定的抽象接口,将可能的变化封装在接口之后,使得系统内部的不稳定或者变化不会对系统的其它部分产生不良影响。

SOLID面向对象设计原则

1. 单一职责原则(The Single Responsibility Principle)

修改某个类的理由应该只有一个,如果超过一个,说明类承担不止一个职责,要视情况拆分。

图片

2. 开放封闭原则(The Open Closed Principle)

软件实体应该对扩展开放,对修改封闭。一般不要直接修改类库源码(即使你有源代码),通过继承等方式扩展。

图片

3. 里氏替代原则(The Liskov Substitution Principle)

当一个子类的实例能够被替换成任何超类的实例时,它们之间才是真正的is-a关系。

图片

4. 依赖倒置原则(The Dependency Inversion Principle)

高层模块不应该依赖于底层模块,二者都应该依赖于抽象。换句话说,依赖于抽象,不要依赖于具体实现。比方说,你不会把电器电源线焊死在室内电源接口处,而是用标准的插头插在标准的插座(抽象)上。

图片

5. 接口分离原则(The Interface Segregation Principle)

不要强迫用户去依赖它们不使用的接口。换句话说,使用多个专门的接口比使用单一的大而全接口要好。

图片

我的解读

  1. 我职业早年主要关注软件设计和编程,所以花蛮多时间学习和消化GRASP和SOLID设计原则。这些原则对我影响很深,尤其是单一职责,信息专家,关注分离,依赖倒置/封装变化,分而治之等核心原则,现在日常研发中我时常用这些原则指导新手工程师。

  2. 高内聚+低耦合,就像道中的一阴一阳,是所有其它OO设计原则的原则(元原则),其它设计原则都是在这两个基础上泛化衍生出来的。

  3. 上述原则虽然是针对OO设计和编程提出,但是对于大规模系统架构仍然适用。比如,微服务架构就体现了:

    • 单一职责:一个微服务尽可能要职责单一,提供的接口也尽可能单一(接口分离原则),安全/路由/限流等跨横切面的关注点(Cross-Cutting Concerns)由独立网关负责,体现关注分离(Separation of Concerns)。

    • 信息专家:当不确定哪个团队应该负责某个微服务时,一般原则也是谁拥有数据谁负责,基于有界上下文Bounded Context(一般是边界比较清晰的领域数据源)构建微服务。

    • 松散耦合:服务之间通过HTTP/JSON等轻量机制通信,服务之间不强耦合。

    • 受保护的变化和依赖倒置:服务之间只依赖抽象接口,实现可能随时变化。

    • 间接:网关在外面的客户端和内部的服务之间增加了一层间接,使两者不强耦合,可以相互独立演化。

  4. 作为架构师或者设计师,有两个设计能力是需要重点培养的,也是最难和最能体现架构设计水平的:

    • 合理的职责分配能力,也就是每个类/组件/子系统应该承担什么职责,如何保证职责单一,它们之间如何协作;

    • 系统抽象和核心领域建模能力,需要深入一线业务域。

三、分布式系统架构设计原则和理论

AKF架构原则

这15个架构原则来自《架构即未来(The Art of Scalability)》[附录2]一书,作者马丁L.阿伯特和迈克尔T.费舍尔分别是eBay和PayPal的前CTO,他们经历过eBay和PayPal大规模分布式电商平台的架构演进,在一线实战经验的基础上总结并提炼出15条架构原则:

1. N + 1设计

永远不要少于两个,通常为三个。比方说无状态的Web/API一般部署至少>=2个。

2. 回滚设计

确保系统可以回滚到以前发布过的任何版本。可以通过发布系统保留历史版本,或者代码中引入动态开关切换机制(Feature Switch)。

3. 禁用设计

能够关闭任何发布的功能。新功能隐藏在动态开关机制(Feature Switch)后面,可以按需一键打开,如发现问题随时关闭禁用。

4. 监控设计

在设计阶段就必须考虑监控,而不是在实施完毕之后补充。例如在需求阶段就要考虑关键指标监控项,这就是度量驱动开发(Metrics Driven Development)的理念。

5. 设计多活数据中心

不要被一个数据中心的解决方案把自己限制住。当然也要考虑成本和公司规模发展阶段。

6. 使用成熟的技术

只用确实好用的技术。商业组织毕竟不是研究机构,技术要落地实用,成熟的技术一般坑都被踩平了,新技术在完全成熟前一般需要踩坑躺坑。

7. 异步设计

能异步尽量用异步,只有当绝对必要或者无法异步时,才使用同步调用。

8. 无状态系统

尽可能无状态,只有当业务确实需要,才使用状态。无状态系统易于扩展,有状态系统不易扩展且状态复杂时更易出错。

9. 水平扩展而非垂直升级

永远不要依赖更大、更快的系统。一般公司成长到一定阶段普遍经历过买更大、更快系统的阶段,即使淘宝当年也买小型机扛流量,后来扛不住才体会这样做不scalable,所以才有后来的去IOE行动。

10. 设计时至少要有两步前瞻性

在扩展性问题发生前考虑好下一步的行动计划。架构师的价值就体现在这里,架构设计对于流量的增长要有提前量。

11. 非核心则购买

如果不是你最擅长,也提供不了差异化的竞争优势则直接购买。避免Not Invented Here症状,避免凡事都要重造轮子,毕竟达成业务目标才是重点。

12. 使用商品化硬件

在大多数情况下,便宜的就是最好的。这点和第9点是一致的,通过商品化硬件水平扩展,而不是买更大、更快的系统。

13. 小构建、小发布和快试错

全部研发要小构建,不断迭代,让系统不断成长。这个和微服务理念一致。

14. 隔离故障

实现故障隔离设计,通过断路保护避免故障传播和交叉影响。通过舱壁泳道等机制隔离失败单元(Failure Unit),一个单元的失败不至影响其它单元的正常工作。

15. 自动化

设计和构建自动化的过程。如果机器可以做,就不要依赖于人。自动化是DevOps的基础。

我的解读

  1. 这15条架构原则基本上是eBay在发展,经历过流量数量级增长冲击过程中,通过不断踩坑踩出来的,是干货中的干货。消化吸收这15条原则,基本可保系统架构不会有原则性问题。

  2. 这15条原则同样适用于现在的微服务架构。eBay发展较早,它内部其实很早(差不多2010年前)就已形成完善的微服务生态,只是没有提出微服务这个概念。

  3. 这15条原则可根据TTM(Time To Market),可用性/可扩展性/质量,成本/效率分布在三个环内,如下图所示:

图片

十二要素应用

Heroku[附录3]是国外知名的云应用平台。基于上百万应用的托管和运营经验,创始人Adam Wiggins提出了12要素应用宣言[附录4]。简单讲,满足这12个要素的应用是比较容易云化并居住在Heroku平台上的。

1. 基准代码

一份基准代码,多份部署。如果用镜像部署方式,则一个镜像可以部署到多个环境(测试,预发,生产),而不是给每个环境制作一个不同镜像。

2. 依赖

显式声明依赖。如果用镜像部署,则一般依赖被直接打在镜像中,或者声明在docker file中。

3. 配置

在环境中存储配置。在Heroku或者类似的PaaS平台上,配置一般是推荐注入到环境变量中的。现在采用集中式配置中心也是一种流行方式。

4. 后端服务

把后端服务(例如缓存,数据库,MQ等)当作附加资源,相关配置和连接字符串通过环境变量注入,或者采用配置中心。

5. 构建、发布和运行

严格分离构建和运行。如果使用镜像部署,则构建、发布/运行是通过镜像这种中间格式严格分离的。

6. 进程

一个或者多个无状态的进程运行应用。容器运行时相当于进程,适用于无状态Web/API。

7. 端口绑定

通过端口绑定提供服务。容器也是通过端口绑定对外提供服务。

8. 并发

通过进程模型进行扩展。容器运行时相当于进程,通过起多个容器可以任意扩展并发数量。

9. 易处理

快速启动和优雅终止可最大化健壮性。docker容器支持秒级启动和关闭。

10. 开发环境和线上环境等价

尽可能保持开发、测试、预发和线上环境相同。容器可以保证容器内运行时环境的一致性,还需要保证不同环境的一致性,例如不同环境内的操作系统,负载均衡,服务发现,后台服务,监控告警等要尽可能一致。

11. 日志

把日志当作数据流。Heroku不支持本地文件,所以必须以流方式把日志输送到后台日志服务。除了日志以外还要补充考虑metrics流的采集和输送。

12. 管理进程

后台管理任务当作一次性的进程。其实相当于在Heroku上以独立进程方式运行任务Job。

我的解读

  1. 12要素应用也是当前云原生应用(Cloud Native App)的参考标准,我把这12要素也称为云应用迁移原则。满足这12个要素的应用,可以比较顺利迁移到各种云平台(Kubernetes, Marathon, Cloud Foundry等)上。

  2. 对于面临企业遗留应用改造和云化迁移的架构师,可以重点参考这12条迁移原则。

  3. Docker容器技术可以认为是为云迁移量身定制的技术。容器化是后续云迁移的捷径,所以遗留应用改造可以先想办法做到容器化。

CAP定理

2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。

CAP认为:一个分布式系统最多同时满足一致性(Consistency),可用性(Availability)和分区容忍性(Partition Tolerance)这三项中的两项。

1. 一致性(Consistency)

一致性指“all nodes see the same data at the same time”,即更新操作成功,所有节点在同一时间的数据完全一致。

2. 可用性(Availability)

可用性指“Reads and writes always succeed”,即服务一直可用,而且响应时间正常。

3. 分区容忍性(Partition tolerance)

分区容忍性指“the system continue to operate despite arbitrary message loss or failure of part of the system.”,即分布式系统在遇到某节点或网络分区故障时,仍然能够对外提供满足一致性和可用性的服务。

图片

BASE理论

eBay架构师Dan Pritchett基于对大规模分布式系统的实践总结,在ACM上发表文章提出了BASE理论,BASE理论是对于CAP理论的延伸,核心思想是即使无法做到强一致性(Strong Consistency,CAP中的一致性指强一致性),但是可以采用适当的方式达到最终一致性(Eventual Consistency)。

BASE指基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventual Consistency)。

1. 基本可用(Basically Available)

基本可用是指分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。比如服务降级。

2. 软状态(Soft State)

软状态是指允许系统存在中间状态,而该中间状态不会影响系统的整体可用性。分布式存储中一般一份数据至少存三个副本,允许不同节点间副本同步的延迟就是软状态的体现。

3. 最终一致性(Eventual Consistency)

最终一致性是指系统中的所有数据副本经过一段时间后,最终能够达成一致状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

图片

我的解读

  1. CAP和BASE理论可以抠得很深,背后甚至有很复杂的数学证明。我理解得相对简单浅显:性能、高可用、不丢数据和数据一致性对分布式系统来说一般是强需求,随着流量的增长,复制和分区在所难免:

    • 复制(replication):数据在多个节点上存多份保证不丢和高可用;

    • 分区(partition):数据按某个纬度切分分布在不同节点上分摊流量压力保证高性能,同时也是为了降低每个节点的复杂性。例如数据库的分库分表,系统拆分微服务化也是一种分区。
      这两者都会带来一致性问题,一致性在时间上有一点妥协的余地-即是最终一致性;时间上要求强一致的话,只有可用性可以适当折中。系统架构的游戏很大部分是和状态一致性作斗争的游戏。

  2. 选择使用分布式产品时,比如NoSQL数据库,你需要了解它在CAP环中所在的位置,确保它满足你的场景需要。

四、组织和系统改进原则

康威法则

Melvin Conway在1967年提出所谓康威法则[附录5],指出组织架构和系统架构之间有一种隐含的映射关系:

Organization which design system […] are constrained to produce designs which are copies of the communication structures of these organization. 设计系统的组织其产生的设计等价于组织间的沟通结构。

图片

康威法则也可以倒过来阐述:

Conway’s law reversed:You won’t be able to successfully establish an efficient organization structure that is not supported by your system design(architecture)。 如果系统架构不支持,你无法建立一个高效的组织;同样,如果你的组织架构不支持,你也无法建立一个高效的系统架构。

图片

系统改进三原则

IT运维管理畅销书《凤凰项目》[附录8]的作者Gene Kim在调研了众多高效能IT组织后总结出支撑DevOps运作的三个原理(The Three Ways: The Principles Underpinning DevOps)[附录9],我认为也是系统改进提升的一般性原理[附录7],见下图:

图片

原理一:系统思考(System Thinking)

开发驱动的组织,其能力不是制作软件,而是持续的交付客户价值。价值从业务需求开始,经过研发测试,到部署运维,依次流动,并最终以服务形式交付到客户手中。整个价值链流速并不依赖单个部分(团队或个人)的杰出工作,而是受整个价值链最薄弱环节(瓶颈)的限制。所以局部优化通常无效,反而招致全局受损。

Gene Kim特别指出:

Any improvements made anywhere besides the bottleneck are an illusion. 在瓶颈之外的任何优化提升都只是幻象。

原理二:强化反馈环(Amplify Feedback Loops)

过程改进常常通过加强反馈环来达成。原理二强调企业和客户之间、组织团队间、流程上和系统内的反馈环。没有测量就没有提升,反馈要以测量数据为准,通过反馈数据优化改进系统。

原理三:持续试验和学习的文化(Culture of Continual Experimentation And Learning)

在企业管理文化层面强调勇于试错和持续试验、学习和改进的文化。

我的解读

  1. 康威法则给我们的启示:系统架构和组织架构之间有隐含的映射关系,你不能单方面改变一方的结构,调整时必须两边联动。系统架构如果是耦合的,就很难组织分散式的团队结构,两边映射不起来,团队之间容易摩擦导致生产率下降。所以一般先按业务边界对单块应用进行解耦拆分,同时做相应的团队拆分,使两边可以映射,每个团队可以独立开发、测试和部署各自的微服务,进而提升生产率。这就是近年流行的微服务架构背后的组织原则。详见我之前发表的文章《企业的组织架构是如何影响技术架构的》[附录6]。

  2. 系统思考要求我们加强团队合作,培养流式思维和瓶颈约束思维,找出瓶颈并针对性地优化。在研发型组织中,常见的系统瓶颈如运维机器资源提供(Provisioning)缓慢,发布流程繁琐容易出错,开发/测试/UAT环境缺失或不完善,遗留系统耦合历史负担重,基础研发平台薄弱等等。这些瓶颈点特别需要关注优化。

  3. 反馈原理要求我们关注基于数据的反馈,技术上的手段包括大数据分析和系统各个层次的测量监控。没有测量就没有反馈,没有反馈就没有提升。

  4. 在管理文化层面:

    • 管理层要承认企业内部近50%的创新或流程改进项目是有可能失败的,即使失败,员工不会受到责罚,鼓励持续的试验和从中学习;

    • 管理层要有技术偿债意识,勿追求100%员工利用率,要预留20%~30%的时间给员工做创新和系统改进提升项目。

五、写在最后

上述原则是架构师必须深入理解和掌握的,但是不能盲从,实际工作中要根据业务、时间、资源和团队情况随机应变。原则有时甚至可以被违反,当然这样做一定有成本,架构师要意识这一点,并适时变通补偿。

上述原则仅是我个人视角总结,有些理解难免偏颇。如果你认为我忽略了哪些重要的原则,或理解有误,请记得线下和我交流!



]]>
taoCMS-基于php+sqlite最小巧的CMS 2021-08-01 21:08:35
1235 设置macbook pro/air死机后自动重启

Do you need your Mac to keep running no matter what? You might want to make sure that if your computer crashes or there’s a brief power outage in your area, and you aren’t near your Mac, that it restarts on its own.

With a simple Terminal command, you can make your Mac automatically restart after a crash and here’s how along with a few other Terminal tips.

Open Terminal

Open Terminal on your Mac one of these quick ways:

  • With Finder open, click Go > Utilities from the menu bar and pick Terminal.
  • Click Applications > Utilities from your Dock and choose Terminal.
  • Open Spotlight Search and enter Terminal.

Terminal command to automatically restart your Mac

Now, enter the following Terminal command into the window and then hit Return.

sudo systemsetup -setrestartfreeze on

Enter your password, hit Return once more and that’s it. You should never have to enter this command again.

Terminal Command Automatically Restart Mac

To turn off the automatic restart, use the following command.

sudo systemsetup -setrestartfreeze off

And to check the status of your automatic restart, enter this command.

sudo systemsetup -getrestartfreeze

Terminal Command Restart Status Mac

Terminal commands to keep your Mac on

Let’s say you want to keep your Mac on for a certain amount of time without going to sleep, for instance. Instead of opening System Preferences and making changes in Energy Saver, just use the following command.

caffeinate -t [seconds]

So, if you want your Mac stay on for say an hour, enter the number of seconds for one hour:

caffeinate -t 3600

Terminal Command Keep Mac On One Hour

You can also use the following command to keep your Mac on permanently as long as Terminal is running:

caffeinate

To stop a “caffeinate” command, use the keyboard shortcut Control + C in the Terminal window.

Wrapping it up

Having your Mac restart automatically after a crash or keeping it on when you need it most are both easy to do with simple Terminal commands.

Let us know in the comments below if you plan to use the automatic restart command for your Mac. And remember, you can always visit us on Twitter if you have tips of your own you’d like to share.


]]>
taoCMS-基于php+sqlite最小巧的CMS 2021-07-21 18:07:27
1234 《利用机器学习在15分钟内破解验证码》一文的实践 看了《深度学习世界深度学习世界深度学习世界深度学习世界》2017-12-21 的文章“验证码,再见!利用机器学习在15分钟内破解验证码”,觉得简单易行,对于深度学习新手来说动手实践的可行性很强。遂决定亲手实践一下,体验深度学习在解决实际问题方面的威力。

 

1,安装Python环境

  • 本机的配置是64位windows7操作系统。安装python 3.5.2版。这也是目前windows操作系统下能够使用tensorflow的版本。
  • 要安装的依赖库为numpy、imutils、sklearn、keras。使用pip直接联网安装很容易。
  • 在powershell中使用命令 pip install tensorflow,安装tensorflow。

2,安装OpenCV 环境

安装OpenCV3. 具体过程略。

3,运行深度学习识别代码

3.1 下载源代码并解压

https://s3-us-west-2.amazonaws.com/mlif-example-code/solving_captchas_code_examples.zip

 

源代码目录solving_captchas_code_examples下的子目录generated_captcha_images下原有9955个图片

 

 

 

子目录extracted_letter_images中是空的。

3.2 从 CAPTCHA 图片中分割单字母图片

运行命令:

python extract_single_letters_from_captchas.py

 

运行完成后,extracted_letter_images下产生32个目录。存放切割出来的单字母图片。如:

3.3 训练神经网络识别单个字母

python train_model.py

 

PS F:testsolving_captchas_code_examples> python train_model.py

Using TensorFlow backend.

Train on 29058 samples, validate on 9686 samples

Epoch 1/10

29058/29058 [==============================] - 97s - loss: 0.2419 - acc: 0.9395 - val_loss: 0.0233 - val_acc: 0.9937

Epoch 2/10

29058/29058 [==============================] - 96s - loss: 0.0150 - acc: 0.9966 - val_loss: 0.0109 - val_acc: 0.9966

Epoch 3/10

29058/29058 [==============================] - 98s - loss: 0.0102 - acc: 0.9970 - val_loss: 0.0132 - val_acc: 0.9962

Epoch 4/10

29058/29058 [==============================] - 97s - loss: 0.0057 - acc: 0.9986 - val_loss: 0.0140 - val_acc: 0.9968

Epoch 5/10

29058/29058 [==============================] - 100s - loss: 0.0042 - acc: 0.9987 - val_loss: 0.0099 - val_acc: 0.9971

Epoch 6/10

29058/29058 [==============================] - 96s - loss: 0.0080 - acc: 0.9980 - val_loss: 0.0120 - val_acc: 0.9975

Epoch 7/10

29058/29058 [==============================] - 96s - loss: 0.0028 - acc: 0.9991 - val_loss: 0.0086 - val_acc: 0.9976

Epoch 8/10

29058/29058 [==============================] - 95s - loss: 0.0028 - acc: 0.9992 - val_loss: 0.0073 - val_acc: 0.9981

Epoch 9/10

29058/29058 [==============================] - 96s - loss: 0.0050 - acc: 0.9987 - val_loss: 0.0100 - val_acc: 0.9974

Epoch 10/10

29058/29058 [==============================] - 97s - loss: 0.0052 - acc: 0.9990 - val_loss: 0.0084 - val_acc: 0.9980

 

3.4 测试识别效果

 

python3 solve_captchas_with_model.py

CAPTCHA text is: PQDR

CAPTCHA text is: T324

CAPTCHA text is: FPV3

CAPTCHA text is: H72Z

CAPTCHA text is: FCBP

CAPTCHA text is: 29LY

CAPTCHA text is: 36YG

CAPTCHA text is: M3C5

CAPTCHA text is: 32Y7

CAPTCHA text is: 6GQ6

 

可以看到,由于是从训练数据中随机抽取验证码图片进行识别,识别率全部正确。

 

从下图看出,即使字符粘连,也能正确识别。说明字符切割和单字符的训练算法是有效的。

 


]]>
taoCMS-基于php+sqlite最小巧的CMS 2021-07-16 22:07:52
1233 Python机器学习方法智能识别亚马逊验证码 概述

亚马逊网站验证码全部由英文字母组成,每个字母的形式也是多样的,通过Tesseract-OCR技术识别效率还是比较低,非常不理想。这里采用向量空间技术进行训练识别,经测试,识别率可达到95%,这个识别率通过训练库的不断增加还可继续提高。下面废话不多说,直接上干货。

技术详解

亚马逊验证码如下图:

e95bb376810bc678dc1c7181c0f140aaf3a7e095

我这里收集了大量的亚马逊网站验证码,下面将随机抽一张验证码为mnyaph作详细讲解,如下图:

92ee6215643935e796345772ba59b8f6b6580b2e

总体思路

1.将原图片作二值化等特殊处理转换得到低像素图片

2.分割出每个字母的图片,并加入到训练库中

3.每个字母图片在训练库中训练

4.将每个字母图片训练后的结果依次组合起来,就是最终验证码

使用技术库

PIL :图片处理库

scipy : 科学计算库

 ●  原图片处理

这里将jpg格式转换为更小容量的gif格式,方便后面处理,并将原图片中的黑色像素(0)拷贝到新的相同尺寸的白色图片上,得到新的Image对象。下图为处理后的图片

cb47c4863cbcb4f4643c72f590b8898d4765c56d


im = Image.open(image_file)

im = im.convert('P')

im_size = im.size

new_im = Image.new('P', im_size, 255)

im_width = im_size[0]
im_height = im_size[1]

for y in range(im_height):
for x in range(im_width):
pixel = im.getpixel((x, y))
if pixel ==0:
new_im.putpixel((x, y), pixel)
 ●  切割图片得到单个字母图片

纵向切割出每个字母,切割规则为:依次纵向检索每个像素点,在横向(x轴)固定的前提下:若遇到像素值为0,则表示为黑色的字母;若整个纵向都没遇到黑色(0),则表示是分割点。我们可以得到一样图片的横向(x轴)的所有分割点的坐标,最后分割即可。如下图:

55404907c523e60d7fc81fa0d038562d43733824

计算得到的切割坐标,如下:

df6cccb6efd9157c50033f382f5c227e21a8d8b8


def get_x_coord(image) -> '返回切割的x坐标':
image_width = image.size[0]
image_height = image.size[1]

crop_list = []
start_pos = 0
is_start_one_char = False

for x in range(image_width):
is_black_pos = False
for y in range(image_height):
pixel = image.getpixel((x,y))
if pixel == 0:
if is_start_one_char == False:
start_pos = x
is_black_pos = True
is_start_one_char = True
break
if is_start_one_char== True and is_black_pos == False:
end_pos = x
is_start_one_char = False
crop_list.append((start_pos, end_pos))

return crop_list
 ●  单个字母图片加入到训练库中

将分割出的每个字母图片加入到训练库中,方便后面训练匹配,训练库中的数量越多识别率越高。将每个字母分类放入不同的文件夹中,如下所示:

fb761707069ccb73dc42a4f5ddb9ac913eba4acf

例如a文件夹中的图片如下:

36991e499b081dab76941e882f74a53fb9092b29

 ●  训练识别单个字母图片

拿到一张单个字母图片后,去训练库中匹配每个图片,计算出相似度最高的,记录出相应的字母文件夹即为最终的字母。

匹配算法:AI与向量空间算法,通俗点讲就是原图片的所有像素点与训练库中的每张图片的所有像素点计算余弦值,余弦值越大,相似度越高。

具体方法是:计算出原图片与训练库中的每张图片像素的余弦值,选出最大值对应的训练库中的文件夹名即为最终的字母。

如下为匹配的结果,与原图片完全吻合

8dd940f46acf5c75bbe3b73cdec9e37054e0df31


match_captcha = []
for crop in crop_list:
crop_im = new_im.crop((crop[0], 0, crop[1], im_height)) #(左上x, 左上y, 右下x, 右下y)
filename = 'e:/crop/' + str(time.time()) + '.gif'
# crop_im.save(filename)

all_result = [] #单个切片的所有字母的相似性

remove_letter = ['d''i''o''q''s''v''w''z']
for letter in list(set(string.ascii_lowercase)- set(remove_letter)):

refer_image_dir = r'E:training_library%s' % letter

for refer_image in os.listdir(refer_image_dir):
refer_im = Image.open(os.path.join(refer_image_dir, refer_image))

crop_list = list(crop_im.getdata())
refer_list = list(refer_im.getdata())
min_count = min(len(crop_list), len(refer_list))

result = 1 - spatial.distance.cosine(crop_list[:min_count-1], refer_list[:min_count-1])
all_result.append({'letter' : letter, 'result' : result})

match_letter = max(all_result, key=lambda x: x['result']).get('letter')
match_captcha.append(match_letter)

print('验证码为:{0}'.format(''.join(match_captcha)))

经测试,每个字母图片的识别时间大约为1s左右,所以一张亚马逊验证码的识别时间大约为5-6s,这个时间是非常可以接受的。


原文发布时间为:2018-11-7

本文作者:zarten

]]>
taoCMS-基于php+sqlite最小巧的CMS 2021-07-16 22:07:26