数据科学竞赛-计算机视觉赛流程

本文主要介绍计算机视觉类竞赛的流程,均为理论经验,比较枯燥但干货满满。

数据科学竞赛-计算机视觉赛流程_第1张图片

简介

计算机视觉的任务一般认为有三大基本任务(分类、检测、分割)和三大进阶任务(图像理解、视频理解、图像生成)。 三大基本任务是最常被作为计算机视觉赛题的,这主要是因为其评价标准比较统一(如分类使用准确率、召回率等评价模型效果等),并且难度并不是特别大,而进阶任务一方面评价较为主观难以量化,另一方面也确实存在难度。

计算机视觉的处理方法一般分为传统方法(Hog算子、Sift算子、Haar级联合)和深度方法(卷积神经网络),在Python语言中这两者封装为OpenCV和TensorFlow,一个计算机视觉任务不是简单的使用深度学习方法就能做到完美的,配合传统的优质方法是必经之路,两者互补相成。(其中opencv可以使用pip安装,TensorFlow尤其在Windows环境下建议使用conda安装。)

不同于数据挖掘赛,花费大量的时间在特征工程上力求输入模型的数据是极好的,计算机视觉任务对数据的预处理并不是特别复杂,输入模型的一般也就是一个个图片矩阵,所以计算机视觉类的比赛最核心的就是模型的构建和优化。同时,因为模型训练最为关键,需要大量算力所以需要使用TensorFlow或PyTorch这类支持GPU运算和自动求导的运算库。

数据获取

数据源是一切的开端,良好的、大量的、多类的有标注数据对于计算机视觉相当重要,这也是前面很多年没有太大突破的原因,因为深度学习方法在计算机视觉任务中表现极好但是需要大量的训练数据用于参数训练。

  • 官方提供
    几乎所有的计算机视觉类比赛都会提供数据集(包括训练集和测试集),只有这样才能确保模型的效果(训练能力及泛化能力)。
  • 公开数据集
    近些年,计算机视觉的飞速发展诞生了很多有标注的海量数据,为了科研的发展,很多大型数据集都是对外开放的,如ImageNet、Object365、Caltech101等。
  • 爬虫采集
    互联网存在大量的有标签的图片、视频等计算机视觉需要的数据,可以通过网络爬虫采集这些数据。

工具选择

CV类的比赛,常常要用到很多图片处理和深度学习框架的第三方库,参加这类比赛必须对这类框架至少熟悉一到两种。

  • OpenCV
    主要用于读取和处理图像,这里需要注意,Python接口的OpenCV读取的图像矩阵式按照BGR存储而不是RGB,可能在PIL或者Matplotlib中显示不正常。类似的库有Pillow、Skimage等,安装使用pip install opencv-python
  • TensorFlow和Keras
    最新版2.0.0的TensorFlow已经集成了Keras(Google收购Keras),TensorFlow是一个使用最广泛的深度学习框架,在学术界和工业界认可度极高,Keras是对复杂的TensorFlow进行的一个封装,使得用户可以轻松构建各类神经网络。类似的库有PyTorch等。安装使用pip install tensorflow安装CPU版本,pip install tensorflow-gpu安装GPU版本。Keras直接使用pip安装即可。
  • 其他常用库
    • tqdm
      • 一个非常常用的很实用的进度条工具。
    • glob
      • 支持正则匹配的目录下文件搜索工具。
    • face_recognition
      • 最简单的人脸检测识别框架。

数据探索

在CV比赛中一般不使用EDA(探索性数据分析)来称呼视觉任务中的数据探索,这是因为计算机视觉的数据大多格式统一(图片或者视频配以一个说明性表格文件)没必要进行过多的探索,达不到分析的地步。

  • 数据集存储信息
    通过shell脚本或者Python脚本了解数据集中数据的基本信息,如图片格式,标注方式(文件夹名称标注一批图片或者csv文件逐一标注每个图片,后者更加常用,适用于分布式存储和分类回归等多种任务)等。使用Python脚本更加灵活且保证整个项目的流程化。
  • 图片格式
    抽样显示图片及其标签或者标注,确认是否需要对图片进行进一步处理,如表情识别中每个图是给的检测到的人脸还是全身照,如输入图片大小不一致(卷积网络要求输入等尺寸,如均为224*224*3)。

Pipeline制定

