这也是我第一次系统对软件系统进行测试,从中了解到了很多之前我从来没有注意到的一些情况,也让我对自己的编码以及软件设计等方面重新进行了深刻的反思,意识到了之前自己的思维上的很多的不足。

个人认为,对软件或程序进行测试,很大一部分就是对当初对软件或者程序的设计过程中的思考是否具有完备性的一次自我检查。

下面列举了很多我在测试过程得到的一些感悟和思考:

你很难预测用户会采取怎样的行为,因此要做“最坏”的打算。

用户采取错误的操作

本系统中,有让用户输入提取帧速率的模块,这个帧速率必须进行严格限定,要让用户在输入错误数据时(例如负数,乃至字母汉字等),保证程序停止继续运行,并给出相应提示框。

注册中,一定严格限制用户填写的用户名和密码规范性。在最初开始测试前,用户甚至可以通过连续空格或者汉字来完成注册,这显然是不合理的。

本系统中,有一个功能是实现通过摄像头摄取用户面部,然后即时地对用户的人脸情绪进行曲线图反馈的功能。但若用户在已经打开摄像头的情况下,还对上面所提到的提取帧速率进行修改的话,会导致程序内部多处紊乱,因此应该专门对该情况进行判定,并弹出警告对话框。

用户采取恶意的操作

登陆过程,一定要防止用户使用SQL注入。以本系统中的代码为例,一定要采用数据库连接类中对应的API完成字符串拼接,而不是直接进行拼接。

sql = "SELECT * FROM" + DB_TABLE_NAME + "WHERE username=%s AND password=%s"self._cursor.execute(sql, (username, password))

而不是

sql = "SELECT * FROM" + DB_TABLE_NAME + "WHERE username=%s AND password=%s" %(username, password)

self._cursor.execute(sql)

该部分总结:因此在测试过程中应该用“最坏的恶意”去揣测用户,尤其是在给予用户极大自主权的部分(例如自行输入的文本框,或者自行选择文件的文本对话框等),一定要对用户的行为进行严格的判断并给出对应合理的解决措施。

很多情况下,程序都会具有在开发时很难注意到的、较为极端的,但却能又能让程序直接崩溃的特例。

本系统中,可以对给定视频进行逐帧的情绪分析,并绘制出对应的情绪变化曲线图。但当截取到帧只要一张或零张时(因为视频过短,或者设置的提取帧间隔过长),是无法作图的,对这种情况应该单列并给予用户警告,否则程序直接崩溃:

self._ax.axis([0, (length - 1) * interval, 0, 100])

self.draw()

因为该部分横坐标最大长度是通过截取帧的数目减去1乘上提取帧间隔得到的。当length的值为0或者1,length - 1的值为-1或0,自然出现异常。

当然这部分的确不应该在测试过程中才发现,在当时进行编码的过程中就应该注意到这里length - 1是可能是负数或零的,所以一定要进行异常分析。

本系统中,可以打开摄像头进行实时的情绪识别。然而在此过程中,由于可能出现找不到脸的情况,采取的解决方案是用上一帧的情绪值代替此处。但是这里自然会出现一个问题,那就是若第一帧就是找不到脸的怎么办?因为第一帧是没有上一帧的,这里直接导致程序崩溃(因为出现了负数的数组索引访问)。

因此这部分需要严格设定情绪的初始值,而不是寄望于不停地使用上一帧的情绪值。

该部分总结:编码过程中,一定要养成良好的习惯!

例如,出现对数组的索引访问,一定要考虑一下,这个索引会不会在某种特别特别极端的情况下变成负的或者出现溢出?

对任何对象的成员函数进行调用时,一定要考虑一下,这个对象是否正确的初始化?是否可能为None从而出现空指针错误?

...

建立有效的异常处理与测试机制并打印控制台日志能够极大地为测试过程提供方便。

所幸我在最开始编码上就极力要求自己在代码中加入非常严格的异常处理以及测试部分,这让我们在最后测试的过程中少走了很多的弯路。

任何的类都有主函数对类进行测试

例如,在用户管理的数据库帮助类下面,就有这样的主函数帮助测试:

if __name__ == ‘__main__‘:

usersHelper=UsersHelper()

username= ‘456‘password= ‘456‘

#print(usersHelper.register(username, password))

