APP下载

基于方位感知的老人居家行为监测系统及应用①

2022-06-29邱云明甘倬溢汪子涵

计算机系统应用 2022年6期
关键词:舵机人脸邮件

邱云明, 甘倬溢, 范 恩, 罗 旭, 刘 晶, 汪子涵

1(深圳大学 物理与光电工程学院, 深圳 518061)

2(绍兴文理学院 计算机科学与工程系, 绍兴 312000)

随着人口老龄化程度的不断加深, 空巢老人居家监护已成为一个亟需解决的热点问题[1–3]. 越来越多的老年人需要看护, 特别是独居老人群体. 然而由于现实工作等客观原因, 子女一般与老人分开居住, 不能及时照看老人, 所以室内安全监测对保障独居老人健康和安全变得十分重要[4–6]. 此外, 老人的室内活动规律会随着他们年龄、季节、身体状态的变化而变化, 他们在室内活动的热点区域以及驻留时间也会发生相应的变化. 通过上述这些情况可以及时了解老人的生活状态, 发现异常行为并发出提醒邮件[7–10]. 因此, 利用远程监测系统获取监控数据, 一方面可以实时监测老人健康状态, 另一方面可以帮助分析老人行为习惯, 进一步深入了解老人生理状态, 从而更好地看护老人.

相对传统监护方式, 利用远程监护系统监测独居老人具有一定的优势. 利用多传感器监测已广泛应用于诸多领域[11–13]. 文献[14]利用蓝牙信号的强弱获得老人当前位置, 提出一种基于位置信息的老人异常状态监测方法, 能够降低穿戴设备的负担. 文献[15]从情感感知的角度, 建立老人的居家行为模型, 提出一种基于随机森林和行为相似性的老人居家行为识别方法.文献[8]通过射频识别标签以及设计内置传感器, 实时监测老人异常位置, 并发出异常提醒. 在实际设计远程监护系统的过程中, 既要考虑用户的实际需求, 也要考虑信息的私密性. 因此, 实际上将摄像头安装在室内合适的位置, 根据目标的方位信息, 来分析老人的健康状态和异常行为, 这样既能够保证用户信息的私密性, 也能够提供目标可靠的信息, 更好地方便用户对老人进行远程看护.

为此, 本文针对独居老人室内行为监测及异常行为监测, 开发出一款基于方位感知的老人居家行为监测系统, 并应用于老人的实际生活场景. 该系统首先根据老人的室内结构图, 以舵机为原点, 建立室内方位坐标系, 将室内划分为不同的兴趣区域; 然后通过编写Python 程序实现摄像头的自动目标(老人)搜索以及人脸识别、定位功能; 最后根据监测目标的方位信息和时间信息, 分析老人的日常行为, 同时判断是否存在异常行为, 并发送提醒邮件. 实际应用结果表明, 该监测系统能够实时监测目标室内行为, 具有灵活性高、实时性强、可靠性好等优点. 此外, 利用Python 语言对摄像头进行二次开发, 代码复用性高、可扩展性强、便于操作, 因此具有良好的应用价值.

1 系统功能架构

为了对独居老人进行监护, 本文开发出一套基于方位感知的独居老人监测系统. 具体设计思路如下:① 采用云象摄像头获取老人室内的方位视频图像;② 利用目标跟踪算法独居老人(目标)进行检测与跟踪; ③ 根据目标方位信息计算目标所处空间位置; ④ 将目标的相关数据保存于本地数据库.

如图1 所示, 基于方位感知的老人居家行为检测系统主要由3 个模块组成: 图像数据信息采集处理模块、数据传输模块、图形界面显示和提示模块. 图像数据信息采集处理模块由云象摄像头、树莓派处理器等硬件、OpenCV 和MySQL 数据库组成. 它主要负责采集图像数据, 并存储到数据库. 数据传输模块主要是通过WiFi 网络传输数据. 图形界面显示和提示模块主要由手机端和电脑端VCC 远程控制显示构成, 负责发送控制命令和接收提示信息.

