自己是学食品的,打算利用课余时间学习python,想听一下各路大神对python的看法?

自己是学食品的,打算利用课余时间学习python,想听一下各路大神对python的看法?

答:

如果是把Python当做兴趣和额外技能进行学习,那可是非常好的,比如食品行业可以考虑这样的交叉应用:用深度学习从海量新闻中识别出食品安全新闻,节省大量人力,比如我之前做的一个网站:

极致安食—食品安全资讯

它基于卷积神经网络的原理,自动根据新闻标题分类出食品安全新闻(短文本分类)。其实可以做的内容还有很多,比如说对这些食品安全新闻发生的地点和时间做一次数据分析或数据挖掘看看都有什么特点,这些衍生出来的分析都可以用Python做,而且非常有社会意义。

不过做这样的项目题主要有思想准备,因为这些确实很难产生商业模式,很容易让人失去继续开发下去的动力,域名要钱,服务器也要钱,唯一支持我继续运维这个网站的动力就是把它看做是一个公益项目,如果你希望用Python做出一些有价值的东西,这些都是你需要考虑的。

了解更多

更多有趣的教程欢迎关注公众号:Python实用宝典

http://weixin.qq.com/r/MDiJkcHEsZzOrYXy920i (二维码自动识别)

或者访问网站:Python实用宝典

安装python包时,如果指定包的版本,为什么用到的是两个等号,而不是一个等号?

用anaconda创建虚拟环境时,会用到conda create -n env-name python=3.6,其中-n是什么意思,如果是参数的话,为什么不是–n,还有就是为什么python=3.6是一个等于号,而在安装包时,比如pip install pymysql==0.7时,用到的是两个等于号。

Anaconda中的命令有两种参数类型,一种是简写,比如题主说到的 -n,还有一种是全称 –name,即-n对应的全称。

pip的==是版本匹配运算符,是PEP 440定义的,见这个文档:PEP 440 – 版本标识和依赖性规范

至于conda的create指定版本的时候用Python = 3.5而不是Python == 3.5,个人猜测是第一个包含“模糊”版本,而第二个包含精确版本。模糊版本将匹配版本> = 3.5和<3.6中的Python包。而==将匹配Python包如3.5,3.5.0,3.5.0.0等这样的精确版本。确实没必要细化到那么细的版本号。

python 小文件下载、大文件下载、异步批量下载 代码

[download_code]

原文:python 小文件下载、大文件下载、异步批量下载 教程

按照不同的情况,python下载文件可以分为三种:

  1. 小文件下载
  2. 大文件下载
  3. 批量下载

python 小文件下载

流程:使用request.get请求链接,返回的内容放置到变量r中,然后将r写入到你想放的地方。

Python小文件下载流程

以下载上述流程图为例子:

# 例1
import requests
def request_zip(url):
    r = requests.get(url) 
    # 请求链接后保存到变量r中
    with open("new/名字.png",'wb') as f:
        # r.content写入至文件
        f.write(r.content)
request_zip('https://pythondict.com/wp-content/uploads/2019/08/2019082807222049.png')

运行完毕后,它将会被保存到当前文件夹的new文件夹里。

python 大文件下载

我们在小文件下载的时候,是将文件内容暂存到变量里,大家想想,下载大文件的时候还这样做会有什么问题? 很简单,如果你的内存只有8G,结果要下载文件却有10G那么大,那就肯定无法下载成功了。而且本机软件运行占的内存也比较大,如果你的内存只有8G,实际上剩余可用的内存可能低于2G-4G. 这种情况下怎么下载大文件呢?

流式分块下载

原理:一块一块地将内存写入到文件中,以避免内存占用过大。

当设置了request.get(stream=True)的时候,就是启动流模式下载,典型特征:在r变量的content被调用的时候才会启动下载。代码如下:

