1.3.8 使用树莓派摄像头进行人脸识别
更新时间:2019-06-05 16:42:07
目标
当前案例可以让你实现基于树莓派摄像头拍摄照片的上传与人脸特征识别,并把结果通过钉钉机器人推送。
说明
树莓派+摄像头是最简单实现图像识别的设备组合。我们使用阿里云设备连接的python SDK进行开发,检测到有人时把拍摄的照片上传到OSS,同时通过服务开发工作台监听设备上报图片事件,获取人脸图片并调用阿里云市场人脸识别API进行识别,最后将结果推送到钉钉机器人上。
创建产品
本次需要创建一个产品——一个摄像头产品,包括人体红外属性与照片URL属性。
之前的产品都是直接在IoT Studio的项目内创建的。我们本次演示如何把物联网平台的设备导入到IoT Studio的项目中。首先在物联网平台的产品管理页新建一个“红外摄像头”设备,采用默认配置即可。
然后在功能定义里创建两个属性,红外状态(布尔)与图片URL(字符),这样就完成了产品的定义。
然后我们点击“开发服务”的项目进入IoT Studio的项目中。
在项目首页点击右上角“导入产品”。选择对应的产品即可。
可以看到产品列表里已经有这个产品了,接下来只要点击左侧栏的“设备”前往项目内的设备管理页面,新建几个设备,拿到实例化的DeviceName和DeviceSecret即可。
OSS开通
阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过 Web 控制台对数据进行简单的管理。OSS 适合存放任意类型的文件,适合各种网站、开发企业及开发者使用。
首先点击“立即开通”进入开通页面并点击同意协议。
然后进入控制台,新建一个Bucket,一个Bucket相当于一个文件夹,可以通过API路径访问里面的文件。在这里我们选择公共读写。
然后可以看到OSS控制台新建了一个bucket,里面是空的,我们可以尝试上传一些图片。
然后点击文件右方的操作项里的“复制文件URL”,把复制的URL粘贴到浏览器,看看能否预览。
可以看到通过URL访问我们就能看到图片了,这样OSS的配置就完成了。
设备开发
由于树莓派是基于python的,我们需要两个python SDK——设备连接的SDK与OSS上传的SDK。
树莓派以及其配套摄像头以及红外传感器的购买可以在淘宝上搜索。加起来300以内即可。
设备接线如下图,把摄像头插入卡槽,PIR插入GPIO口即可。
接下来是树莓派的代码开发。树莓派的代码烧录可以通过HDMI线接入显示屏作为普通电脑或选择SSH远程登录等方法操作,这里不再赘述,可以参考这里的链接。
代码如下(基于python 3.6),需要根据备注填入自己的账号信息,产品信息等:
import aliyunsdkiotclient.AliyunIotMqttClient as iot ##导入阿里云的设备MQTT库,如果import失败需要先pip3 install 一下
import json
import multiprocessing
import time
import random
import oss2 ##导入阿里云的OSS库,如果import失败需要先pip3 install oss2
from picamera import PiCamera ##树莓派的摄像头,系统自带
import RPi.GPIO as GPIO ##GPIO口,接红外PIR用
auth = oss2.Auth('**AccessId*****','**AccessSecret*****') ##OSS的授权需要阿里云账号AccessId和AccessSecret,具体查看https://usercenter.console.aliyun.com/#/manage/ak
bucket = oss2.Bucket(auth,'http://oss-cn-beijing.aliyuncs.com','***你的bucket名称***') ##需要根据服务器区域修改节点路径,见文档
global picURLtoIoT
camera = PiCamera()
camera.resolution = (800,600) ##拍照分辨率,越高越容易分析,但是上次越慢
##初始化树莓派
def init():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(3, GPIO.IN)
pass
def take_photo():
ticks = int(time.time())
fileName = 'test%s.jpg' % ticks ##在文件名加入了时间戳作为简易加密手段
filePath = '/home/pi/Pictures/%s' % fileName
camera.capture(filePath)
bucket.put_object_from_file('bucket_file_name/%s', fileName) ##在这里改bucket名字
global picURLtoIoT
picURLtoIoT = 'http://***你的bucket名称**.oss-cn-beijing.aliyuncs.com/bucket_file_name/%s' % fileName
##在这里改bucket名字和bucket内文件夹的名字
print(str(picURLtoIoT))
##如果检测到有人则拍照,否则休眠5秒
def detectPeople():
if GPIO.input(3) == True:
take_photo()
else:
time.sleep(5)
options = {
'productKey':'**你的ProductKey**',
'deviceName':'**你的deviceName**',
'deviceSecret':'**你的deviceSecret**',
'port':1883,
'host':'iot-as-mqtt.cn-shanghai.aliyuncs.com' ##注意阿里云IoT国内都是华东1,不一定跟OSS的节点一致
}
host = options['productKey'] + '.' + options['host']
def on_message(client, userdata, msg):
topic = '/' + productKey + '/' + deviceName + '/update'
print(msg.payload)
def on_connect(client, userdata, flags_dict, rc):
print("Connected with result code " + str(rc))
def on_disconnect(client, userdata, flags_dict, rc):
print("Disconnected.")
##设备上报的定义
def upload_device(client):
topic = '/sys/'+options['productKey']+'/'+options['deviceName']+'/thing/event/property/post'
while True:
payload_json = {
'id': int(time.time()),
'params': {
'people':1 ##注意物模型里布尔值是以0和1的形式上报的
'picURL': picURLtoIoT,
},
'method': "thing.event.property.post"
}
print('send data to iot server: ' + str(payload_json))
client.publish(topic, payload=str(payload_json))
if __name__ == '__main__':
client = iot.getAliyunIotMqttClient(options['productKey'], options['deviceName'], options['deviceSecret'], secure_mode=3)
client.on_connect = on_connect
client.connect(host=host, port=options['port'], keepalive=60)
p = multiprocessing.Process(target=upload_device, args=(client,))
p.start()
detectPeople()
GPIO.cleanup()
client.loop_forever()
创建服务
进入新建页面,建立一个空白的服务。
选择设备触发节点作为开始节点。中间接入一个云市场api节点,以及一个钉钉机器人节点。注意在新的界面中,设备触发节点在“设备”tab里。
云市场API节点采用了这个API,配置项如图。
钉钉机器人节点配置如下,这里不再赘述如何获取Webhook。
之后部署启动即可。
调试与验证
用树莓派拍照
结果