人脸识别主要步骤:python
face_recognition 库的安装web
安装此库,首先须要安装编译dlib,此处咱们偷个懒,安装软件Anaconda(大牛绕过),此软件预装了dlib.算法
安装好后,咱们直接经过pip 安装face_recognition库,命令以下flask
python -m pip install face_recognition
调用一下库,检查是否成功导入浏览器
没报错,就是安装成功了。服务器
按照以上办法在安装numpy 和python-opencv 两个库就能够了网络
经过face_recognition库实现人脸识别架构
代码以下app
# -*- coding: UTF-8 -*- import face_recognition import cv2 import os # 这是一个超级简单(但很慢)的例子,在你的网络摄像头上实时运行人脸识别 # PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam. # 请注意:这个例子须要安装OpenCV # 具体的演示。若是你安装它有困难,试试其余不须要它的演示。 # 获得一个参考的摄像头# 0(默认) video_capture = cv2.VideoCapture(0) # 加载示例图片并学习如何识别它。 path ="images"#在同级目录下的images文件中放须要被识别出的人物图 total_image=[] total_image_name=[] total_face_encoding=[] for fn in os.listdir(path): #fn 表示的是文件名 total_face_encoding.append(face_recognition.face_encodings(face_recognition.load_image_file(path+"/"+fn))[0]) fn=fn[:(len(fn)-4)]#截取图片名(这里应该把images文件中的图片名命名为为人物名) total_image_name.append(fn)#图片名字列表 while True: # 抓取一帧视频 ret, frame = video_capture.read() # 发如今视频帧全部的脸和face_enqcodings face_locations = face_recognition.face_locations(frame) face_encodings = face_recognition.face_encodings(frame, face_locations) # 在这个视频帧中循环遍历每一个人脸 for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings): # 看看面部是否与已知人脸相匹配。 for i,v in enumerate(total_face_encoding): match = face_recognition.compare_faces([v], face_encoding,tolerance=0.5) name = "Unknown" if match[0]: name = total_image_name[i] break # 画出一个框,框住脸 cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2) # 画出一个带名字的标签,放在框下 cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED) font = cv2.FONT_HERSHEY_DUPLEX cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1) # 显示结果图像 cv2.imshow('Video', frame) # 按q退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头中的流 video_capture.release() cv2.destroyAllWindows()
其次还要准备一个images文件夹进行摄像头的人脸比对框架
成功的效果图我就不贴了。
私信小编01 02 03 04 便可获取数十套PDF哦!
原理以下:
1.遍历images文件中的图片
2.提取特征脸
3.摄像头每帧提取图片,提取特诊脸
4.遍历特征列表,找出符合特征脸
5.输出名字
一、从特征中找出图片中的人脸
import face_recognition image = face_recognition.load_image_file("your_file.jpg") face_locations = face_recognition.face_locations(image)
二、找到而且控制图像中的脸部特征
import face_recognition image = face_recognition.load_image_file("your_file.jpg") face_landmarks_list = face_recognition.face_landmarks(image)
三、识别照片中的人脸
import face_recognition known_image = face_recognition.load_image_file("biden.jpg") unknown_image = face_recognition.load_image_file("unknown.jpg") biden_encoding = face_recognition.face_encodings(known_image) [0]unknown_encoding = face_recognition.face_encodings(unknown_image) [0]results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
0×02 总结
总的来讲,该开源库使得人脸识别的普及实现再也不那么的遥远。调用该库,只需几行代码,即可实现人脸识别。有什么问题能够在下面评论讨论哦,各路大牛勿喷。
* 本文做者:淼淼兮与怀,本文属FreeBuf原创奖励计划,未经许可禁止转载
Python+树莓派+YOLO打造一款人工智能相机
2018年1月2日 BY ALPHA_H4CK·PYTHON+树莓派+YOLO打造一款人工智能相机
已关闭评论
不久以前,亚马逊刚刚推出了DeepLens。这是一款专门面向开发人员的全球首个支持深度学习的摄像机,它所使用的机器学习算法不只能够检测物体活动和面部表情,并且还能够检测相似弹吉他等复杂的活动。虽然DeepLens还未正式上市,但智能摄像机的概念已经诞生了。
今天,咱们将本身动手打造出一款基于深度学习的照相机,当小鸟出如今摄像头画面中时,它将能检测到小鸟并自动进行拍照。最终成品所拍摄的画面以下所示:
相机不傻,它能够很机智
咱们不打算将一个深度学习模块整合到相机中,相反,咱们准备将树莓派“挂钩”到摄像头上,而后经过WiFi来发送照片。本着“一切从简”(穷)为核心出发,咱们今天只打算搞一个跟DeepLens相似的概念原型,感兴趣的同窗能够本身动手尝试一下。
接下来,咱们将使用Python编写一个Web服务器,树莓派将使用这个Web服务器来向计算机发送照片,或进行行为推断和图像检测。
咱们这里所使用的计算机其处理能力会更强,它会使用一种名叫YOLO的神经网络架构来检测输入的图像画面,并判断小鸟是否出如今了摄像头画面内。
咱们得先从YOLO架构开始,由于它是目前速度最快的检测模型之一。该模型专门给Tensorflow(谷歌基于DistBelief进行研发的第二代人工智能学习系统)留了一个接口,因此咱们能够轻松地在不一样的平台上安装和运行这个模型。友情提示,若是你使用的是咱们本文所使用的迷你模型,你还能够用CPU来进行检测,而不仅是依赖于价格昂贵的GPU。
接下来回到咱们的概念原型上… 若是像框内检测到了小鸟,那咱们就保存图片并进行下一步分析。
检测与拍照
正如咱们所说的,DeepLens的拍照功能是整合在计算机里的,因此它能够直接使用板载计算能力来进行基准检测,并肯定图像是否符合咱们的标准。
可是像树莓派这样的东西,咱们其实并不须要使用它的计算能力来进行实时计算。所以,咱们准备使用另外一台计算机来推断出如今图像中的内容。
我使用的是一台简单的Linux计算机,它带有一个摄像头以及WiFi无线网卡(树莓派3+摄像头),而这个简单的设备将做为个人深度学习机器并进行图像推断。对我来讲,这是目前最理想的解决方案了,这不只大大缩减了个人成本,并且还可让我在台式机上完成全部的计算。
固然了,若是你不想使用树莓派视频照相机的话,你也能够选择在树莓派上安装OpenCV 3来做为方案B,具体的安装方法请参考【这份文档】。友情提示,安装过程可谓是很是的麻烦!
接下来,咱们须要使用Flask来搭建Web服务器,这样咱们就能够从摄像头那里获取图像了。这里我使用了MiguelGrinberg所开发的网络摄像头服务器代码(Flask视频流框架),并建立了一个简单的jpg终端:
#!/usr/bin/envpython from import lib import import_module import os from flask import Flask, render_template, Response #uncomment below to use Raspberry Pi camera instead #from camera_pi import Camera #comment this out if you're not using USB webcam from camera_opencv import Camera app =Flask(__name__) @app.route('/') def index(): return "hello world!" def gen2(camera): """Returns a single imageframe""" frame = camera.get_frame() yield frame @app.route('/image.jpg') def image(): """Returns a single currentimage for the webcam""" return Response(gen2(Camera()),mimetype='image/jpeg') if __name__ == '__main__': app.run(host='0.0.0.0', threaded=True)
若是你使用的是树莓派视频照相机,请确保没有注释掉上述代码中from camera_pi那一行,而后注释掉from camera_opencv那一行。
你能够直接使用命令python3 app.py或gunicorn来运行服务器,这跟Miguel在文档中写的方法是同样的。若是咱们使用了多台计算机来进行图像推断的话,咱们还能够利用Miguel所开发的摄像头管理方案来管理摄像头以及计算线程。
当咱们启动了树莓派以后,首先须要根据IP地址来判断服务器是否正常工做,而后尝试经过Web浏览器来访问服务器。
URL地址格式相似以下:
http://192.168.1.4:5000/image.jpg
在树莓派中加载Web页面及图像来肯定服务器是否正常工做:
图像导入及推断
既然咱们已经设置好了终端来加载摄像头当前的图像内容,咱们就能够构建一个脚原本捕捉图像并推断图像中的内容了。
这里咱们须要用到request库(一个优秀的Python库,用于从URL地址获取文件资源)以及Darkflow(YOLO模型基于Tensorflow的实现)。
不幸的是,咱们没办法使用pip之类的方法来安装Darkflow,因此咱们须要克隆整个代码库,而后本身动手完成项目的构建和安装。安装好Darkflow项目以后,咱们还须要下载一个YOLO模型。
由于我使用的是速度比较慢的计算机和板载CPU(而不是速度较快的GPU),因此我选择使用YOLO v2迷你网络。固然了,它的功能确定没有完整的YOLO v2模型的推断准确性高啦!
配置完成以后,咱们还须要在计算机中安装Pillow、numpy和OpenCV。最后,咱们就能够完全完成咱们的代码,并进行图像检测了。
最终的代码以下所示:
from darkflow.net.build import TFNet import cv2 from io import BytesIO import time import requests from PIL import Image import numpy as np options= {"model": "cfg/tiny-yolo-voc.cfg", "load":"bin/tiny-yolo-voc.weights", "threshold": 0.1} tfnet= TFNet(options) birdsSeen= 0 def handleBird(): pass whileTrue: r =requests.get('http://192.168.1.11:5000/image.jpg') # a bird yo curr_img = Image.open(BytesIO(r.content)) curr_img_cv2 =cv2.cvtColor(np.array(curr_img), cv2.COLOR_RGB2BGR) result = tfnet.return_predict(curr_img_cv2) print(result) for detection in result: if detection['label'] == 'bird': print("bird detected") birdsSeen += 1 curr_img.save('birds/%i.jpg' %birdsSeen) print('running again') time.sleep(4)
此时,咱们不只能够在命令控制台中查看到树莓派所检测到的内容,并且咱们还能够直接在硬盘中查看保存下来的小鸟照片。接下来,咱们就可使用YOLO来标记图片中的小鸟了。
假阳性跟假阴性之间的平衡
咱们在代码的options字典中设置了一个threshold键,这个阈值表明的是咱们用于检测图像的某种成功率。在测试过程当中,咱们将其设为了0.1,可是如此低的阈值会给咱们带来是更高的假阳性以及误报率。更糟的是,咱们所使用的迷你YOLO模型准确率跟完整的YOLO模型相比,差得太多了,但这也是须要考虑的一个平衡因素。
下降阈值意味着咱们能够获得更多的模型输出(照片),在个人测试环境中,我阈值设置的比较低,由于我想获得更多的小鸟照片,不过你们能够根据本身的须要来调整阈值参数。