# 例2
import requests
def request_big_data(url):
    name = url.split('/')[-1]
    # 获取文件名
    r = requests.get(url, stream=True)
    # stream=True 设置为流读取
    with open("new/"+str(name), "wb") as pdf:
        for chunk in r.iter_content(chunk_size=1024):
            # 每1024个字节为一块进行读取
            if chunk:
                # 如果chunk不为空
                pdf.write(chunk)
request_big_data(url="https://www.python.org/ftp/python/3.7.4/python-3.7.4-amd64.exe")

Python 批量文件下载

所谓批量下载,当然不是一个一个文件的下载了,比如说我们要下载百度图片,如果一个一个下载会出现两种负面情况:

  1. 如果某个请求堵塞,整个队列都会被堵塞
  2. 如果是小文件,单线程下载太慢

我们的解决方案是使用异步策略。如果你会用scrapy框架,那就轻松许多了,因为它结合了twisted异步驱动架构,根本不需要你自己写异步。不过我们python实用宝典讲的可是教程,还是跟大家说一下怎么实现异步下载

我们需要使用到两个包,一个是asyncio、一个是aiohttp. asyncio是Python3的原装库,但是aiohttp则需要各位使用cmd/Terminal打开,输入以下命令安装:

pip install aiohttp

注意asyncio是单进程并发库,不是多线程,也不是多进程,单纯是在一个进程里面异步(切来切去运行),切换的地方用await标记,能够切换的函数用async标记。比如下载异步批量下载两个图片的代码如下:

 

# 例3
import aiohttp
import asyncio
import time
async def job(session, url):
    # 声明为异步函数
    name = url.split('/')[-1]
    # 获得名字
    img = await session.get(url)
    # 触发到await就切换,等待get到数据
    imgcode = await img.read()
    # 读取内容
    with open("new/"+str(name),'wb') as f:
        # 写入至文件
        f.write(imgcode)
    return str(url)

async def main(loop, URL):
    async with aiohttp.ClientSession() as session:
        # 建立会话session
        tasks = [loop.create_task(job(session, URL[_])) for _ in range(2)]
        # 建立所有任务
        finished, unfinished = await asyncio.wait(tasks)
        # 触发await,等待任务完成
        all_results = [r.result() for r in finished]
        # 获取所有结果
        print("ALL RESULT:"+str(all_results))

URL = ['https://pythondict.com/wp-content/uploads/2019/07/2019073115192114.jpg',
       'https://pythondict.com/wp-content/uploads/2019/08/2019080216113098.jpg']
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop, URL))
loop.close()

 

注意: img = await session.get(url)
这时候,在你请求第一个图片获得数据的时候,它会切换请求第二个图片或其他图片,等第一个图片获得所有数据后再切换回来。从而实现多线程批量下载的功能,速度超快,下载超清大图用这个方法可以一秒一张

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!

你应该用Python3.x而非Python2.x的20个理由

最近小编在知乎上经常遇到这样的问题:《现在开始学习python的话,是学习python2.x还是学习python3.x比较好?》,这也是许多初学者会遇到的问题,我们的答案是python 3.x. 为了帮助大家消除疑惑,在这里统一告诉大家原因

1. Python3.1,io模块是使用Python语言实现的,比2.x快5~10倍

2. Python3.1,str.format()支持自动编号:

python3.1,str.format()支持自动编号

3. Python 3.1,64位版的int快了27%~55%

4. Python 3.2,对全局解释器锁(GIL)进行了重大升级,显著改进了Python处理多线程的方式

5. python3.3,用C语言重写了decimal模块,比以前快12倍(数据操作)~120倍(高密度计算)。

6. Python3.3,utf-8编码快了2~4倍,utf-16编码的encode最多快了10倍

7. python3.4,优化pickle模块,性能提升好几倍。

8. python3.4,python解释器的启动快了30%

9. Python3.4, 新增tracemalloc模块。一个调试工具,用于追踪、统计python的内存分配。

10.Python3.4, 新增enum模块,提供枚举。好多人抱怨python没有枚举,现在有了,虽然是以模块的方式实现的。