print(usersHelper.confirm(username, password))

在控制台上进行较为系统的日志打印

例如,对视频进行情绪曲线作图时,控制台日志如下,里面的一些警告信息(例如找到了多对眼睛等)都一目了然。

同样的,在通过摄像头进行识别时,也能清楚地看到中间的过程,包括缓存的存储信息,找不到人脸的错误信息,找不到人眼的警告信息等。

建立严谨的异常处理

例如该系统中对人脸的截取部分。本系统不仅对人脸进行截取,还能够对人脸进行摆正操作,然而这些过程都可能出现很多异常的东西,如找不到人脸,找到多个人脸,找不到眼睛(因为人脸摆正依赖对眼睛的识别)的异常处理必须严谨慎重。代码如下:

def get_face(self, image, rotate=False):""":param image: 需要截取的人脸矩阵

:param rotate: 是否进行摆正处理,默认为False

:return: 返回截取的脸,与一个flag值,为True表示有找到多个脸"""

ifrotate:#试图旋转

try:

angle=self.get_angle(image)except:#捕捉眼睛过程出现异常,此时放弃旋转

pass

else:#未出现异常,正常旋转

image =self.rotate_about_center(image, angle)

faces=self._face_classifier.detectMultiScale(image)if len(faces) ==0:#找不到人脸

print(‘ERROR: No Face Found‘.center(80, ‘-‘))raise Exception(‘No Face Found‘)#抛出异常

elif len(faces) > 1:#找到多个人脸时,只在控制台上打印警告信息,不抛出异常,但令flag值为True

print(‘WARNING: Multiple Faces Found‘.center(80, ‘-‘))return image[faces[0][1]:faces[0][1] + faces[0][3], faces[0][0]:faces[0][0] + faces[0][2]], Truereturn image[faces[0][1]:faces[0][1] + faces[0][3], faces[0][0]:faces[0][0] + faces[0][2]], False

在设计类的过程中抛出的异常,在用到对象的时候自然就要用到,例如

try:

image, flag= self._faceIdentifier.get_face(image, rotate=True)#尝试获取脸部

exceptException as e:#若找不到人脸,直接返回错误信息,函数结束

return ‘‘, [], str(e)ifflag:#若找到多个人脸,暂时不结束程序,但记录错误信息

exception = ‘Multiple Faces Found‘

此外,对很多容易产生异常的函数,一定要对其传入参数进行严格判断,并抛出对应异常

defget_data(self, X, Y, n):"""从CK+数据集获取数据存到给定矩阵中

:param X: numpy(n, IMAGE_SIZE, IMAGE_SIZE, CHANNEL_NUM), 输入矩阵

:param Y: numpy(n), 结果矩阵

:param n: int, 需要获取的数据数量

:return:"""

if len(X) != n or len(Y) !=n:#输入矩阵或输出矩阵的维度不符合要求

raise Exception(‘Illegal Length of Lists‘)if n >self._size:#试图获取的数据数量超出SQL查询结果

raise Exception(‘CK+ Samples Out of Range‘)

该部分总结:磨刀不误砍柴工,写代码时写好注释、测试函数、异常处理等等,在测试的时候则会真的省去很多事。到底是什么地方出现问题一目了然。

总结

软件测试是一个相当具有技巧,并相当必要的过程。由于我们下学期才上系统的软件测试的课程,现在我们能做的也是必须要做的就是严谨自己的思维,增加自己考虑问题的全面性,并对用户的任何可能行为作出全面的预测分析,在编码中多做工夫,从而就能在软件测试过程中少做工夫。

