计算机系统应用  2022, Vol. 31 Issue (6): 125-131   PDF    
基于方位感知的老人居家行为监测系统及应用
邱云明1, 甘倬溢2, 范恩2, 罗旭2, 刘晶2, 汪子涵2     
1. 深圳大学 物理与光电工程学院, 深圳 518061;
2. 绍兴文理学院 计算机科学与工程系, 绍兴 312000
摘要:针对独居老人室内行为及异常行为监测, 开发出一款基于方位感知的老人居家行为监测系统, 并将该系统应用于生活场景. 该系统首先以舵机为原点, 建立室内方位坐标系, 将室内划分为不同的兴趣区域; 然后通过WiFi连接树莓派、摄像头、舵机, 编写Python程序实现摄像头自动目标搜索以及人脸识别、定位功能; 同时, 根据人脸识别结果, 记录舵机方位、视频以及老人驻留热点区域的时间; 最后根据上述监测方位和时间信息, 分析老人的室内行为, 进行异常行为判断, 并发送提醒邮件. 实测结果结果表明, 监测系统能够实时采集目标的视频和方位信息, 分析老人行为状态, 并对异常行为发送邮件预警. 此外, 该系统便于实现, 能够提供丰富的历史数据, 具有实际的应用价值和良好的应用前景.
关键词: 方位感知    独居老人    人脸识别    异常行为预警    驻留时间    深度学习    
Orientation Perception-based Home Behavior Monitoring System and Application for Elderly People
QIU Yun-Ming1, GAN Zhuo-Yi2, FAN En2, LUO Xu2, LIU Jing2, WANG Zi-Han2     
1. College of Physics and Optoelectronic Engineering, Shenzhen University, Shenzhen 518061, China;
2. Computer Science and Engineering Department, Shaoxing University, Shaoxing 312000, China
Abstract: For the monitoring of indoor behaviors and abnormal behaviors of the elderly living alone, a home behavior monitoring system based on orientation perception is developed and applied in real life. First, this system takes the rudder as the origin, establishes the indoor coordinate system, and divides the indoor area into different interest areas. Then, it connects the Raspberry Pi, camera, and rudder by WiFi, and Python programs are developed to execute the automatic target search of the camera, face recognition, and target location. In the meanwhile, the rudder position, video, and the residence time of the elderly in hot spots are recorded according to the results of face recognition. Finally, on the basis of the above orientation and time information, we analyze the indoor behaviors of elderly people, make abnormal behavior judgment, and send an e-mail alert. The real-test results show that the monitoring system can collect video and orientation information of a target in real time, analyze the target behavior status, and send an e-mail alert in view of the abnormal behavior of the target. In addition, the system is easy to implement and provides rich historical data. Hence, it has practical application value and good application prospect.
Key words: oriention perception     elderly people living alone     face recognition     abnormal behavior alert     residence time     deep learning    

随着人口老龄化程度的不断加深, 空巢老人居家监护已成为一个亟需解决的热点问题[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.accumulateWeighted()检测运动目标, 并采用cv2.absdiff()记录差值; 接着, 利用函数cv2.threshold()将灰度图二值化, 使用函数cv2.dilate()对图像膨胀处理, 通过函数cv2.drawContours()在绘制轮廓, 同时遍历轮廓; 最后, 调用函数cv2.contourArea()计算目标轮廓面积, 并根据门限值进行判断. 由于人体目标相对较大, 门限值应该设置较大, 以便过滤除较小目标的影响, 调用cv2.boundingRect()计算目标轮廓的4个坐标值, 再利用cv2.rectangle()对轮廓边框进行标注.

2.2 人脸定位模块

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

center_x=max_face[0]+int((max_face[2]–max_face[0])/2)

center_y=max_face[1]+int((max_face[3]–max_face[1])/2)

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

img_center_y=60 #图像中心y

img_center_x=80 #图像中心x

当其差值较大时, 即可以认为人脸不在图像中间部位, 此时控制舵机转动, 保证人脸位于图像中心位置, 不超出图像范围. 主要实现代码如代码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–1000方位

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程序实现摄像头自动目标搜索以及人脸识别功能; 然后根据人脸识别结果、目标热点区域驻留时间等信息分析老人室内行为, 同时判断是否存在异常行为, 并发送提醒邮件. 实测结果表明, 该监测系统能够实时采集目标的视频和方位信息, 准确分析目标行为状态, 对目标异常行为发送邮件预警, 有利于监测老人居家安全, 具有良好的应用前景.

增强出版

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

参考文献
[1]
李月. 中国农村空巢老人心理健康状况及影响因素分析. 中国公共卫生, 2021, 37(2): 333-336. DOI:10.11847/zgggws1126709
[2]
向琴, 王荣灼, 闫朝阳, 等. 我国空巢老人健康贫困状况及其影响因素. 医学与社会, 2020, 33(9): 58-62.
[3]
杨宜勇, 韩鑫彤. 提高我国养老服务质量的国际经验及政策建议. 经济与管理评论, 2020, 36(1): 5-14.
[4]
郑晓丽, 王海鹏, 倪红波, 等. 基于室内时空信息的老人安全监测方法. 计算机科学, 2014, 41(10): 128-130, 153. DOI:10.11896/j.issn.1002-137X.2014.10.029
[5]
柳晶, 刘青. 面向老年公寓的智能安防及看护系统设计研究. 机械设计与制造工程, 2018, 47(2): 114-118. DOI:10.3969/j.issn.2095-509X.2018.02.026
[6]
魏晓曦. 基于树莓派3B+Movidius NCS的智能监护安防系统. 智能建筑与智慧城市, 2020(12): 20-22. DOI:10.3969/j.issn.1671-9506.2020.12.007
[7]
张杰, 朱珺. 攀枝花智慧城市背景下"智慧康养"发展路径研究. 攀枝花学院学报, 2018, 35(6): 60-65. DOI:10.3969/j.issn.1672-0563.2018.06.010
[8]
伍静, 刘德丰, 张松, 等. 智能摔倒检测监控系统设计. 计算机技术与发展, 2018, 28(4): 6-10, 16. DOI:10.3969/j.issn.1673-629X.2018.04.002
[9]
李志. 移动用户位置数据关联分析与异常检测技术[博士学位论文]. 长沙: 国防科技大学, 2018.
[10]
池志攀. 基于智慧家居感知数据的老人日常行为识别与异常检测[硕士学位论文]. 杭州: 杭州电子科技大学, 2017.
[11]
俞聪, 范恩, 俞哲彤, 等. 面向Android和Web平台的温湿度云端监测系统. 物联网技术, 2021, 11(8): 29-32.
[12]
王陈政, 范恩, 曹良波, 等. 基于ZigBee的室内安全报警系统. 物联网技术, 2021, 11(7): 4-5, 8.
[13]
范恩. 基于模糊信息处理的传感网系统中多目标跟踪方法[博士学位论文]. 西安: 西安电子科技大学, 2015.
[14]
王长清, 冯惠粉, 丰明奎. 基于位置信息的老人异常状态检测技术研究. 现代电子技术, 2019, 42(16): 182-186.
[15]
潘宇欣, 郑彬, 张龙, 等. 基于随机森林和行为相似性的老人居家行为识别方法. 智能计算机与应用, 2019, 9(5): 312-319.