11. Python 3.5,使异步变得不那么棘手,async和await关键字成为语言语法的一部分。

12. Python3.5,新的语法:Type hints和typing模块。方便代码阅读。

Python3.5,新的语法:Type hints和typing模块

13. Python3.5,UTF-8、UTF-16、LATIN-1编码的decode速度是以前的2~4倍。

14. Python3.5,新增.hex()函数,可以直接把bytes类型转为16进制

python hex()

15.python3.5, 新增os.scandir()函数,更快、更省内存的遍历文件夹。在POSIX系统上比以前快3~5倍,在Windows系统上快7~20倍。os.walk()目前也在使用此函数。

16. Python3.6, 用C语言实现asyncio.Future类和asyncio.Task类,asyncio程序的性能快了25%~30%

17. Python3.6, glob模块的glob()函数和iglob()函数现在使用os.scandir()函数。快了3~6倍

18. Python3.6,pathlib.Path模块的glob()函数现在使用os.scandir()函数。快了1.5~4倍

19. Python3.6, 新增secrets模块,生成强随机数。以前的random模块只能生成伪随机数,官方推荐在涉及安全问题时不再使用random模块

20. Python3.7,time模块新增6个可以访问纳秒的函数,如time.time_ns()、time.perf_counter_ns()等等。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Vscode 设置中文

如果你刚下载VSCode,发现界面全是英文的,不要急,下面就来教你怎么改成中文。

1. 首先打开vscode界面,点击View – Command Palette (或输入 Ctrl + shift + P)进入命令面板.

打开命令面板

2. 然后输入 configure language, 选择Configure Display Language (配置显示语言)。

Configure Display Language

3. 然后查看有没有zh-cn的选项,如果有,直接选择zh-cn替换,然后按照提示重启vscode就能看到界面变回中文了。

如果没有zh-cn的选项,则选择install additional languages (添加其他语言选项),左边会弹出扩展窗口,扩展窗口找到中文简体,然后点击install安装。然后重复第1, 2步骤选择中文即可。

install additional languages

VsCode系列文章:

Python 使用VS Code进行调试

VSCode 设置中文

Python 编程的最好搭档—VSCode 详细指南

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Pycharm 代码左边的数字是什么?

代码左边的数字

这个是Pycharm的书签功能

去除:

删除书签,将光标移至书签所在行,按快捷键F11即可消除。

添加:

在所在行按快捷键Ctrl+Shift+任意数字或者快捷键Ctrl+F11 即可添加,就可以插入一个标签了。

使用:

要将光标跳转到某个书签,只需要Ctrl+对应的标签数字。

如果想要查看所有书签位置:Shift + F11。

了解更多

更多有趣的Python教程欢迎关注公众号:Python实用宝典

或者访问网站:Python实用宝典

为什么Python这么适合AI和机器学习?4位专家给你答案

Python是机器学习的最佳编程语言之一,其迅速地在学术界和相关研究领域威胁到甚至超过了R的主导地位。为什么Python在机器学习领域如此受欢迎呢?为什么Python对AI有好处?

Mike Driscoll采访了4位Python专家和机器学习社区人士,讨论了Python在AI和相关研究领域中如此受欢迎的原因。

编程是一种社会活动——Python的社区已经透彻认识到了这一点

Glyph Lefkowitz

Glyph Lefkowitz (@glyph)是Python网络编程框架Twisted(一个能用于Python异步开发的)的创始人,他在2017年获得了PSF的社区服务奖。他是这么认为的:

人工智能是一个包罗万象的术语,它倾向于指当前计算机科学研究中最先进的领域。

曾经有一段时间,我们理所当然的以为基本图形遍历被认为是AI。在那个时候,Lisp是一种大型人工智能语言,因为它比一般的编程语言要高级,而且研究人员可以更容易地用Lisp做快速原型。我认为Python在总体上已经很大程度上取代了它,因为除了具有类似的高级功能外,它还有一个优秀的第三方生态系统。

