助力远程医疗--基于AidLux的残障人士运动、康复治疗系统设计

助力远程医疗--基于AidLux的残障人士运动、康复远程治疗系统设计

本文正在参加『In AidLux,To AIoT』AI应用案例征集活动。

0 背景概况

图像处理和通讯技术的飞速发展,使得远程医疗变为可能,残障人士不再需要去特定的治疗点进行康复治疗,居家就可以接受专业的远程治疗指导。只需要配备一台智能手机,就可以进行有效的运动、康复治疗,并将治疗情况及时反馈给亲人及相关的指导医师,方便了解残障人士每日的运动和恢复情况。

最终的设计效果视频如下,运行程序后,可以根据画面的提示,进行一系列设定动作的组合动作练习,运动结束后,手机会自动将所有运动数据发送给亲人和相关指导医师,方便医师对残障人士的恢复情况进行指导。

1 平台及设备支持

系统所需的平台及设备如下图所示,基于AidLux平台进行软件开发,并将其部署在华为荣耀10手机上,当残障人士运动完毕后,会将运动、康复数据自动上传至七牛云数据存储平台进行保存,之后将触发喵提醒,将存在七牛云服务器端的数据以外链的形式经公众号提醒发送给残障人士的亲人及相关的指导医师,医师点击链接后,可以接收到残障人士今日运动情况,包含完成的规定动作,及整个动作完成的时长等数据。

系统框架设计

本设计所使用的数据存储、公众号推送方法均参考了江大白老师推文中的方案《万字长文手把手教你Yolov5制作家庭安防告警系统》,对人工智能、机器视觉感兴趣的同学可以关注公众号江大白,几乎每天都有AI相关的知识和动态分享。

1.1 AidLux应用开发和部署平台

AidLux是基于ARM架构的跨生态(Android/鸿蒙+Linux)一站式AIoT应用开发和部署平台(Linux星人狂喜),我很欣赏阿加犀做差异化产品的打法,专攻领域内的痛点和难点,将多系统开发进行融合,打造跨生态的AidLux平台,解决了X86平台功耗高、便携性差、价格昂贵以及移动端开发功能受限、门坎高的问题。

AidLux官网

1.2 华为荣耀10智能手机

基于AidLux应用和部署平台,选用了身边的华为荣耀10智能手机进行实物开发与验证,搭载海思麒麟970八核处理器,前置2400万像素摄像头,5.84主屏屏幕。

华为 荣耀10 青春版

1.3 七牛云

七牛云平台主要用于数据存储,将残障人士的运动、康复治疗情况上传至自定义的服务器,便于后续读取转发。

七牛云空间设置

1.4 喵提醒

喵提醒是内嵌微信中的提醒、提示小程序,通过设定相应的“喵码”,使用公众号提醒功能将后端图片数据外链发送给亲人及相关的指导医师。

喵提醒设置

2 远程治疗系统功能设计

以远程运动、康复治疗为设计背景,期望以视觉反馈的方式监测残障人士进行运动、康复训练。现有的运动、康复治疗会对康复设备仪器、指导人员、场地有着较高的规格要求,此外,高昂的治疗费用使得很多普通家庭望而却步或是中途放弃治疗。

而随着智能手机和机器视觉的进一步发展,特别是 阿加犀公司提供的AidLux应用开发及部署平台 ,让智能手机运行图像处理算法不再像以前那么吃力、多平台无法兼容,像以往程序开发一样,只需要在AidLux端设计代码,并将其移植进手机,点击运行即可实现设计的功能。

因而,本系统将具备以下功能:

1 基于AidLux和视觉的残障人士运动、康复治疗监测:

利用AidLux已经集成好的骨骼检测算法,调用前置摄像头进行残障人士的人体的骨骼关键点检测,使用代码逻辑判断,监测残障人士执行连续的多个动作,并对动作执行程度、数量以及执行时长进行统计,输出数据。

残障人士运动过程中,可以根据页面的视觉反馈,手机的听觉反馈,了解自己当前动作的执行状况。

2 基于七牛云的数据存储:

根据江大白老师基于七牛云的数据存储demo,可以直接利用python代码,将残障人士运动、康复治疗情况以图片的形式上传至七牛云的数据存储服务器。

这里注册七牛云帐号、新建存储空间、上传图片等操作步骤已省略,感兴趣的同学可以点击文章最后的github链接查看到上传图片的python代码。

3 基于喵提醒的图片推送:

根据江大白老师基于喵提醒的图片推送demo,同样的可以直接利用python代码,将存储在七牛云服务器上的图片数据外链推送给残障人士的亲人或相关的指导医师,方便对残障人士运动情况进行了解和指导。