深度系统通常认为是端到端的,给定输入给出输出,中间的细节被封装成管道中的一个个部件。在探索之后的步骤都会概念上理解为一个管道处理。视频的处理本质就是一帧一帧的图片处理。一般分为数据预处理和模型构建两步,前者一般可以通过opencv实现,后者可以通过tensorflow实现。

数据预处理

  • 图片尺寸调整
    通常数据集中每个图片的大小是不规整的,而卷积神经网络要求输入是规整的,这样后续的操作及输出层才能是预估的结果才能进行反向传播。一般分为等尺寸放缩和固定大小放缩。各个图片处理库(如opencv)都提供了图片尺寸调整的方法,如cv.resize(img, [target_width, target_height]等。
  • 图片抠取
    通常数据集中数据是人为采集的,当初采集的目标不一定是以task为驱动的,所以图中有很多的冗余信息。如人类识别的关键特征应为人的面部,全身信息并不重要,所以需要利用检测器找到人面部的区域抠取出来。

目标抠取通常用到很多检测算法,就比较简单的人脸抠取而言检测算法大致分为传统方法如Haar检测器和深度方法如MTNN,但是一般的比赛中为了前期处理数据的高效率,使用传统方法以及足够,即使准确率差那么一些。

  • 图片的旋转和翻转
    有时在很多的分类问题总,数据量即使很大但是对于参数巨大的神经网络还是远远不够的,数据增广是一个常用手段,其中旋转和翻转可以增加和原来同分布的新数据用于模型的训练。
  • 图片格式转换
    很多任务并不关心RGB三通道的色彩信息,而关心更核心的信息,转为灰度图是个不错的选择。有时数据集有JPG和PNG等图片,他们之间也需要统一转换,因为前者是RGB后者是RGBA。图片的格式转换在减少任务复杂度方面是一个很有效的手段。

模型构建

  • 数据集划分
    为了防止过拟合等在深度学习中常见的问题,划分出一个不参与训练的验证集用于测试模型的泛化能力是很常见的一个手段。
  • 数据加载
    由于计算机视觉的任务数据都是非常庞大的,单纯的内存或者显存是不可能放下所有的数据的,所以必须分批量从磁盘中读取数据输入给模型训练。这个分批加载的手段一般是通过一个生成器不断获取一个batch的数据送入网络进行训练。
  • 数据增广
    数据增广是深度学习训练的一个技巧,首先在2012年AlexNet中被提出,随后和Dropout等训练的trick一起,被后来的神经网络训练所广泛采用。数据增广只是一个概念,实现数据增广的方式有很多如图片翻转、图片旋转等,当然,数据增广不能违背增广的初衷,即增加有效的数据,例如手写集上下翻转,原来的标签就没有意义,这是无效的增广。

数据增广这一步可以放在数据加载这个步骤之后,即不同轮次读取到的同一个图片可以随机进行不同的增广送入模型训练。(一般增广产生的数据不需要落入本地。)

  • 神经网络设计
    • 网络结构
      一般是借鉴经典的网络设计思路(如VGG、ResNet、DenseNet等)进行设计,对先进的网络结构进行融合、重构等,但是应当明确,过于复杂的网络也许有着较好的表现但是难以实际部署,本质上还是无用的。
    • 损失函数
      • 对于比较简单的任务有比较使用的损失函数,如分类使用交叉熵、回归使用MSE等,但是对于一些比较复杂的任务,这些原有的损失函数未必很有效,这是需要设计新的损失函数(如OCR中使用CTC损失函数)。
    • 优化函数
    • 目前大多数优化函数都是基于SGD的优化(有Adagrad、Adam、RAdam等),但是,应当明确没有最好的优化方法只有最合适的,也许有的任务最简单的SGD表现是最优的。
  • 模型应用
    比赛中,主要指的是将训练好的在验证集上表现较好的模型对测试集进行预测然后提交。实际应用中,是指在成型系统上进行模型的部署,这方面TensorFlow提供了不错的接口,在关于TensorFlow的博客中我有提到。

补充说明

本文较为简略的说明了计算机视觉类比赛的主要流程及方法,由于篇幅限制没有过细展开,具体的相关问题可以查看我的其他博客。博客同步至我的个人博客网站,欢迎查看。如有错误,欢迎指正。

你可能感兴趣的:(数据科学竞赛)