检信专注心理
用技术创新 做行业先驱
检信ALLEMOTION
  • 检信智能 Allemotion OS 介绍 语音识别技术的发展现状
    让机器听懂人声,这是人们长久以来的梦想。语音识别是一门交叉学科,涉及多学科研究领域。不同领域的研究成果为语音识别的发展做出了贡献。语音识别技术是一种高科技,它可以让机器通过识别和理解的过程将语音信号转换成相应的文本或命令。计算机语音识别过程与人类语音识别过程基本相同。当前主流的语音识别技术是基于统计模式识别的基本理论。一个完整的语音识别系统大致可以分为三个部分:(1)语音特征提取:目的是从语音波形中提取随时间变化的语音特征序列。(2)声学模型与模式匹配(识别算法):声学模型是识别系统的底层模型,也是语音识别系统中关键的部分。声学模型通常是从获得的语音特征中训练生成的,目的是为每个发音建立一个发音模板。在识别过程中,将未知语音特征与声学模型(模式)进行匹配和比较,计算未知语音的特征向量序列与每个发音模板的距离。声学模型的设计与语言发音的特点密切相关。声学模型单元大小对语音训练数据的大小、语音识别系统的识别率和灵活性有很大影响。(3)语义理解:计算机对语音识别结果的语法和语义进行分析。理解语言的含义,以便做出相应的反应。它通常是通过语言模型来实现的。语音识别技术的应用:语音识别过程实际上就是一个识别过程。就像人们在听语音时,不会将语音与语言的语法结构和语义结构分开,因为当语音的发音模糊时,人们可以利用这些知识来指导理解语言的过程。对于机器来说,语音识别系统也需要使用这些知识,但鉴于语音信号的可变性、动态性和瞬态性,语音识别技术与人脑仍有一定差距。因此,在语音识别技术的选择、应用模式和系统开发等方面都需要专业的设计和调试,以达到良好的应用效果。
    2021-09-27
  • 检信智能 Allemotion OS 对语音识别的简单介绍
    检信智能 Allemotion OS 对语音识别的简单介绍 语言作为人类交流的基本方式,在几千年的历史长河中不断传承。近年来,随着语音识别技术的不断成熟,它在我们的生活中得到了广泛的应用,成为通过自然语言进行人机交互的重要方式之一。语音识别技术如何让机器“理解”人类语言?随着计算机技术的快速发展,人们对机器的依赖已经达到了一个非常高的水平。语音识别技术使人和机器通过自然语言进行交互成为可能。通过语音识别控制房间照明、空调温度和电视相关操作是很常见的。根据识别对象的不同,语音识别任务大致可以分为三类,即孤立词识别、关键词识别(或关键词检测)和连续语音识别。其中,孤立词识别的任务是识别先前已知的孤立词,如“开放”和“封闭”。连续语音识别的任务是识别任何连续的语音,如句子或段落。连续语音流中的关键词检测针对的是连续语音,但它并不识别所有的文本,只检测一些已知关键词出现的位置。根据目标说话人,语音识别技术可以分为特定人语音识别和非特定人语音识别。前者只能识别一个或几个人的声音,而后者可以被任何人使用。显然,独立于人的语音识别系统更符合实际需求,但比识别特定的人要困难得多。此外,根据语音设备和渠道,可分为桌面(PC)语音识别、电话语音识别和嵌入式设备(手机、PDA等)语音识别。不同的采集通道会扭曲人类发音的声学特征,因此我们需要构建自己的识别系统。语音识别应用广泛。常见的应用系统包括:语音输入系统,比键盘输入更符合人们的日常习惯,也更自然;语音控制系统,即使用语音识别控制设备比手动控制更快更方便,可应用于工业控制、语音拨号系统、智能家电、声控智能玩具等诸多领域。
    2021-09-24
  • Tensorboard可视化:基于LeNet5进行面部表情分类
    Tensorboard可视化:基于LeNet5进行面部表情分类 面部表情分类面部表情是面部肌肉的一个或多个动作或状态的结果。这些运动表达了个体对观察者的情绪状态。面部表情是非语言交际的一种形式。它是表达人类之间的社会信息的主要手段,不过也发生在大多数其他哺乳动物和其他一些动物物种中。人类的面部表情至少有21种,除了常见的高兴、吃惊、悲伤、愤怒、厌恶和恐惧6种,还有惊喜(高兴+吃惊)、悲愤(悲伤+愤怒)等15种可被区分的复合表情。面部表情识别技术主要的应用领域包括人机交互、智能控制、安全、医疗、通信等领域。网络架构LeNet-5出自论文Gradient-Based Learning Applied to Document Recognition,是一种用于手写体字符识别的非常高效的卷积神经网络。LeNet5的网络架构如下:但是因为我们要做的是面部表情分类,而且CK+数据集样本大小是48*48,因此需要对LeNet5网络进行微调。网络架构如下: 网络结构如下:计算图如下:代码实现预处理数据集加载,并进行预处理,同时将测试集的前225张样本拼接成15张*15张的大图片,用于Tensorboard可视化。%matplotlib inlineimport matplotlib.pyplot as pltimport osimport cv2import numpy as npfrom tensorflow import name_scope as namespacefrom tensorflow.contrib.tensorboard.plugins import projectorNUM_PIC_SHOW=225base_filedir='D:/CV/datasets/facial_exp/CK+'dict_str2int={'anger':0,'contempt':1,'disgust':2,'fear':3,'happy':4,'sadness':5,'surprise':6}labels=[]data=[]#读取图片并将其保存至datafor expdir in os.listdir(base_filedir): base_expdir=os.path.join(base_filedir,expdir) for name in os.listdir(base_expdir): labels.append(dict_str2int[expdir]) path=os.path.join(base_expdir,name) path=path.replace('\\','/') #将\替换为/ img = cv2.imread(path,0) data.append(img)data=np.array(data)labels=np.array(labels)#将data打乱permutation = np.random.permutation(data.shape[0])data = data[permutation,:,:]labels = labels[permutation]#取前225个图片拼成一张大图片,用于tensorboard可视化img_set=data[:NUM_PIC_SHOW]#前225的数据用于显示label_set=labels[:NUM_PIC_SHOW]big_pic=Noneindex=0for row in range(15): row_vector=img_set[index] index+=1 for col in range(1,15): img=img_set[index] row_vector=np.hstack([row_vector,img]) index+=1 if(row==0): big_pic=row_vector else: big_pic=np.vstack([big_pic,row_vector])plt.imshow(big_pic, cmap='gray')plt.show()#写入大图片cv2.imwrite(D:/Jupyter/TensorflowLearning/facial_expression_cnn_projector/data/faces.png,big_pic)#转换数据格式和形状data=data.reshape(-1,48*48).astype('float32')/255.0labels=labels.astype('float32')#0.3的比例测试scale=0.3test_data=data[:int(scale*data.shape[0])]test_labels=labels[:int(scale*data.shape[0])]train_data=data[int(scale*data.shape[0]):]train_labels=labels[int(scale*data.shape[0]):]print(train_data.shape)print(train_labels.shape)print(test_data.shape)print(test_labels.shape)#将标签one-hottrain_labels_onehot=np.zeros((train_labels.shape[0],7))test_labels_onehot=np.zeros((test_labels.shape[0],7))for i,label in enumerate(train_labels): train_labels_onehot[i,int(label)]=1for i,label in enumerate(test_labels): test_labels_onehot[i,int(label)]=1print(train_labels_onehot.shape)print(test_labels_onehot.shape)2.定义前向网络import tensorflow as tfIMAGE_SIZE=48 #图片大小NUM_CHANNELS=1 #图片通道CONV1_SIZE=5CONV1_KERNEL_NUM=32CONV2_SIZE=5CONV2_KERNEL_NUM=64FC_SIZE=512 #隐层大小OUTPUT_NODE=7 #输出大小#参数概要,用于tensorboard实时查看训练过程def variable_summaries(var): with namespace('summaries'): mean=tf.reduce_mean(var) tf.summary.scalar('mean',mean) #平均值 with namespace('stddev'): stddev=tf.sqrt(tf.reduce_mean(tf.square(var-mean))) tf.summary.scalar('stddev',stddev) #标准差 tf.summary.scalar('max',tf.reduce_max(var))#最大值 tf.summary.scalar('min',tf.reduce_min(var))#最小值 tf.summary.histogram('histogram',var)#直方图#获取权重def get_weight(shape,regularizer,name=None): w=tf.Variable(tf.truncated_normal(shape,stddev=0.1),name=name) #variable_summaries(w) if(regularizer!=None): tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(regularizer)(w)) return w#获取偏置def get_bias(shape,name=None): b=tf.Variable(tf.zeros(shape),name=name) #variable_summaries(b) return b #定义前向网络def forward(x,train,regularizer): with tf.name_scope('layer'): #把输入reshape with namespace('reshape_input'): x_reshaped=tf.reshape(x,[-1,IMAGE_SIZE,IMAGE_SIZE,NUM_CHANNELS]) with tf.name_scope('conv1'): #定义两个卷积层 conv1_w=get_weight([CONV1_SIZE,CONV1_SIZE,NUM_CHANNELS,CONV1_KERNEL_NUM],regularizer=regularizer,name='conv1_w') conv1_b=get_bias([CONV1_KERNEL_NUM],name='conv1_b') conv1=tf.nn.conv2d(x_reshaped,conv1_w,strides=[1,1,1,1],padding='SAME') relu1=tf.nn.relu(tf.nn.bias_add(conv1,conv1_b)) pool1=tf.nn.max_pool(relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') with tf.name_scope('conv2'): conv2_w=get_weight([CONV2_SIZE,CONV2_SIZE,CONV1_KERNEL_NUM,CONV2_KERNEL_NUM],regularizer=regularizer,name='conv2_w') conv2_b=get_bias([CONV2_KERNEL_NUM],name='conv2_b') conv2=tf.nn.conv2d(pool1,conv2_w,strides=[1,1,1,1],padding='SAME') relu2=tf.nn.relu(tf.nn.bias_add(conv2,conv2_b)) #对卷机后的输出添加偏置,并通过relu完成非线性激活 pool2=tf.nn.max_pool(relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME') with tf.name_scope('flatten'): #定义reshape层 pool_shape=pool2.get_shape().as_list() #获得张量的维度并转换为列表 nodes=pool_shape[1]*pool_shape[2]*pool_shape[3] #[0]为batch值,[1][2][3]分别为长宽和深度 #print(type(pool2)) reshaped=tf.reshape(pool2,[-1,nodes]) with tf.name_scope('fc1'): #定义两层全连接层 fc1_w=get_weight([nodes,FC_SIZE],regularizer,name='fc1_w') fc1_b=get_bias([FC_SIZE],name='fc1_b') fc1=tf.nn.relu(tf.matmul(reshaped,fc1_w)+fc1_b) if(train): fc1=tf.nn.dropout(fc1,0.5) with tf.name_scope('fc2'): fc2_w=get_weight([FC_SIZE,OUTPUT_NODE],regularizer,name='fc2_w') fc2_b=get_bias([OUTPUT_NODE],name='fc2_b') y=tf.matmul(fc1,fc2_w)+fc2_b return y3.定义反向传播 ,可视化设置,并进行训练,BATCH_SIZE=100 #每次样本数LEARNING_RATE_BASE=0.005 #基本学习率LEARNING_RATE_DECAY=0.99 #学习率衰减率REGULARIZER=0.0001 #正则化系数STEPS=2500 #训练次数MOVING_AVERAGE_DECAY=0.99 #滑动平均衰减系数SAVE_PATH='.\\facial_expression_cnn_projector\\' #参数保存路径data_len=train_data.shape[0]#将拼接为big_pic的测试样本保存至标量,用于训练过程可视化pic_stack=tf.stack(test_data[:NUM_PIC_SHOW]) #stack拼接图片张量embedding=tf.Variable(pic_stack,trainable=False,name='embedding')if(tf.gfile.Exists(os.path.join(SAVE_PATH,'projector'))==False): tf.gfile.MkDir(os.path.join(SAVE_PATH,'projector'))#创建metadata文件,存放可视化图片的labelif(tf.gfile.Exists(os.path.join(SAVE_PATH,'projector','metadata.tsv'))==True): tf.gfile.DeleteRecursively(os.path.join(SAVE_PATH,'projector')) tf.gfile.MkDir(os.path.join(SAVE_PATH,'projector'))#将可视化图片的标签写入with open(os.path.join(SAVE_PATH,'projector','metadata.tsv'),'w') as f: for i in range(NUM_PIC_SHOW): f.write(str(label_set[i])+'\n')with tf.Session() as sess: with tf.name_scope('input'): #x=tf.placeholder(tf.float32,[BATCH_SIZE,IMAGE_SIZE,IMAGE_SIZE,NUM_CHANNELS],name='x_input') x=tf.placeholder(tf.float32,[None,IMAGE_SIZE*IMAGE_SIZE*NUM_CHANNELS],name='x_input') y_=tf.placeholder(tf.float32,[None,OUTPUT_NODE],name='y_input') #reshape可视化图片 with namespace('input_reshape'): image_shaped_input=tf.reshape(x,[-1,IMAGE_SIZE,IMAGE_SIZE,1]) #把输入reshape tf.summary.image('input',image_shaped_input,7) #添加到tensorboard中显示 y=forward(x,True,REGULARIZER) global_step=tf.Variable(0,trainable=False) with namespace('loss'): #softmax并计算交叉熵 ce=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.argmax(y_,1)) cem=tf.reduce_mean(ce) #求每个样本的交叉熵 loss=cem+tf.add_n(tf.get_collection('losses')) tf.summary.scalar('loss',loss) #loss只有一个值,就直接输出 learning_rate=tf.train.exponential_decay( LEARNING_RATE_BASE, global_step, data_len/BATCH_SIZE, LEARNING_RATE_DECAY, staircase=True ) with namespace('train'): train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step) ema=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step) ema_op=ema.apply(tf.trainable_variables()) with namespace('accuracy'): correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1)) accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) tf.summary.scalar('accuracy',accuracy) with tf.control_dependencies([train_step,ema_op]): train_op=tf.no_op(name='train') init_op=tf.global_variables_initializer() sess.run(init_op) #合并所有的summary merged=tf.summary.merge_all() #写入图结构 writer=tf.summary.FileWriter(os.path.join(SAVE_PATH,'projector'),sess.graph) saver=tf.train.Saver() #保存网络的模型 #配置可视化 config=projector.ProjectorConfig() #tensorboard配置对象 embed=config.embeddings.add() #增加一项 embed.tensor_name=embedding.name #指定可视化的变量 embed.metadata_path='D:/Jupyter/TensorflowLearning/facial_expression_cnn_projector/projector/metadata.tsv' #路径 embed.sprite.image_path='D:/Jupyter/TensorflowLearning/facial_expression_cnn_projector/data/faces.png' embed.sprite.single_image_dim.extend([IMAGE_SIZE,IMAGE_SIZE])#可视化图片大小 projector.visualize_embeddings(writer,config) #断点续训 #ckpt=tf.train.get_checkpoint_state(MODEL_SAVE_PATH) #if(ckpt and ckpt.model_checkpoint_path): # saver.restore(sess,ckpt.model_checkpoint_path) for i in range(STEPS): run_option=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) run_metadata=tf.RunMetadata() start=(i*BATCH_SIZE)%(data_len-BATCH_SIZE) end=start+BATCH_SIZE summary,_,loss_value,step=sess.run([merged,train_op,loss,global_step], feed_dict={x:train_data[start:end],y_:train_labels_onehot[start:end]}, options=run_option, run_metadata=run_metadata) writer.add_run_metadata(run_metadata,'step%03d'%i) writer.add_summary(summary,i)#写summary和i到文件 if(i%100==0): acc=sess.run(accuracy,feed_dict={x:test_data,y_:test_labels_onehot}) print('%d %g'%(step,loss_value)) print('acc:%f'%(acc)) saver.save(sess,os.path.join(SAVE_PATH,'projector','model'),global_step=global_step) writer.close()可视化训练过程执行上面的代码,打开tensorboard,可以看到训练精度和交叉熵损失如下:由于只有六百多的训练样本,故得到曲线抖动很大,训练精度大概在百分之八九十多浮动,测试精度在百分之七八十浮动,可见精度不高。下面使用Tensorboard将训练过程可视化(图片是用Power Point录频然后用迅雷应用截取gif得到的): ————————————————版权声明:本文为CSDN博主「陈建驱」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    2021-09-20
  • 检信智能Allemotion OS 让你读懂什么是图像识别
    检信智能Allemotion OS 让你读懂什么是图像识别图像识别是指利用计算机对图像进行处理、分析和理解,以各种模式识别目标和物体。它是深度学习算法的实际应用。现阶段,图像识别技术一般分为人脸识别和产品识别。人脸识别主要应用于安检、身份验证和移动支付;产品图像识别主要应用于商品流通领域,尤其是无人货架、智能零售柜等无人零售领域。传统的图像识别过程分为四个步骤:图像采集→图像预处理→特征提取→图像识别。另外,在地理学上,图像识别是指对遥感图像进行分类的技术。图像识别可以基于图像的主要特征。每个图像都有它的特点,比如字母A有一个尖点,P有一个圆,Y的中心有一个锐角。对图像识别过程中眼球运动的研究表明,视线总是集中在图像的主要特征上。而且,眼睛的扫描路径总是从一个特征到另一个特征。可见,在图像识别过程中,感知机制需要排除输入的冗余信息,提取关键信息。同时,大脑中有负责整合信息的机制,可以将分阶段获得的信息组织成完整的感知图像。在人体图像识别系统中,复杂图像的识别往往是通过不同层次的信息处理来实现的。对于一个熟悉的人物,因为你掌握了它的主要特征,你就会把它认作一个单元,不再关注它的细节。这种由孤立的单元材料组成的整体单元称为块,每个块同时被感知。在书面材料的识别中,人们不仅可以将汉字的笔画组合成一个块,还可以将经常一起出现的字符或单词组合成块单元进行识别。在计算机图像识别系统中,图像内容通常由图像特征来描述。事实上,基于计算机视觉的图像检索也可以分为类似于文本搜索引擎的三个步骤:提取特征、建立索引和查询。
    2021-09-08
  • 检信智能Allemotion OS  10分钟让你 了解语音识别
    检信智能Allemotion OS 10分钟让你了解语音识别语言作为人类基本的交流方式,在几千年的历史中不断地传承下来。近年来,语音识别技术的不断成熟,在我们的生活中得到了广泛的应用,成为人机通过自然语言进行交互的重要方式之一。语音识别技术如何让机器“理解”人类语言?随着计算机技术的飞速发展,人们对机器的依赖程度已经达到了非常高的水平。语音识别技术使人与机器通过自然语言进行交互成为可能。常见的情况是通过语音识别控制房间照明、空调温度和电视相关操作。根据识别对象的不同,语音识别任务大致可以分为三类,即孤立词识别、关键词识别(或关键词检测)和连续语音识别。其中,孤立词识别的任务是识别预先已知的孤立词,如“开启”、“关闭”等;连续语音识别的任务是识别任何连续的语音,例如句子或段落;连续语音流中的关键词检测是针对连续语音的,但它并不识别所有的文本,而只是检测一些已知关键词出现的位置。根据目标说话人,语音识别技术可分为特定人语音识别和非特定人语音识别。前者只能识别一个人或几个人的声音,而后者任何人都可以使用。显然,独立于人的语音识别系统更符合实际需求,但比识别特定的人要困难得多。此外,根据语音设备和通道,可分为桌面(PC)语音识别、电话语音识别和嵌入式设备(手机、PDA等)语音识别。不同的采集通道会扭曲人类发音的声学特征,因此需要构建自己的识别系统。语音识别的应用领域非常广泛。常见的应用系统有:语音输入系统,更符合人们的日常习惯,比键盘输入更自然;语音控制系统,即使用语音识别控制设备操作比手动控制更快捷方便,可应用于工业控制、语音拨号系统、智能家电、声控智能玩具等多个领域。
    2021-08-25
  • 检信智能 Allemotion OS 情绪识别
    检信智能 Allemotion OS 情绪识别 情绪识别原本是指个体对于他人情绪的识别,现多指AI通过获取个体的生理或非生理信号对个体的情绪状态进行自动辨别,是情感计算的一个重要组成部分。情绪识别研究的内容包括面部表情、语音、心率、行为、文本和生理信号识别等方面,通过以上内容来判断用户的情绪状态。情绪是综合了人的感觉、思想和行为的一种状态,在人与人的交流中发挥着重要作用。情绪是一种综合了人的感觉、思想和行为的状态,它包括人对外界或自身刺激的心理反应, 包括伴随这种心理反应 的 生 理反应。在 人 们 的 日 常工作和生活中,情绪的作用无处不在。在医疗护理中,如果能够知道患者、特别是有表达障碍的患者的情绪状态,就可以根据患者的情绪做出不同的护理措施,提高护理 量。在产品开发过程中,如 果能够识别出用户使用产品过程中的情绪状态,了解用户体验,就 可 以 改 善 产 品 功 能,设 计 出 更 适 合 用户需求的产品。在各种人-机交互系统里,如果系统能识别出人的情绪状态,人与机器的交互就会变得更加友好和自然。因此,对情绪进行分析和识别是神经科学、心理学、认知科学、计算机科学和人工智能等领域的一项重要的交叉学科研究课题。关于情绪识别的普遍性观点最早可以追溯到查尔斯·罗伯特·达尔文(Charles Robert Darwin)在 1872 年所写的《人类和动物的表情》一书, 他认为人的情绪和表情是天生的、普遍的, 人们能够识别来自不同文化、种族的人的情绪和表情。从上世纪 60 年代起许多心理学家通过研究都得出了情绪识别具有普遍性的结论 。Ekman 和 Izard 提出人类共具有 6 种基本表情 (basic emotion):高兴、愤怒、恐惧、悲伤、厌恶和惊奇。然而, 其他一些心理学家则认为情绪的表达和识别是后天习得的, 具有文化差异性, 这文种化上的差异在面部表情的强度和对情绪体验的推断等方面都有所体现。对应于不同的情绪诱发方法,情绪识别方法也各不相同,常见的情绪识别方法主要分成 两大类:基于非生理信号的识别和基于生理信号的识别。基于非生理信号的情绪识别方法主要包括对面 部 表 情 和 语 音 语 调 的 识 别。面 部 表 情 识别方法是根据表情与情绪间的对应关系来识别不同的情绪,在特定情绪状态下人们会产生特定的面部肌肉 运 动 和 表 情 模 式,如 心 情 愉 悦 时 嘴 角 角 上翘,眼部会出现环形褶皱; 愤怒时会皱眉,睁大眼睛等。目前,面部表情识别多采用图像识别的方法来实现 。语音语调识别方法是根据 不 同 情 绪 状态下人们的语言表达方式的不同来实现的 ,如心情愉悦时说话的语调会比较欢快,烦躁时语调会比较沉闷。基于非生理信号识别方法的优点是操作简单,不需要特殊设备。缺点是不能保证情绪识别的可靠性,因为人们可以通过伪装面部表情和语音语调来掩饰自己的真实情绪,而这种伪装往往不易被发现。其次,对于患有某些特殊疾病的残疾人来说,基于非生理信号识别的方法往往难以实现。基于生理信号的情绪识别方法,主要包括基于自主神经系统( autonomic nervous system) 的情绪 识别和 基 于 中 枢 神 经 系 统( central nervous system) 的情绪识别。基于自主神经系统的识别方法是指通过测量心率、皮 肤 阻 抗、呼吸等生理信号来识别对应的情绪状态。美国麻省理工学院的 Picard 等人通过对人体自主神经系统的测量和分析,识别出了平静、生气、厌恶、忧伤、愉悦、浪漫、开心和畏惧等 8 种不同的情绪。这些自主神经系统的生理信号虽然无法伪装,能 够 得 到 真 实 的 数 据,但 是 由 于 准 确率低且缺乏合理的评价标准,因此不太适合于实际应用。基于中枢神经系统的识别方法,是指通过分析不同情绪状态下大脑发出的不同信号来识别相应的情绪。这种方法不易被伪装,并且与其他生理信号识别方法相比识别率较高,因此越来越多的被应用于情绪 识 别 研 究 。
    2021-08-24