自动化工具 人工智能在自动化测试中的一点小实践

codyL · 2017年03月31日 · 最后由 zhang 回复于 2017年07月13日 · 3689 次阅读
本帖已被设为精华帖!

楼主在自学完人工智 (ruo) 能 (zhi) 后,一直都没有在测试工作中找到可施展的地方。碰巧最近再和 360 的同行交流后,灵光一闪,有了今天的文章。

背景

花椒相机是 360 发布的一款拍照 APP,可以在照片中加入各种小插件来美化照片。尽管自动化可以搞定该 APP 拍照的大部分功能,但是对于加入插件后的照片是否正确却无法验证,只能通过保存到本地,进行人工检查。无法使自动化形成一个闭环,未能使自动化的价值最大化。

可行性分析

既然可以拍照把照片保存到本地,当照片变多后,就形成了大量的照片数据,这些照片完全就可以再利用起来,用人工智能来玩。

工具选择

  • Google 出品的 TensorFlow,说真的,楼主倒腾了两天 TensorFlow,硬是没搞出个结果来,所以放弃了。
  • Python 机器学习包,Scikit-learn,超好用的机器学习包,一直都在用这个机器学习包。

工欲善其事必先利其器

这里简单的写下所需要的工具包的安装,如果安装的时候遇到了各种莫名其妙的报错问题,那么 Google 一下

  • 楼主的 Python 版本是 2.7,已经安装好 pip,所以只要简单几步就可以安装好运行 Scikit-learn 所需要的环境

    • 安装 Numpy
    $ sudo pip install numpy
    
    • 安装 Scipy
    $ sudo pip install scipy
    
    • 安装 Scikit-learn
    $ sudo pip install scikit-learn
    
    • 安装 PIL, 这个用来读取图片,到官网下载安装包到本地,切换到解压路径
    $ sudo python setup.py install
    

    注意: 有可能还要安装 JPEG 的包,这个取决于本机是否已经安装,未安装的可以参考网上教程

其他

  • 训练数据以及测试数据,这里楼主自拍了 7 种不同插件的照片共计 136 张,测试数据 5 种共计 5 张

    对于机器学习来说,数据是越多越好越多越好,更多的数据会让你的模型效果更佳 :)

  • 你仅仅需要一点点机器学习的基础知识,以及 Python 基础知识。

那我们就从这里开始进入正文

因为楼主的目的是要对图片进行多分类,因为楼主的数据里面已经有 X -> Y 了,所以这是一种有监督学习。
首先我们要确定的是用什么算法来训练数据,这里楼主主要试验了两种算法:

  1. KNN

    使用 KNN 的时候,因为数据样本不够多,正确率大概在 60% 左右,不是太可观的结果。

  2. SVM
    对于,支持向量机,也使用了两种算法

    1. SVC:"one-against-one"策略
    2. LinearSVC:"one-vs-the-rest"策略

代码如下:

import Image
import numpy as np
import os
from sklearn import svm

def getTrainClass(category):
    if category == 'Train':
        classes = {0, 1, 2, 3, 4, 5, 6, 7}
    else:
        classes = {0, 1, 2, 5, 7}
    return classes

def getImageData(path,classes):
    ImageList = []
    LabelList = []
    for name in classes:
        class_path = cwd + path + "/" + str(name) + "/"
        for image_name in os.listdir(class_path):
            image_path = class_path + image_name
            if 'JPG' in image_path:
                img = Image.open(image_path)
                ImageList.append(np.asarray(img).flatten())
                LabelList.append(name)
    return ImageList, LabelList

cwd = '/home/hadoop/Pictures/pic1/'

TrClasses = getTrainClass('Train')
tr_img, tr_label = getImageData('Train',TrClasses)  #加载训练数据
tstClass = getTrainClass('Validation')
tst_img, tst_label = getImageData('Validation',tstClass)  #加载测试数据

svcClf = svm.LinearSVC()    #直接使用默认参数就好了
svcClf.fit(tr_img,tr_label)

Z = svcClf.predict(tst_img)