Lispers会反对,所以我应该说清楚,我并不是要捧高Python的地位,只是说Python和Lisp都是同一类语言,比如在垃圾回收、内存安全等机制、命名空间和高级数据结构等方面都具有相似的特点。

从机器学习的更具体的意义上说,也就是现在越来越多的人所说的人工智能,我认为有更具体的答案。NumPy的存在及其伴随的生态系统允许非常适合研究的高级内容的混合,以及非常高性能的数字处理。如果不是非常密集的数字运算,机器学习就什么都不是。

“……统计学家、天文学家、生物学家和业务分析师都已经成为Python程序员,并改进了这个语言。”

Python社区致力于为非程序员提供友好的介绍和生态系统支持,这确实增加了它在数据科学和科学计算的姊妹学科中的应用。无数的统计学家、天文学家、生物学家和业务分析师已经成为Python程序员,并改进了这个语言。编程本质上是一种社会活动,Python社区比除JavaScript之外的任何语言都更认可这一点。

Python让用户关注真正的问题

Marc-Andre Lemburg

Marc-Andre Lemburg (@malemburg),PSF的联合创始人和eGenix的首席执行官。他是这样认为的:

Python对于没有受过计算机科学训练的人来说非常容易理解。当您试图执行研究所需的外部时,它消除了您必须处理的许多复杂性。

在Numeric(现在是NumPy)开始开发之后,新增了IPython笔记本(现在是Jupyter笔记本)、matplotlib和许多其他工具,使事情变得更加直观,Python允许使用者主要考虑问题的解决方案,而不是驱动这些解决方案所需的技术。

“Python是一种理想的集成语言,可以轻松地将技术绑定在一起。”

Python是一种理想的集成语言,可以轻松地将技术绑定在一起。Python允许用户关注真正的问题,而不是将时间花在实现细节上。除了让用户更容易操作之外,对于开发外部的底层集成人员来说,Python还是一个理想的粘合平台。这主要是因为Python非常容易通过一个漂亮而完整的C语言API访问。

Python有许多适合科学计算的特性

Luciano Ramalho

Luciano Ramalho (@ramalhoorg), ThoughtWorks技术负责人,PSF研究员。他是这么看的:

最重要和最直接的原因是NumPy和SciPy支持像scikit-learn这样的项目,scikit-learn目前几乎是机器学习的标准工具

首先创建NumPy、SciPy、scikit-learn和许多其他的原因是Python具有一些特性,使其对科学计算非常方便。Python有一个简单且一致的语法,这使得非软件工程师更容易进行编程。

“Python得益于科学计算的丰富生态系统。”

另一个原因是运算符重载,这使得代码可读且简洁。然后是Python的buffer protocol (PEP 3118),它是外部在处理类似数组的数据结构时与Python有效互操作的标准。最后,Python得益于科学计算的丰富生态系统,这吸引了更多的科学家与开发者,并创造了一个良性循环。

Python严格一致的特点使其对AI非常友好

Mike Bayer

Mike Bayer (@zzzeek), Red Hat高级软件工程师,SQLAlchemy的创建者。他是这么认为的:

我们在这个领域所做的是开发我们的数学模型和算法。我们正在把我们肯定想要保留的和优化的算法放入像scikit-learn这样的中。然后,我们将继续迭代并共享关于如何组织和考虑数据的注释。

高级脚本语言是人工智能和机器学习的理想语言,因为我们可以快速转移数据,然后再试一次。我们创建的代码的大部分用于表示实际的数学和数据结构。

像Python这样的脚本语言甚至更好,因为它是严格和一致的。每个人都可以更好地理解彼此的Python代码,而不是使用其他具有混乱和不一致编程范例的语言。

Python重视我们正在努力做的工作的核心,并且完全最小化了我们如何给计算机下达指令等其他事情,这是应该的,自动化所有你不应该考虑的事情,让你更好地为了达到目标写代码。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

