背景
目前移动端应用的弹窗有很多种,如启动弹窗、安装应用需要输入账号/密码弹窗、升级弹窗、活动弹窗等,弹窗主要有通常的几个部分组成,如活动内容、取消按钮、关闭按钮、文本输入框等。此次主要处理的是关闭按钮这个组成部分。
关闭按钮详细介绍流程图:https://www.processon.com/view/link/5ff85ee4e401fd661a21ef1b#map
名词解释
TensorFlow:是一个开源软件库,用于各种感知和语言理解任务的机器学习。
Keras:Keras是一个用Python编写的开源神经网络库,能够在TensorFlow、Microsoft Cognitive Toolkit、Theano或PlaidML之上运行,进行深度学习模型的设计、调试、评估、应用和可视化。
CNN:卷积神经网络(Convolutional Neural Networks),是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。CNN实际应用:图片分类、检索;目标定位检测;目标分割;人脸识别;骨骼识别。
R-CNN:属于CNN的一种,适用于图像检测、目标检测。
环境安装
Python3.7 Keras==2.2.4 numpy==1.16.5 tensorflow==1.15.2 scikit-learn==0.19.2 scipy==1.1.0 selectivesearch==0.4 opencv-python==3.4.2.17 h5py==2.10.0
具体步骤
机器学习流程图:https://www.processon.com/view/link/5ff865e707912914e73af1b3
1、构造数据集
样本:
• 正样本:11个不同类型的活动弹窗关闭按钮图片
• 负样本:11个非活动弹窗关闭按钮图片
样本增强:
data_gen = ImageDataGenerator(rotation_range=20, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True, vertical_flip=True, fill_mode='nearest', data_format='channels_last')
ImageDataGenerator()通过实时数据增强生成张量图像数据批次,并且可以循环迭代,它是keras.preprocessing.image模块中的图片生成器,可以每一次给模型“喂”一个batch_size大小的样本数据,同时也可以在每一个批次中对这batch_size个样本数据进行增强,扩充数据集大小,增强模型的泛化能力。比如进行旋转,变形,归一化等等。
总结起来就是两个点:
(1)图片生成器,负责生成一个批次一个批次的图片,以生成器的形式给模型训练;
(2)对每一个批次的训练图片,适时地进行数据增强处理(data augmentation);
for _ in data_gen.flow(x, batch_size=1, save_to_dir=self.train_path, save_prefix=cls_prefix, save_format="png"): i = i+1 if i >= augmentation_size: print("class_{0} augmentation for {1} samples".format(cls_prefix, i)) break flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png'):
接收numpy数组和标签为参数,生成经过数据提升或标准化后的batch数据,并在一个无限循环中不断的返回batch数据,采集数据和标签数组,来训练数据,生成批量增强数据
此两处代码主要是针对原始的样本集做数据增强处理,得到较多增强样本
2、训练模型
构造好数据集后,通过Keras提供的API进行模型的训练,创建模型采用的是Keras的Sequential,它能够快速的进行编译并生成模型,得到模型文件,该模型文件将用于后续的弹窗识别工作。
Sequential 序贯模型
Sequential 序贯模型是函数式模型的简略版,为最简单的线性、从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠。Keras实现了很多层,包括core核心层,Convolution卷积层、Pooling池化层等非常丰富有趣的网络结构。我们可以通过将层的列表传递给Sequential的构造函数,来创建一个Sequential模型。
model = Sequential()
指定输入数据的尺寸
model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25))
编译
在训练模型之前,我们需要配置学习过程,这是通过compile方法完成的,他接收三个参数:
• 优化器 optimizer:它可以是现有优化器的字符串标识符,如 rmsprop 或 adagrad,也可以是 Optimizer 类的实例。详见:optimizers
• 损失函数 loss:模型试图最小化的目标函数。它可以是现有损失函数的字符串标识符,如 categorical_crossentropy 或 mse,也可以是一个目标函数。详见:losses。
• 评估标准 metrics:对于任何分类问题,你都希望将其设置为 metrics = [‘accuracy’]。评估标准可以是现有的标准的字符串标识符,也可以是自定义的评估标准函数。
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])
训练
Keras 模型在输入数据和标签的 Numpy 矩阵上进行训练。为了训练一个模型,你通常会使用 fit 函数
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test))
3、预测结果
以手淘首页中的活动弹窗为例:可以看到训练出来的模型识别能对其准确识别
可以先对待识别图片做预处理,预处理的方法可以参照之前的分享:识别图片中文字的一种思路_ocr: https://testerhome.com/articles/27379
4、模型评价
真正例(True Positive,TP):真实类别为正例,预测类别为正例
假正例(False Positive,FP):真实类别为负例,预测类别为正例
假负例(False Negative,FN):真实类别为正例,预测类别为负例
真负例(True Negative,TN):真实类别为负例,预测类别为负例
准确率,又称查准率(Precision,P):
召回率:
可以根据准确率和召回率来衡量你这个模型的好坏
↙↙↙阅读原文可查看相关链接,并与作者交流
Be First to Comment