图1 系统功能架构

云摄像头: 30 万像素, 俯仰130°, 环视180°.

树莓派处理器: 含有8 路带过路流保护的PWM舵机接口, 单总线串口电路, 可直接控制串口舵机两路可编程LED、清晰展示系统工作状态; 有两路可编程的按钮, 可以配置系统; 预留IIC 的UART 接口, 可以拓展各种传感器.

MySQL 数据库模块: 记录目标位置的数据表结构图. 其中, id 表示记录表的索引, name 表示目标名字,position 表示目标位置, time 表示检测时间. 通过此表可以记录目标的位置以及位置改变的时间. 因此, 通过数据库中目标在不同位置的停留时长来判断老人的行为以及可能存在的异常情况.

OpenCV 函数库: 它是开放源代码计算机视觉库,主要包括图像处理、计算机视觉和机器学习等算法,能够提供C、C++、Java、Python 等接口. 在本文视频处理及图像处理功能模块, 主要是在OpenCV 函数的基础上实现的.

WiFi 网络/局域网: 通过WiFi 将终端和摄像头链接在同一局域网, 实现不同终端之间的通信.

图像化界面显示和提示模块: 将摄像头采集的图像信息传送到电脑端, 再通过VCC 远程控制界面实时显示.

2 系统功能实现

如图2 所示, 监测系统的硬件部分主要由树莓派、摄像头和舵机组成, 用于实现自动目标搜索功能和人脸定位功能. 受到摄像头分辨率以及所采用的目标检测算法性能的限制, 搭建好硬件监测平台后, 本文采用的主要监测处理流程如下: 当目标距离较远时, 系统将老人作为移动目标进行检测, 能够实时检测并跟踪目标, 但此时人脸识别不连续或不稳定; 当目标距离比近时, 系统既能够实时检测并跟踪目标, 同时能够连续、稳定地识别目标的人脸.

图2 监测硬件系统

2.1 摄像头自动搜索模块

自动搜索功能主要由舵机和摄像头联合实现. 舵机用于控制摄像头上下和左右旋转, 摄像头用于采集图像数据. 当系统启动时, 摄像头首先进入自动搜索模式, 通过水平扫描, 捕捉室内目标及位置数据. 当没有捕捉到目标数据时, 控制舵机向右旋转5°, 直至最大角度, 再向相反方向开始旋转. 在自动搜索过程中, 对摄像头上下位置进行判断, 如果与定义的水平位置存在差值, 那么就缓慢上下转动摄像头, 直至修正为水平位置. 主要实现代码如代码1.

代码1. 摄像头自动搜索if track != 0 and max_area == 0:#当开启追踪功能但是没有检测的人脸的时候#摄像头水平复原函数

if servo1_face_track<1230: servo1_face_track=servo1_face_track+10 elif servo1_face_track>1270: servo1_face_track=servo1_face_track–10 else: servo1_face_track=1250 #摄像头没有检测到人脸时的循环扫描实现if tmp2>10 and tmp1<2500: #当摄像头从初始角开始转时 servo2_face_track=tmp1 tmp1=tmp1+10 time.sleep(0.01)if action_finish_face: dis_ok_face = True elif tmp1>=2500 and tmp2>10: #控制摄像头回转 servo2_face_track=tmp2 tmp=tmp2–10 time.sleep(0.01)if action_finish_face: dis_ok_face = True else: tmp1=int(0) tmp2=int(2500)?