准确率94%!Python 机器学习识别微博或推特机器人

推特或微博机器人的存在其实是比较危险的,他们可以制造虚假的流量、传播谣言、甚至执行一些令人汗颜的恶意操作,这里我们使用kaggle纽约大学2017年机器学习竞赛的推特分类数据来进行我们的识别实验,本实验的数据集请访问:下载Python推特机器人分类数据集

在开始之前我们需要安装以下Python包(),打开你的CMD(Windows系统)/Terminal(macOS系统)输入以下指令即可:

pip install numpy
pip install seaborn
pip install pandas
pip install matplotlib
pip install scikit-learn

其中numpy和pandas都是用于数据处理的,numpy是一个C编写的,所以运算会比python内置的运算快,此外,matplotlib和seaborn主要用于Python数据可视化。scikit-learn内置了许多常用的机器学习分析模型,用起来非常简单。

1.Python加载数据

好了,废话不多说,让我们现在就开始使用panda加载数据,分别获得bot和非bot数据:

import pandas as pd
import numpy as np
import seaborn
import matplotlib

data = pd.read_csv('training_data.csv')
Bots = data[data.bot==1]
NonBots = data[data.bot==0]

使用热力图识别训练集/测试集中缺失数据:

seaborn.heatmap(data.isnull(), yticklabels=False, cbar=False, cmap='viridis')
# 热力图,当data中有空值时标为黄色
matplotlib.pyplot.tight_layout() 
matplotlib.pyplot.show()
Python识别缺失数据

2.Python 特征选择

什么是特征选择?其实很简单,我们在日常生活中识别西瓜和榴莲的时候是怎么识别的?比如从外观特征上:榴莲带刺、黄色的;西瓜圆润、绿色的。机器学习模型也是一样的,我们需要从类似于挑选西瓜外观特征来挑选两个类别的特征。比如说应用上我们前面的Python热力图查看数据缺失

Python机器人的数据缺失热力图
Python非机器人的数据缺失热力图

我们可以明显地看到机器人的location, urls明显缺失的部分更多。因此我们的特征可以加上这两项,由于数据量不多,我们应该绕过字符串编码,以location列为例,编码方式为:如果location缺失则为false, location存在则为True.

其他特征当然还有比如姓名、描述(description ) 这样的必输信息。当然,我们还能通过选择Twitter机器人使用的一些不好的单词将他们作为特征,如果他们的信息里包含了这些脏话,则将该机器人的该项特征设为True。下面是一个机器人使用脏话的例子。你可以添加更多的单词:

bag_of_words_bot = r'bot|b0t|cannabis|tweet me|mishear|follow me|updates every|gorilla|yes_ofc|forget' \
r'expos|kill|bbb|truthe|fake|anony|free|virus|funky|RNA|jargon'\
r'nerd|swag|jack|chick|prison|paper|pokem|xx|freak|ffd|dunia|clone|genie|bbb' \
r'ffd|onlyman|emoji|joke|troll|droop|free|every|wow|cheese|yeah|bio|magic|wizard|face'

将我们的特征编码为数字的形式:

# 该列的每个值包不包含脏话,包含则为True,不包含则为False
data['screen_name_binary'] = data.screen_name.str.contains(bag_of_words_bot, case=False, na=False)
data['name_binary'] = data.name.str.contains(bag_of_words_bot, case=False, na=False)
data['description_binary'] = data.description.str.contains(bag_of_words_bot, case=False, na=False)
data['status_binary'] = data.status.str.contains(bag_of_words_bot, case=False, na=False)

# 判断该列的每个值是否有listedcount>20000的情况,有的话为False,没有的话为True
data['listed_count_binary'] = (data.listedcount>20000)==False 

# 判断该列的每个值是否有空的情况,有空的则为False,否则为True
data['location_binary'] = ~data.location.isnull()
data['url_binary'] = ~data.url.isnull()

