在人机交互领域中,按照手势信息的来源以及识别算法不同可分为视觉手势识别和穿戴式手势识别[1,2,3]。视觉手势识别因其更自然成为当前热点研究方向之一。
基于视觉的手势识别主要包括3个基本步骤[4]:手势分割,特征提取和手势识别。其中,特征提取对手势识别的准确率和效率起着至关重要的作用。在视觉手势识别中,特征提取是将图像信息转化为可量化的、易于处理的形式[5]。常用特征提取的类型包括形状[6-8]、纹理[9,10]和深度学习[11-14]。
千承辉等[6]和Jafari等[7]利用图像的梯度方向直方图特征(HOG)来对手势进行分类识别,尽管它在一定程度上能够抵消光照变化和手势旋转对手势识别结果的影响,但其适用范围仅限于在简单背景下对单个手势的识别。王磊等[8]提出一种改进HOG特征提取及分类的算法,虽然改进了识别时间,但算法的识别率仅70%。李云峰等[9]构建手势灰度图像的多方向共生矩阵,并计算多方向共生矩阵的特征参数来提取手势纹理的灰度共生矩阵(GLCM)特征,对15种手势的平均识别率为97.4%,但对复杂手势的识别效果不太理想。Maktabdar等[10]研究了 GLCM 参数对分类效果的影响,说明GLCM特征非常适合对自然物体进行纹理分析,但该特征对于手势图像中的纹理信息利用仍然不够充分。李振宇等[11]改进了2D卷积神经网络提取多帧特征,在同一个测试集上比CNN卷积神经网络提高11.99%,但需要大量时间对网络调参。陈铭等[12]提出了一种基于SSD卷积神经网络特征提取识别方法,使用CNN学习框架下的VGG16模型结合SSD算法,模型经过优化后,收敛速度加快,损失函数降低了1%,但对计算机内存要求较高。Gangrade等[13]采用卷积神经网络 (CNN) 对印度手语 (ISL) 进行识别,准确识别手势高达 99.3%,但对于手势外观差异小的情况下的情况下,对分类任务有一定的挑战性。Eid等[14]讨论了卷积神经网络(CNN)在手势识别任务的性能,在Marcel数据集和NUS II数据集下测试,测试准确度分别为 96.5%和96.57%。神经网络模型具有很强的拟合能力,当训练数据不足或者模型复杂度过高时,容易发生过拟合现象,导致模型在训练集上表现良好但在测试集上泛化能力较差。
考虑到单一特征的局限性,本研究中提出一种基于 HOG和VGG16特征融合的支持向量机识别方法,实验结果表明,多特征融合算法相比于单一特征,有较高的识别率,与其他特征提取分类网络对比,分类效果也更好。
卷积神经网络在图像分类任务中表现出色,能够捕捉到手势中的深度纹理信息,包括图案,结构等。HOG特征能捕捉到局部区域梯度方向信息,包括轮廓,边缘等。
本研究中将VGG16与HOG特征融合起来,原理如图1所示,融合方法为向量拼接。将这两者结合起来,既可以获得高级的语义特征,也能够保留更多在细节的纹理和边缘信息。这样对于一些手势相近,或者手势变换(亮度,形变)的情况能提取到更加全面的特征,具有一定的鲁棒性。
图1 算法整体框架
Fig.1 The overall framework of the algorithm
然后用支持向量机的方式对融合后的特征进行分类,SVM通过最大化分类间隔的方式进行分类,使得其对新样本的泛化能力较强,具有较好的预测能力。
1.2.1 VGG16特征提取
VGG16(Visual Geometry Group 16)[15]是一种经典的卷积神经网络模型,由牛津大学的研究团队提出,被广泛用于图像分类和识别任务。
在卷积神经网络中,卷积操作的基本思想是通过滑动一个称为卷积核(或过滤器)的小窗口,对输入数据进行局部加权和求和。数学表达式为
(1)
ReLU函数定义为
ReLU(x)=max(0,x)
(2)
设输入图像为I,经过第l层卷积的特征图为Ol,则:
Ol=ReLU(Wl*Ol-1+bl)
(3)
式中:Wl为第l层卷积核的权重;Ol-1为前一层得到输出;bl为第l层的偏置项。全连接层的操作可以表示为
Ofc=ReLU(Wfc*Opool+bfc)
(4)
式中:Wfc为第全连接层的权重;bfc为第全连接层偏置项;Opool为池化层。
1.2.2 HOG特征提取
方向梯度直方图(HOG)[16]是一种用于目标检测和图像识别的特征提取方法。HOG 主要通过分析图像中局部区域的梯度方向来表示图像的特征。它的基本思想是将图像分成小的局部区域,对每个局部区域计算梯度的方向和强度,并将这些信息组合成直方图,从而形成对图像结构的描述。
HOG特征提取算法的具体实现过程如下:
其中由式(5)和式(6)计算出每个像素的梯度大小G(x,y)和方向θ(x,y)。其中,Gx(x,y)表示水平方向梯度,Gy(x,y)表示垂直方向梯度。
(5)
(6)
1.3.1 特征融合结构
单一特征对手势图像的描述存在局限性,不能很好地描述完整的手势信息,所以设计特征融合算法。
特征融合的结构如图2所示,2种特征提取方式提取到的特征经过向量拼接之后,同时具备融合前特征的特性。
图2 特征融合算法
Fig.2 Feature fusion algorithm
1.3.2 特征分析
对VGG16特征与HOG特征进行可视化。如图3所示,分别对2个特征进行可视化,探究对手势图像进行干扰后特征变化。图像从第二行和第三行可以看出,VGG16能够捕捉到手势中的深度纹理信息,这说明对于图形的抗干扰能力较强。而对于HOG特征提取,它能提取局部区域梯度方向信息,可以部分抵消光照和亮度变化带来的影响。
图3 特征可视化分析
Fig.3 Feature visualization analysis
1.3.3 特征维度选择
将手势图像归一化到224×224,每个block由2×2个cell组成,bin的个数是9,block 的移动步长为一个cell,cell的大小为k×k个block的特征维数为2×2×9=36。
特征维度的计算式为
(7)
分类器采用支持向量机分类。从表1所示的实验结果可知,不同的区域块大小会直接影响 HOG 特征的分类准确性。当区域块尺寸过小,HOG 特征的维度会变得很高,导致识别率降低,这表明 HOG 特征中有过多的冗余信息,影响了 SVM 的识别效果。因此,对于 SVM 分类器而言,HOG 特征的最佳区域块划分是16×16。VGG16模型中卷积层(Conv5-3)后的池化层(VGG16-Conv5-pool)中特征大小为7×7×512,特征维度为25 088。
表1 不同区域块划分的HOG特征识别结果
Table 1 HOG feature recognition results of different block partitions
特征k×k特征维度识别率/%HOG4×410890075.158×82624474.9116×16608476.9432×32129668.9
分段线性拟合是一种拟合方法,其中函数由不同的线性段组成。在x=1 000处有一个明显的跳变点,因此选择将拟合分为22个部分:一个部分代表跳变点之前的趋势,另一个部分代表跳变点之后的趋势。
由图4可以看出,斜率有跳变位置。结果:跳变点的位置为1 028,跳变前的斜率为0.089,跳变点后的斜率为0.000 6。由此可以看出,在维度为1 000之后的识别率基本稳定在75%上下。
图4 特征维度与识别率分段线性拟合曲线
Fig.4 Piecewise linear fitting results of feature dimension and recognition rate
支持向量机(support vector machine,SVM)[17]是一种强大的监督学习算法,主要用于分类和回归任务。SVM 的核心思想是通过找到能够最好地划分不同类别之间边界的超平面,从而实现对数据进行有效分类(见图5)。
图5 3分类SVM结构
Fig.5 3 Classification SVM structure
“一对一”策略的思路是对于每一对不同的类别,都训练一个二分类器。然后,当进行预测时,所有这些二分类器都会投票,最终选择得票最多的类别作为预测结果。这意味着:如果你有N个类别,SVC类将训练N × (N-1) / 2 个二分类器。
本研究中使用的SVM分类器的类型是C-SVC,选择径向基核函数(RBF)作为核函数,可以适用于各种类型的数据,无论是低维还是高维,线性或非线性并且能够捕捉到数据中的非线性关系。
SVM的输入是每张图像的组合特征向量,这些特征由以下2部分组成:
1) 经过降维后的VGG16模型中卷积层(Conv5-3)后的池化层(VGG16-Conv5-pool)特征;
2) 灰度图的HOG特征。
对于2种特征的维度,在文中1.3.2中对特征维度进行了详细的解释,最终确定VGG16特征维度为1 000维,HOG特征的维度为6 084。将2个特征进行融合后的维度为7 084维。SVM的输出是预测的手势类别标签。假设数据集中有N个手势类别,SVM的输出是这些类别中的一个。例如本研究中对应ASL数据集有24个类别,SVM分类器输出就是这24个类别中的一个。
SVM的输入是包含卷积特征和HOG特征的组合特征向量,维度为7 084。输出是手势类别的预测标签,类别数由数据集中的不同手势类别数量N决定。其伪代码如下:
Algorithm 1 Feature Fusion Algorithm
Input: Dataset path:’ Gesture Dataset’
Output: Accuracy of the gesture recognition model
1: Initialize empty lists: X←[], y←[]
2: for each gesture_folder in ’ Gesture Dataset’ do
3: Construct gesture_path ← ’ Gesture Dataset’+’/’+ gesture_folder
4: if gesture_path is directory then
5: for each image_file in gesture_path do
6: Construct image_path ← gesture_path+’/’+image_file
7: Extract features from image_path:
8: Load VGG16 model without top
9: Load and resize image to (224,224)
10: Convert to YCbCr and extract Y channel
11: Extract CNN features,flatten
12: Extract HOG features from Cr channel
13: Concatenate CNN and HOG features
14: Append features to X
15: Append gesture_folder to y
16: end for
17: end if
18: end for
19: Split X,y into Xtrain,Xtest,Ytrain,Ytest
20 : Initialize SVM classifier with RBF kernel
21: Train SVM classifier with, Xtrain,Ytrain
22: Predict Y
23: Evaluate accuracy
2.1.1 分类器对比实验
HOG特征能够捕捉到图像中的边缘和梯度信息,这些信息对于某些特定的图像分类任务(如边缘检测、纹理分析等)非常重要。而VGG16提取的特征虽然包含高层次的语义信息,但可能在某些细节上有所欠缺。
在公开的ASL(American Sign Language)数据集(见图6),手势A—Z一共26个字母,其中字母J与字母Z的手势是动态的,所以这里不做考虑,一共24个字母。单个手势400张图片,一共9 600张图片,数据划分80%训练集,20%测试集。
图6 ASL数据集
Fig.6 ASL dataset
实验设置:单个手势400张图片,一共9 600张图片,数据划分80%训练集,20%测试集。
模型设置:VGG16模型:使用预训练的VGG16模型,微调全连接层,训练参数为学习率0.001,批次大小32,训练50个周期。VGG16特征提取+SVM分类:使用预训练的VGG16模型提取Conv5-3层特征,SVM分类器使用RBF核,正则化参数C=1.0。
如表3所示,使用VGG16提取特征与使用SVM分类器进行分类的识别率与VGG16本身提取特征及分类的识别率接近,总体识别率效果为75%~80%,而本研究中提出的HOG-VGG16特征融合分类算法比VGG16模型本身特征提取及分类识别率高22.62%。再将两者的训练时间进行对比。
表3 分类器对比
Table 3 Classifier comparison
提取特征方式总体识别率/%VGG16(特征提取层与SVM分类)78.48±1.65VGG16(本身特征提取与分类)75.21±1.32HOG-VGG1697.83±0.99
本次实验的配置为:inter i7-9700k处理器,16G内存。算法在pycharm平台中基于python3.10进行。
使用VGG16模型进行训练时,特征提取和分类是同时进行的,所以只记录一个整体训练时间。不同于VGG16特征提取加SVM分类方法,后者需要分别记录特征提取和分类训练的时间。在训练的总体时间上,VGG16模型本身特征提取与分类所需的时间最长。
如表4所示,VGG16模型本身提取特征与分类需要较多时间是因为它进行的是端到端的训练,包括特征提取和分类的所有计算。这个过程需要反复调整大量参数,并在每个训练轮次中进行前向和反向传播。因此,计算量大,训练时间长,特别是在处理大规模数据集时。
表4 模型训练时间对比
Table 4 Comparison of model training time
方法训练时间/s特征提取时间/s分类器训练时间/s总时间/sVGG16(本身特征提取与分类)1197——1197VGG16(特征提取层与SVM分类)—214546760HOG-VGG16—327578905
所以,不管是从识别率还是模型的训练时间来考虑,即使VGG16本身就带有特征提取层和分类功能,加HOG和SVM是有必要的;下文中的VGG16均是VGG16(特征提取层与SVM分类)。
2.1.2 特征分类实验
选择公开的American Sign Language(ASL)数据集,手势A—Z一共26个字母,除去字母J和Z,一共24个字母。一共24个字母。单个手势400张图片,一共9 600张图片。
在本试验中,采用交叉验证[18]的方式来评估模型分类性能。在本研究中训练集与测试集的比例为4∶1。这样测试集每个手势的图片为80张,共1 920张;训练集:训练集每个手势的图片为320张,共7 680张。由于随机选择测试集和训练集,识别结果的标准差作为误差。本研究中实验硬件平台配置:Inter i7-9700k处理器,16G内存。SVM多分类算法在pycharm平台中基于python3.10进行。
从表5中看出,对于用融合前2种方式提取特征分类的总体识别率都在70%,而融合后的特征提取分类识别率达到了97.86%,较HOG特征分类提高了20.89%,较VGG16特征提取方式提高了19.35%。
表5 融合前后识别率对比
Table 5 Comparison of recognition rate before and after fusion
提取特征方式总体识别率/%HOG76.94±1.77VGG1678.48±1.65HOG-VGG1697.83±0.99
如图7所示,对于使用HOG特征来进行识别分类,对于单个的手势识别率基本稳定在70%~80%中间,其中对于字母T的识别效果最好,达到了90.47%,但对于字母N识别率仅有60.27%,这种整体识别率不高,且对单个字母识别效率高的特征提取方式显然不利于整体的手势分类。对于使用VGG16特征来进行分类,它的识别率分布较为平均,基本也是维持在70%~80%,但是相较HOG特征提取方式,没有那种过高,或者过低的识别率,但是整体识别率仅为78.48%,在实际应用中不是很稳定。
图7 单个手势识别率
Fig.7 Single gesture recognition rate
而对于使用本文中提出的融合特征来分类,总体识别率达到了97.83%,单个的手势识别率均在90%以上。
表6中,P表示24种手势的平均精确率,R表示平均召回率,F表示平均f1分数[19-20],对3种特征的P、R、F对比。
表6 不同特征平均P、R、F对比
Table 6 Comparison of average P,R,F of different characteristics
特征PRFHOG0.810.760.77VGG160.820.770.79HOG-VGG160.970.980.97
不同的特征提取方法会导致提取的特征质量不同。从精确率对比入手,其中对于3种不同的特征提取方式,HOG对于24个手势精确率的平均数是0.81。
VGG16对于24个手势精确率的平均数是0.82,HOG-VGG16对于24个手势精确率的平均数是0.97,更高的精确率意味着特征提取方法能够更全面地捕捉到数据的关键信息,从而提高了分类模型的性能。对于3种方式的召回率对比,HOG对于24个手势召回率的平均数是0.76,VGG16对于24个手势召回率的平均数是0.77,HOG-VGG16对于24个手势召回率的平均数是0.98。高的召回率表示着特征提取方法能够更有效地保留数据中的关键信息。而对比f1分数,HOG对于24个手势f1的平均数是0.77,VGG16对于24个手势f1的平均数是0.79,HOG-VGG16对于24个手势f1分数的平均数是0.97。
因为HOG-VGG16特征是由2个特征拼接组合而来,在向量长度上比融合前的特征长,质量相对较高,这也说明融合特征的综合性能更好。
2.1.3 网络性能分析
使用交叉验证评价算法的分类性能,并记录每个类别手势的识别正确率,总体正确率为每个类别的正确率之和与总类别数的比值。
如表7所示,使用3种不同的特征提取方式对比来看,使用DenseNet-18[21]与ResNet-121[22]的识别率总体都在80%,接近90%。但使用本文中提出的特征提取的方式,识别率达到97.83%。
表7 不同网络提取特征识别率对比
Table 7 Comparison of recognition rate of different network extraction features
提取特征方式总体识别率/%DenseNet-1887.43±1.59ResNet-12187.69±3.01HOG-VGG1697.83±0.99
通过图8所示的混淆矩阵可以看出:对于DenseNet-18与ResNet-121模型分类,对于手势A,手势T,手势S;手势M与手势N;手势K和手势V;手势O和手势Q,2种特征提取分类模型对于上述手势的分类效果不理想,分析原因可能是由于手势姿势接近造成的。
图8 混淆矩阵对比
Fig.8 Comparison of confusion matrix
本研究中提出的特征融合分类模型,能清楚的分类每一个手势,这说明本文中提出的特征融合提取到的特征信息更为全面,分类识别效果更好。
图9为应用的控制流程及实物场景。
图9 控制流程及实物场景
Fig.9 Control flow and physical scene
首先要保证小车和上位机处于同一局域网下,摄像头读取到手势信息,黄色箭头表示对小车的控制:经过算法识别后将控制指令通过无线传输到小车的树莓派端,树莓派控制单片机实现对小车的控制。蓝色箭头表示,小车构建地图信息传输的流程,雷达将数据传输给小车端的树莓派,在树莓派中处理后通过无线传输到上位机。
选择将ASL数据集中其他网络难以区分接近的手势进行测试,手势如图10所示。
图10 手势控制图
Fig.10 Gesture control chart
单手势随机选取50张图片进行识别率测试。累计测试4次,单手势图片为200张。
如表8所示,对于5个手势,识别正确率基本都稳定在98%。
表8 识别效果
Table 8 Recognition effect
手势类型正确识别次数错误识别次数无法识别次数前进19721左转19640右转19631后退19712停止19820
在对传统的键盘控制小车代码进行修改时,目标是替换原本通过键盘输入获取的控制信号,改为从视频流中识别出的手势结果获取控制信号。这个过程涉及对输入源的更改,从直接的键盘输入切换到视频流中的手势识别结果,图11中蓝色线段表示小车在地图中的路径。
图11 构建地图
Fig.11 Building map
采用多特征融合的方法提取手势特征,提取手势的梯度方向直方图(HOG)特征和深度特征(VGG16)特征,将2种特征进行融合后通过SVM分类器进行手势识别。主要工作包括:
1) 探究融合前特征的性质,VGG16提取到的特征对图像的形变存在一定的鲁棒性,而HOG特征对图像亮暗变化存在一定的鲁棒性。
2) 对融合前后特征的识别结果进行对比,融合后的特征提取分类识别率达到了97.86%,较HOG特征分类提高了20.89%,较VGG16特征提取方式提高了19.35%。
3) 与DenseNet-18,ResNet-121特征提取网络进行对比,在同一个数据集下,本论文提出的方法比其他网络特征提取网络识别率高10%左右。
4) 将识别地手势成功转化为控制指令,完成对无人车的控制。
[1] CHEOK M J,OMAR Z,JAWARD M H.A review of hand gesture and sign language recognition techniques[J].International Journal of Machine Learning and Cybernetics,2019,10:131-153.
[2] ZHANG S,LI Y,ZHANG S,et al.Deep learning in human activity recognition with wearable sensors:A review on advances[J].Sensors,2022,22(4):1476.
[3] 丛玉华,何啸,邢长达,等.基于计算机视觉手势识别的人机交互技术研究[J].兵器装备工程学报,2022,43(1):152-160.CONG Yuhua,HE Xiao,XING Changda,etc.Research on human-computer interaction technology based on computer vision gesture recognition[J].Ordnance equipment engineering,2022,43(1):152-160.
[4] 解迎刚,王全.基于视觉的动态手势识别研究综述[J].计算机工程与应用,2021,57(22):68-77.XIE Yinggang,WANG Quan.A review of visual-based dynamic gesture recognition[J].Computer Engineering and Applications,2021,57 (22):68-77.
[5] HUANG Y,XU G,Zhu Y.Extraction of spatial-temporal features for vision-based gesture recognition[J].Journal of Computer Science and Technology,2000,15(1):64-72.
[6] 千承辉,邵晶雅,夏涛,等.基于Kinect的手语识别方法[J].传感器与微系统,2019,38(6):31-34,38.QIAN Chenghui,SHAO Jingya,XIA Tao,et al.Kinect-based sign language recognition method[J].Sensors and Microsystems,2019,38 (6):31-34,38.
[7] JAFARI F,BASU A.Saliency-driven hand gesture recognition incorporating histogram of oriented gradients (hog) and deep learning[J].Sensors,2023,23(18):7790.
[8] 王磊,关英,孟志敏,等.嵌入式平台下红外图像坦克目标识别的实现方法[J].兵器装备工程学报,2021,42(4):132-137.WANG Lei,GUAN Ying,MENG Zhimin,et al.Realization method of infrared image tank target recognition based on embedded platform[J].Science of Weapon Equipment Engineering,2021,42(4):132-137.
[9] 李云峰,张澎悦.基于GLCM和Gabor纹理特征的手势识别算法[J].计算机应用与软件,2019,36(7):183-191.LI Yunfeng,ZHANG Pengyue.A gesture recognition algorithm based on GLCM and Gabor texture features[J].Computer Applications and Software,2019,36(7):183-191.
[10] MAKTABDAR O M,MAAROF M A,ROHANI M F,et al.An optimized skin texture model using gray-level co-occurrence matrix[J].Neural Computing and Applications,2019,31:1835-1853.
[11] 李振宇,张立民,邓向阳,等.基于序列特征的2D CNN的动态手势识别[J].兵器装备工程学报,2019,40(2):141-146.LI Zhenyu,ZHANG Limin,DENG Xiangyang,et al.Dynamic gesture recognition of 2D CNN based on sequence features[J].Arsenal of Ordnance Equipment Engineering,2019,40(2):141-146.
[12] 陈铭,陈新,余辉敏.SSD网络算法模型在车辆轴型识别中的应用[J].兵器装备工程学报,2021,42(8):227-232.CHEN Ming,CHEN Xin,YU Huimin.Application of SSD network algorithm model in vehicle axle type recognition[J].Journal of Ordnance Equipment Engineering,2021,42(8):227-232.
[13] GANGRADE J,BHARTI J.Vision-based hand gesture recognition for Indian sign language using convolution neural network[J].IETE Journal of Research,2023,69(2):723-732.
[14] EID A,SCHWENKER F.Visual static hand gesture recognition using convolutional neural network[J].Algorithms,2023,16(8):361.
[15] PORA W,KASAMSUMRAN N,THARAWATCHAR-ASART K,et al.Enhancement of VGG16 model with multi-view and spatial dropout for classification of mosquito vectors[J].Plos One,2023,18(7):e0284330.
[16] 黄晓冬,曾科军,李冬.一种多特征融合的背景感知相关滤波跟踪算法[J].兵器装备工程学报,2021,42(10):230-236.HUANG Xiaodong,ZENG Kejun,LI Dong.A background-aware correlation filter tracking algorithm based on multi-feature fusion[J].Journal of Ordnance Equipment Engineering,2021,42(10):230-236.
[17] 刘小建,张元.基于多特征提取和SVM分类的手势识别[J].计算机工程与设计,2017,38(4):953-958.LIU Xiaojian,ZHANG Yuan.Gesture recognition based on multi-feature extraction and SVM classification[J].Computer Engineering and Design,2017,38(4):953-958.
[18] LIU Y,LIAO S,JIANG S,et al.Fast cross-validation for kernel-based algorithms[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2020,42(5):1083-1096.
[19] JAIN R,KARSH R K,BARBHUIYA A A.Encoded motion image-based dynamic hand gesture recognition[J].The Visual Computer,2021,38:1957-1974.
[20] KIRUPAKARAN A M,YADAV K S,LASKAR R H,et al.Development of an intelligent recognition system for dynamic mid-air gesticulation of isolated alphanumeric keys[J].Expert Systems with Applications,2022,210.
[21] 郑远攀,李广阳,李晔.深度学习在图像识别中的应用研究综述[J].计算机工程与应用,2019,55(12):20-36.ZHENG Yuanpan,LI Guangyang,LI Ye.A review of the application of deep learning in image recognition[J].Computer Engineering and Application,2019,55(12):20-36.
[22] 王琛,王颖,郑涛,等.基于ResNet-LSTM网络和注意力机制的综合能源系统多元负荷预测[J].电工技术学报,2022,37(7):1789-1799.WANG Chen,WANG Ying,ZHENG Tao,et al.Multivariate load forecasting of integrated energy system based on ResNet-LSTM network and attention mechanism[J].Journal of Electrical Technology,2022,37(7):1789-1799.