Press "Enter" to skip to content

移动端应用的弹窗模型训练

背景

 

目前移动端应用的弹窗有很多种,如启动弹窗、安装应用需要输入账号/密码弹窗、升级弹窗、活动弹窗等,弹窗主要有通常的几个部分组成,如活动内容、取消按钮、关闭按钮、文本输入框等。此次主要处理的是关闭按钮这个组成部分。

 

关闭按钮详细介绍流程图: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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注