# 选定我们的特征
features = ['screen_name_binary', 'name_binary', 'description_binary', 'status_binary', 'verified', 'followers_count','verified', 'friends_count', 'statuses_count', 'listed_count_binary', 'bot', 'url_binary', 'location_binary', 'default_profile', 'default_profile_image'] 

其中需要注意的是所有的文本我们都编码为0和1的形式(存不存在脏话)。

3.Python scikit-learn训练与测试

现在让我们来使用Python scikit-learn包里的决策树模型进行分类。

首先我们引入需要使用到的包,有三个,如下:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split 

1.从 sklearn.tree 引入 DecisionTreeClassifier ,这是一个决策树的分类器模型,我们一会将使用它进行训练;
2.sklearn.metrics 引入 accuracy_score 这是用于方便计算准确率的;
3.sklearn.model_selection 的 train_test_split 是用于方便分割训练集和测试集的。

分割训练集

X = data[features].iloc[:,:-1] 
# 除了最后一列的BOT都是数据
y = data[features].iloc[:,-1] 
# BOT是分类对象,1:机器人 0:非机器人X_train, 
X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)

使用到了train_test_split()函数,test_size=0.3即30%的数据用于测试,random_state=101 是随机数种子,设置后对于每次不改变训练集的测试,测试结果都一样。

训练与测试

clf = DecisionTreeClassifier(criterion='entropy', min_samples_leaf=50, min_samples_split=10)
clf.fit(X_train, y_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)  
print("Training Accuracy: %.5f" %accuracy_score(y_train, y_pred_train))
print("Test Accuracy: %.5f" %accuracy_score(y_test, y_pred_test)) 

初始化了一个决策树模型clf,clf.fit即开始进行训练,clf.predict则为测试。

4.Python 模型结果

测试结果

最终我得到的结果如下,测试准确率高达94.4%,这是一个相当令人满意的结果了,在当时的kaggle比赛里大约能排在27名左右。你也可以尝试其他的模型,并非只有决策树可以选择,比如说SVM、LR都可以尝试一下。

kaggle排名

全部源代码下载请点击:Python机器学习识别微博或推特机器人(acc:94.4%)

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 世界上最简单的面部识别api 源代码下载

[download_code]

Face Recognition 世界上最简单的Python面部识别api

译者注:

本项目face_recognition是一个强大、简单、易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统。

为了便于中国开发者研究学习人脸识别、贡献代码,我将本项目README文件翻译成中文。

向本项目的所有贡献者致敬。

英译汉:同济大学开源软件协会 子豪兄Tommy

Translator’s note:

face_recognition is a powerful, simple and easy-to-use face recognition open source project with complete development documents and application cases, especially it is compatible with Raspberry Pi.

In order to facilitate Chinese software developers to learn, make progress in face recognition development and source code contributions, I translated README file into simplified Chinese.

Salute to all contributors to this project.

Translator: Tommy in Tongji Univerisity Opensource Association 子豪兄Tommy

本项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工具提取、识别、操作人脸。

本项目的人脸识别是基于业内领先的C++开源库 dlib中的深度学习模型,用Labeled Faces in the Wild人脸数据集进行测试,有高达99.38%的准确率。但对小孩和亚洲人脸的识别准确率尚待提升。

Labeled Faces in the Wild是美国麻省大学安姆斯特分校(University of Massachusetts Amherst)制作的人脸数据集,该数据集包含了从网络收集的13,000多张面部图像。

本项目提供了简易的face_recognition命令行工具,你可以用它处理整个文件夹里的图片。

  

特性

从图片里找到人脸

定位图片中的所有人脸:

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)

识别人脸关键点在很多领域都有用处,但同样你也可以把这个功能玩坏,比如本项目的 digital make-up自动化妆案例(就像美图秀秀一样)。

识别图片中的人是谁

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)

你也可以配合其它的Python库(比如opencv)实现实时人脸检测:

