\chapter{开放能力} 本章节将详细讲述每个模块模型实现方法以及用户自主训练、预测的方法。 \section{回归预测} 回归是一种通过建模和分析变量之间关系的的方法,其目的是通过模型来计算得出一个具体的值。\\ \indent 回归预测在很多的方面得到应用,例如:天气预测、机械寿命预测、商品价格预测、股价预测等都有广泛的应用。本平台的回归预测模块选取了海浪高度预测、波士顿房价预测、碳排放预测和股票价格预测等四个典型预测问题,并提供多种不同类型的建模方法,方便使用者充分利用本平台构建自己的模型。 \subsection{海浪高度预测} \subsubsection{模型构建} 海浪高度预测属于简单的回归预测,其样本的结构如表\ref{ocean_wave_data}所示: \begin{table}[htb] \centering \resizebox{\textwidth}{15mm}{ \begin{tabular}{|c|c|c|c|c|c|c|c|} \hline\hline \textbf{列名} & \textbf{WVHT\_1} & \textbf{WDIR\_1} & \textbf{WSPD\_1} & \textbf{WDIR\_2} &\textbf{WSPD\_2} & \textbf{WDIR} & \textbf{WSPD} \\ \hline \textbf{含义}&\textbf{t-1时刻高度}&\textbf{t-1时刻风向}&\textbf{t-1时刻风速}& \textbf{t-2时刻风向}&\textbf{t-2时刻风速}&\textbf{当前风向}&\textbf{当前风速} \\ \hline \textbf{数据类型}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}&\textbf{float}\\ \hline\hline \end{tabular}} \caption{海浪高度预测模型的数据特征及说明} \label{ocean_wave_data} \end{table} 因此,建模时采用简单的多层感知机(Multi-Layer Perceptron, MLP)即可快速完成任务,模型构造如图\ref{MLP}所示,输入数据通过z-score(式\ref{z_score})进行归一化,然后输入到感知机中,最后输出得到预测值,并与真实值进行比较,计算损失值进行迭代。 \begin{equation} z(x) = \frac{x-\mu}{\sigma} \label{z_score} \end{equation} \begin{figure}[htb] \centering \includegraphics[width=0.75\textwidth]{images/ch03/regression/MLP.png} \caption{支持用户自定义的多层感知机} \label{MLP} \end{figure} \indent 用户可以将自己的数据输入进模型,根据自定义的超参数进行训练,得到符合自己数据的专有模型;也可以直接输入特征数据进行预测。 \subsubsection{模型训练} 训练界面如图\ref{oceantrain}所示,该模型支持自定义神经元数量、学习率、训练轮数、激活函数、损失函数等超参数。 \begin{figure}[!htb] \centering \includegraphics[width=0.6\textwidth]{images/ch03/regression/oceanwave_train.png} \caption{海浪高度模型训练界面} \label{oceantrain} \end{figure} 用户通过输入上述超参数,可以选择上传本地数据进行训练,若不上传,则默认使用线上数据。等待训练完成后,系统将返回该模型在验证集数据上的指标,如图\ref{ocean_train_result}所示。此时,用户就得到了一个基于自设超参数和本地数据的模型。 \begin{figure}[htb] \centering \includegraphics[width=0.8\textwidth]{images/ch03/regression/ocean_train_result.png} \caption{海浪高度模型训练指标} \label{ocean_train_result} \end{figure} \subsubsection{模型预测} 平台支持使用用户自定义和模型进行预测和使用平台预先训练好的模型进行训练,以用户自训练模型预测(图\ref{ocean_prediction})为例 \begin{figure}[htb] \centering \includegraphics[width=0.55\textwidth]{images/ch03/regression/ocean_prediction.png} \caption{使用自训练模型预测} \label{ocean_prediction} \end{figure} 用户输入一条特征数据,点击\textbf{预测浪高}按钮,等待模型预测完成后,即可获得海浪高度的预测值。 \newpage \subsection{波士顿房价预测} 波士顿房价预测属于经典的机器学习回归问题之一,该任务需要对79个与房价有关的特征进行处理和建模,最终得到能够预测房价的回归模型。该任务的评价指标是均方根误差(Root Mean Square Error, RMSE) \begin{equation} RMSE(y) = \sqrt{\sum_{i=1}^{n}(y_i-\hat{y_i})^2} \label{rmse} \end{equation} \subsubsection{模型构建} 由于特征维度较多,而且有很多的缺失值、部分特征存在异常值,因此首先进行特征分析和数据预处理。包括异常点检测、缺失值处理和数据填充、特征独热编码等。 \begin{enumerate} \item \textbf{异常点检测}。异常点的分析以特征"GrLivArea"为例,打印其与房屋售价"SalePrice"的分布如图\ref{annopoint}所示, \begin{figure}[H] \centering \includegraphics[width=0.75\textwidth]{images/ch03/regression/annopoint.png} \caption{GrLivArea与SalePrice分布图} \label{annopoint} \end{figure} 清晰可见右上角有两个离群点,在训练时,可以考虑将这两条样本删除。同理,其他特征上包含异常值的样本,在数据预处理阶段也同时予以删除。 \item \textbf{缺失值处理}。对训练数据的缺失值进行分析,得到较高缺失比例的特征如图\ref{miss_rate}所示,高缺失率的特征将影响模型的泛化能力,因此将缺失率>30\%的特征(PoolQC, MiscFeature, Alley, Fence, FireplaceQu)删去,不参与后续训练。 \begin{figure}[H] \centering \includegraphics[width=0.5\textwidth]{images/ch03/regression/boston_miss_rate.png} \caption{特征缺失比例} \label{miss_rate} \end{figure} \item \textbf{缺失值填充}。对于剩余包含较少缺失值的特征列,分别采取填充None值、填充众数、填充平均数等方式,将缺失的部分填充上。 \item \textbf{正态性分析}。对于目标值SalePrice,构建其直方图和正态概率分布图\ref{non_normal_house_price},可见其呈明显正偏态分布,不利于回归建模。 \begin{figure}[H] \centering \includegraphics[scale=0.4]{images/ch03/regression/non_normal_dist.png} \includegraphics[scale=0.4]{images/ch03/regression/non_normal_prob.png} \caption{SalePrice的直方图和正态概率分布图} \label{non_normal_house_price} \end{figure} 因此,对价格列进行对数化处理,处理后的数据分布如图\ref{normal_house_price},可见其基本符合正态分布。 \begin{figure}[H] \centering \includegraphics[scale=0.4]{images/ch03/regression/normal_dist.png} \includegraphics[scale=0.4]{images/ch03/regression/normal_prob.png} \caption{对数化后SalePrice的直方图和正态概率分布图} \label{normal_house_price} \end{figure} \item \textbf{特征独热编码} 对于离散型的特征,需要将其进行独热编码(one-hot),才能转变为机器可以识别的特征。 \end{enumerate} 经过数据预处理后,平台采用xgboost模型进行回归建模。xgboost(eXtreme Gradient Boosting)是一种基于GBDT的算法,具有高效、灵活和轻便的特点,在数据挖掘、推荐系统等领域得到广泛的应用。通过预设的超参数集合,将训练样本输入xgboost模型中,经过数轮迭代后得到训练好的模型。 \subsubsection{模型训练} 平台提供了用户上传数据和自定义超参数训练模型的功能。用户可定义的超参数如表\ref{hyperparams_xgb}所示 \begin{table}[htb] \centering \begin{tabular}{|c|c|c|} \hline\hline \textbf{名称} & \textbf{含义} & \textbf{默认值} \\ \hline \textbf{eta}&\textbf{学习率}&\textbf{0.05} \\ \hline \textbf{max\_depth}&\textbf{树的最大深度}&\textbf{10}\\ \hline \textbf{subsample}&\textbf{随机采样比例}&\textbf{0.7}\\ \hline \textbf{colsample\_bytree}&\textbf{随机采样列数}&\textbf{0.8}\\ \hline \textbf{num\_boost\_round}&\textbf{迭代轮数}&\textbf{1000}\\ \hline \textbf{early\_stopping\_rounds}&\textbf{提前终止训练}&\textbf{200}\\ \hline\hline \end{tabular} \caption{海浪高度预测模型的数据特征及说明} \label{hyperparams_xgb} \end{table} \subsubsection{模型预测} 用户可以选择使用自训练模型进行预测,也可以选择使用平台已经训练好的模型进行预测。预测时需要按照波士顿房价预测问题官方给出的数据集格式准备好自己的数据,并将数据在指定界面上传,平台将返回符合官方要求的数据格式的文件。 \subsection{碳排放预测} \subsection{股票预测} \section{智能图像} 机器视觉(Machine Vision)是人工智能领域中发展迅速的一个重要分支,目前正处于不断突破、走向成熟的阶段。智能图像处理是指一类基于计算机的自适应于各种应用场合的图像处理和分析技术,本身是一个独立的理论和技术领域,但同时又是机器视觉中的一项十分重要的技术支撑。\\ \indent 智能图像处理的主要技术包括图像预处理、图像分割、目标识别和分类、目标检测和跟踪等主要研究方向。近年来,随着深度学习技术的不断发展,利用深度神经网络完成相关任务成为智能图像处理领域的主流方法。\\ \indent 在本模块中,平台基于深度神经网络技术,实现了综合性的图像智能处理功能。包括基础问题建模(MNIST手写体分类、图片文字识别),智能目标检测、智能图像分割、人体关键点检测、智能图像生成(通过文字描述生成图像)等应用,可以快速根据需求生成所需的结果。 \subsection{MNIST手写体分类} MNIST手写体数据集来自美国国家标准与技术研究所(National Institute of Standards and Technology, NIST). 训练集有60000个样本,测试集有10000个样本。样本经过归一化后,每张图片的大小是相同的。该数据集由Yann LeCun等人维护。其中部分数据如图\ref{MNIST_sample}所示 \begin{figure}[H] \centering \includegraphics[width=0.2\textwidth]{images/ch03/vision/1.jpg} \includegraphics[width=0.2\textwidth]{images/ch03/vision/2.jpg} \includegraphics[width=0.2\textwidth]{images/ch03/vision/7.jpg} \caption{MNIST数据集示例} \label{MNIST_sample} \end{figure} \subsubsection{模型构建} 由于任务相对简单,我们以经典的LeNet-5来完成MNIST手写体识别任务。LeNet-5网络结构如图\ref{LeNet}所示 \begin{figure}[htb] \centering \includegraphics[width=0.8\textwidth]{images/ch03/vision/LeNet-5.png} \caption{LeNet-5网络结构} \label{LeNet} \end{figure} \subsubsection{模型训练} 用户可以上传数据并自设学习率和迭代轮数进行模型自训练。 \subsubsection{模型预测} 用户可以使用自训练的模型进行预测,也可以上传数据,使用平台预先训练好的模型进行预测。预测界面如图\ref{mnist_pred}所示 \begin{figure}[H] \centering \includegraphics[width=0.9\textwidth]{images/ch03/vision/mnist_predict.png} \caption{MNIST预测界面} \label{mnist_pred} \end{figure} \subsection{图片文字识别} 光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。 \subsubsection{模型构建} 平台集成了开源离线OCR工具tr,用户只需要上传图片,就可以得到图片中的文字。 \subsubsection{模型训练} 暂不支持自训练。 \subsubsection{模型预测} 用户上传带有文字的图片,平台经过计算后,返回图片中的文字,效果如图\ref{ocr_pred}所示 \begin{figure}[H] \centering \includegraphics[width=0.9\textwidth]{images/ch03/vision/ocr_result.png} \caption{OCR识别效果} \label{ocr_pred} \end{figure} \subsection{目标检测} YOLO(You Only Look Once)系列算法采用单个神经网络直接预测物品边界和类别概率,实现端到端的物品检测。该方法的特点是将目标检测任务看作目标区域预测和类别预测的回归问题,实现快速检测的同时还达到较高的准确率。平台采用YOLOv5框架作为目标检测模型的基础框架。 \subsubsection{模型构建} YOLOv5的网络结构如图\ref{yolov5}所示, \begin{figure}[H] \centering \includegraphics[width=0.9\textwidth]{images/ch03/vision/yolov5.png} \caption{YOLOv5网络结构图} \label{yolov5} \end{figure} 由于模型代码已经开源(\href{https://github.com/ultralytics/yolov5}{https://github.com/ultralytics/yolov5}),平台直接利用了其开源代码搭建模型。 \subsubsection{模型训练} 通过YOLOv5的开源代码,我们可以利用预训练好的代码和权重进行训练。通过以下指令,就完成了基于yolov5n的网络结构和COCO数据集,BATCH大小为128的模型的训练。 \begin{Verbatim}[h] python train.py --data coco.yaml --cfg yolov5n.yaml --weights '' --batch-size 128 \end{Verbatim} 该模型训练耗时和算力消耗都比较大,因此平台不提供自主数据训练。 \subsubsection{模型预测} 平台支持使用不同参数量的YOLOv5模型进行预测,用户通过上传本地的图片,选择YOLOv5模型的版本,进行目标检测模型的预测。具体版本类型如表\ref{yolov5_version}所示:\\ \begin{table}[H] \centering \begin{tabular}{|c|c|c|c|c|} \hline\hline \textbf{Model} & \textbf{size(pixels)} & \textbf{Speed(ms)}&\textbf{params(M)} & \textbf{FLOPs@640 (B)} \\ \hline \textbf{YOLOv5n}&640&45&1.9&4.5 \\ \hline \textbf{YOLOv5s}&640&98&7.2&16.5 \\ \hline \textbf{YOLOv5m}&640&224&21.2&49.0 \\ \hline \textbf{YOLOv5l}&640&430&46.5&109.1 \\ \hline \textbf{YOLOv5x}&640&766&86.7&205.7\\ \hline\hline \end{tabular} \caption{YOLOv5可选版本及其部分参数} \label{yolov5_version} \end{table} \newpage \indent 使用YOLOv5x对图片进行分割的结果如图\ref{yolov5x_rst}所示 \begin{figure}[H] \centering \includegraphics[width=0.45\textwidth]{images/ch03/vision/yolov5x_in.jpg} \hspace{3mm} \includegraphics[width=0.45\textwidth]{images/ch03/vision/yolov5x_out.jpg} \caption{YOLOv5x检测结果} \label{yolov5x_rst} \end{figure} \subsection{智能图像分割} 图像分割技术是目前计算机视觉领域最热门的技术之一,许多应用了计算机视觉的场景都需要对图像进行智能分割,以充分理解图像中的内容,以便于机器分析图像中各个部分之间的关系。图像分割技术主要分为语义分割和实例分割等。\\ \indent 光伏发电站,是指一种特殊材料电子元件(诸如晶硅板、逆变器等)组成的利用太阳能发电的体系,与电网相连并向电网输送电力。利用遥感图像和图像分割技术,可以对光伏发电站的空间分布进行精准确定。因此,本平台以光伏发电站的遥感图像为例,提供了光伏板智能图像分割服务。 \subsubsection{模型构建} U-Net是一种U型的类Encoder-Decoder卷积神经网络,最初被应用于医疗图像分割,后来实验证明其在其他领域的图像分割也有较好的效果,是实现语义分割或实例分割的较为基础的模型,其网络结构如图\ref{unet}所示:\\ \begin{figure}[H] \centering \includegraphics[scale=0.53]{images/ch03/vision/unet.png} \caption{U-Net的网络结构图} \label{unet} \end{figure} \indent 模型首先通过卷积操作进行特征融合,通过池化层进行降维,然后再通过卷积层进行上采样,最后通过$1\times 1$的卷积进行结果的输出。 \subsubsection{模型训练} \begin{enumerate} \item \textbf{数据准备}。 U-Net模型训练需要同时准备原图像和标注图像,其示例如图\ref{unet-data}所示,标注图像需标注出光伏板的位置 \begin{figure}[H] \centering \includegraphics[scale=0.4]{images/ch03/vision/unet-ori.jpg} \hspace{5mm} \includegraphics[scale=0.43]{images/ch03/vision/unet-label.jpg} \caption{U-Net数据集示例} \label{unet-data} \end{figure} \item \textbf{模型训练}。首先将原始图像进行数据增强,例如随机限制对比度、随机增加白噪声、随机锐化和模糊等,然后调整分表了使得图像像素长宽能被32整除,最后将图像规范化成为神经网络模型可接受的输入。训练时以DiceLoss作为损失函数,使用交并比作为训练时更新模型的指标。 \end{enumerate} \subsubsection{模型预测} 模型预测支持单张图片预测,也支持批量预测,用户通过平台上传本地图片,模型运行完成后会返回分割后的结果。最终分割的效果如图\ref{unet-out}所示 \begin{figure}[H] \centering \includegraphics[scale=0.4]{images/ch03/vision/unet_photovoltaic.png} \caption{U-Net分割光伏图像} \label{unet-out} \end{figure} \subsection{人体关键点检测} 人体关键点检测,Human Pose Estimation,指通过识别一些人体关键点,如头部、肩膀、关节等,描述人体骨骼信息。人体关键点检测是计算机视觉的重要应用之一,以人体关键点检测为基础,可以进行行为识别、人物跟踪、步态识别等相关研究。按照检测目标的维度,人体关键点检测一般可以分为二维关键点检测和三维关键点检测。 \begin{figure}[H] \centering \includegraphics[scale=0.6]{images/ch03/vision/pose_esti.jpg} \caption{二维人体关键点检测} \label{pose_esti} \end{figure} \subsubsection{模型构建} MMPose是一个基于PyTorch的开源姿态估计工具箱。基于MMPose的开源框架,我们可以简单的搭建一个人体关键点检测的建模、训练和预测服务。 \subsubsection{模型训练} 平台选择了MMPose自带的预训练模型搭建服务,MMPose框架也支持使用者基于自有数据进行模型微调或者重新训练,指令如下 \begin{Verbatim}[H] python tools/train.py ${CONFIG_FILE}$ [optional arguments] \end{Verbatim} \subsubsection{模型预测} 用户可以直接上传本地图片进行预测,模型预测的效果如图\ref{pose_out}所示 \begin{figure}[H] \centering \includegraphics[width=0.4\textwidth]{images/ch03/vision/pose_in.jpg} \hspace{5mm} \includegraphics[width=0.4\textwidth]{images/ch03/vision/pose_out.jpg} \caption{预测结果示例} \label{pose_out} \end{figure} \subsection{图像生成} 根据文本生成对应的图像是多模态任务之一。解决这一问题的主流方法有VAE(Variational Auto-Encoder),DRAW(Deep Recurrent Attention Writer)以及生成对抗网络(Generative Adversarial Networks, GAN)等。 \subsubsection{模型构建} FuseDream是一个结合CLIP(Connecting Text and Images)和GAN的开源文本生成图像模型 \begin{enumerate} \item \textbf{生成对抗网络模块}。GAN模块的结构如下图\ref{gan}所示 \begin{figure}[H] \centering \includegraphics[width=0.8\textwidth]{images/ch03/vision/GAN.jpg} \caption{生成对抗网络结构图} \label{gan} \end{figure} 生成对抗网络模型由两部分组成,一个是生成模型(Generator),一个是判别模型(Discriminator Network)。生成模型的任务是尽力模仿输入的数据生成类似的数据。判别模型的任务是判断给定的实例是否是由生成器伪造的。 \item \textbf{CLIP}。CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比学习的文本-图像对的预训练模型。如下图\ref{clip}所示,CLIP包括两个模型:Text Encoder和Image Encoder,其中Text Encoder用来提取文本的特征,可以采用transformer模型;而Image Encoder用来提取图像的特征,可采用CNN模型。 \begin{figure}[H] \centering \includegraphics[width=0.6\textwidth]{images/ch03/vision/CLIP.jpg} \caption{CLIP结构图} \label{clip} \end{figure} \end{enumerate} \subsubsection{模型训练} 训练时按照如下步骤进行 \begin{enumerate} \item 通过对数据集随机扰动,进行数据增强。 \item 使用CLIP模型计算文本与图像的相似度,依靠增强的数据,增加CLIP的鲁棒性。 \item 将CLIP模型计算得分较高的一部分数据送入GAN模型,进行训练。 该模型利用了预训练的BIG-GAN权重,在使用时无需重复训练,根据用户输入的文本进行微调即可。 \end{enumerate} \subsubsection{模型预测} 用户输入文字,模型经过生成后,输出对应的图片。示例如下 \begin{figure}[H] \centering \subfigure[A photo of a blue dog.]{\includegraphics[width=0.3\textwidth]{images/ch03/vision/blue_dog.png}} \hfill \subfigure[Sun rises from sea.]{\includegraphics[width=0.3\textwidth]{images/ch03/vision/sunrise.png}} \hfill \subfigure[A small flower blooms on the cliff.]{\includegraphics[width=0.3\textwidth]{images/ch03/vision/flower_blooms.png}} \caption{生成图像示例} \label{text2gan} \end{figure} \section{自然语言处理} 自然语言处理(Natural Language Processing, NLP)是计算机科学与人工智能领域中的一个重要研究方向。它是关于如何使计算机理解人所使用的自然语言的研究,是融合计算机科学、语言学、数学等学科于一体的科学。 自然语言处理任务通常包括句法分析、文本分类、机器翻译、阅读理解、人机对话等多种任务,在舆情分析、智能机器人等研究上扮演了重要的角色。平台以将这些任务为例,结合最新预训练模型技术进行建模。 \subsection{文本情感分类} 文本分类任务是NLP任务中较为基础的应用。文本情感分类一般是指按照文本内容,将文本情感分为两类(积极、消极)或三类(积极、中性、消极)。\\ \indent 传统文本情感分类任务一般是基于中文分词、词向量结合TextCNN等神经网络模型实现的,近年来,随着各种Transformer预训练模型的出现,基于预训练模型进行微调(Fine-Tune)的文本分类模型逐渐成为主流。本平台的文本分类模型即采用了这种方式。 \subsubsection{模型构建} 使用Bert等Transformer模型进行微调预测的网络结构如下图\ref{bert_cls}所示,中文文本一般不再需要分词,而是经过在词表中的位置映射,转换为机器能够理解的编码。对于文本分类任务,BERT模型在文本前插入一个[CLS]符号,经过训练和,该符号可以学习到整段文本的语义表示,并将该符号对应的向量输出得到最后的分类结果。 \begin{figure}[H] \centering \includegraphics[scale=0.6]{images/ch03/nlp/bert_classify.png} \caption{Bert文本分类} \label{bert_cls} \end{figure} 构建模型时,采用 RoBERTa 作为基础的预训练模型,相比于Bert,RoBERTa基于更大的训练数据和更长的预训练时间进行预训练。 \subsubsection{模型训练} 平台支持文本分类任务的自主训练,用户同时上传训练数据集和测试数据集,平台建模完成后,会提供预测的结果文件,可供用户下载。 \subsubsection{模型预测} 用户也可以只提交测试文件,平台基于线上模型进行预测,同时返回预测结果。 %\subsection{机器翻译} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\subsection{阅读理解} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\subsection{语义匹配} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\subsection{对话系统} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\subsection{文本生成} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\subsection{词法分析} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\section{智能语音} %\subsection{语音识别} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\subsection{语音生成} %\subsubsection{模型构建} %\subsubsection{模型训练} %\subsubsection{模型预测} %\section{其他任务} \begin{subappendices}%%!!!!!!! \section{各模块模型服务接口文档} \subsection{回归预测} \subsubsection{海浪高度预测} \end{subappendices}