result = (1 - np.sum(Z==tst_label)/float(len(tst_img)))
print "\nthe total error rate is: %f" %result

使用 LinearSVC 训练数据的时候,效率稍微有点低,比直接使用 SVC 低,但是别人正确率高呀
结果如下:

剩下要做的是就是固化了,然后就可以直接调用了。

写在最后的话

这是时下很火热的人工智 (RUO) 能 (ZHI) 在测试中的一种应用,相信在测试工作中,还有很多地方可以使用人工智 (RUO) 能 (ZHI) 来提高咱们的工作效率。
那就自己多发现吧。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 38 条回复 时间 点赞

占个沙发。

恒温 将本帖设为了精华贴 03月31日 16:00

人工智能必须加精啊,虽然我看不懂。。

人工智能 + 自动化测试,赞赞赞

好思路~👍
之前拿 PIL 做像素对比算百分比思路的算是有出路了😂
期待万张、十万张图训练后的准确度👍

Mingway_Hu 回复

如果只是为了做对比到没有必要上人工智能。
你都能拿到百分之的话,直接压缩成对应的图片去比较就可以了。
我这个场景是为了应对各种自拍的角度,以及杂乱背景环境下的图片验证。

codyL 回复

嗯,除了断言外,跑的步骤也截了一套图做基准来辅助,后期回归时出来的图跟基准那套做对比,当时隐约考虑过要不要走机器学习去提高对比的准确度,后来觉得截图对比这活儿本身的价值也不是很大然后犯懒用的 PIL 做来简单作个对比,误差大的偶尔翻翻看,再到后来对比完了也不看了 [捂脸]。。。

前些天见了写搞直播流鉴黄和视频的,发现机器学习在这块还挺火的~

204 几年 第三次世界大战
204 几年 强人工智能出现

没看明白测试点呀。。。美颜、磨皮、瘦脸后验证还是不是刚刚那张照片里的人是吗?

Mingway_Hu 回复

想知道鉴黄的数据开源不😍 😍 😵

codeskyblue 回复

鉴黄的结果都是计算图片的涉黄概率,返回数据是些草草的涉黄程度(一般是正常、性感、违规三档)反馈给 cdn 和客户方,没啥特别的。
素材他们说是能找地方去买,好像是千张几毛到几块钱,你想问的是这个吧😂

我对人工智能很有兴趣,但是目前的认知还只是大学课本上的基础和几种算法,能请教一下,大神是怎么学习的么,或者是学习路线图

没怎么看懂

codyL #14 · 2017年04月01日 Author
simple 回复

目前我想的测试点是,拍照后,选择插件拍照后,照片里面的插件是否正确。
再延伸,也可以判断美颜啊,这样那样的,取决于训练样本

15楼 已删除
codyL #16 · 2017年04月01日 Author
子非鱼 回复

可以从网易公开课或者 Coursera Andrew Ng 的课开始
然后你还要学习线性代数,以及微积分

codyL #25 · 2017年04月01日 Author
Mingway_Hu 回复

那个地方叫百度图片,是吗?

看了半天 也不知道怎么用起来

错误率是 0 ?

把 AI 应用于测试,非常有趣的尝试,也期待楼主有更多深入的分享.
此外,搭车招募优秀的测试开发工程师参与到人工智能项目的测试开发工作, 有机会每天和优秀的 AI Researcher 一起探索人类未知的边界, 坐标上海

我觉得我们还是来讨论下人工智障的项目如何测试吧。。

codyL 回复

肯定不是 x 度~
有专门的卖图片素材的公司~
图片识别这块一般都爱用 gpu 算,部到阿里云上,感觉再写写也能搞搞简 low 版的鉴黄服务了~
对了,哥们儿,问个事儿,你在 51testing 上也发这个文了没?或是授权他们转载过没?

你好, 请问你的文章有没有投递到其他的渠道, 我们看看可否声明你的原创.

codyL #24 · 2017年04月01日 Author
Mingway_Hu 回复

没有,就在这里发了,也没有授权转载过

codyL #25 · 2017年04月01日 Author