看这个案例 实时人脸检测 。

安装

环境配置

  • Python 3.3+ or Python 2.7
  • macOS or Linux
  • Windows并不是我们官方支持的,但也许也能用

不同操作系统的安装方法

在 Mac 或者 Linux上安装本项目

First, make sure you have dlib already installed with Python bindings:

第一步,安装dlib和相关Python依赖:

Then, install this module from pypi using pip3 (or pip2 for Python 2):

pip3 install face_recognition

如果你遇到了幺蛾子,可以用Ubuntu虚拟机安装本项目,看下面这个教程。 如何使用Adam Geitgey大神提供的Ubuntu虚拟机镜像文件安装配置虚拟机,本项目已经包含在镜像中.

在 Mac 或者 Linux上安装本项目 2

修改你的pip镜像源为清华镜像,然后使用pip install face_recognition,可以自动帮你安装各种依赖,包括dlib。只是在安装dlib的时候可能会出问题,因为dlib需要编译,出现的问题一般是gcc或者g++版本的问题,所以在pip install face_recognition之前,可以通过在命令行键入

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++  

来指定你gcc和g++对应的位置,(这两句话会临时修改当前终端的环境变量/usr/local/bin/gcc对应你自己gcc或者g++所在目录)。

在树莓派上安装

在Windows上安装

虽然本项目官方并不支持Windows,但一些大神们摸索出了在Windows上运行本项目的方法:

使用Ubuntu虚拟机镜像文件安装配置虚拟机,本项目已经包含在这个镜像中

使用方法

命令行界面

当你安装好了本项目,你可以使用两种命令行工具:

  • face_recognition – 在单张图片或一个图片文件夹中认出是谁的脸。
  • face_detection – 在单张图片或一个图片文件夹中定位人脸位置。

face_recognition 命令行工具

face_recognition命令行工具可以在单张图片或一个图片文件夹中认出是谁的脸。

首先,你得有一个你已经知道名字的人脸图片文件夹,一个人一张图,图片的文件名即为对应的人的名字:

然后,你需要第二个图片文件夹,文件夹里面是你希望识别的图片:

然后,你在命令行中切换到这两个文件夹所在路径,然后使用face_recognition命令行,传入这两个图片文件夹,然后就会输出未知图片中人的名字:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

输出结果的每一行对应着图片中的一张脸,图片名字和对应人脸识别结果用逗号分开。

如果结果输出了unknown_person,那么代表这张脸没有对应上已知人脸图片文件夹中的任何一个人。

face_detection 命令行工具

face_detection命令行工具可以在单张图片或一个图片文件夹中定位人脸位置(输出像素点坐标)。

在命令行中使用face_detection,传入一个图片文件夹或单张图片文件来进行人脸位置检测:

$ face_detection  ./folder_with_pictures/

examples/image1.jpg,65,215,169,112
examples/image2.jpg,62,394,211,244
examples/image2.jpg,95,941,244,792

输出结果的每一行都对应图片中的一张脸,输出坐标代表着这张脸的上、右、下、左像素点坐标。

调整人脸识别的容错率和敏感度

如果一张脸识别出不止一个结果,那么这意味着他和其他人长的太像了(本项目对于小孩和亚洲人的人脸识别准确率有待提升)。你可以把容错率调低一些,使识别结果更加严格。

通过传入参数 --tolerance 来实现这个功能,默认的容错率是0.6,容错率越低,识别越严格准确。

$ face_recognition --tolerance 0.54 ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person

如果你想看人脸匹配的具体数值,可以传入参数 --show-distance true

$ face_recognition --show-distance true ./pictures_of_people_i_know/ ./unknown_pictures/

/unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785
/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None
更多的例子

如果你并不在乎图片的文件名,只想知道文件夹中的图片里有谁,可以用这个管道命令:

$ face_recognition ./pictures_of_people_i_know/ ./unknown_pictures/ | cut -d ',' -f2