这里注册喵提醒、新建公众号推送提醒、发送“喵码”等操作步骤已省略,感兴趣的同学可以点击文章最后的github链接查看到发送信息的python代码。

小提示, 激活公众号提醒需要新建提醒后,后台回复消息方可激活设置的提醒 ,不然推送的图片链接不会被自动识别为网址链接。

3 基于AidLux的残障人士运动、康复治疗检测设计

3.1 使用人体骨骼关键点检测人体运动

因为之前接触过人体骨骼关键点用于跟踪,所以知道使用人体骨骼关键点来监测人体的一些运动还是有效可行的,利用检测出的骨骼关键点加上逻辑判断来表达一些设定动作的执行。

这里选用了三组动作作为康复治疗的既定动作,分别是转脖运动(6个一组)、抬手运动(3个一组)和弯曲手肘运动(3个一组)。这里的动作参考了刘耕宏老师的健身视频,转脖运动可以帮助残障人士拉伸肩颈和增加脖子的灵活性,抬手运动作为综合多关节多肌肉群运动的动作,有效的缓解了残障人士肌肉关节退化的速度,最后一个弯曲手肘动作,很好的进行了背部拉伸,有助于调整整个人的体态和颈椎。以多个为一组,组合成一套运动、康复动作。

列举的三个既定动作可以根据指导医师的指示进行修改,后续拓展的地方也就是一些人体骨骼关键点检测进行的逻辑判断。

转脖运动

抬手运动

弯曲手肘

在AidLux平台中提供的demo视频中,就有轻量版的人体骨骼关键点检测Human Pose Detection,以此为人体骨骼关键点检测方法进行运动检测。

Human Pose Detection demo

这里开发环境是手上的华为荣耀10手机,我们可以在应用商店中下载AidLux应用软件,应用的体积较大,注意提前空余出所需内存空间。

进入AidLux应用后,点击Cloud_ip,使用远程登录的方式进行软件开发,AidLux提供了智能化的网址开发界面,我们在PC机上输入网址,便可远程进行软件开发和部署操作。

点击页面下方的命令行模式,即可感受到Linux端的终端操作方式,以命令行的方式进行软件的安装和文件到操作,页面下方的AidCode加载python文件便可以开始python代码的编写,点击左上角的运行即可运行该代码。

这是根据Human Pose Detection代码推算的主要人体骨骼关键点id号码。

关键点ID

3.2 使用逻辑判断策略进行人体动作的判定

3.2.1 转脖运动的检测

通过观测残障人士在转脖运动过程中人体骨骼关键点的变化,进行关键点的逻辑判断,这里我发现,常规状态下,鼻子、左耳、右耳的位置状态为鼻子关键点在左耳和右耳关键点的中间,当脖子转向左边或者右边的时候,被遮挡的内测的耳朵关键点会保持在外侧耳朵和鼻子关键点的中间,设置转头的标志位,来计数转脖运动的个数。这里的核心骨骼关键点为0、7、8。

常规状态下 转脖运动

转脖运动过程

伪代码示意