具体地, 在OpenCV 中: 首先, 采用函数cv2.resize()将每帧图像的功能模块设置成大小为320×240, 利用函数cv2.cvtColor()对图像进行灰度处理, 并使用函数cv2.GaussianBlur()对图像高斯模糊化, 从而消除高斯噪声; 然后, 比较两帧图像, 调用函数cv2.accumulate Weighted()检测运动目标, 并采用cv2.absdiff()记录差值; 接着, 利用函数cv2.threshold()将灰度图二值化, 使用函数cv2.dilate() 对图像膨胀处理, 通过函数cv2.drawContours()在绘制轮廓, 同时遍历轮廓; 最后, 调用函数cv2.contourArea()计算目标轮廓面积, 并根据门限值进行判断. 由于人体目标相对较大, 门限值应该设置较大, 以便过滤除较小目标的影响, 调用cv2.bounding Rect()计算目标轮廓的4 个坐标值, 再利用cv2.rectangle()对轮廓边框进行标注.

2.2 人脸定位模块

当搜索到目标后, 需要对目标人脸进行监测和定位. 当检测到人脸面部时, 将该区域标记成一个框, 分别用x1、x2、y1、y2 这4 个值, 标记该框的4 个角,然后根据公式计算人脸的坐标:

最后根据两个坐标与定义好的图像中心坐标进行比较:

当其差值较大时, 即可以认为人脸不在图像中间部位, 此时控制舵机转动, 保证人脸位于图像中心位置,不超出图像范围. 主要实现代码如代码2.

代码2. 人脸定位if track and max_area != 0:#当开启人脸追踪功能并且检测到人脸时, 控制舵机追踪 center_x, center_y = (max_face[0]+int((max_face[2]–max_face[0]) / 2),max_face[1]+int((max_face[3]–max_face[1]) /2)) #最大的人脸的坐标 #上下pid 刷新 servo1_pid3.SetPoint = center_y if abs(img_center_y–center_y)<20 else img_center_y #离中心一定范围内的停止pid 操作 servo1_pid3.update(center_y) tmp = int(servo1_face_track–servo1_pid3.output) tmp = tmp if tmp>500 else 500 servo1_face_track = tmp if tmp<1950 else 1950 #舵机角度限位 #左右pid 刷新 servo2_pid4.SetPoint = center_x if abs(img_center_x–center_x)<40 else img_center_x #离中心一定范围内的停止pid 操作 servo2_pid4.update(2 * img_center_x–center_x) tmp = int(servo2_face_track+servo2_pid4.output) tmp = tmp if tmp>500 else 500 servo2_face_track = tmp if tmp<2500 else 2500 #舵机角度限位if action_finish_face: #图像返回函数 dis_ok_face = True

在OpenCV 中, 主要利用Haar 特征检测人脸, 调用face_recognition()函数进行识别. 这里, 用于描述人脸的特征主要分为4 类: 边缘特征、线性特征、中心特征和对角线特征. 在具体计算特征值时, 可以通过改变各类模板的大小和在子窗口中的位置, 得到不同的矩形特征, 然后利用这些特征计算子窗口中所有的特征值.

具体地, 当摄像头采集到每帧图像后, 首先采用函数cv2.resize()将图像大小设置为160×120, 并利用函数cv2.dnn.blobFromImage()对图像进行预处理, 包括减均值、比例缩放、裁剪、交换通道等; 然后, 利用函数net.setInput()输入图像, 通过net.forward()函数引入算法模型计算人脸预测结果, 并设置人脸检测的可信度阈值. 当可行度大于预设值时, 记录人脸的坐标, 求出当前人脸面积, 并与之前人脸面积进行比较, 判断当前是否为最大人脸, 如果是就更新人脸坐标. 最后, 对人脸坐标进行640×480 的坐标转换, 使其能够匹配摄像头, 并调用函数cv2.rectangle()对人脸进行方框标注.

3 人脸检测算法实现

3.1 人脸的数据采集

第1 步采集图像.

① 调用摄像头: cv2.VideoCapture('http://127.0.0.1:8080/?action=stream?dummy=param.mjpg'). 其中,cv2.VideoCapture(0)表示创建一个cap 对象, 参数0 表示打开笔记本内置的摄像头. 如果外接其他摄像头, 则调整为相应的参数值.

② 读取摄像头采集的图像数据: 调用cap.read(),返回值ret 为布尔值, Ture 表示读取成功, False 表示读取失败; frame 表示返回一帧图像.