Barack Obama
unknown_person
加速人脸识别运算

如果你的CPU是多核的,你可以通过并行运算加速人脸识别。例如,如果你的CPU有四个核心,那么你可以通过并行运算提升大概四倍的运算速度。

如果你使用Python3.4或更新的版本,可以传入 --cpus <number_of_cpu_cores_to_use> 参数:

$ face_recognition --cpus 4 ./pictures_of_people_i_know/ ./unknown_pictures/

你可以传入 --cpus -1参数来调用cpu的所有核心。

子豪兄批注:树莓派3B有4个CPU核心,传入多核参数可以显著提升图片识别的速度(亲测)。

Python 模块:face_recognition

在Python中,你可以导入face_recognition模块,调用我们提供的丰富的API接口,用几行代码就可以轻松玩转各种人脸识别功能!

API 接口文档: https://face-recognition.readthedocs.io

在图片中定位人脸的位置
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image)

# face_locations is now an array listing the co-ordinates of each face!

看 案例:定位拜登的脸

你也可以使用深度学习模型达到更加精准的人脸定位。

注意:这种方法需要GPU加速(通过英伟达显卡的CUDA库驱动),你在编译安装dlib的时候也需要开启CUDA支持。

import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_locations = face_recognition.face_locations(image, model="cnn")

# face_locations is now an array listing the co-ordinates of each face!

看 案例:使用卷积神经网络深度学习模型定位拜登的脸

如果你有很多图片需要识别,同时又有GPU,那么你可以参考这个例子:案例:使用卷积神经网络深度学习模型批量识别图片中的人脸.

识别单张图片中人脸的关键点
import face_recognition

image = face_recognition.load_image_file("my_picture.jpg")
face_landmarks_list = face_recognition.face_landmarks(image)

# face_landmarks_list is now an array with the locations of each facial feature in each face.
# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.

看这个案例 案例:提取奥巴马和拜登的面部关键点 

识别图片中的人是谁
import face_recognition

picture_of_me = face_recognition.load_image_file("me.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!

unknown_picture = face_recognition.load_image_file("unknown.jpg")
unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]

# Now we can see the two face encodings are of the same person with `compare_faces`!

results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)

if results[0] == True:
    print("It's a picture of me!")
else:
    print("It's not a picture of me!")

看这个案例 案例:是奥巴马还是拜登?

Python 案例

所有案例都在这个链接中 也就是examples文件夹.

人脸定位

人脸关键点识别

人脸识别

关于 face_recognition的文章和教程

人脸识别的原理

如果你想更深入了解人脸识别这个黑箱的原理 读这篇文章

子豪兄批注:一定要看这篇文章,讲的既有趣又有料。

警告说明

  • 本项目的人脸识别模型是基于成年人的,在孩子身上效果可能一般。如果图片中有孩子的话,建议把临界值设为0.6.
  • 不同人种的识别结果可能不同, 看wiki百科页面 查看更多细节。

把本项目部署在云服务器上 (Heroku, AWS等)

本项目是基于C++库dlib的,所以把本项目部署在Heroku或者AWS的云端服务器上是很明智的。

为了简化这个过程,有一个Dockerfile案例,教你怎么把face_recognition开发的app封装成Docker 容器文件,你可以把它部署在所以支持Docker镜像文件的云服务上。

出了幺蛾子?

如果出了问题,请在Github提交Issue之前查看 常见错误 。

鸣谢

  • 非常感谢 Davis King (@nulhom)创建了dlib库,提供了响应的人脸关键点检测和人脸编码相关的模型,你可以查看 blog post这个网页获取更多有关ResNet的信息。
  • 感谢每一个相关Python模块(包括numpy,scipy,scikit-image,pillow等)的贡献者。
  • 感谢 Cookiecutter 和audreyr/cookiecutter-pypackage 项目模板,使得Python的打包方式更容易接受。

有趣好用的Python教程

退出移动版
微信支付
请使用 微信 扫码支付