没有

调用这个包,不需要自定义特征,就可以利用 svm 直接做分类吗?

codyL #27 · 2017年04月03日 Author
willys 回复

图片的特征怎么做?

还是有个老问题,这个自动化测试程序本身出错的时候怎样发现?

先 ai 测完再人工检查一遍?或者是,直接认为这个程序不可能出错,而不需要再人工检查一遍?

挺不错的,个人觉得人工智能中的图像识别技术在 UI 层自动化测试上也可能会有很大的应用空间。

请问这个方法解决了什么问题呢?是不用人工校验了吗?还是仅仅是尝试?

codyL #31 · 2017年04月06日 Author
ting 回复

这是两个不同的问题
我这个 demo 是用来检查一些自动化检查点检查不了的东西。
对于自动化程序本身出错,无法判断

codyL #32 · 2017年04月06日 Author
Sutune 回复

对,有一定的应用空间,不过人工智能这个东西在门槛上有一定限制。
只能多尝试

codyL #33 · 2017年04月06日 Author
sunny 回复

不用人工效验了呀。
e.g.
1.对于某些问题,自动化是无法判断到底是什么问题,只能截图第二天人工来检查判断,可以尝试这样解决。
2.对于某些即使自动化跑通过的场景也需要截图人工第二天核对的,也可以尝试通过这种思路来解决。

codyL 回复

不是说自动化程序出错,我是指你这个 “判断自动化检查点检查不了的东西的程序” 出错的时候,你怎么发现他出错了。

比如实际上这个点没 pass,但是你这个程序给出的输出是 pass,有没有可能出现这个情况,如果出现了,你怎样去发现?是通过对每次这个程序检查过的检查点做人工检查的方法来发现这种问题吗?

实际工作中我看到很多人实现了很神奇的自动化测试,却从来不会考虑这种测试本身有没有 bug,也不考虑如果有 bug 能不能发现。我也从别人的自动化脚本里找出过一些非常隐蔽,但会导致整个测试白测的 bug。绝没有给你挑刺的意思。

codyL #35 · 2017年04月09日 Author
ting 回复

明白你的问题
其实我在做这个工具的时候,其实我是会在大量数据上做自测的,自测数据量占总样本的 20%~30%
在这里我主要是要提一个思路以及实现,所以在文章里面跳过了 cross validation 这一步而已,直接训练完就去验证结果了,还有一个特殊点是,我这里的场景其实并不复杂,无非就是选择插件拍照保存输入,有很多细节或者特征是可以固定的,所以可以做到绝对 100% 全对

这个世界真的是欠了的债是就要还的, 最近一直在 coursera 上面看 Andrew NG 的课, 不过由于线性代数和微积分完全懵逼, 所以就去边补它们边看 Andrew NG 的课, 然而在学习微积分的路程上又遇到了三角函数 (部分懵逼), 所以现在是在边看三角函数, 边看线性代数, 边看微积分, 边看 Andrew NG 的课....
我不管, 我会把机器学习坚持学下去的.

请问你的训练图片尺寸是多少?彩色还是灰度呢?训练一次需要多少时间呢?

codyL #38 · 2017年07月12日 Author
xiaqing 回复

100*100,彩色 RGB,所以 feature 有 100*100*3
训练一次的话 ,因为我在虚拟机上跑的,可能时间不太准确,但是 1 一分钟之内是肯定可以搞定的

codyL #39 · 2017年07月12日 Author
zhang 回复

加油,其实 coursera 上 Andrew Ng 的课是最简单的,看完还可以去网易公开课看看 Andrew 的公开课,属于进阶版
另外也不要想的那么复杂,机器学习在工程应用方面对数学的要求并没有那么高
难就难在调参,这是一门玄学

codyL 回复

嗯嗯, 我会加油的, 谢谢您的推荐啊。
可能是自己的相应基础技能还太不扎实, 所以看起来有点吃力, 不过绝对不会放弃的。😆

Seadragon [该话题已被删除] 中提及了此贴 06月15日 16:06
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册