首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >人脸识别程序

人脸识别程序
EN

Code Review用户
提问于 2016-09-06 06:11:35
回答 1查看 3.5K关注 0票数 6

我一直使用以下脚本进行人脸识别,作为安全功能:

main.py

代码语言:javascript
复制
from itertools import izip
from PIL import Image
def compare(self,pic): 
    i1 = Image.open("pic1.jpg")
    i2 = Image.open(pic)
    size = i1.size
    i2 = i2.resize(size)
    assert i1.mode == i2.mode, "Different kinds of images."
    assert i1.size == i2.size, "Different sizes."

    pairs = izip(i1.getdata(), i2.getdata())
    if len(i1.getbands()) == 1:
        # for gray-scale jpegs
        dif = sum(abs(p1-p2) for p1,p2 in pairs)
    else:
        dif = sum(abs(c1-c2) for p1,p2 in pairs for c1,c2 in zip(p1,p2))
    ncomponents = i1.size[0] * i1.size[1] * 3
    print ((dif / 255.0 * 100) / ncomponents)
    return (dif / 255.0 * 100) / ncomponents

def password(self):
    import passw
    y=str(self.password_input.text)
    x=passw.verify(y)
    if x == True:
        try:
            os.startfile("recog.py")
            import time
            time.sleep(6)
            x = self.compare("security.jpg")
            if x <= 30:
                os.remove("pic1.jpg")
                os.rename("security.jpg","pic1.jpg")
                return True
            else:
                raise ValueError
        except ValueError, e:
            print(e)
            sf=open('secure.txt','w')
            sf.write("")
            sf.close()
            if os.path.exists("securitylog.jpg"):
                from datetime import datetime, date, time
                dt = datetime.today()
                t=dt.strftime("%A, %d. %B %Y %H:%M %p")
                t='{0:%H:%M }'.format(dt)
                f='{0:%A}, {0:%d} of {0:%B}, {0:%Y}.'.format(dt)
                timed=(("Date: ",f,"\nTime: ",t))
                timed=''.join(timed)
                sf=open('secure.txt','a')
                sf.write(timed)
                sf.close()
                kl=Thread(target=self.say, args="You are not authorized to access this program.")
                kl.start()
                p = Wrong()
                p.open()
            else:
                os.rename("security.jpg","securitylog.jpg")

    else:
        sf=open('secure.txt','w')
        sf.write("")
        sf.close()
        if os.path.exists("securitylog.jpg"):
            from datetime import datetime, date, time
            dt = datetime.today()
            t=dt.strftime("%A, %d. %B %Y %H:%M %p")
            t='{0:%H:%M }'.format(dt)
            f='{0:%A}, {0:%d} of {0:%B}, {0:%Y}.'.format(dt)
            timed=(("Date: ",f,"\nTime: ",t))
            timed=''.join(timed)
            sf=open('secure.txt','a')
            sf.write(timed)
            sf.close()
            kl=Thread(target=self.say, args="You are not authorized to access this program.")
            kl.start()
            p = Wrong()
            p.open()
        else:
            os.rename("security.jpg","securitylog.jpg")

passw.py:

代码语言:javascript
复制
from passlib.hash import sha256_crypt
import onetimepad
def verify(string):
        y=string
        key=y[-2:]
        enc=onetimepad.encrypt(y,key)
        x=sha256_crypt.verify(enc,'<hash>')
        return x
def main():
        x=raw_input("Enter Password: ")
        print verify(x)

if __name__ =="__main__":
        main()

recog.py

代码语言:javascript
复制
#!/usr/bin/env python
# Python 2/3 compatibility
from __future__ import print_function
import sys
import numpy as np
import cv2
# local modules
from video import create_capture
from common import clock, draw_str


def detect(img, cascade):
    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
                                     flags=cv2.CASCADE_SCALE_IMAGE)
    if len(rects) == 0:
        return []
    rects[:,2:] += rects[:,:2]
    return rects

def draw_rects(img, rects, color):
    for x1, y1, x2, y2 in rects:
        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)

if __name__ == '__main__':
    import sys, getopt
    print("Face Recognition using Haar Cascades")

    args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=', 'nested-cascade='])
    try:
        video_src = video_src[0]
    except:
        video_src = 0
    args = dict(args)
    cascade_fn = args.get('--cascade', "E:\\Python27\\My programs\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml")
    nested_fn  = args.get('--nested-cascade', "E:\\Python27\\My programs\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml")

    cascade = cv2.CascadeClassifier(cascade_fn)
    nested = cv2.CascadeClassifier(nested_fn)

    cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')

    while True:
        ret, img = cam.read()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.equalizeHist(gray)

        t = clock()
        rects = detect(gray, cascade)
        vis = img.copy()
        draw_rects(vis, rects, (0, 255, 0))
        if not nested.empty():
            for x1, y1, x2, y2 in rects:
                roi = gray[y1:y2, x1:x2]
                vis_roi = vis[y1:y2, x1:x2]
                subrects = detect(roi.copy(), nested)
                print("Face detected")
                image = vis_roi
                cv2.imwrite('security.jpg', image)
                cv2.destroyWindow('facedetect')
                sys.exit()
        dt = clock() - t

        draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))
        cv2.imshow('facedetect', vis)

        if 0xFF & cv2.waitKey(5) == 27:
            break
    cv2.destroyAllWindows()