③ 显示采集图像: 在树莓派开发系统上现实摄像头采集的图像.

第2 步人脸检测.

① 导入模块. cv2 为opencv, 用于调用摄像头以及并进行相应处理. face_recognition() 用于人脸识别,os 用于对人脸进行标注.

② 人脸分类器功能模块. 通过调用dlib 库中dlib.get_frontal_face_detector()可以调用人脸分类器, 计算图像中人脸的最大box 面积, 然后根据人脸检测模块,获取人脸的可信度. 如果可信度达到标准, 则在图像上标注人脸框.

3.2 方位角信息记录

3.2.1 记录时段信息及位置

安装好摄像头后, 设置舵机度角范围所匹配的区域. 当摄像头检测到人脸面部信息时, 记录舵机的方位信息、对应区域以及当前时间.

当目标消失在某区域时, 同事没有在其他指定区域出现, 不断读取当前时间, 并与进入此区域时间进行差值比较. 如果时差大于设定值, 则可以判断异常, 同时发送邮件信息提醒接收人, 并记录当前邮件发送的时间.

若在非设定区域检测到人脸信息, 可以认为目标已经离开检测区域, 此时将进入此区域的时间清零. 主要代码如代码3.

代码3. 记录时段信息及位置if track and max_area != 0: #当开启人脸追踪功能并且检测到人脸时, 控制舵机追踪if tmp>600 and tmp<1000: #假设卫生间在摄像头的600–1 000 方位 time1=int(time.time())#记录下进入卫生间的时间else:

time1=0 # 进入卫生间的时间清零 time3=0 # 发送邮件时间清零if track != 0 and max_area == 0: time2=int(time.time()) #报警功能的实现if time1 != 0 and time3==0 and time2–time1>1200: mial_delivery() # 调用发送邮件的函数 time3 = time2 # 记录下发送邮件的时间elif time1!=0 and time3 != 0 and time2–time3>600: mial_delivery()#调用发送邮件的函数 time3=time2?

3.2.2 发送数据模块

摄像头发送数据采用SMTP 服务, 可以利用Python的两个包来发送邮件, 即smtplib 和email. Python 中email 模块里包含很多实用的邮件格式设置函数, 可以用于创建邮件“包裹”. 利用MIMEText 对象, 可以为底层的 MIME 协议创建一封空邮件, 最后通过高层SMTP协议发送出去. MIMEText 对象msg 包括收发邮箱的地址、正文和主题. Python 通过它就可以创建一封格式正确的邮件. smtplib 模块用来设置服务器连接的相关信息. 下面通过QQ 邮箱发送邮件.

代码4. 发送数据模块host_server = 'smtp.qq.com' #qq 邮箱smtp 服务器sender_qq = 'xxxxxxxx@qq.com' #发件人邮箱pwd = '你的授权码'receiver = ['xxxxxxxx@qq.com']mail_title = 'Python 自动发送的邮件' #邮件标题mail_content = "python 登录QQ 邮箱发送邮件测试—zep"msg = MIMEMultipart()msg["Subject"] = Header(mail_title, 'utf-8')msg["From"] = sender_qq msg['To'] = ";".join(receiver)msg.attach(MIMEText(mail_content, 'plain', 'utf-8'))smtp = SMTP_SSL(host_server) #ssl 登录smtp.login(sender_qq, pwd)smtp.sendmail(sender_qq, receiver, msg.as_string())smtp.quit()

4 实际场景应用及分析

实际场景为一室一厅的独立老年公寓, 如图3 所示, 将公寓划分为3 个区域, 分别标识为A、B、C, 将摄像头和检测算法获得老人在一天内的历史活动数据,将活动时间高的地方称为热点区域, 将目标在热点区域之间的转移用于描述目标在日常生活中的行为变化.在实际检测过程中, 首先需要将运动轨迹数据在热点监控区域进行整合, 计算目标在这些监控区域的进入时间及驻留时长, 然后通过Python 对记录数据进行处理, 获取目标活动轨迹的中位数, 如表1 所示.