``` turn_round_count = 0 turn_left_flag = False turn_right_flag = False ... if action_id == 1: if not turn_right_flag: if points[0][0]-points[7][0] > 0: turn_round_count += 1 turn_right_flag = True droid.ttsSpeak('turn round %d times'%turn_round_count) elif turn_right_flag: if points[0][0]-points[7][0] < 0: turn_right_flag = False if turn_round_count == 6: action_id = 2 if not turn_left_flag: if points[8][0]-points[0][0] > 0: turn_round_count += 1 turn_left_flag = True droid.ttsSpeak('turn round %d times'%turn_round_count) elif turn_left_flag: if points[8][0]-points[0][0] < 0: turn_left_flag = False if turn_round_count == 6: action_id = 2
<h4>3.2.2 抬手运动的检测</h4>
<p>和转脖运动一样,首先使用骨骼关键点检测抬手运动,通过观察骨骼关键点的变化,了解抬手运动如何判定。这里我发现,常规状态下,左右手腕的关键点是很明显低于左右肩关键点,而抬手运动下,左右手腕的关键点会从明显低于左右肩关键点逐渐高于左右肩关键点,通过对这四个关键点进行比较判断,即可对抬手运动进行计数。这里的核心关键点为11、12、15、16。</p>
<p><img src="https://aidlux.oss-cn-beijing.aliyuncs.com/imgs/1661929514192875900.png" alt="" /></p>
<p>常规状态下 抬手运动</p>
<p><img src="https://aidlux.oss-cn-beijing.aliyuncs.com/imgs/1661929598437927390.png" alt="" /></p>
<p>抬手运动过程</p>
<p><strong>伪代码示意</strong></p>

raise_arms_count = 0
raised_flag = False

elif action_id == 2:
if not raised_flag:
if points[15][1] < points[11][1] and points[16][1] < points[12][1]:
raise_arms_count += 1
raised_flag = True
droid.ttsSpeak(‘raise hands %d times’%raise_arms_count)
elif raised_flag:
if points[15][1] > points[11][1] and points[16][1] > points[12][1]:
raised_flag = False
if raise_arms_count == 3:
action_id = 3

<h4>3.2.3 弯曲手肘的检测</h4>
<p>弯曲手肘动作相较于前面的简单骨骼关键点比较会复杂一点,同样的,还是先观察人体骨骼关键点的走向,在这里我们发现,其实手肘弯曲常规情况和执行情况下关键点的位置是没有发生较大改变的,唯一变化的就是手肘的弯曲程度,主要是手臂三个核心关键点的位置,或者说是手肘上臂和手肘小臂的夹角在做动作时,夹角先变大在变小。</p>
<p>利用线段与线段之间的夹角计算公式,在执行动作过程中,检测该夹角数据,选定以数值后,作为弯曲与不弯曲的关键点。</p>
<p>这里注意,为了避免有动作的误识别,会在比较前加一些固定关键点的位置判断,如手肘的核心关键点在弯曲过程中,横向的坐标顺序始终没有发生改变,以及弯曲过程中,弯曲角度经监测是有范围阈值的,通过这些判定,可以将动作的误识别减少。</p>
<p><img src="https://aidlux.oss-cn-beijing.aliyuncs.com/imgs/1661929647560156975.png" alt="" /></p>
<p>常规状态下 弯曲手肘</p>
<p><img src="https://aidlux.oss-cn-beijing.aliyuncs.com/imgs/1661929686369036202.png" alt="" /></p>
<p>弯曲手肘过程</p>
<p><strong>伪代码示意</strong></p>

bend_arms_count = 0
bended_flag = False

elif action_id == 3:
if points[16][0] < points[14][0] and points[14][0] < points[12][0] and points[11][0] < points[13][0] and points[13][0] < points[15][0]:
k1 = (points[16][1]-points[14][1])/(float(points[16][0]- points[14][0]))
k2 = (points[14][1]-points[12][1])/(float(points[14][0]- points[12][0]))
x = np.array([1,k1])
y = np.array([1,k2])
Lx = np.sqrt(x.dot(x))
Ly = np.sqrt(y.dot(y))
cobb = int((np.arccos(x.dot(y)/(float(Lx*Ly)))*180/np.pi)+0.5)
# cv2.putText(image_roi, ‘angle:%d’%cobb, (0, 60),cv2.FONT_ITALIC, 1, (0, 255, 129), 2)
if not bended_flag:
if cobb < 140 and cobb > 100:
if bend_arms_count == 3:
bend_arms_count = 3
else:
bend_arms_count += 1
droid.ttsSpeak(‘bend arms %d times’%bend_arms_count)
bended_flag = True
elif bended_flag:
if cobb > 140 and cobb < 170:
bended_flag = False

<p>最后,设定的这一套组合动作是可以根据指导医师的要求进行改变,复杂动作的化还是需要更为复杂的逻辑判断策略去过滤的,时间有限,在后续的发送数据中,只保留了动作数量的计数以及一套动作残障人士执行下来所费时间,其实还有很多数据可以深入挖掘,例如动作执行的程度,将最大最小的动作执行程度进行归一化操作,平均动作执行时长等。</p>
<h3>3.3 使用语音播报进行反馈</h3>
<p>也是借鉴生活中常用的运动健身app,Keep应用会在锻炼过程中进行语音的反馈,告知使用者当前的动作执行进度和状况,在AidLux的hello.py中就引入了android的库,可以直接调用手机喇叭进行语音播放。</p>
<p>按照例程,在动作被计数的过程中进行手机的语音提示,如“raise arms three times”等。</p>
<p><strong>伪代码示意</strong></p>

import android

droid = android.Android()
droid.ttsSpeak(‘Sports change life’)

<h3>3.4 将动作数据图片上传至七牛云服务器</h3>
<p>在残障人士完成一系列的动作之后,程序会自动保存当前手机界面为图片,并将其上传至先前设定好的七牛云数据存储服务器中。</p>
<p><strong>伪代码示意</strong></p>

if action_id == 1:
cv2.putText(image_roi, ‘turn round:%d’%turn_round_count, (0, 30),cv2.FONT_ITALIC, 1, (0, 255, 129), 2)
elif action_id == 2:
cv2.putText(image_roi, ‘raise hands:%d’%raise_arms_count, (0, 60),cv2.FONT_ITALIC, 1, (0, 255, 129), 2)
elif action_id == 3:
cv2.putText(image_roi, ‘bend arms:%d’%bend_arms_count, (0, 90),cv2.FONT_ITALIC, 1, (0, 255, 129), 2)
if turn_round_count == 1:
stime = time.time()
elif bend_arms_count == 3:
totaltime = time.time() - stime
cv2.putText(image_roi, ‘total time:%d s’%totaltime, (0, 120),cv2.FONT_ITALIC, 1, (255, 0, 0), 2)
img_save_path = ‘rehabilitation.jpeg’
cv2.imwrite(img_save_path, image_roi)
url_receive = upload_images(img_save_path, img_save_path)
send_mags(url_receive)

<h3>3.5 将数据外链以公众号提醒的方式推送</h3>
<p>在前面将动作数据图片上传至七牛云后,随即调用喵提醒将数据外链以公众号提醒的方式对残障人士的亲人以及相关的指导医师进行实时推送,方便掌握残障人士今日的运动、康复治疗情况。</p>
<p><strong>伪代码示意</strong></p>

url_receive = upload_images(img_save_path, img_save_path)
send_mags(url_receive)

<h2>4 效果演示</h2>
<h3>4.1 视频演示效果</h3>
<iframe src="https://player.bilibili.com/player.html?aid=815021064&amp;bvid=BV1KG4y167xx&amp;cid=819907473&amp;page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
<p>demo演示视频</p>
<h3>4.2 七牛云图片数据</h3>
<p><img src="https://aidlux.oss-cn-beijing.aliyuncs.com/imgs/1661929835049149233.png" alt="" /></p>
<p>七牛云图片数据</p>
<h3>4.3 喵提醒公众号推送</h3>
<p><img src="https://aidlux.oss-cn-beijing.aliyuncs.com/imgs/1661929868530381938.jpg" alt="" /></p>
<p>喵提醒 今日运动情况推送</p>
<p><img src="https://aidlux.oss-cn-beijing.aliyuncs.com/imgs/1661929913549437929.png" alt="" /></p>
<p>点击链接 出现运动图片数据</p>
<h2>5 拓展与改进</h2>
<h3>5.1 代码程序优化</h3>
<p>也是制作的时间比较匆忙,是直接在人体骨骼关键点检测的demo代码进行修改,简单的完成了基本功能的设计,在程序的编写上,没有分线程写,程序执行的效率不高。</p>
<h3>5.2 系统功能完善</h3>
<p>因为也是根据几个demo熟悉的AidLux平台,对平台的了解还是不够完善,没有充分发挥AidLux在手机图像处理运算的优势(看官网介绍,AidLux目前对arm芯片的利用效率比高通提供的实例还要高),之后有时间的话,在手机芯片利用效率上如有改进还会做后续的更新。</p>
<h4>5.2.1 动作检测方法的改进</h4>
<p>目前的人体骨骼关键点检测方法分为传统方法、自上而下、自下而上的骨骼关键点检测,今年的话相较于前几年在检测精度和速度上又有了质的飞跃,特别是HRNet、Yolo-Pose算法的出现,当然算法的移动端生态还没有很完善,也期待AidLux后续的更新,我是很想用Yolo-Pose做一些功能拓展,基于大量数据的直接端到端的结果输出应该会比简单的代码逻辑判断更快、更准确。</p>
<h4>5.2.2 UI界面的改善</h4>
<p>可以说本次设计的UI界面就是一摄像头画面,以及在画面中添加了几行数据,对于这个看脸的世界来说,这样是走不长远的,后面期待用代码的方式做一些UI显示、交互界面,完善整个功能。</p>
<h4>5.2.3 AIoT的拓展</h4>
<p>本次的设计用主要使用了手机的摄像头、喇叭等传感器,如果说换成AidLux的智慧盒子,应该可以做更完善的功能,受VR、深度相机一些体感游戏的启发,将运动、康复治疗以体感游戏的方式进行,可能会有更多的趣味性。</p>
<h2>6 结语</h2>
<p>至此,基于AidLux 的残障人士运动、康复治疗系统设计就完成了,在这里感谢AidLux提供的软件开发和部署平台,让我在移动端部署代码有了质的飞跃,也感谢江大白老师、刘耕宏老师的知识分享。</p>
<p>最后再次感慨一下阿加犀公司在跨系统代码设计平台的创新,这让一些优秀算法多平台落地成为可能。</p>
<p>github链接随后放在评论区自取。</p>

赞?

Nice

居家健身、康复治疗,这想法可以!!!?

好腻害,能分享一下代码地址一起学习一下吗

github链接:https://github.com/Miululu/remote-rehabilitation-system/tree/main,欢迎加星。

哇撒 太优秀了叭