陈壮炼,林晓乐,陈银菊,黄秋莹,李 超
(广东轻工职业技术学院 信息技术学院,广州 510300)
在现实生活中,手部障碍给人们带来了诸多不便,而且严重影响人们的日常生活。随着科学技术的发展,手部障碍患者的治疗方式愈趋于智能化,如基于数据手套的手部远程虚拟康复系统[1-2]和基于触觉的虚拟康复系统[3-4]。前者是利用数据手套来控制虚拟场景中小球的拿捏来完成手部的训练。该虚拟系统虽然一定程度能达到手部康复的目的,但患者在佩戴时会有负重感,容易造成二次伤害,而且数据手套价格较昂贵,不适合普通家庭的使用。后者是利用触觉系统和虚拟环境结合设计出用户图形,患者通过举起杯子和挤压球等动作走出“3D迷宫”,完成训练。该康复系统虽提高了患者训练的积极性,但虚拟设备价格较高,而且只能训练某些特定的动作,不具备灵活性。
针对上述手部康复系统的不足,利用计算机视觉技术设计出的手势识别康复系统兼具灵活、高识别准确率、低成本的特点,并且在训练过程中能与患者进行动态交互,通过数据库记录下训练过程,有助于医务人员针对该训练过程给患者制定合理的康复训练疗程。
本文为手部患者设计了较灵活、低成本的康复系统。其系统结构可分为图像采集、图像预处理、图像分类和图像识别4个部分。系统结构如图1所示。
图1 康复系统结构图
该系统采用的Python编辑器是PyCharm,该编辑器的好处是能够提升编程的速度,提高开发效率。主要利用Anaconda对包进行管理,利用开源视觉库OpenCV和卷积神经网络进行图像处理和分类,sklearn进行模型训练,PyQt进行GUI界面设计和数据可视化。
1.2.1 图像采集
采用PC端摄像头对康复手势进行拍摄采集,OpenCV会将采集的图片会分割成多个像素点,形成像素图,再将图像保存到文件夹,并给文件命名作为图像的标签。
1.2.2 图像预处理
1)图像分割:
计算机视觉中的摄像头采集到的是不同等级的灰度图像[5],而在很多应用中需要的是纯黑或纯白的图像,如卷积神经网络在进行图像的特征提取时输入只由简单线条、文字组成的图像,那么在提取的过程就会简单很多,模型训练的准确率也会提高。本文采用局部二值化图像中的自适应阈值二值化算法进行图像分割[6]。
将摄像头采集的彩色图片进行灰度化后,把灰度图像进行二值化处理。即找到一个阈值,灰度大于这个阈值的区域设置像素为255,灰度小于这个阈值的区域设置像素为0。自适应二值化是针对光影变化较大的图片,根据图片的灰度直方图,得到一个适合该图像的二值化阈值。灰度直方图如图2所示,柱状形代表灰度直方图,设法找到一个合适的混合高斯分布,两个高斯分布相交的灰度值即要选择的阈值。
本文采用最大类间方差法(OTSU)来计算图像二值化的自适应阈值,阈值将原图像分为前景和后景,这里令阈值为T,图像像素对应的灰度级为f(x,y),经阈值分割后的图像g(x,y)定义为:
(1)
公式(1)中,1代表前景,0代表后景,即图像二值化。
当选取最佳阈值时,目标与背景的差别最大,最大类间方差法(OTSU)公式推导如下。
记T为分割阈值,W0为前景点数占图像比例,U0为前景平均灰度,W1为后景点数占图像比例,U1为后景平均灰度,则图像的总平均灰度U为:
U=W0*U0+W1*U1
(2)
前景和后景图像的方差S为:
S=W0*(U0-U)2+W1*(U1-U)2=
W0*W1*(U0-U1)2
(3)
当方差S最大时,前景和后景的差别最大,此时的灰度是最佳阈值。
2)图像平滑处理:
图像平滑处理[7]是计算机视觉中一种相对简单并且使用频率较高的图像处理方式。常用来减少图像中的噪点和降低图像的分辨率。一张没有经过图像处理的图像中包含有很多的高频信息,如噪音和边界。如果将未经处理的图像直接进行卷积运算会带来很多不必要的运算量,使用滤波器可以有效地去除噪音,达到图像模糊的目的。图像平滑处理一般有图像均值平滑滤波,高斯滤波和中值滤波,本文采用的是均值平滑滤波。
均值滤波是一种典型的线性滤波算法,是指在图像上对目标像素值给出一个滤波模板,该模板包含目标像素周围的M*N个临近像素,也就是去掉目标像素本身,再用该模板中目标像素周围的像素平均值来代替原来像素值。其中M*N的矩阵称为核,采用核对原始图像中的像素点进行处理,从而实现图像去噪,得到结果图像。均值滤波处理过程如图3所示。
图3 均值滤波处理过程
均值滤波处理公式为:
(4)
根据公式(4)对图3中的区域像素进行均值滤波处理过程为:
((197+25+106+156+159)+(149+40+107+5+71)+(163+198+226+223+156)+(222+37+68+193+157)+(42+72+250+41+75))/25 =125.52
其中,5*5的矩阵为模糊内核。本文使用计算机视觉中的blur()方法实现图像的平滑处理。
1.2.3 图像分类
计算机能看到的是一个个像素值,并不能像人类的视觉一样,可以轻松分辨出图片里面出现的事物,以及图片的类别,故计算机需要通过图像分类来区分图片。基于计算机视觉的图像分类方法有朴素贝叶斯分类、K近邻、支持向量机、决策树、Boosting、随机森林和神经网络。本文采用神经网络中的卷积神经网络图像分类算法[8-9],首先通过PCA技术提取样本图像特征与待分类的图像特征码,根据特征码生成输入项,样本所属标签作为输出项,将输入与输出项送入神经网络进行训练,让神经网络学习每个类别图像的特征,最后将待分类图像的特征码输入神经网络进行测试,根据神经网络输出项判断其所属类别。
1.2.4 图像识别
计算机和人的眼睛一样,都是通过颜色的轮廓来区分图像,而图像的颜色由三原色组成的,可以通过调色得到各种颜色。在计算机图像识别中,制定了RGB(Red,Green,Blue)通道作为图像识别的基础。OpenCV中图像通道有单通道、二通道、三通道和四通道,其中常见通道有单通道和三通道。
一般黑白图像是用灰度来表示色彩,称为单通道,例如某个像素值为0则表示黑色,255则表示白色,灰度的范围为0~255。彩色图像则采用RGB通道来表示,称为三通道,例如(255,255,255)表示白色,(0,0,0)表示黑色,灰度也是彩色的一种。二通道的图像采用RGB555和RGB565表示,一个通道为实数,另一个为虚数。四通道则是采用RGBA来表示,与三通道相比多了一个A通道,A通道表示透明度。本文图像识别采用的是三通道。
康复系统设计主要分为几个步骤:1)样本采集:首先在界面的绿色识别方框内做出不同的手势,摄像头识别到手势并将手势进行拍摄保存到文件夹中,再将文件夹命名为对应手势的名称作为手势标签。2)图片预处理:将采集到的手势进行图像分割,形成灰度图像,以免复杂背景影响训练的准确度,再将图像进行均值滤波处理,减少图像的噪声。3)神经网络训练:将处理过后的图像通过卷积、池化和全连接层进行特征提取和分类。4)模型测试:在相应位置做出对应手势,观察屏幕是否显示该手势的标签。5)康复训练:患者通过打开系统进行手部康复训练,并将对应训练过程保存到数据库中。6)康复历史查询:通过点击查询按钮,调用数据库查询语句,将训练过程显示到屏幕上。
2.1.1 样本采集
为了实现手部康复的训练,定义并采集了6种手势,依次是悬垂、二指捏、击打、柱状抓握、勾拉、侧捏,建立康复手势数据库。通过调用cv2.VideoCapture(0)方法打开PC端摄像头,输入采集手势的种类和训练周期,将采集的手势保存到geskind目录下,然后将同种类的手势放到一个文件夹并为其取标签名,方便后续对这些手势图像进行图像处理。采集的分别是50岁以上、10到50岁、10岁以下3个年龄段的人群,一共拍摄70组数据,共490张手势图片,采集的图片大小都是306*306,采集条件是室内正常光照,采集手势对象的男女比例均衡。图像采集流程如图4所示。
图4 图像采集
以下是进行图像捕获关键代码:
global gestname,sample_nums,path,saveimg if(self.is_camera_opened==False):
QMessageBox.warning(self,'警告','未打开摄像头')
else:
if self.hand_name.text()=="":
gestname=self.hand_example.currentText()
else:
gestname=self.hand_name.text()
sample_nums=self.hand_num.value()
print(gestname+str(sample_nums))
try:
os.makedirs('./geskind/'+gestname)
except OSError as e:
print(gestname + '文件夹已创建')
path ="./geskind/" + gestname + "/"
if gestname =='':
互联网背景下会计电算化课程改革一方面可以提高人才的理论素质;另一方面可以增强人才的实践技能。与传统的会计核算方式相比,会计电算化课程核算的途径,发生了明显的变化。会计人才不仅需要充分的了解会计专业的相关知识,同样需掌握与会计软件应用情况有关的理论。加强课程改革,是确保教学能够达到上述效果的基础,对会计人才理论素质的提高,具有重要价值。从实践的角度分析,会计电算化对人才计算机操作水平的要求逐渐提高。学生必须不断的练习,并积极利用网络资源,方可充分了解当前的会计政策以及核算方式的变化情况。加强课程改革,是确保学生的各项实践技能,能够得到充分培养的关键。
print("请先输入一个存放文件夹的名字")
else:
saveimg =True
#循环捕获图片
ret,self.frame =self.camera.read()
self.frame =cv2.flip(self.frame,3)
roi =self.binaryMask(self.frame,x0,y0,width,height)
framecount =framecount + 1
为了降低手势在训练过程过拟合和减少图片处理时的计算量,需要进行图片预处理。利用Opencv中的cv2.Imread()方法将图片加载进来,再通过Numpy的array()方法将图片进行归一化,使其能提高模型的收敛速度和精度,然后使用LabelBinarizer()进行二值化处理,将彩色图像处理成黑白图像,即二值化灰度图像,再将二值化灰度图像用blur()方法进行平滑处理,降低图像噪声,最后使用pickle.dump(lb,f)将标签数据保存为dat文件,方便模型训练和手势识别,具体流程如图5所示。
图5 图像预处理流程
2.1.3 神经网络训练
该手部康复系统的神经网络结构包含5个卷积层,3个池化层和两个全连接层。其中5个卷积层的卷积核尺寸大小都一样,卷积核个数分别是32,64,64,128,128,而且都是采用全零填充和Relu激活函数。3个池化层采用的是2*2大小,步长为2的最大池化操作。在全连接层之前该系统采用了Dropout[10]随机丢弃50%神经元参数,让这些参数不参与当前训练而达到了又一次的防止过拟合。最后在输出层采用Softmax函数对结果进行分类输出。关键代码如下:
# 神经网络构建
model =Sequential()
# 第一层卷积和第一层池化
model.add(Conv2D(32,(3,3),padding="same",input_shape=(100,100,3),activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
# 第二层卷积
model.add(Conv2D(64,(3,3),padding="same",activation="relu"))
# 第三层卷积和第二层池化
model.add(Conv2D(64,(3,3),padding="same",activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
# 第四层卷积
model.add(Conv2D(128,(3,3),padding="same",activation="relu"))
# 第五层卷积和第三层池化
model.add(Conv2D(128,(3,3),padding="same",activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
# 全连接层
model.add(Flatten())
model.add(Dense(64,activation="relu"))
# 防止过拟合
model.add(Dropout(0.5))
# 输出层(用的是多分类的对数损失函数softmax,如果只有两个手势,用sigmoid)
model.add(Dense(class_num,activation="softmax"))
2.1.4 模型测试
为了保证模型的准确度,需要对模型的准确度进行测试。首先需要使用pickle.load()加载标签数据,调用load_model()加载神经网络,使用inverse_transform()将标准化的数据转为原始数据,再调用cv2.VideoCapture(0)方法打开Pc端摄像头,在界面的绿色区域内做出采集过的手势,调用cv2.putText()将识别到的手势类型名称显示在屏幕上,根据在绿色识别区域作出的手势与屏幕上显示的手势类型名称是否一致判断模型的准确度。重复进行模型测试,当模型测试达到高准确度和高稳定性时,就可以把该模型运用到手部康复训练中。关键代码如下:
#加载标签
try:
with open(LABEL_NAME,"rb")as f:
lb =pickle.load(f)
#加载神经网络
model=load_model(MODEL_NAME)
except:
print('没有'+LABEL_NAME+'和'+MODEL_NAME)
gesture=lb.inverse_transform(prediction)[0]
手部康复患者首先打开康复训练程序,若是首次使用的患者可以根据需要录入各种手势。非首次使用可以跳过录入手势的步骤,设定好康复训练的组数作为一个疗程进行康复训练,在康复训练中患者需要根据屏幕上提示的文字信息在界面的绿色区域中做出对应的手势,完成疗程后结束康复训练。训练完毕会生成数据录入数据库中,患者可点击历史查询按钮查看历史康复训练数据的反馈,根据系统记录判断患者的训练完成程度对训练计划做出相应的调整,患者可设定较低组数作为手部的适应性训练,当患者适应训练强度后可逐步增加训练的难度。循序渐进的手部康复训练,有利于提高患者对康复训练的信心和加快患者手部的恢复速度。
通过摄像头拍摄的各种手势图像一般都是RGB图像,该系统使用了OpenCV技术把输入的RGB图像数据经过预处理转化为灰度图像,同时也采用归一化提升手势识别康复系统模型的收敛速度和精度。该手部康复系统的神经网络结构包含5个卷积层,3个池化层和两个全连接层。经过5个仅取图像数据局部特征的卷积层,有效地减少了图片的长度和宽度,减少了特征权值的数量。3个一样的池化层不断地降低了维数,通过降采样的方式,在不影响我们的特征图像质量的情况之下压缩图片,从而达到了减少网络中的参数和计算次数,缩短了训练时间等目的,也很好地控制了过度拟合情况的发生。最后在全连接层之前该系统也采用了Dropout随机丢弃50%神经元参数,让这些参数不参与当前训练而达到了又一次的防止过拟合。其中第一个全连接层也使用了拉直层。由于手势识别康复过程中需要训练的手势往往是两个以上的,所以输出层用的是输出值概率总和始终为1的多分类的对数损失函数Softmax函数。该系统的训练过程中是用总样本的20%为测试数据,剩下的80%为训练数据。最终的训练的准确率可以达到96%以上。
该系统不仅使用了计算机视觉技术,卷积神经网络也应用在其中,使训练模型的准确度不断提高。整个康复系统也采用PyQt5设计GUI界面,实现了可视化。以历史查询界面为例,用户通过时间选择范围,查看在各阶段的手势恢复数据反馈,如训练时间,训练手势种类,训练周期等数据可以帮助医生以及患者查看患者在各个阶段的手部恢复情况,便于医生对恢复程度进行针对性的康复训练调整。由于计算机视觉对收集手势的环境背景要求比较高,该康复系统在使用时,最好保证摄像头开启时的环境背景足够单调,这样更有利于降低周围环境对识别手势的干扰,准确识别到手势,提高训练使用准确率。
本文设计并实现了基于计算机视觉的手部康复系统,给手部障碍患者提供一个良好的训练环境并进行有效的康复训练,提高患者训练的积极性。系统具有以下点:采用PyQt设计了GUI界面,呈现效果美观;利用计算机视觉技术与患者进行交互,识别速度和识别准确率较高;患者的训练过程会保存到数据库中,可以随时查看训练过程并做出相应的训练调整。
手势康复训练是近年来人工智能研究邻域的热点,对此我们对该系统如下展望:提高在复杂背景下识别的准确率;通过跟相关医院合作,根据更专业的医护知识完善训练手势的种类、训练过程设计等;进一步研究智能决策系统,通过主观评估结果结合智能决策法,产生康复训练的初步方案,并将该方法运用到游戏训练的过程中,通过监控当前游戏训练中的参数的变化趋势,以此作为后续训练方案制定的依据。