python情绪识别_人脸情绪识别 测试心得(示例代码)相关推荐

  1. Python基于OpenCV的人脸表情识别系统[源码&部署教程]

    1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...

  2. python多张照片拼成一张人脸,使用OpenCV实现人脸图像卡通化的示例代码

    引言 通过前面的文章我们已经了解到OpenCV 是一个用于计算机视觉和机器学习的开源 python 库.它主要针对实时计算机视觉和图像处理.它用于对图像执行不同的操作,这些操作使用不同的技术对图像进行 ...

  3. python与tensorflow实现人脸表情识别(基于CNN)

    使用fer2013数据集,卷积神经网络实现人脸表情识别 python与CNN实现,有GUI界面,支持摄像头实时识别和手动选取图片识别,GUI界面选取图片进行识别实现效果如下图 摄像头实时读取并识别表情 ...

  4. python 命名实体识别_命名实体识别的两种方法

    作者:Walker 目录 一.什么是命名实体识别 二.基于NLTK的命名实体识别 三.基于Stanford的NER 四.总结 一 .什么是命名实体识别? 命名实体识别(Named Entity Rec ...

  5. Python案例之视频人脸检测识别

    今天给大家分享简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道 门禁考勤系统.人脸动态跟踪识别系统等等. 案例展示 这里我们还是使用 opencv 中自带了 ...

  6. js如何实现扫描身份证识别_人脸识别是如何实现的

    前言 以前我们看电影的时候看到人脸识别,瞳孔识别,和指纹识别的时候感觉好先进,特别有未来科技感.但是现在人脸识别技术已经非常普及了,无论我们是在付款或者在验证密码的时候都可以应用到人脸识别技术了.那么 ...

  7. 调用远程摄像头进行人脸识别_人脸识别技术植入手机APP

    随着物联网技术的日益成熟,我们看到已经有很多APP用到了人脸识别技术,特别是金融和互联网领域的应用纷纷加入了人脸识别.表示,人脸识别技术基于人的脸部特征信息进行身份识别,为互联网金融等行业解决在线多维 ...

  8. 人脸识别_人脸识别及其应用

    人脸识别软件登录界面 人脸识别的英文名称是 Human Face Recognition.人脸识别产品利用AVS03A图像处理器:可以对人脸明暗侦测,自动调整动态曝光补偿,人脸追踪侦测,自动调整影像放 ...

  9. python机器视觉车牌识别_机器视觉车牌识别

    机器视觉车牌识别 --车牌号识别系统研究课题 2018年7月10日,许昌学院信息工程(软件职业技术)学院"创出彩"机器视觉智能检测实践队第10天研究正式开展,由于老师有别的事情要忙 ...

  10. SSM+ajax使用百度AI人脸识别(人脸对比)功能心得

    最近做毕业设计,算是自己第一次独立完成一个系统,使用了百度ai的接口,查询了大部分网络上的博客,也来分享一下自己的经验. 1.首先,使用之前先注册一个百度AI开放平台的账号 2.登录之后,创建属于自己 ...

最新文章

  1. 爬虫究竟是合法还是违法的?
  2. linux 查看是否安装perl模块
  3. 旷视Face++回清华求教AI本质创新,姚期智授2锦囊,出任首席顾问
  4. 如何在Windows CMD的一行中运行两个命令?
  5. 建站百科|如何做好网站Banner设计
  6. 单调队列java_单调队列单调栈
  7. java 浏览器设置字体大小_Sass可以在不使用REM的情况下访问浏览器的默认字体大小吗?...
  8. 蓝桥杯 大臣的旅费 JAVA
  9. 教你十分钟在Linux系统上快速装机并安装Ansible
  10. Matplotlib输出中文显示问题
  11. WEB客户端编程与服务器端编程
  12. h5物体拖动_【点我解锁】11种网易爆款H5交互手势及案例
  13. 【JVM】三色标记法
  14. 【数据结构】栈与队列:后进先出与先进先出到底是啥?
  15. Android 自动化触发GC
  16. SQLserver 索引碎片
  17. linux怎能查硬盘通电时间,查看LINUX服务器型号磁盘加电时长
  18. 里怎么带引号_日本小学里的午餐,都是怎么搭配的呢,带您了解一下
  19. linux基本命令之计划任务
  20. UML状态图的实用C/C++设计(QP状态机)-笔记一

热门文章

  1. Rhino学习教程——1.2
  2. 【c/c++】二次方程计算器
  3. 分享收集网络上的免费0元虚拟主机
  4. GC基本原理学习(Garbage Collected)
  5. 微信公众号图文 点击显示图片效果
  6. 怎么将flac文件转成mp3文件
  7. tar: R-4.1.0.tar.gz: Cannot read: Is a directory tar: At beginning of tape, quitting now tar: Error
  8. 类似于android短信校验码的demo
  9. 苹果6系统怎么更新不了_苹果手机系统怎么降级
  10. 有关LaaS、PaaS、SaaS概念认识