硬件
- 树莓派4B一个
- CSI摄像头一个
笔者使用的是树莓派4B和CSI摄像头,但是树莓派3和USB摄像头等相似设备均可。
百度云智能设置
Step 1 登录
百度云智能 网址https://cloud.baidu.com/
首先登录百度账号,与百度云、百度贴吧等互通,可直接扫码登录。如果没有百度账号请先自行注册。
Step 2 实名认证
百度的产品用了这么多年了,想必大家都已经认证过了,没有认证的读者现在认证即可,很快。
Step 3 领取免费资源
实名认证之后可以领取免费的智能云资源,一定要领取,否则之后我们测试程序时会报qps不足,不知道在哪领取的话先往后看,后面也会有链接。
Step 4 创建应用
鼠标放到右上角的三道横杠,依次选择产品服务、人工智能、人脸识别。
进来以后创建应用:
没有什么特别好说的,都无关乎我们的程序,按自己想的填写即可:(注意前面没有领取免费资源的话,可以在这里点击去领取)
Step 5 下载SDK
创建好应用后回到这个界面,点击下载SDK,一会儿要用。
本文采用Python语言实现,后续可能会出C++版本的教程,这里先直接选择Python的SDK:
Step 6 保存关键信息、创建组、新建用户并上传图片
下载好后我们进入到应用详情,首先保存好AppID、API Key、Secret Key三个字段的值,一会儿程序中要用。
保存好后我们点击左侧的“可视化人脸库”,然后根据页面提示创建组、创建用户、并上传用户的人脸图片,这里笔者只上传了一张自拍照,经测试在正常条件下也是可以识别出本人的。
到这里百度云智能的配置就告一段落了。
树莓派摄像头设置及必要视觉库的安装
Step 1 树莓派及摄像头的硬件安装及开启
首先我们将树莓派和摄像头安装好,并通过raspi-config开启摄像头权限,不熟悉的同学可以参考博客:树莓派摄像头基础配置及测试
Step 2 安装必要的视觉库
安装picamera,这是树莓派原生的图像和摄像头库。
pip install picamera
这里假设大家已经安装好python3。
安装opencv,笔者的程序中使用opencv库来做的图像采集。
sudo apt-get install -y libopencv-dev python3-opencv
如果要使用Python来使用GPIO信号,需要使用RPi.GPIO模块。如果你使用的是Python2版本,树莓派默认安装了RPi.GPIO模块(python-rpi.gpio)。
目前大多数的人都是使用Python3了,所以我们要手动安装Python 3版本的模块。
GPIO在本文中暂时不需要,但是还是安装一下,以后可以通过GPIO传输控制信号玩法有很多,笔者私以为树莓派最有魅力的一个点就在与除了可以看作一台电脑,它还带有丰富的GPIO接口。
sudo apt-get install python3-rpi.gpio
Step 3 安装百度云智能相关模块
安装百度AI模块
sudo pip install baidu-aip
安装SDK,将下载好的人脸识别SDK解压并安装:
sudo python3 setup.py install
测试
首先创建一个客户端来访问百度云智能,这里传入的参数就是刚才让大家保存的几个字段APP_ID, API_KEY, SECRET_KEY
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
以下是核心测试函数,笔者在代码中做了比较详细的注释。
def check():
stranger_count = 0
while True:
img_np = get_image() # opencv读取图像
img_base64 = image_to_base64(img_np) # 将opencv读取到的图像转base64编码
result = client.search(str(img_base64), 'base64', 'admin'); #在百度云人脸库中寻找匹配的人脸
if result['error_msg'] == 'SUCCESS': # 如果成功了,说明检测到人,但不一定是成员
name = result['result']['user_list'][0]['user_id'] # 获取名字
score = result['result']['user_list'][0]['score'] # 获取相似度分数
# print(name, score)
if score > 80: #如果相似度大于80
print('检测到成员:{}, 匹配度:{}'.format(name, score))
with open('Log.txt','a') as f:
f.write('Person: {},\t score: {:.4f}\t, time: {}\n'.format(name, score, get_curr_time()))
time.sleep(2)
else:
print("检测到非成员,")
name = 'stranger'
stranger_count += 1
stranger_path = os.path.join(STRANGER_DIR, str(stranger_count)+'.jpg')
with open('Log.txt','a') as f:
f.write('Person: {},\t saved as: {},\t time: {}\n'.format(name, stranger_path, get_curr_time()))
cv2.imwrite(stranger_path, img_np)
time.sleep(2)
elif result['error_msg'] == 'pic not has face':
print('未检测到人脸')
time.sleep(2)
else:
print(result['error_code']+' ' + result['error_code'])
time.sleep(2)
Log.txt文件的部分输出:
Person: stranger, saved as: strangers/16.jpg, time: Thu Aug 5 19:07:31 2021
Person: stranger, saved as: strangers/17.jpg, time: Thu Aug 5 19:07:34 2021
Person: Song, score: 95.0842 , time: Thu Aug 5 19:07:37 2021
Person: stranger, saved as: strangers/18.jpg, time: Thu Aug 5 19:07:43 2021
stranger是笔者请师哥露脸时的输出。Song是笔者本人露脸的识别结果及分数。识别的精度还是可以满足一般日常场景的需要的。
除了与百度之间的接口之外就是一些简单控制逻辑,大家也可以自行设计一些控制逻辑,根据是否检测到人脸、检测到的人脸能否被识别为用户组里的人脸来配合GPIO做一些控制逻辑,比如开关门、开关灯之类等智能家居,或者人脸识别打卡等。
后续笔者可能会做一个C++语言版的分享。
源码地址:https://github.com/Adenialzz/Rpi-BaiduSDK/tree/main
有其他报错或者困惑的朋友欢迎留言交流,有其他有趣的树莓派或计算机视觉想法的朋友也欢迎留言讨论。