图3 室内活动场景

表1 时间分布表

实验中, 所采用舵机的相关参数为: 型号LFD-01,工作电压6 V, 水平检测范围0–180°, 垂直监测范围0–130°, 初始位置为0°; 云摄像头的相关参数为30w 像素; 树莓派通过额外的Poe 供电, 用于处理数据信息;树莓派扩展板可直接控制串口舵机两路可编程按钮,方便配置系统.

图4 和图5 给出了室内目标的检测结果. 图4 给出室内近景对于目标近景中人脸和人体的检测结果.图5 给出室内远景中人体的检测结果. 在室内的行为异常的情况, 主要根据目标在热点区域的驻留时长进行判断. 若超出统计给定的时长阈值, 将进行警报提示.因此, 利用监测系统获取目标在热点区域的驻留时间,可以得到目标在识别区的驻留时间.

图4 近景人脸和人体检测结果

图5 远景人体检测结果

具体地, 如图4 所示, 当目标距离摄像头较近时(1.5 m 范围内), 系统可以同时准确地检测到目标和人脸. 如图5 所示, 当目标距离摄像头较远时(1.5 m 到7.0 m 范围内), 系统依然能够准确地检测到目标, 但是由于摄像头性能的限制, 此时人脸图像变得十分模糊,检测不到人脸. 当目标距离太远时(超过7.0 m), 系统对目标检测的准确性下降, 检测性能不是很稳定. 因此,从实验结果看, 系统能够满足常见的老人居住环境.

考虑到摄像头、舵机的性能以及树莓派数据处理能力的限制, 为了保证监测的实时性, 在具体实验过程中, 设置舵机每0.01 s 转动5°. 当系统未检测到目标时,系统继续水平转动搜索目标; 当系统检测到目标时, 系统进入跟踪模式, 根据目标的位置进行转动. 一般地,由于针对的目标是老人, 当目标相对舵机移动角速度小于上述5°/0.01 s, 系统都能够实时检测和跟踪目标.而且当目标距离摄像头2 m 范围内, 还能够同时检测到人脸. 因此, 在系统具体设计过程中, 需要充分考虑到硬件平台中树莓派的数据处理能力以及舵机、摄像头的性能, 并结合室内居住环境的相关参数, 才能设计出满足实际要求的实时监测系统.

此外, 通过分析驻留时长, 可以统计目标的主要活动区域, 从侧面反映该老人的生活规律. 如图6 所示,当出现超过某个特定阈值的时间值, 系统会自动判定为发生特殊情况, 同时发送警示邮件给相关用户, 提醒用户及时查看监控视频, 观察老人的行为状态.

图6 预警邮件

5 结语

本文针对独居老人室内行为及异常行为检测, 开发出一款基于方位感知的老人居家行为监测系统. 该系统首先通过将室内划分为不同兴趣区域, 利用WiFi连接树莓派、摄像头、舵机, 采用Python 程序实现摄像头自动目标搜索以及人脸识别功能; 然后根据人脸识别结果、目标热点区域驻留时间等信息分析老人室内行为, 同时判断是否存在异常行为, 并发送提醒邮件.实测结果表明, 该监测系统能够实时采集目标的视频和方位信息, 准确分析目标行为状态, 对目标异常行为发送邮件预警, 有利于监测老人居家安全, 具有良好的应用前景.

增强出版

本文附有基于方位感知的老人居家行为监测系统演示视频,可点击视频链接或手机扫描二维码观看.

猜你喜欢

舵机人脸邮件
玻璃窗上的人脸
来自朋友的邮件
智力考场:有趣的图片测试
“领家系”可爱脸VS“高冷系”美人脸
海太克HS—1100WP数字舵机
超音速舵机保护器
菜鸟看模型
长得象人脸的十种动物
舵机的应用
Outlook和Foxmail邮件互导