如您所见,我提供了所有的代码,以确保我的面部识别程序工作。

我觉得上面的代码不是很有效率。有没有更好的方法使用人脸识别作为使用python的安全措施?

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-09-06 08:49:50

你应该阅读并跟随PEP8。这意味着:

  • 将所有导入放在文件的顶部。
  • 在赋值操作符周围留出一个空间。
  • 在大多数逗号后面放一个空格。
  • 使用描述性名称。

这是因为它使您的代码更易于阅读。为了增加可读性,我们在英语单词周围加了空格,在编程语言中也是这样做的。

你应该:

  • 使用with。 --这可以确保文件被关闭,即使程序错误。假设用户强制退出程序,KeyboardInterrupt
  • 不要使用assertassert用于调试,而不是用于实时代码。如果我使用-O标志运行您的代码,它将删除所有这些,然后您的代码就会中断。
  • 允许更多的可定制性。传递给函数的 --几个文件名--并不难。更困难的是,当您决定将pic1.jpg更改为image.jpg并同时使用pic1.jpeg时。这意味着您需要重新编写代码才能做到这一点。
  • 没有巨大的try块。 --这会导致错误的掩蔽。这是因为你可能有两个函数,ValueErrors说,但是你不知道哪个函数引发了ValueError,现在你正在处理未知的状态。
  • 再次将所有导入放在文件的顶部。这允许我知道什么是您要导入的,一旦我打开您的文件。这防止了混乱,就像您在main.py中做的那样,您从未导入os,但您正在使用它。
  • 删除重复的代码。,您需要将重复的代码放入一个新函数中,或者重新排列当前的函数,以便能够合并重复的代码。以password中的main.py为例,您复制了大量的函数块,您可以在其中将它连接在一起,或者至少为它创建一个函数。

我所知道的最大的改变是如何对main.py进行修改。除此之外,我将您的代码更改为使用更少的变量,并删除了死代码。采取:

代码语言:javascript
复制
dt = datetime.today()
t=dt.strftime("%A, %d. %B %Y %H:%M %p")
t='{0:%H:%M }'.format(dt)
f='{0:%A}, {0:%d} of {0:%B}, {0:%Y}.'.format(dt)
timed=(("Date: ",f,"\nTime: ",t))
timed=''.join(timed)

第一个t是死代码,您可以立即将t覆盖到其他东西,这样就可以删除它。在此之后,您有两个timed变量,您可以将其更改为单个str.formatDate: {}\nTime: {}。由此您应该注意到,您可以将所有str.formats合并为一个,并最终得到如下结果:

代码语言:javascript
复制
timed = 'Date: {0:%A}, {0:%d} of {0:%B}, {0:%Y}.\nTime: {0:%H:%M }'.format(datetime.today())

我将只显示对main.py的更改,因为其他文件没有那么多要更改:

代码语言:javascript
复制
from itertools import izip
import time
from datetime import datetime, date, time

from PIL import Image

import passw


def compare(self, picture1, picture2): 
    image1 = Image.open(picture1)
    image2 = Image.open(picture2).resize(image1.size)
    if image1.mode != image2.mode:
        raise ValueError("Different kinds of images.")
    if image1.size != image2.size:
        raise ValueError("Different sizes.")

    pairs = izip(image1.getdata(), image2.getdata())
    if len(image1.getbands()) == 1:
        dif = sum(abs(p1-p2) for p1, p2 in pairs)
    else:
        dif = sum(abs(c1-c2) for p1, p2 in pairs for c1, c2 in zip(p1,p2))

    ret = (dif / 255.0 * 100) / image1.size[0] * image1.size[1] * 3
    print ret
    return ret


def password(self):
    y = str(self.password_input.text)
    x = passw.verify(y)
    if x:
        try:
            os.startfile("recog.py")
            time.sleep(6)
            if self.compare("pic1.jpg", "security.jpg") <= 30:
                os.remove("pic1.jpg")
                os.rename("security.jpg", "pic1.jpg")
                return True
            else:
                raise ValueError
        except ValueError, e:
            print(e)

    # If not x or ValueError.
    with open('secure.txt', 'w') as sf:
        sf.write('')
    if os.path.exists("securitylog.jpg"):
        with open('secure.txt', 'a') as sf:
            sf.write('Date: {0:%A}, {0:%d} of {0:%B}, {0:%Y}.\nTime: {0:%H:%M }'
                     .format(datetime.today()))
        kl = Thread(target=self.say, args="You are not authorized to access this program.")
        kl.start()
        p = Wrong()
        p.open()
    else:
        os.rename("security.jpg", "securitylog.jpg")
票数 10
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/140604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档