2017-01-19 18:01:31 wangss9566 阅读数 29152
  • 基于深度学习的计算机视觉:原理与实践(上部)

    本课程适合具有一定深度学习基础,希望发展为深度学习之计算机视觉方向的算法工程师和研发人员的同学们。 基于深度学习的计算机视觉是目前人工智能最活跃的领域,应用非常广泛,如人脸识别和无人驾驶中的机器视觉等。该领域的发展日新月异,网络模型和算法层出不穷。如何快速入门并达到可以从事研发的高度对新手和中级水平的学生而言面临不少的挑战。精心准备的本课程希望帮助大家尽快掌握基于深度学习的计算机视觉的基本原理、核心算法和当前的领先技术,从而有望成为深度学习之计算机视觉方向的算法工程师和研发人员。 本课程系统全面地讲述基于深度学习的计算机视觉技术的原理并进行项目实践。课程涵盖计算机视觉的七大任务,包括图像分类、目标检测、图像分割(语义分割、实例分割、全景分割)、人脸识别、图像描述、图像检索、图像生成(利用生成对抗网络)。本课程注重原理和实践相结合,逐篇深入解读经典和前沿论文70余篇,图文并茂破译算法难点, 使用思维导图梳理技术要点。项目实践使用Keras框架(后端为Tensorflow),学员可快速上手。 通过本课程的学习,学员可把握基于深度学习的计算机视觉的技术发展脉络,掌握相关技术原理和算法,有助于开展该领域的研究与开发实战工作。另外,深度学习之计算机视觉方向的知识结构及学习建议请参见本人CSDN博客。 本课程提供课程资料的课件PPT(pdf格式)和项目实践代码,方便学员学习和复习。 本课程分为上下两部分,其中上部包含课程的前五章(课程介绍、深度学习基础、图像分类、目标检测、图像分割),下部包含课程的后四章(人脸识别、图像描述、图像检索、图像生成)。

    3525 人正在学习 去看看 白勇

计算机视觉入门系列(一) 综述

自大二下学期以来,学习计算机视觉及机器学习方面的各种课程和论文,也亲身参与了一些项目,回想起来求学过程中难免走了不少弯路和坎坷,至今方才敢说堪堪入门。因此准备写一个计算机视觉方面的入门文章,一来是时间长了以后为了巩固和温习一下所学,另一方面也希望能给新入门的同学们介绍一些经验,还有自然是希望各位牛人能够批评指正不吝赐教。由于临近大四毕业,更新的时间难以保证,这个系列除了在理论上面会有一些介绍以外,也会提供几个小项目进行实践,我会尽可能不断更新下去。

因诸多学术理论及概念的原始论文都发表在英文期刊上,因此在尽可能将专业术语翻译成中文的情况下,都会在括号内保留其原始的英文短语以供参考。


目录

  • 简介
  • 方向
  • 热点

简介

计算机视觉(Computer Vision)又称为机器视觉(Machine Vision),顾名思义是一门“教”会计算机如何去“看”世界的学科。在机器学习大热的前景之下,计算机视觉与自然语言处理(Natural Language Process, NLP)及语音识别(Speech Recognition)并列为机器学习方向的三大热点方向。而计算机视觉也由诸如梯度方向直方图(Histogram of Gradient, HOG)以及尺度不变特征变换(Scale-Invariant Feature Transform, SIFT)等传统的手办特征(Hand-Crafted Feature)与浅层模型的组合逐渐转向了以卷积神经网络(Convolutional Neural Network, CNN)为代表的深度学习模型。

方式 特征提取 决策模型
传统方式 SIFT,HOG, Raw Pixel … SVM, Random Forest, Linear Regression …
深度学习 CNN … CNN …

svm(Support Vector Machine) : 支持向量机
Random Forest : 随机森林
Linear Regression : 线性回归
Raw Pixel : 原始像素

传统的计算机视觉对待问题的解决方案基本上都是遵循: 图像预处理 → 提取特征 → 建立模型(分类器/回归器) → 输出 的流程。 而在深度学习中,大多问题都会采用端到端(End to End)的解决思路,即从输入到输出一气呵成。本次计算机视觉的入门系列,将会从浅层学习入手,由浅入深过渡到深度学习方面。

方向

计算机视觉本身又包括了诸多不同的研究方向,比较基础和热门的几个方向主要包括了:物体识别和检测(Object Detection),语义分割(Semantic Segmentation),运动和跟踪(Motion & Tracking),三维重建(3D Reconstruction),视觉问答(Visual Question & Answering),动作识别(Action Recognition)等。

物体识别和检测

物体检测一直是计算机视觉中非常基础且重要的一个研究方向,大多数新的算法或深度学习网络结构都首先在物体检测中得以应用如VGG-net, GoogLeNet, ResNet等等,每年在imagenet数据集上面都不断有新的算法涌现,一次次突破历史,创下新的记录,而这些新的算法或网络结构很快就会成为这一年的热点,并被改进应用到计算机视觉中的其它应用中去,可以说很多灌水的文章也应运而生。

物体识别和检测,顾名思义,即给定一张输入图片,算法能够自动找出图片中的常见物体,并将其所属类别及位置输出出来。当然也就衍生出了诸如人脸检测(Face Detection),车辆检测(Viechle Detection)等细分类的检测算法。
这里写图片描述

近年代表论文

  1. He, Kaiming, et al. “Deep residual learning for image recognition.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.
  2. Liu, Wei, et al. “SSD: Single shot multibox detector.” European Conference on Computer Vision. Springer International Publishing, 2016.
  3. Szegedy, Christian, et al. “Going deeper with convolutions.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.
  4. Ren, Shaoqing, et al. “Faster r-cnn: Towards real-time object detection with region proposal networks.” Advances in neural information processing systems. 2015.
  5. Simonyan, Karen, and Andrew Zisserman. “Very deep convolutional networks for large-scale image recognition.” arXiv preprint arXiv:1409.1556 (2014).
  6. Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. “Imagenet classification with deep convolutional neural networks.” Advances in neural information processing systems. 2012.

数据集

  1. IMAGENET
  2. PASCAL VOC
  3. MS COCO
  4. Caltech

语义分割

语义分割是近年来非常热门的方向,简单来说,它其实可以看做一种特殊的分类——将输入图像的每一个像素点进行归类,用一张图就可以很清晰地描述出来。
这里写图片描述
很清楚地就可以看出,物体检测和识别通常是将物体在原图像上框出,可以说是“宏观”上的物体,而语义分割是从每一个像素上进行分类,图像中的每一个像素都有属于自己的类别。

近年代表论文

  1. Long, Jonathan, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.
  2. Chen, Liang-Chieh, et al. “Semantic image segmentation with deep convolutional nets and fully connected crfs.” arXiv preprint arXiv:1412.7062 (2014).
  3. Noh, Hyeonwoo, Seunghoon Hong, and Bohyung Han. “Learning deconvolution network for semantic segmentation.” Proceedings of the IEEE International Conference on Computer Vision. 2015.
  4. Zheng, Shuai, et al. “Conditional random fields as recurrent neural networks.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

数据集

  1. PASCAL VOC
  2. MS COCO

运动和跟踪

跟踪也属于计算机视觉领域内的基础问题之一,在近年来也得到了非常充足的发展,方法也由过去的非深度算法跨越向了深度学习算法,精度也越来越高,不过实时的深度学习跟踪算法精度一直难以提升,而精度非常高的跟踪算法的速度又十分之慢,因此在实际应用中也很难派上用场。
那么什么是跟踪呢?就目前而言,学术界对待跟踪的评判标准主要是在一段给定的视频中,在第一帧给出被跟踪物体的位置及尺度大小,在后续的视频当中,跟踪算法需要从视频中去寻找到被跟踪物体的位置,并适应各类光照变换,运动模糊以及表观的变化等。但实际上跟踪是一个不适定问题(ill posed problem),比如跟踪一辆车,如果从车的尾部开始跟踪,若是车辆在行进过程中表观发生了非常大的变化,如旋转了180度变成了侧面,那么现有的跟踪算法很大的可能性是跟踪不到的,因为它们的模型大多基于第一帧的学习,虽然在随后的跟踪过程中也会更新,但受限于训练样本过少,所以难以得到一个良好的跟踪模型,在被跟踪物体的表观发生巨大变化时,就难以适应了。所以,就目前而言,跟踪算不上是计算机视觉内特别热门的一个研究方向,很多算法都改进自检测或识别算法。
这里写图片描述

近年代表论文

  1. Nam, Hyeonseob, and Bohyung Han. “Learning multi-domain convolutional neural networks for visual tracking.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.
  2. Held, David, Sebastian Thrun, and Silvio Savarese. “Learning to track at 100 fps with deep regression networks.” European Conference on Computer Vision. Springer International Publishing, 2016.
  3. Henriques, João F., et al. “High-speed tracking with kernelized correlation filters.” IEEE Transactions on Pattern Analysis and Machine Intelligence 37.3 (2015): 583-596.
  4. Ma, Chao, et al. “Hierarchical convolutional features for visual tracking.” Proceedings of the IEEE International Conference on Computer Vision. 2015.
  5. Bertinetto, Luca, et al. “Fully-convolutional siamese networks for object tracking.” European Conference on Computer Vision. Springer International Publishing, 2016.
  6. Danelljan, Martin, et al. “Beyond correlation filters: Learning continuous convolution operators for visual tracking.” European Conference on Computer Vision. Springer International Publishing, 2016.
  7. Li, Hanxi, Yi Li, and Fatih Porikli. “Deeptrack: Learning discriminative feature representations online for robust visual tracking.” IEEE Transactions on Image Processing 25.4 (2016): 1834-1848.

数据集

  1. OTB(Object Tracking Benchmark)
  2. VOT(Visual Object Tracking)

视觉问答

视觉问答也简称VQA(Visual Question Answering),是近年来非常热门的一个方向,其研究目的旨在根据输入图像,由用户进行提问,而算法自动根据提问内容进行回答。除了问答以外,还有一种算法被称为标题生成算法(Caption Generation),即计算机根据图像自动生成一段描述该图像的文本,而不进行问答。对于这类跨越两种数据形态(如文本和图像)的算法,有时候也可以称之为多模态,或跨模态问题。
这里写图片描述

近年代表论文

  1. Xiong, Caiming, Stephen Merity, and Richard Socher. “Dynamic memory networks for visual and textual question answering.” arXiv 1603 (2016).
  2. Wu, Qi, et al. “Ask me anything: Free-form visual question answering based on knowledge from external sources.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.
  3. Zhu, Yuke, et al. “Visual7w: Grounded question answering in images.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.

数据集

  1. VQA

热点

随着深度学习的大举侵入,现在几乎所有人工智能方向的研究论文几乎都被深度学习占领了,传统方法已经很难见到了。有时候在深度网络上改进一个非常小的地方,就可以发一篇还不错的论文。并且,随着深度学习的发展,很多领域的现有数据集内的记录都在不断刷新,已经向人类记录步步紧逼,有的方面甚至已经超越了人类的识别能力。那么,下一步的研究热点到底会在什么方向呢?就我个人的一些观点如下:

  1. 多模态研究: 目前的许多领域还是仅仅停留在单一的模态上,如单一分物体检测,物体识别等,而众所周知的是现实世界就是有多模态数据构成的,语音,图像,文字等等。 VQA 在近年来兴起的趋势可见,未来几年内,多模态的研究方向还是比较有前景的,如语音和图像结合,图像和文字结合,文字和语音结合等等。
  2. 数据生成: 现在机器学习领域的许多数据还是由现实世界拍摄的视频及图片经过人工标注后用作于训练或测试数据的,标注人员的职业素养和经验,以及多人标注下的规则统一难度在一定程度上也直接影响了模型的最终结果。而利用深度模型自动生成数据已经成为了一个新的研究热点方向,如何使用算法来自动生成数据相信在未来一段时间内都是不错的研究热点。
  3. 无监督学习:人脑的在学习过程中有许多时间都是无监督(Un-supervised Learning)的,而现有的算法无论是检测也好识别也好,在训练上都是依赖于人工标注的有监督(Supervised Learning)。如何将机器学习从有监督学习转变向无监督学习,应该是一个比较有挑战性的研究方向,当然这里的无监督学习当然不是指简单的如聚类算法(Clustering)这样的无监督算法。而LeCun也曾说: 如果将人工智能比喻作一块蛋糕的话,有监督学习只能算是蛋糕上的糖霜,而增强学习(Reinforce Learning)则是蛋糕上的樱桃,无监督学习才是真正蛋糕的本体。

    最后,想要把握领域内最新的研究成果和动态,还需要多看论文,多写代码。
    计算机视觉领域内的三大顶级会议有:

    Conference on Computer Vision and Pattern Recognition (CVPR)
    International Conference on Computer Vision (ICCV)
    European Conference on Computer Vision (ECCV)

    较好的会议有以下几个:

    The British Machine Vision Conference (BMVC)
    International Conference on Image Processing (ICIP)
    Winter Conference on Applications of Computer Vision (WACV)
    Asian Conference on Computer Vision (ACCV)

当然,毕竟文章的发表需要历经审稿和出版的阶段,因此当会议论文集出版的时候很可能已经过了小半年了,如果想要了解最新的研究,建议每天都上ArXiv的cv板块看看,ArXiv上都是预出版的文章,并不一定最终会被各类会议和期刊接收,所以质量也就良莠不齐,对于没有分辨能力的入门新手而言,还是建议从顶会和顶级期刊上的经典论文入手。


这是一篇对计算机视觉目前研究领域的几个热门方向的一个非常非常简单的介绍,希望能对想要入坑计算机视觉方向的同学有一定的帮助。由于个人水平十分有限,错误在所难免,欢迎大家对文中的错误进行批评和指正。

2018-08-13 22:42:40 hhy_csdn 阅读数 1948
  • 基于深度学习的计算机视觉:原理与实践(上部)

    本课程适合具有一定深度学习基础,希望发展为深度学习之计算机视觉方向的算法工程师和研发人员的同学们。 基于深度学习的计算机视觉是目前人工智能最活跃的领域,应用非常广泛,如人脸识别和无人驾驶中的机器视觉等。该领域的发展日新月异,网络模型和算法层出不穷。如何快速入门并达到可以从事研发的高度对新手和中级水平的学生而言面临不少的挑战。精心准备的本课程希望帮助大家尽快掌握基于深度学习的计算机视觉的基本原理、核心算法和当前的领先技术,从而有望成为深度学习之计算机视觉方向的算法工程师和研发人员。 本课程系统全面地讲述基于深度学习的计算机视觉技术的原理并进行项目实践。课程涵盖计算机视觉的七大任务,包括图像分类、目标检测、图像分割(语义分割、实例分割、全景分割)、人脸识别、图像描述、图像检索、图像生成(利用生成对抗网络)。本课程注重原理和实践相结合,逐篇深入解读经典和前沿论文70余篇,图文并茂破译算法难点, 使用思维导图梳理技术要点。项目实践使用Keras框架(后端为Tensorflow),学员可快速上手。 通过本课程的学习,学员可把握基于深度学习的计算机视觉的技术发展脉络,掌握相关技术原理和算法,有助于开展该领域的研究与开发实战工作。另外,深度学习之计算机视觉方向的知识结构及学习建议请参见本人CSDN博客。 本课程提供课程资料的课件PPT(pdf格式)和项目实践代码,方便学员学习和复习。 本课程分为上下两部分,其中上部包含课程的前五章(课程介绍、深度学习基础、图像分类、目标检测、图像分割),下部包含课程的后四章(人脸识别、图像描述、图像检索、图像生成)。

    3525 人正在学习 去看看 白勇

机器学习与计算机视觉入门项目——视频投篮检测(一)

随着机器学习、深度学习技术的迅猛发展,计算机视觉无疑是近年来发展最快的AI领域之一。正因如此,互联网上有关计算机视觉和机器学习、深度学习的社区、博文、论文、代码、算法框架等极大地丰富起来,给初入该领域的新人丰富的参考资料。同时计算机视觉比较易于理解,适合新手入门,培养最基本的工程素养和代码项目经验,从而了解处理具体计算机科学相关领域的基本流程。
——浙江大学教授 王跃明

该博客是由我2018年8月1日至22日在浙江大学玉泉校区参加计算机学院保研夏令营时所做的项目整理而来。在此,向培训期间授课和指导的王跃明老师、潘纲老师、祁玉老师表示感谢!向与我同组的西北工业大学祝同学表示感谢,她负责了项目的绝大部分实验和PPT,她的认真态度和拼搏精神永远值得我学习,祝她前程似锦!感谢一直陪伴我们的姜学长,整个过程中,姜学长给了我很多启发和指导,祝他在浙大求得真理!

正式开始

Getting Started:Practice Machine Learning Algorithms in Computer Vision

计算机视觉和机器学习的关系

Machine learning focuses more than a model itself, has more
mathematics, emphasizes the understanding of models and algorithms. Computer vision can be seen as an application field, and seems more like problem(s). Obviously, the models in ML can be applied to solve CV problems. Indeed, people are doing this.

显然,机器学习是解决计算机视觉问题的一个有力工具,但是也并不能解决CV的任何问题。同时计算机视觉也有着自己的特点:

  • Data are usually large
  • Processing skills of image and video data are varied
  • Many problems have priors
  • Requiring good programming skills

总结一句话,将机器学习算法应用到CV问题上时,应充分考虑到问题的特性,充分应用问题的先验知识改造我们的机器学习“工具”。

项目简介——篮球进球检测

给定一个篮球赛视频,如何确定何时进球得分?更进一步说,如何判断进球时刻的frames?
这里写图片描述
让我们来考虑几个现实的问题,看看是否能得出思路。

首先,视频是由若干帧图片组成的,分析进球与否可以通过判断球框区域有无篮球来完成。即,构造一个图像分类器,送入一张图片,判断其中有无篮球。这是一个标准的机器学习的二分类问题。

这样问题就从一个视频分析任务转化成了图像分析任务,只不过需要考虑一下单帧图像的处理速度,能否胜任视频的播放速度。不过在我们的项目中运算量还不是很大,基本不用考虑。

其次,若以25帧/秒的速率录制视频,一次进球的过程可能长达十几帧。这么多帧的图片都是一次进球,我们的图像分类器将每张图片都判定成进球怎么办?

这里写图片描述

然后,我们应该如何选取篮筐区域的大小?篮框的区域总不能太大,否则将包含太多无用信息,干扰模型的训练;也不能太小,因为进球情况多样,有相当数量的情况是倾斜进框的,篮框区域太小会使篮球捕捉不完整。总之这是一个需要反复琢磨和思考的问题,直接影响了后面的特征提取和分类器训练。

最后,我们通过截帧和标注,获得了一个进球数据集,然后选择了一个合适的分类器模型进行训练好了,那我们如何评价训练的模型好坏呢?一个模型有很多参数,我们如何衡量参数改变带来的模型分类性能的变化?如何划定训练集和测试集的比例,这对模型有何影响?

该博客将在随后的逐渐回答这些问题或者给出作者的思考,也希望各位前辈同行不吝赐教!

最后是训练与检测的框图

这里写图片描述

工欲善其事,必先利其器——环境配置

关于Python的安装和配置请看我的博客
Windows10 GPU版Tensorflow配置教程+Anaconda3+Jupyter Notebook
项目常用到的package有如下:

numpy # 矩阵运算
scipy # 科学计算
matplotlib # 画图
random # 随机数相关
sklearn # 机器学习
cv2 # OpenCV计算机视觉
pickle # 保存变量
os # 文件操作
theano # 机器学习和深度学习框架
tensorflow # 同上
keras # 同上

这些package利用Anaconda都可以很方便的安装,conda install yourpackage,或者是Python自带的。
代码的最开头,我都会引入这些

# -- coding: utf-8 --
import cv2
import math
import matplotlib.pyplot as plt
import numpy as np
import scipy
import copy
import os
import pickle
import random
from scipy import interp

from sklearn import svm,datasets
from sklearn.metrics import roc_curve, auc
from sklearn.cross_validation import StratifiedKFold

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data

import theano
%matplotlib inline

IDE我用的是Jupyter Notebook,解释性比较好,Anaconda自带。当然,Pycharm也不错。

数据集制作

曾听过这样两句话,“人工智能,有多少人工,就有多少智能”,“数据集的好坏决定了这个任务的performance上限,而后的模型选择、参数调整不过是在不断接近这个上限”。

因此数据集的制作是很重要的,直接影响了我们的分类器性能的好坏。同时,这也体现了较多的主观性,毕竟判断是否是进球是一个很模糊的概念,比如
这里写图片描述

那么我们现在开始处理视频。视频的链接在这里https://pan.baidu.com/s/1Vq9cr5HUSaRyPk1tinztFA
处理视频并得到篮筐位置截图的流程如下:

  1. 读入视频
  2. 拾取鼠标位置坐标,获得篮框位置
  3. 依次读取每帧图片,截取第二步获得的区域
  4. 保存至指定目录

我首先用面向过程的方法编写代码,调试BUG,直至无误后将其封装成Annotation类。

下面是面向过程的代码.

代码的第三部分,受姜学长启发,是我关于自动标注图片的一个尝试。运行代码可以实现给图片自动打标签(0 不进球 1 进球)的功能。

其基本思想是这样的:灰度显示的篮筐区域里,255代表白色,0代表黑色,进球的图像中,由于球体的颜色偏深灰,因而篮球会使整个区域的像素和降低,即,区域灰度值之和关于时间的图像上会出现一个负尖峰。如下:
这里写图片描述
当选取合适的阈值,就可以截获所有进球的帧。
但是问题没有那么简单。很多具有迷惑性的情况也会出现明显的负尖峰,比如由于摄像机角度的问题,篮球出现在了球网的前面,读者可以自行想象。或者球网摆动造成的毛刺现象。因此我又对上图做了均值平滑滤波(或者高斯平滑滤波),削弱“毛刺”现象,并将平滑前后图像相减,得到下图
这里写图片描述
选取合适阈值,截取负尖峰对应的帧就完成了进球帧的标注。但是理想总是美好的,实现起来效果感人。一是不明显的进球没有检测出来,二是错误的标注了一些很有迷惑性的负样本。当然这只是手工标注前的一个辅助工作,没有期望具有很高的精度。
还有一个做法是手工标注小规模数据,训练一个分类器,用这个分类器帮助我们标注剩下的图片,这当然比上面只用灰度值好得多

def annotation(filename,dir_to_save,smoothing_method,waitMs = 40):

    # 该函数用于
    # 1)标定视频中的篮球框,获得篮球框的左上角和右下角坐标
    # 2)截取视频(每一帧)的篮球框图片,尺寸约38*37,三十分钟视频约45000帧
    # 3)根据进球与否,标定篮框图片为正负样本,正样本有球,负样本无球,并将其命名

    #---------------task1: get the position of hoop---------------
    print('----------task1: get the position of hoop----------\n')
    # 视频名称
    filename_video = filename
    # 每帧间隔(毫秒)
    waitMs = waitMs
    # 播放视频,鼠标拾取篮框坐标
    def getHoopPosition(filename,waitMs):
        """
        function: get the position of hoop
        filename: the name of video, datatype string
        waitMs  : the interval of 2 frame, generally 40 ms, controls the speed of video

        """ 
        # 存储篮框位置的全局变量
        global hoopPos
        hoopPos = np.zeros((2,2),np.int)
        # 鼠标响应函数
        def hoopPosition(event,x,y,flags,param):
            # 鼠标左键点击,记录左上角点
            if event == cv2.EVENT_LBUTTONDOWN:
                hoopPos[0,:] = x,y
            # 鼠标右键点击,记录右上角点
            if event == cv2.EVENT_RBUTTONDOWN:
                hoopPos[1,:] = x,y
        # 打开可调大小的窗口
        cv2.namedWindow('image',cv2.WINDOW_NORMAL)
        # 设置鼠标响应,名字应一致
        cv2.setMouseCallback('image',hoopPosition)
        # 读取视频
        cap = cv2.VideoCapture(filename)
        # 显示视频帧率
        fps = cap.get(cv2.CAP_PROP_FPS)
        print("FPS of the video: ", fps)
        # 显示视频总帧数
        counts = cap.get(cv2.CAP_PROP_FRAME_COUNT)
        print("Total number of frames: ", counts)
        # 读取视频尺寸
        size=[(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))),
               int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))]
        print("The size of the video: ", size)
        # 播放视频,isOpened()检测视频是否正确读入
        if cap.isOpened() == True:
            print("The video is loaded correctly!")
        else:
            print("The video is not loaded correctly! Please check the path!")
        while(cap.isOpened()):
            ret, frame=cap.read()
            if ret==True:
                cv2.imshow("image",frame)
                # 1000ms播放25帧,每帧停顿40ms
                k=cv2.waitKey(waitMs)
                # 64位系统都要 &0xff
                if (k&0xff==ord('q')):
                    break
        # 释放cap对象
        cap.release()
        # 关闭视频窗口
        cv2.destroyAllWindows()
        # 打印篮框位置
        print('The position of hoop is:')
        print(hoopPos)
        return(hoopPos,fps,counts,size)
        # 篮球框
        # (591,78)
        # (628,116)

    hoopPos1 = np.zeros((2,2),np.int)
    # 注意,fps和counts是浮点
    hoopPos1,fps_video,counts_video,size_video = getHoopPosition(filename,waitMs)
    counts_video = int(int(counts_video)/100)
    # 显示矩形框
    cap=cv2.VideoCapture(filename_video)
    if(cap.isOpened()):
        ret, frame=cap.read()
        if ret==True:
            # 画矩形
            cv2.rectangle(frame,(hoopPos1[0,0],hoopPos1[0,1]),(hoopPos1[1,0],hoopPos1[1,1]),(0,255,0),1)
            cv2.imshow("video",frame)
            k=cv2.waitKey(0)
            cap.release()
            cv2.destroyAllWindows()

    #---------------task2: crop the image of hoop---------------
    print('\n----------task2: crop the image of hoop----------\n')
    # 先存所有图片,再打标签

    cap = cv2.VideoCapture(filename_video)
    # 图片计数
    count = 0
    while(cap.isOpened()):
        ret, frame = cap.read()
        if ret == True:
            # 转灰度图
            frame_GRAY = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
            # 扣取篮筐
            frame_GRAY = frame_GRAY[hoopPos1[0,1]:hoopPos1[1,1],hoopPos1[0,0]:hoopPos1[1,0]]
            # 生成文件名
            filename_pic = dir_to_save +str(count)+".png"
            # 写文件
            cv2.imwrite(filename_pic,frame_GRAY)
            # 计数+1
            count += 1
            if count%50 == 0:
                print("saving ",count," pictures")
            if count == counts_video:
                print("all the pictures have been saved correctly!")
                break
    cap.release()
    cv2.destroyAllWindows()

    #---------------task3: label the pic---------------
    print('\n----------task3: label the pic----------\n')

    # 首先对每一帧计算篮筐区域所有像素值的和,然后根据该值判断有无篮球进筐
    print("calculate the sum of pixel value of hoop region.")
    cap=cv2.VideoCapture(filename_video)
    count = 0
    # 篮框区域内所有像素值的和
    PixelValue = []
    while(cap.isOpened()):
        ret, frame=cap.read()
        if ret==True:
            frame_GRAY = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
            # 扣取篮筐
            frame_GRAY = frame_GRAY[hoopPos[0,1]:hoopPos[1,1],hoopPos[0,0]:hoopPos[1,0]]
            PixelValue.append(frame_GRAY.sum())
            count += 1
            if count%50 == 0:
                print("now we calculate ",count,"pictures")
            if count == counts_video:
                print("done!")
                break
    cap.release()
    cv2.destroyAllWindows()
    # 画像素之和的曲线图
    fig1=plt.figure('fig1')
    plt.plot(range(0,count),PixelValue,'b-',label='PixelValue')
    plt.title('Pixel Value of Each Frame')
    plt.xlabel('Frame')
    plt.ylabel('Pixel Value')
    plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
    # plt.legend(loc='lower right')

    # python内核经常崩坏,要把PixelValue保存起来
    print("saving the PixelValue in a txt")
    fileObject = open('PixelValue.txt', 'w')  
    for item in PixelValue:  
        fileObject.write(str(item))
        fileObject.write('\n')  
    fileObject.close() 

    if smoothing_method == 'linear':
        # 均值滤波操作
        print("smooth the PixelValue using linear filter")
        tmp1 = []
        for i in range(0,counts_video-2):
            tmp1.append((PixelValue[i]+PixelValue[i+1]+PixelValue[i+2])/3)
        tmp1.append(PixelValue[counts_video-2])
        tmp1.append(PixelValue[counts_video-1])
        fig2=plt.figure('fig2')
        plt.plot(range(0,counts_video),tmp1,'b-',label='PixelValue after smoothing')
        plt.title('PixelValue after average filtering')
        plt.xlabel('Frame')
        plt.ylabel('Pixel Value')
        plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
        temp1 = []
        for i in range(0,counts_video):
            temp1.append(PixelValue[i]-tmp1[i])
        fig3=plt.figure('fig3')
        plt.plot(range(0,counts_video),temp1,'b-',label='difference of PixelValue')
        plt.title('difference between PixelValue and smooth result')
        plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
        plt.xlabel('Frame')
        plt.ylabel('D-Value')

    if smoothing_method == 'gaussian':
        # 高斯平滑操作
        print("smooth the PixelValue using Gaussian filter")
        tmp2 = []
        for i in range(0,counts_video-4):
            tmp2.append((PixelValue[i]+3*PixelValue[i+1]+5*PixelValue[i+2]+3*PixelValue[i+3]+PixelValue[i+4])/13)
        tmp2.append(PixelValue[counts_video-4])
        tmp2.append(PixelValue[counts_video-3])
        tmp2.append(PixelValue[counts_video-2])
        tmp2.append(PixelValue[counts_video-1])
        fig2=plt.figure('fig2')
        plt.plot(range(0,int(counts_video)),tmp2,'b-',label='PixelValue after smoothing')
        plt.title('PixelValue after Gaussian filtering')
        plt.xlabel('Frame')
        plt.ylabel('Pixel Value')
        plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
        temp2 = []
        for i in range(0,counts_video):
            temp2.append(PixelValue[i]-tmp2[i])
        fig3=plt.figure('fig3')
        plt.plot(range(0,counts_video),temp2,'b-',label='difference of PixelValue')
        plt.title('difference between PixelValue and smooth result')
        plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
        plt.xlabel('Frame')
        plt.ylabel('D-value')


    # 找出所有的正样本,可能有假阳性样本
    # 用户输入阈值
    def rename():
        threshold = input("input the threshold")
        threshold = int(threshold)

        positive_list = []
        for i in range(0,counts_video):
            if smoothing_method == 'linear':
                if temp1[i] <=threshold:
                    positive_list.append(i)
            if smoothing_method == 'gaussian':
                if temp2[i] <=threshold:
                    positive_list.append(i)
    # 打标签

        filelist = os.listdir(dir_to_save)

        for item in filelist:
            src = os.path.join(os.path.abspath(dir_to_save), item)
            if (int(item.split('.')[0])) in positive_list:
                dst = os.path.join(os.path.abspath(dir_to_save), "pos_" + item)
                os.rename(src, dst)
            else:
                dst = os.path.join(os.path.abspath(dir_to_save), "neg_" + item)
                os.rename(src, dst)
        print("labeling work done!")
    rename()

这是封装成类的代码

class Annotation:
    '''
    该对象用于:
    1)标定视频中的篮球框,获得篮球框的左上角和右下角坐标
    2)截取视频(每一帧)的篮球框图片,尺寸约38*37,三十分钟视频约45000帧
    3)根据进球与否,标定篮框图片为正负样本,正样本有球,负样本无球,并将其命名
    参数:
    1)filename,视频路径+名称
    2)dir_to_save,截图存放路径
    3)smoothing_method,数据平滑方法,'linear'或'gaussian'
    4)waitMs,视频播放每帧间隔,以毫秒计
    '''
    def __init__(self,filename,dir_to_save,smoothing_method = 'linear',waitMs = 40):
        self.filename = filename
        self.dir_to_save = dir_to_save
        self.smoothing_method = smoothing_method
        self.waitMs = waitMs
    def getHoopPosition(self):
        """
        播放视频,鼠标拾取篮框坐标
        function: get the position of hoop
        filename: the name of video, datatype string
        waitMs  : the interval of 2 frame, generally 40 ms, controls the speed of video

        """ 
        print('----------task: get the position of hoop----------\n')
        # 存储篮框位置的全局变量
        global hoopPos
        hoopPos = np.zeros((2,2),np.int)
        # 鼠标响应函数
        def hoopPosition(event,x,y,flags,param):
            if event == cv2.EVENT_LBUTTONDOWN:# 鼠标左键点击,记录左上角点
                hoopPos[0,:] = x,y
            if event == cv2.EVENT_RBUTTONDOWN:# 鼠标右键点击,记录右上角点
                hoopPos[1,:] = x,y
        cv2.namedWindow('image',cv2.WINDOW_NORMAL)# 打开可调大小的窗口
        cv2.setMouseCallback('image',hoopPosition)# 设置鼠标响应,名字应一致
        cap = cv2.VideoCapture(self.filename)# 读取视频
        fps = cap.get(cv2.CAP_PROP_FPS)# 显示视频帧率
        print("FPS of the video: ", fps)
        counts = cap.get(cv2.CAP_PROP_FRAME_COUNT)# 显示视频总帧数
        print("Total number of frames: ", counts)
        size=[(int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))),# 读取视频尺寸
               int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))]
        print("The size of the video: ", size)
        if cap.isOpened() == True:# 播放视频,isOpened()检测视频是否正确读入
            print("The video is loaded correctly!")
        else:
            print("The video is not loaded correctly! Please check the path!")
        while(cap.isOpened()):
            ret, frame=cap.read()
            if ret==True:
                cv2.imshow("image",frame)
                k=cv2.waitKey(self.waitMs)
                if (k&0xff==ord('q')):# 64位系统都要 &0xff
                    break
        cap.release()# 释放cap对象
        cv2.destroyAllWindows()# 关闭视频窗口
        print('The position of hoop is:')
        print(hoopPos)
        return(hoopPos,fps,counts,size)

    def drawRectangle(self,hoopPos1):# 画篮框
        cap=cv2.VideoCapture(self.filename)
        if(cap.isOpened()):
            ret, frame=cap.read()
            if ret==True:
                cv2.rectangle(frame,(hoopPos1[0,0],hoopPos1[0,1]),(hoopPos1[1,0],hoopPos1[1,1]),(0,255,0),1)
                cv2.imshow("video",frame)
                k=cv2.waitKey(0)
                cap.release()
                cv2.destroyAllWindows()

    def saveHoopImage(self,hoopPos1):    
        cap = cv2.VideoCapture(self.filename)
        count = 0
        while(cap.isOpened()):
            ret, frame = cap.read()
            if ret == True:
                frame_GRAY = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
                frame_GRAY = frame_GRAY[hoopPos1[0,1]:hoopPos1[1,1],hoopPos1[0,0]:hoopPos1[1,0]]# 扣取篮筐
                filename_pic = dir_to_save +str(count)+".png"
                cv2.imwrite(filename_pic,frame_GRAY)
                count += 1
                if count%50 == 0:
                    print("saving ",count," pictures")
                if count == counts_video:
                    print("all the pictures have been saved correctly!")
                    break
        cap.release()
        cv2.destroyAllWindows()

    def evaluationPixelValue(self,hoopPos):
        # 首先对每一帧计算篮筐区域所有像素值的和,然后根据该值判断有无篮球进筐
        print("calculate the sum of pixel value of hoop region.")
        cap=cv2.VideoCapture(self.filename)
        count = 0
        PixelValue = []# 篮框区域内所有像素值的和,存储45000个值的列表
        while(cap.isOpened()):
            ret, frame=cap.read()
            if ret==True:
                frame_GRAY = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
                frame_GRAY = frame_GRAY[hoopPos[0,1]:hoopPos[1,1],hoopPos[0,0]:hoopPos[1,0]]
                PixelValue.append(frame_GRAY.sum())
                count += 1
                if count%5000 == 0:
                    print("now we calculate ",count,"pictures")
                if count == counts_video:
                    print("done!")
                    break
        cap.release()
        cv2.destroyAllWindows()
        fig1=plt.figure('fig1')# 画像素之和的曲线图
        plt.plot(range(0,count),PixelValue,'b-',label='PixelValue')
        plt.title('Pixel Value of Each Frame')
        plt.xlabel('Frame')
        plt.ylabel('Pixel Value')
        plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
        return PixelValue

    def save_PixelValue(self,PixelValue):# Jupyter内核经常崩坏,要把PixelValue保存起来
        print("saving the PixelValue in a pkl file")
        PixelValue_output = open('PixelValue.pkl', 'wb')
        pickle.dump(PixelValue, PixelValue_output)
        PixelValue_output.close()
        print("done!")

    def smooth_PixelValue_draw(self,PixelValue,counts_video):# 平滑像素曲线图,并用原图与之相减,凸显进球时的像素脉冲
        if self.smoothing_method == 'linear':# 均值滤波操作
            print("smooth the PixelValue using linear filter")
            tmp1 = []
            for i in range(0,counts_video-2):
                tmp1.append((PixelValue[i]+PixelValue[i+1]+PixelValue[i+2])/3)
            tmp1.append(PixelValue[counts_video-2])
            tmp1.append(PixelValue[counts_video-1])
            fig1=plt.figure('fig1')
            plt.plot(range(0,counts_video),tmp1,'b-',label='PixelValue after smoothing')
            plt.title('PixelValue after average filtering')
            plt.xlabel('Frame')
            plt.ylabel('Pixel Value')
            plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
            temp1 = []
            for i in range(0,counts_video):
                temp1.append(PixelValue[i]-tmp1[i])
            fig2=plt.figure('fig2')
            plt.plot(range(0,counts_video),temp1,'b-',label='difference of PixelValue')
            plt.title('difference between PixelValue and smooth result')
            plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
            plt.xlabel('Frame')
            plt.ylabel('D-Value')

        if smoothing_method == 'gaussian':# 高斯平滑操作
            print("smooth the PixelValue using Gaussian filter")
            tmp2 = []
            for i in range(0,counts_video-4):
                tmp2.append((PixelValue[i]+3*PixelValue[i+1]+5*PixelValue[i+2]+3*PixelValue[i+3]+PixelValue[i+4])/13)
            tmp2.append(PixelValue[counts_video-4])
            tmp2.append(PixelValue[counts_video-3])
            tmp2.append(PixelValue[counts_video-2])
            tmp2.append(PixelValue[counts_video-1])
            fig1=plt.figure('fig1')
            plt.plot(range(0,int(counts_video)),tmp2,'b-',label='PixelValue after smoothing')
            plt.title('PixelValue after Gaussian filtering')
            plt.xlabel('Frame')
            plt.ylabel('Pixel Value')
            plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
            temp2 = []
            for i in range(0,counts_video):
                temp2.append(PixelValue[i]-tmp2[i])
            fig2=plt.figure('fig2')
            plt.plot(range(0,counts_video),temp2,'b-',label='difference of PixelValue')
            plt.title('difference between PixelValue and smooth result')
            plt.grid(color='b' , linewidth='0.3' ,linestyle='--')
            plt.xlabel('Frame')
            plt.ylabel('D-value')


    # 找出所有的正样本,可能有假阳性样本
    # 用户输入阈值
    def rename(self):
        threshold = input("input the threshold")
        threshold = int(threshold)
        positive_list = []
        for i in range(0,counts_video):
            if self.smoothing_method == 'linear':
                if temp1[i] <=threshold:
                    positive_list.append(i)
            if self.smoothing_method == 'gaussian':
                if temp2[i] <=threshold:
                    positive_list.append(i)
        filelist = os.listdir(self.dir_to_save)
        for item in filelist:
            src = os.path.join(os.path.abspath(self.dir_to_save), item)
            if (int(item.split('.')[0])) in positive_list:
                dst = os.path.join(os.path.abspath(self.dir_to_save), "pos_" + item)
                os.rename(src, dst)
            else:
                dst = os.path.join(os.path.abspath(self.dir_to_save), "neg_" + item)
                os.rename(src, dst)
        print("labeling work done!")

标注好的数据集(1张图片是一个样本)大概这个样子:
这里写图片描述

下面我们将对数据集提取特征了,特征的选取也是图像分类的关键一环,敬请期待!

2020-01-05 22:05:44 u014055323 阅读数 60
  • 基于深度学习的计算机视觉:原理与实践(上部)

    本课程适合具有一定深度学习基础,希望发展为深度学习之计算机视觉方向的算法工程师和研发人员的同学们。 基于深度学习的计算机视觉是目前人工智能最活跃的领域,应用非常广泛,如人脸识别和无人驾驶中的机器视觉等。该领域的发展日新月异,网络模型和算法层出不穷。如何快速入门并达到可以从事研发的高度对新手和中级水平的学生而言面临不少的挑战。精心准备的本课程希望帮助大家尽快掌握基于深度学习的计算机视觉的基本原理、核心算法和当前的领先技术,从而有望成为深度学习之计算机视觉方向的算法工程师和研发人员。 本课程系统全面地讲述基于深度学习的计算机视觉技术的原理并进行项目实践。课程涵盖计算机视觉的七大任务,包括图像分类、目标检测、图像分割(语义分割、实例分割、全景分割)、人脸识别、图像描述、图像检索、图像生成(利用生成对抗网络)。本课程注重原理和实践相结合,逐篇深入解读经典和前沿论文70余篇,图文并茂破译算法难点, 使用思维导图梳理技术要点。项目实践使用Keras框架(后端为Tensorflow),学员可快速上手。 通过本课程的学习,学员可把握基于深度学习的计算机视觉的技术发展脉络,掌握相关技术原理和算法,有助于开展该领域的研究与开发实战工作。另外,深度学习之计算机视觉方向的知识结构及学习建议请参见本人CSDN博客。 本课程提供课程资料的课件PPT(pdf格式)和项目实践代码,方便学员学习和复习。 本课程分为上下两部分,其中上部包含课程的前五章(课程介绍、深度学习基础、图像分类、目标检测、图像分割),下部包含课程的后四章(人脸识别、图像描述、图像检索、图像生成)。

    3525 人正在学习 去看看 白勇

目录

1.教材

2.博客

3.代码

4.论文

5.交流

小结:教材 博客(csdn)+ 代码(github)+ 论文(百度学术,google,知网等等)+ 交流(网站)


 

1.教材

(1)《Computer Vision: A.Modern.Approach》Written by Simon J.D. Prince

中文:《计算机视觉:一种现代方法》

这是国外很多高校计算机视觉课程的教材。

链接:https://pan.baidu.com/s/1P-kfi7JcsFWoE_MZhy9JRw 
提取码:xu9p

Book link:Computer Vision Models

(2)《Computer Vision: Algorithms and Applications》Written by Richard Szeliski

中文:《计算机视觉:算法和应用》

这算是一本综述性质的书,它把很多论文中的经典方法都整理到书中(截止到成书前),因此也有一定难度,遇到不明白的细节可以下载对应的论文。

(3)《Multiple View Geometry in Computer Vision Second Edition》Written by Richard Hartley

中文:《计算机视觉中的多视角几何》

链接:https://pan.baidu.com/s/1spYVPa1JsjNcxJqY0vVdXQ
提取码:0x6c 

(4)《Computer Vision: Models, Learning, and Inference》written by Simon J.D. Prince

中文:《计算机视觉:模型、学习和推理》

链接:https://pan.baidu.com/s/16wpED3y9sIetGOgBdkZTHA
提取码:tsdw 

作者主页:http://www.computervisionmodels.com/。为老师和同学们准备了丰富的资料(如:slide,code)。

个人比较喜欢这本。虽然这本书重学习(Learning),轻特征,但它把计算机视觉这一具体应用赋予到抽象的概率、统计中,使得各种分布有了实际的意义,有利于提高对概率、统计知识点的理解水平。

(5)《Concise Computer Vision: An Introduction into Theory and Algorithms》written by Reinhard Klette,

(6)《Learning OpenCV》

做视觉必备书籍吧,作为工具书。

(7)《Digital Image Processing》冈萨雷斯

这本书侧重图像的基本运算,如果是做视觉,且时间不是很充裕,最好不要从头到尾地读。

 

2.博客

 

3.代码

(1) 图像处理初学者设计的 100 个问题(Github)
 

4.论文

 

5.交流

优秀网站:

(1)来Keith Price老爷子1994年开始的视觉任务整理

 


未完待续......

 

 

2017-12-16 18:29:50 KHFlash 阅读数 920
  • 基于深度学习的计算机视觉:原理与实践(上部)

    本课程适合具有一定深度学习基础,希望发展为深度学习之计算机视觉方向的算法工程师和研发人员的同学们。 基于深度学习的计算机视觉是目前人工智能最活跃的领域,应用非常广泛,如人脸识别和无人驾驶中的机器视觉等。该领域的发展日新月异,网络模型和算法层出不穷。如何快速入门并达到可以从事研发的高度对新手和中级水平的学生而言面临不少的挑战。精心准备的本课程希望帮助大家尽快掌握基于深度学习的计算机视觉的基本原理、核心算法和当前的领先技术,从而有望成为深度学习之计算机视觉方向的算法工程师和研发人员。 本课程系统全面地讲述基于深度学习的计算机视觉技术的原理并进行项目实践。课程涵盖计算机视觉的七大任务,包括图像分类、目标检测、图像分割(语义分割、实例分割、全景分割)、人脸识别、图像描述、图像检索、图像生成(利用生成对抗网络)。本课程注重原理和实践相结合,逐篇深入解读经典和前沿论文70余篇,图文并茂破译算法难点, 使用思维导图梳理技术要点。项目实践使用Keras框架(后端为Tensorflow),学员可快速上手。 通过本课程的学习,学员可把握基于深度学习的计算机视觉的技术发展脉络,掌握相关技术原理和算法,有助于开展该领域的研究与开发实战工作。另外,深度学习之计算机视觉方向的知识结构及学习建议请参见本人CSDN博客。 本课程提供课程资料的课件PPT(pdf格式)和项目实践代码,方便学员学习和复习。 本课程分为上下两部分,其中上部包含课程的前五章(课程介绍、深度学习基础、图像分类、目标检测、图像分割),下部包含课程的后四章(人脸识别、图像描述、图像检索、图像生成)。

    3525 人正在学习 去看看 白勇

计算机视觉入门综述

自大二下学期以来,学习计算机视觉及机器学习方面的各种课程和论文,也亲身参与了一些项目,回想起来求学过程中难免走了不少弯路和坎坷,至今方才敢说堪堪入门。因此准备写一个计算机视觉方面的入门文章,一来是时间长了以后为了巩固和温习一下所学,另一方面也希望能给新入门的同学们介绍一些经验,还有自然是希望各位牛人能够批评指正不吝赐教。由于临近大四毕业,更新的时间难以保证,这个系列除了在理论上面会有一些介绍以外,也会提供几个小项目进行实践,我会尽可能不断更新下去。

因诸多学术理论及概念的原始论文都发表在英文期刊上,因此在尽可能将专业术语翻译成中文的情况下,都会在括号内保留其原始的英文短语以供参考。


目录

  • 简介
  • 方向
  • 热点

简介

计算机视觉(Computer Vision)又称为机器视觉(Machine Vision),顾名思义是一门“教”会计算机如何去“看”世界的学科。在机器学习大热的前景之下,计算机视觉与自然语言处理(Natural Language Process, NLP)及语音识别(Speech Recognition)并列为机器学习方向的三大热点方向。而计算机视觉也由诸如梯度方向直方图(Histogram of Gradient, HOG)以及尺度不变特征变换(Scale-Invariant Feature Transform, SIFT)等传统的手办特征(Hand-Crafted Feature)与浅层模型的组合逐渐转向了以卷积神经网络(Convolutional Neural Network, CNN)为代表的深度学习模型。

方式 特征提取 决策模型
传统方式 SIFT,HOG, Raw Pixel … SVM, Random Forest, Linear Regression …
深度学习 CNN … CNN …

svm(Support Vector Machine) : 支持向量机
Random Forest : 随机森林
Linear Regression : 线性回归
Raw Pixel : 原始像素

传统的计算机视觉对待问题的解决方案基本上都是遵循: 图像预处理 → 提取特征 → 建立模型(分类器/回归器) → 输出 的流程。 而在深度学习中,大多问题都会采用端到端(End to End)的解决思路,即从输入到输出一气呵成。本次计算机视觉的入门系列,将会从浅层学习入手,由浅入深过渡到深度学习方面。

方向

计算机视觉本身又包括了诸多不同的研究方向,比较基础和热门的几个方向主要包括了:物体识别和检测(Object Detection),语义分割(Semantic Segmentation),运动和跟踪(Motion & Tracking),三维重建(3D Reconstruction),视觉问答(Visual Question & Answering),动作识别(Action Recognition)等。

物体识别和检测

物体检测一直是计算机视觉中非常基础且重要的一个研究方向,大多数新的算法或深度学习网络结构都首先在物体检测中得以应用如VGG-net, GoogLeNet, ResNet等等,每年在imagenet数据集上面都不断有新的算法涌现,一次次突破历史,创下新的记录,而这些新的算法或网络结构很快就会成为这一年的热点,并被改进应用到计算机视觉中的其它应用中去,可以说很多灌水的文章也应运而生。

物体识别和检测,顾名思义,即给定一张输入图片,算法能够自动找出图片中的常见物体,并将其所属类别及位置输出出来。当然也就衍生出了诸如人脸检测(Face Detection),车辆检测(Viechle Detection)等细分类的检测算法。
这里写图片描述

近年代表论文

  1. He, Kaiming, et al. “Deep residual learning for image recognition.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.
  2. Liu, Wei, et al. “SSD: Single shot multibox detector.” European Conference on Computer Vision. Springer International Publishing, 2016.
  3. Szegedy, Christian, et al. “Going deeper with convolutions.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.
  4. Ren, Shaoqing, et al. “Faster r-cnn: Towards real-time object detection with region proposal networks.” Advances in neural information processing systems. 2015.
  5. Simonyan, Karen, and Andrew Zisserman. “Very deep convolutional networks for large-scale image recognition.” arXiv preprint arXiv:1409.1556 (2014).
  6. Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. “Imagenet classification with deep convolutional neural networks.” Advances in neural information processing systems. 2012.

数据集

  1. IMAGENET
  2. PASCAL VOC
  3. MS COCO
  4. Caltech

语义分割

语义分割是近年来非常热门的方向,简单来说,它其实可以看做一种特殊的分类——将输入图像的每一个像素点进行归类,用一张图就可以很清晰地描述出来。
这里写图片描述
很清楚地就可以看出,物体检测和识别通常是将物体在原图像上框出,可以说是“宏观”上的物体,而语义分割是从每一个像素上进行分类,图像中的每一个像素都有属于自己的类别。

近年代表论文

  1. Long, Jonathan, Evan Shelhamer, and Trevor Darrell. “Fully convolutional networks for semantic segmentation.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.
  2. Chen, Liang-Chieh, et al. “Semantic image segmentation with deep convolutional nets and fully connected crfs.” arXiv preprint arXiv:1412.7062 (2014).
  3. Noh, Hyeonwoo, Seunghoon Hong, and Bohyung Han. “Learning deconvolution network for semantic segmentation.” Proceedings of the IEEE International Conference on Computer Vision. 2015.
  4. Zheng, Shuai, et al. “Conditional random fields as recurrent neural networks.” Proceedings of the IEEE International Conference on Computer Vision. 2015.

数据集

  1. PASCAL VOC
  2. MS COCO

运动和跟踪

跟踪也属于计算机视觉领域内的基础问题之一,在近年来也得到了非常充足的发展,方法也由过去的非深度算法跨越向了深度学习算法,精度也越来越高,不过实时的深度学习跟踪算法精度一直难以提升,而精度非常高的跟踪算法的速度又十分之慢,因此在实际应用中也很难派上用场。
那么什么是跟踪呢?就目前而言,学术界对待跟踪的评判标准主要是在一段给定的视频中,在第一帧给出被跟踪物体的位置及尺度大小,在后续的视频当中,跟踪算法需要从视频中去寻找到被跟踪物体的位置,并适应各类光照变换,运动模糊以及表观的变化等。但实际上跟踪是一个不适定问题(ill posed problem),比如跟踪一辆车,如果从车的尾部开始跟踪,若是车辆在行进过程中表观发生了非常大的变化,如旋转了180度变成了侧面,那么现有的跟踪算法很大的可能性是跟踪不到的,因为它们的模型大多基于第一帧的学习,虽然在随后的跟踪过程中也会更新,但受限于训练样本过少,所以难以得到一个良好的跟踪模型,在被跟踪物体的表观发生巨大变化时,就难以适应了。所以,就目前而言,跟踪算不上是计算机视觉内特别热门的一个研究方向,很多算法都改进自检测或识别算法。
这里写图片描述

近年代表论文

  1. Nam, Hyeonseob, and Bohyung Han. “Learning multi-domain convolutional neural networks for visual tracking.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.
  2. Held, David, Sebastian Thrun, and Silvio Savarese. “Learning to track at 100 fps with deep regression networks.” European Conference on Computer Vision. Springer International Publishing, 2016.
  3. Henriques, João F., et al. “High-speed tracking with kernelized correlation filters.” IEEE Transactions on Pattern Analysis and Machine Intelligence 37.3 (2015): 583-596.
  4. Ma, Chao, et al. “Hierarchical convolutional features for visual tracking.” Proceedings of the IEEE International Conference on Computer Vision. 2015.
  5. Bertinetto, Luca, et al. “Fully-convolutional siamese networks for object tracking.” European Conference on Computer Vision. Springer International Publishing, 2016.
  6. Danelljan, Martin, et al. “Beyond correlation filters: Learning continuous convolution operators for visual tracking.” European Conference on Computer Vision. Springer International Publishing, 2016.
  7. Li, Hanxi, Yi Li, and Fatih Porikli. “Deeptrack: Learning discriminative feature representations online for robust visual tracking.” IEEE Transactions on Image Processing 25.4 (2016): 1834-1848.

数据集

  1. OTB(Object Tracking Benchmark)
  2. VOT(Visual Object Tracking)

视觉问答

视觉问答也简称VQA(Visual Question Answering),是近年来非常热门的一个方向,其研究目的旨在根据输入图像,由用户进行提问,而算法自动根据提问内容进行回答。除了问答以外,还有一种算法被称为标题生成算法(Caption Generation),即计算机根据图像自动生成一段描述该图像的文本,而不进行问答。对于这类跨越两种数据形态(如文本和图像)的算法,有时候也可以称之为多模态,或跨模态问题。
这里写图片描述

近年代表论文

  1. Xiong, Caiming, Stephen Merity, and Richard Socher. “Dynamic memory networks for visual and textual question answering.” arXiv 1603 (2016).
  2. Wu, Qi, et al. “Ask me anything: Free-form visual question answering based on knowledge from external sources.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.
  3. Zhu, Yuke, et al. “Visual7w: Grounded question answering in images.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016.

数据集

  1. VQA

热点

随着深度学习的大举侵入,现在几乎所有人工智能方向的研究论文几乎都被深度学习占领了,传统方法已经很难见到了。有时候在深度网络上改进一个非常小的地方,就可以发一篇还不错的论文。并且,随着深度学习的发展,很多领域的现有数据集内的记录都在不断刷新,已经向人类记录步步紧逼,有的方面甚至已经超越了人类的识别能力。那么,下一步的研究热点到底会在什么方向呢?就我个人的一些观点如下:

  1. 多模态研究: 目前的许多领域还是仅仅停留在单一的模态上,如单一分物体检测,物体识别等,而众所周知的是现实世界就是有多模态数据构成的,语音,图像,文字等等。 VQA 在近年来兴起的趋势可见,未来几年内,多模态的研究方向还是比较有前景的,如语音和图像结合,图像和文字结合,文字和语音结合等等。
  2. 数据生成: 现在机器学习领域的许多数据还是由现实世界拍摄的视频及图片经过人工标注后用作于训练或测试数据的,标注人员的职业素养和经验,以及多人标注下的规则统一难度在一定程度上也直接影响了模型的最终结果。而利用深度模型自动生成数据已经成为了一个新的研究热点方向,如何使用算法来自动生成数据相信在未来一段时间内都是不错的研究热点。
  3. 无监督学习:人脑的在学习过程中有许多时间都是无监督(Un-supervised Learning)的,而现有的算法无论是检测也好识别也好,在训练上都是依赖于人工标注的有监督(Supervised Learning)。如何将机器学习从有监督学习转变向无监督学习,应该是一个比较有挑战性的研究方向,当然这里的无监督学习当然不是指简单的如聚类算法(Clustering)这样的无监督算法。而LeCun也曾说: 如果将人工智能比喻作一块蛋糕的话,有监督学习只能算是蛋糕上的糖霜,而增强学习(Reinforce Learning)则是蛋糕上的樱桃,无监督学习才是真正蛋糕的本体。

    最后,想要把握领域内最新的研究成果和动态,还需要多看论文,多写代码。
    计算机视觉领域内的三大顶级会议有:

    Conference on Computer Vision and Pattern Recognition (CVPR)
    International Conference on Computer Vision (ICCV)
    European Conference on Computer Vision (ECCV)

    较好的会议有以下几个:

    The British Machine Vision Conference (BMVC)
    International Conference on Image Processing (ICIP)
    Winter Conference on Applications of Computer Vision (WACV)
    Asian Conference on Computer Vision (ACCV)

当然,毕竟文章的发表需要历经审稿和出版的阶段,因此当会议论文集出版的时候很可能已经过了小半年了,如果想要了解最新的研究,建议每天都上ArXiv的cv板块看看,ArXiv上都是预出版的文章,并不一定最终会被各类会议和期刊接收,所以质量也就良莠不齐,对于没有分辨能力的入门新手而言,还是建议从顶会和顶级期刊上的经典论文入手。


这是一篇对计算机视觉目前研究领域的几个热门方向的一个非常非常简单的介绍,希望能对想要入坑计算机视觉方向的同学有一定的帮助。由于个人水平十分有限,错误在所难免,欢迎大家对文中的错误进行批评和指正。

2019-11-07 17:20:26 weixin_43876801 阅读数 139
  • 基于深度学习的计算机视觉:原理与实践(上部)

    本课程适合具有一定深度学习基础,希望发展为深度学习之计算机视觉方向的算法工程师和研发人员的同学们。 基于深度学习的计算机视觉是目前人工智能最活跃的领域,应用非常广泛,如人脸识别和无人驾驶中的机器视觉等。该领域的发展日新月异,网络模型和算法层出不穷。如何快速入门并达到可以从事研发的高度对新手和中级水平的学生而言面临不少的挑战。精心准备的本课程希望帮助大家尽快掌握基于深度学习的计算机视觉的基本原理、核心算法和当前的领先技术,从而有望成为深度学习之计算机视觉方向的算法工程师和研发人员。 本课程系统全面地讲述基于深度学习的计算机视觉技术的原理并进行项目实践。课程涵盖计算机视觉的七大任务,包括图像分类、目标检测、图像分割(语义分割、实例分割、全景分割)、人脸识别、图像描述、图像检索、图像生成(利用生成对抗网络)。本课程注重原理和实践相结合,逐篇深入解读经典和前沿论文70余篇,图文并茂破译算法难点, 使用思维导图梳理技术要点。项目实践使用Keras框架(后端为Tensorflow),学员可快速上手。 通过本课程的学习,学员可把握基于深度学习的计算机视觉的技术发展脉络,掌握相关技术原理和算法,有助于开展该领域的研究与开发实战工作。另外,深度学习之计算机视觉方向的知识结构及学习建议请参见本人CSDN博客。 本课程提供课程资料的课件PPT(pdf格式)和项目实践代码,方便学员学习和复习。 本课程分为上下两部分,其中上部包含课程的前五章(课程介绍、深度学习基础、图像分类、目标检测、图像分割),下部包含课程的后四章(人脸识别、图像描述、图像检索、图像生成)。

    3525 人正在学习 去看看 白勇

在这里插入图片描述
来源:机器之心
这是一篇计算机视觉入门指南,从概念、原理、用例等角度介绍了计算机视觉。

「机器能够模拟人类视觉系统」的幻想已经过时了。自 1960 年代第一批学术论文出现以来,计算机视觉已经走了很远,现代系统已经出现,且它们可以集成到移动应用中。

今天,由于其广泛应用和巨大潜力,计算机视觉成为最热的人工智能和机器学习子领域之一。其目标是:复制人类视觉的强大能力。

但是,到底什么是计算机视觉?它在不同行业中的应用现状如何?知名的商业用例有哪些?典型的计算机视觉任务是什么?

本文将介绍计算机视觉的基础概念和现实应用,对任何听说过计算机视觉但不确定它是什么以及如何应用的人,本文是了解计算机视觉这一复杂问题的便捷途径。

你可以通读本文,或者直接跳至某个章节。

目录

什么是计算机视觉?
计算机视觉解决什么问题
区分计算机视觉与其相关领域
行业应用
零售业
制造业
医疗行业
自动驾驶
保险业
农业
安防
典型的计算机视觉任务
图像分类
定位
目标检测
目标识别
实例分割
目标追踪
计算机视觉运行原理
通用策略
现有数据集
训练目标检测模型
商业用例
视觉搜索引擎
Facebook 人脸识别
Amazon Go
特斯拉自动驾驶
微软 InnerEye
计算机视觉在小公司的应用现状
如何实现计算机视觉项目

什么是计算机视觉?

计算机视觉解决什么问题

人类能够理解和描述图像中的场景。以下图为例,人类能做到的不仅仅是检测到图像前景中有四个人、一条街道和几辆车。
在这里插入图片描述披头士专辑《艾比路》的封面。(图源:https://liveforlivemusic.com/news/beatles-abbey-road/)

除了这些基本信息,人类还能够看出图像前景中的人正在走路,其中一人赤脚,我们甚至知道他们是谁。我们可以理性地推断出图中人物没有被车撞击的危险,白色的大众汽车没有停好。人类还可以描述图中人物的穿着,不止是衣服颜色,还有材质与纹理。

这也是计算机视觉系统需要的技能。简单来说,计算机视觉解决的主要问题是:

给出一张二维图像,计算机视觉系统必须识别出图像中的对象及其特征,如形状、纹理、颜色、大小、空间排列等,从而尽可能完整地描述该图像。

区分计算机视觉与其相关领域

计算机视觉完成的任务远超其他领域,如图像处理、机器视觉,尽管它们存在一些共同点。接下来,我们就来了解一下这些领域之间的差异。

图像处理

图像处理旨在处理原始图像以应用某种变换。其目标通常是改进图像或将其作为某项特定任务的输入,而计算机视觉的目标是描述和解释图像。例如,降噪、对比度或旋转操作这些典型的图像处理组件可以在像素层面执行,无需对图像整体具备全面的了解。

机器视觉

机器视觉是计算机视觉用于执行某些(生产线)动作的特例。在化工行业中,机器视觉系统可以检查生产线上的容器(是否干净、空置、无损)或检查成品是否恰当封装,从而帮助产品制造。

计算机视觉

计算机视觉可以解决更复杂的问题,如人脸识别、详细的图像分析(可帮助实现视觉搜索,如 Google Images),或者生物识别方法。

行业应用

人类不仅能够理解图像中的场景,稍加训练,还能解释书法、印象派画家、抽象画,以及胎儿的二维超声图像。

从这个角度来看,计算机视觉领域尤其复杂,它拥有大量的实际应用。

从电商到传统行业,各种类型和规模的公司现在都可以利用计算机视觉的强大能力,这是依赖于人工智能和机器学习(更具体地说是计算机视觉)的创新所带来的利好。

下面我们就来看看,近年来受计算机视觉影响最大的行业应用。

零售业

近年来,计算机视觉在零售业的应用已成为最重要的技术趋势之一。下文将介绍一些常见的用例。如果你想对计算机视觉在零售业的潜在应用有更详细的了解,请参考:https://tryolabs.com/resources/retail-innovations-machine-learning/。

行为追踪

实体零售店利用计算机视觉算法和摄像头,了解顾客及其行为。

计算机视觉算法能够识别人脸,确定人物特征,如性别或年龄范围。此外,零售店还可以利用计算机视觉技术追踪顾客在店内的移动轨迹,分析其移动路线,检测行走模式,并统计零售店店面受到行人注意的次数。
在这里插入图片描述

添加视线方向检测后,零售店能够回答这一重要问题:将店内商品放在哪个位置可以提升消费者体验,最大化销售额。

计算机视觉还是开发防盗窃机制的强大工具。人脸识别算法可用于识别已知的商店扒手,或检测出某位顾客将商品放入自己的背包。

库存管理

计算机视觉在库存管理方面有两个主要的应用。

通过安防摄像头图像分析,计算机视觉算法可以对店内剩余商品生成非常准确的估计。对于店铺管理者来说,这是非常宝贵的信息,它可以帮助管理者立即察觉不寻常的货物需求,并及早作出反应。

另一个常见应用是:分析货架空间利用情况,识别次优配置。除了发现被浪费的空间以外,此类算法还可以提供更好的货品摆放方案。

制造业

生产线上的主要问题是机器中断或残次品,这些问题会导致生产延迟和利润损失。

计算机视觉算法被证实是实施预测性维护的好方法。算法通过分析(来自机器人身上摄像头等的)视觉信息,预先发现机器的潜在问题。此类系统可以预测包装或汽车装配机器人是否会中断,这是一项巨大的贡献。

这同样可用于降低不良率,系统可以检测出整个生产线上各个组件中的缺陷。这使得制造商实时响应,采取解决办法。缺陷可能不那么严重,生产流程可以继续,但是产品以某种方式被标记,或者被指向特定的生产路径。但是,有时停止生产线是必要的。为了进一步的利益,此类系统可以针对每个用例进行训练,按类型和严重程度对缺陷进行分类。

医疗行业

在医疗行业中,现有计算机视觉应用的数量非常庞大。

毫无疑问,医疗图像分析是最著名的例子,它可以显著提升医疗诊断流程。此类系统对 MRI 图像、CT 扫描图像和 X 光图像进行分析,找出肿瘤等异常,或者搜索神经系统疾病的症状。

在很多情况下,图像分析技术从图像中提取特征,从而训练能够检测异常的分类器。但是,一些特定应用需要更细化的图像处理。例如,对结肠镜检查图像进行分析时,分割图像是必要的,这样才能找出肠息肉,防止结直肠癌。
在这里插入图片描述
胸腔 3D 渲染 CT 扫描图像的体分割。(图源:https://en.wikipedia.org/wiki/Image_segmentation)

上图是观察胸腔元素所需的图像分割结果。该系统分割每个重要部分并着色:肺动脉(蓝色)、肺静脉(红色)、纵膈(黄色)和横膈(紫色)。

目前大量此类应用已经投入使用,如估计产后出血量、量化冠状动脉钙化情况、在没有 MRI 的情况下测定人体内的血流量。

但是,医疗图像并非计算机视觉在医疗行业中唯一的用武之地。比如,计算机视觉技术为视障人士提供室内导航帮助。这些系统可以在楼层平面图中定位行人和周围事物等,以便实时提供视觉体验。视线追踪和眼部分析可用于检测早期认知障碍,如儿童自闭症或阅读障碍,这些疾病与异常注视行为高度相关。

自动驾驶

你是否思考过,自动驾驶汽车如何「看」路?计算机视觉在其中扮演核心角色,它帮助自动驾驶汽车感知和了解周围环境,进而恰当运行。

计算机视觉最令人兴奋的挑战之一是图像和视频目标检测。这包括对不同数量的对象进行定位和分类,以便区分某个对象是交通信号灯、汽车还是行人,如下图所示:
在这里插入图片描述

自动驾驶汽车目标检测。(图源:https://cdn-images-1.medium.com/max/1600/1*q1uVc-MU-tC-WwFp2yXJow.gif)

此类技术,加上对来自传感器和/或雷达等来源的数据进行分析,使得汽车能够「看见」。

图像目标检测是一项复杂的强大任务,之前我们曾经讨论过,参见:https://tryolabs.com/blog/2017/08/30/object-detection-an-overview-in-the-age-of-deep-learning/。
另一篇文章从人类-图像交互的角度探讨这一主题,参见:https://tryolabs.com/blog/2018/03/01/introduction-to-visual-question-answering/。

保险业

计算机视觉在保险业中的应用影响很大,尤其是在理赔处理中。

计算机视觉应用可以指导客户以视觉形式进行理赔文件处理。它可以实时分析图像并发送至适合的保险经纪人。同时,它可以估计和调整维护费用,确定是否在保险覆盖范围内,甚至检测是否存在保险欺诈。所有这些最大程度上缩短了索赔流程,为客户提供更好的体验。

从预防的角度来看,计算机视觉在避免意外事故方面用处极大。大量可用于阻止碰撞的计算机视觉应用被整合到工业机械、汽车和无人机中。这是风险管理的新时代,可能改变整个保险业。

农业

计算机视觉对农业有极大影响,尤其是精准农业。

在粮食生产这一全球经济活动中,存在一系列宝贵的计算机视觉应用。粮食生产面临一些反复出现的问题,之前这些问题通常由人类监控。而现在,计算机视觉算法可以检测或合理预测病虫害。此类早期诊断可帮助农民快速采取合适措施,减少损失,保证生产质量。

另一项长期挑战是除草,因为杂草对除草剂产生抗药性,可能给农民带来严重损失。现在出现了配备有计算机视觉技术的机器人,它们可以监控整片农田,精准喷洒除草剂。这极大地节约了使用农药量,为地球环境和生产成本均带来了极大的益处。

土壤质量也是农业中的一大主要因素。一些计算机视觉应用可以从手机拍摄的照片中识别出土壤的潜在缺陷和营养缺乏问题。分析之后,这些应用会针对检测出的土壤问题,提供土壤恢复技术和可能的解决方案。

计算机视觉还可用于分类。一些算法通过识别水果、蔬菜甚至花卉的主要特性(如大小、质量、重量、颜色、纹理等),对其进行分类。这些算法还能够检测缺陷,估计出哪些农产品保鲜期较长、哪些应该放置在本地市场售卖。这极大延长了农产品的保鲜期,减少了农产品上市前所需时间。

安防

与零售业类似,对安全具备高要求的企业(如银行或赌场)可从计算机视觉应用中获益,这些应用对安防摄像头拍摄的图像进行分析,从而识别顾客。

而从另一个层面上来讲,计算机视觉是国土安全任务中的强大工具。它可用于改进港口货物检验,或者监控敏感场所,如大使馆、发电站、医院、铁路和体育场。这里,计算机视觉不仅能够分析和分类图像,还能对场景提供详细且有意义的描述,为决策实时提供关键因素。

通常,计算机视觉广泛应用于国防任务,如侦察敌军地形、自动确认图像中的敌军、自动化车辆和机器移动,以及搜索援救。

典型的计算机视觉任务

高度复制人类视觉系统,这是如何做到的呢?

计算机视觉基于大量不同任务,并组合在一起实现高度复杂的应用。计算机视觉中最常见的任务是图像和视频识别,涉及确定图像包含的不同对象。

图像分类

计算机视觉中最知名的任务可能就是图像分类了,它对给定图像进行分类。我们看一个简单的二分类例子:我们想根据图像是否包含旅游景点对其进行分类。假设我们为此任务构建了一个分类器,并提供了一张图像(见下图)。
在这里插入图片描述
埃菲尔铁塔(图源:https://cdn.pariscityvision.com/media/wysiwyg/tour-eiffel.jpg)

该分类器认为上述图像属于包含旅游景点的图像类别。但这并不意味着分类器认出埃菲尔铁塔了,它可能只是曾经见过这座塔的照片,并且当时被告知图像中包含旅游景点。
在这里插入图片描述
巴黎旅游景点明信片。(图源:http://toyworldgroup.com/image/cache/catalog/Ecuda%20Puzzles/Postcard%20Form%20Paris%20/14840-500x500.jpg)

该分类器的更强大版本可以处理不止两个类别。例如,分类器将图像分类为旅游景点的特定类型,如埃菲尔铁塔、凯旋门、圣心大教堂等。那么在此类场景中,每个图像输入可能有多个答案,就像上面那张明信片一样。

定位

假设,现在我们不仅想知道图像中出现的旅游景点名称,还对其在图像中的位置感兴趣。定位的目标就是找出图像中单个对象的位置。例如,下图中埃菲尔铁塔的位置就被标记出来了。
在这里插入图片描述
被红色边界框标记出的埃菲尔铁塔。(图源:https://cdn.pariscityvision.com/media/wysiwyg/tour-eiffel.jpg)

执行定位的标准方式是,在图像中定义一个将对象围住的边界框。

定位是一个很有用的任务。比如,它可以对大量图像执行自动对象剪裁。将定位与分类任务结合起来,就可以快速构建著名旅游景点(剪裁)图像数据集。

目标检测

我们想象一个同时包含定位和分类的动作,对一张图像中的所有感兴趣对象重复执行该动作,这就是目标检测。该场景中,图像中的对象数量是未知的。因此,目标检测的目标是找出图像中的对象,并进行分类。
在这里插入图片描述
目标检测结果(图源:http://research.ibm.com/artificial-intelligence/computer-vision/images/cv-research-areas-object-detection.jpg)

在这个密集图像中,我们可以看到计算机视觉系统识别出大量不同对象:汽车、人、自行车,甚至包含文本的标志牌。

这个问题对人类来说都算困难的。一些对象只显示出一部分,因为它们有一部分在图像外,或者彼此重叠。此外,相似对象的大小差别极大。

目标检测的一个直接应用是计数,它在现实生活中应用广泛,从计算收获水果的种类到计算公众集会或足球赛等活动的人数,不一而足。

目标识别

目标识别与目标检测略有不同,尽管它们使用类似的技术。给出一个特定对象,目标识别的目标是在图像中找出该对象的实例。这并不是分类,而是确定该对象是否出现在图像中,如果出现,则执行定位。搜索包含某公司 logo 的图像就是一个例子。另一个例子是监控安防摄像头拍摄的实时图像以识别某个人的面部。

实例分割

我们可以把实例分割看作是目标检测的下一步。它不仅涉及从图像中找出对象,还需要为检测到的每个对象创建一个尽可能准确的掩码。
在这里插入图片描述
(图注)实例分割结果。

你可以从上图中看到,实例分割算法为四位披头士成员和一些汽车创建掩码(不过该结果并不完整,尤其是列侬)。

人工执行此类任务的成本很高,而实例分割技术使得此类任务的实现变得简单。在法国,法律禁止媒体在未经监护人明确同意的情况下暴露儿童形象。使用实例分割技术,可以模糊电视或电影中的儿童面部。

目标追踪

目标追踪旨在追踪随着时间不断移动的对象,它使用连续视频帧作为输入。该功能对于机器人来说是必要的,以守门员机器人举例,它们需要执行从追球到挡球等各种任务。目标追踪对于自动驾驶汽车而言同样重要,它可以实现高级空间推理和路径规划。类似地,目标追踪在多人追踪系统中也很有用,包括用于理解用户行为的系统(如零售店的计算机视觉系统),以及在游戏中监控足球或篮球运动员的系统。

执行目标追踪的一种相对直接的方式是,对视频序列中的每张图像执行目标追踪并对比每个对象实例,以确定它们的移动轨迹。该方法的缺陷是为每张图像执行目标检测通常成本高昂。另一种替换方式仅需捕捉被追踪对象一次(通常是该对象出现的第一次),然后在不明确识别该对象的情况下在后续图像中辨别它的移动轨迹。最后,目标追踪方法未必就能检测出对象,它可以在不知道追踪对象是什么的情况下,仅查看目标的移动轨迹。

计算机视觉运行原理

如前所示,计算机视觉的目标是模仿人类视觉系统的工作方式。算法如何实现这一目标呢?本文将介绍其中最重要的几个概念。

通用策略

深度学习方法和技术深刻改变了计算机视觉以及其他人工智能领域,对于很多任务而言,使用深度学习方法已经成为标准操作。尤其是,卷积神经网络(CNN)的性能超过了使用传统计算机视觉技术所能达到的最优结果。

以下四步展示了利用 CNN 构建计算机视觉模型的通用方法:

创建一个包含标注图像的数据集或者使用现有的数据集。标注可以是图像类别(适用于分类任务)、边界框和类别对(适用于目标检测问题),或者对图像中每个感兴趣对象进行像素级分割(适用于实例分割问题)。
从每张图像中提取与待处理任务相关的特征,这是建模的重点。例如,用来识别人脸的特征、基于人脸标准的特征与用来识别旅游景点或人体器官的特征存在显著区别。
基于特征训练深度学习模型。训练意味着向机器学习模型输入很多图像,然后模型基于特征学习如何解决任务。
使用不同于训练所用数据的图像评估模型,从而测试训练模型的准确率。

该策略非常基础,但效果不错。这类方法叫做监督机器学习,它需要包含模型待学习现象的数据集。

现有数据集

构建数据集通常成本高昂,但是它们对于开发计算机视觉应用至关重要。幸运的是,目前有一些现成的数据集。其中规模最大、最著名的是 ImageNet,该数据集包含 1400 万人工标注图像。该数据集包含 100 万张具备边界框标注的图像。

在这里插入图片描述
带有边界框的 ImageNet 图像(图源:http://www.image-net.org/bbox_fig/kit_fox.JPG)
在这里插入图片描述
具备对象属性标注的 ImageNet 图像(图源:http://www.image-net.org/attribute_fig/pullfigure.jpg)

另一个著名数据集是 Microsoft Common Objects in Context (COCO) 数据集,它包含 328,000 张图像、91 个对象类别(这些类别很容易识别,4 岁孩童也可以轻松识别出来),以及 250 万标注实例。
在这里插入图片描述
COCO 数据集中的标注图像示例。(图源:https://arxiv.org/abs/1405.0312)

尽管该领域可用数据集并不是特别多,但仍然有一些适合不同的任务,如 CelebFaces Attributes Dataset(CelebA 数据集,该人脸属性数据集包含超过 20 万张名人图像)、Indoor Scene Recognition 数据集(包含 15,620 张室内场景图像)、Plant Image Analysis 数据集(包括属于 11 个不同类别的 100 万张植物图像)。

训练目标检测模型

  • Viola–Jones 方法

有很多种方法可以解决目标检测问题。很多年来,Paul Viola 和 Michael Jones 在论文《Robust Real-time Object Detection》中提出的方法成为流行的方法。

尽管该方法可用来检测大量对象类别,但它最初是受人脸检测目标的启发。该方法快速、直接,是傻瓜相机中所使用的算法,它可以在几乎不浪费处理能力的情况下执行实时人脸检测。

该方法的核心特征是:基于哈尔特征与大量二分类器一起训练。哈尔特征表示边和线,计算简单。
在这里插入图片描述
哈尔特征(图源:https://docs.opencv.org/3.4.3/haar_features.jpg)

尽管比较基础,但在人脸检测这一特定案例下,这些特征可以捕捉到重要元素,如鼻子、嘴或眉间距。该监督方法需要很多正类和负类样本。
在这里插入图片描述
检测蒙娜丽莎的面部。

本文暂不讨论算法细节。不过,上图展示了该算法检测蒙娜丽莎面部的过程。

  • 基于 CNN 的方法

深度学习变革了机器学习,尤其是计算机视觉。目前基于深度学习的方法已经成为很多计算机视觉任务的前沿技术。

其中,R-CNN 易于理解,其作者提出了一个包含三个阶段的流程:

1 利用区域候选(region proposal)方法提取可能的对象。
2 使用 CNN 识别每个区域中的特征。
3 利用支持向量机(SVM)对每个区域进行分类。

在这里插入图片描述
R-CNN 架构(图源:https://arxiv.org/abs/1311.2524)

该区域候选方法最初由论文《Selective Search for Object Recognition》提出,尽管 R-CNN 算法并不在意使用哪种区域候选方法。步骤 3 非常重要,因为它减少了候选对象的数量,降低了计算成本。

这里提取的特征没有哈尔特征那么直观。总之,CNN 可用于从每个区域候选中提取 4096 维的特征向量。鉴于 CNN 的本质,输入应该具备同样的维度。这也是 CNN 的弱点之一,很多方法解决了这个问题。回到 R-CNN 方法,训练好的 CNN 架构要求输入为 227 × 227 像素的固定区域。由于候选区域的大小各有不同,R-CNN 作者通过扭曲图像的方式使其维度满足要求。
在这里插入图片描述
满足 CNN 输入维度要求的扭曲图像示例。

尽管该方法取得了很好的结果,但训练过程中存在一些困难,并且该方法最终被其他方法超越。其中一些方法在这篇文章中有深入介绍:https://tryolabs.com/blog/2017/08/30/object-detection-an-overview-in-the-age-of-deep-learning/。

商业用例

计算机视觉应用被越来越多的公司部署,用于回答业务问题或提升产品性能。它们或许已经成为人们日常生活的一部分,你甚至都没有注意到它。以下是一些常见的使用案例。

视觉搜索引擎

2001 年,Google Images 的出现意味着视觉搜索技术可被大众使用。视觉搜索引擎能够基于特定内容标准检索图像。常见用例是搜索关键词,不过有时候我们会提供源图像,要求引擎找出相似图像。在某些案例中,可以指定更详细的搜索条件,如沙滩的图像、夏天拍摄、至少包含 10 个人。

现在有很多视觉搜索引擎,有的可以网站形式直接使用,有的需要通过 API 调用,有的则是移动应用。

最著名的视觉搜索网站无疑是 Google Images、Bing 和 Yahoo。前两个网站均可使用多个关键词或者单张图像作为搜索输入,以图像作为搜索输入又名「反向图像搜索」(以图搜图)。Yahoo 仅支持关键词搜索,搜索结果同样不错,如下图所示。
在这里插入图片描述
Yahoo 图像搜索。

还有一些视觉搜索网站同样值得关注,如仅支持反向图像搜索的 TinEye,以及仅支持文本搜索但覆盖范围极大的 Picsearch。

在移动应用方面,由于视觉搜索技术逐渐成为标准特征,此类应用之间的区别较大。

此类实现包括 Google Goggles(后被 Google Lens 取代),它可从图像中获取详细信息。例如,从一张猫照片中得到其品种信息,或者提供博物馆中艺术作品的信息。

在电商市场中,Pinterest 开发了 Pinterest Lens。如果你需要现有衣物的新穿搭想法,你可以为这件衣服拍张照,之后 Pinterest Lens 会返回穿搭建议,该建议包括你可以购买的搭配单品。近年来,针对网购的视觉搜索成为增长最快的趋势之一。

最后,视觉搜索的更高阶案例是视觉问答系统,参见:https://tryolabs.com/blog/2018/03/01/introduction-to-visual-question-answering/。

Facebook 人脸识别

尽管早在 2000 年代中期,出于自动对焦目的而使用人脸检测技术的相机已经普遍,但近年来人脸识别领域出现了很多更优秀的成绩。最常见(也最具争议)的应用或许就是识别图像或视频中的人物。这通常用于安防系统,但也出现在社交媒体中:人脸管理系统为人脸添加过滤器,以便按人脸执行搜索,甚至在选举过程中阻止选民多次投票。人脸识别还可用到更复杂的场景,如识别面部表情中的情绪。

其中同时引发了兴趣和担忧的用例是 Facebook 的人脸识别系统。开发团队的一个主要目标是阻止陌生人使用出现用户人脸的图像(见下图的示例),或者向视障用户告知图像或视频中出现的人物。
在这里插入图片描述
Facebook 人脸识别。(图源:https://cdn0.tnwcdn.com/wp-content/blogs.dir/1/files/2017/12/Facebook-Tagging-796x428.jpg)

除了那些令人担忧的部分以外,这项技术在很多场景中是有益的,比如对抗网络骚扰。

Amazon Go

厌倦了超市和杂货店的排队等待?Amazon Go 商店提供别样的体验。在计算机视觉的帮助下,这里不用排队,也没有包装箱。

其思路很简单:顾客进入商店,选择所需商品,离开商店,不用排队结账。

这是如何实现的呢?多亏了 Amazon 的「Just Walk Out」技术。顾客必须下载一个移动 app,该 app 可以帮助 Amazon 识别他们的身份。当他们想进入 Amazon Go 商店时,该 app 提供一个二维码。商店入口处有一些闸机供顾客出入商店,顾客进入商店时,闸机读取顾客的二维码。一个有趣的功能是,其他人可以陪伴该顾客一起进入商店,且陪伴者无需安装该应用程序。

顾客可以在商店内自由移动,而这也是计算机视觉发挥作用之处。商店内安装有一系列传感器,包括摄像头、运动传感器和商品上的重量传感器。这些设备收集了每个人的行为信息。它们实时检测顾客从货架上拿取的货品。顾客可以取下某个货品,改变主意的话再放回去。系统最终会向第一个拿起它的顾客收费,即使它被递给另一位想要购买的顾客,第一位拿起它的顾客仍然需要支付费用。于是系统创建了一个包含所有拿起货品的虚拟购物车,并进行实时维护。这使得顾客的购物流程非常顺利。

当顾客完成购物,即可走出商店。当他们经过闸机时,系统不会让顾客扫描货品或二维码,而是记录交易额并向顾客发送确认通知。

Amazon Go 是计算机视觉对现实世界和人类日常生活产生积极影响的一个案例。

特斯拉 Autopilot

让汽车自动行驶不只是一个遥远的梦。特斯拉 Autopilot 技术提供非常方便的自动驾驶功能。这并不是全自动驾驶系统,而是可在特定路段上驾驶汽车的驾驶助手。这是特斯拉强调的重点:在所有情况下,控制汽车都是驾驶员的责任。

自动驾驶通过目标检测和追踪技术实现。

要想使 Autopilot 工作,特斯拉汽车必须「高度武装」:八个全景摄像头提供 250 米范围内的 360 度图像、超声波传感器用于检测对象、雷达用来处理周围环境信息。这样,特斯拉汽车才能够根据交通条件调整行驶速度,在遇到障碍物时及时刹车,保持或变换车道,拐弯以及流畅地停车。

特斯拉 Autopilot 技术是计算机视觉对人类日常活动带来积极影响的另一个精彩案例。

微软 InnerEye

在医疗行业中,微软的 InnerEye 是帮助放射科医生、肿瘤专家和外科医生处理放射图像的宝贵工具。其主要目的是从恶性肿瘤的 3D 图像中准确识别出肿瘤。
在这里插入图片描述
癌性肿瘤的 3D 图像。

基于计算机视觉和机器学习技术,InnerEye 输出非常详细的肿瘤 3D 建模图像。以上截图展示了 InnerEye 创建的对脑部肿瘤的完整 3D 分割。从上述视频中,你可以看到专家控制 InnerEye 工具,指引它执行任务,InnerEye 像助手一样运行。

在放射疗法中,InnerEye 结果使得不伤害重要器官直接针对目标肿瘤进行放射成为可能。

这些结果还帮助放射科医生更好地理解图像序列,基于肿瘤大小的变化,判断疾病是否有进一步发展、稳定,或者对治疗反应良好。这样,医疗图像就成为一种重要的追踪和衡量方式。

最后,InnerEye 可用于规划精准手术。

计算机视觉在小公司的应用现状

计算机视觉在大公司的实现常被大家谈论,但这不意味着所有公司必须是谷歌或亚马逊那种量级才能从该机器学习技术中受益。任何规模的公司都可以利用数据和计算机视觉技术变得更加高效,制定更好的决策。

我们来看一些小公司的现实案例:

Tryolabs 曾帮助一家位于旧金山的小型风险管理公司构建和实现了一个计算机视觉系统,用于扩展对屋顶检查图像的处理。

在使用计算机视觉技术之前,公司专家人工分析无人机拍摄的照片,检测屋顶建设中的损伤。尽管分析结果很准确,但由于服务耗时且人力资源有限,该服务无法得到有效扩展。

为了解决这个问题,我们构建了一个能够理解图像并自动识别屋顶问题(如积水、电缆松散和铁锈)的深度学习系统。为此,我们开发了一个能够基于屋顶图像检测问题的深度神经网络、分析输入图像的流程,以及使检测结果可用于外部工具的 API。

因此,这家公司的订单量和收益都有所增长。

如何实现计算机视觉项目

和在组织内值得进行的所有创新一样,你应该选择一种有策略的方式来实现计算机视觉项目。

利用计算机视觉技术实现成功创新取决于整体业务策略、资源和数据。

以下问题可以帮助你为计算机视觉项目构建战略路线图。

1、计算机视觉解决方案应该降低成本还是增加收益?

成功的计算机视觉项目要么降低成本要么提高收益(或者二者兼顾),你应该定义该项目的目标。只有这样,它才能对组织及其发展产生重要影响。

2、如何衡量项目的成功?

每个计算机视觉项目都是不同的,你需要定义一个特定于该项目的成功指标。设置好指标后,你应该确保它被业务人员和数据科学家等认可。

3、能否保证信息的获取?

开启计算机视觉项目时,数据科学家应该能够轻松访问数据。他们需要和来自不同部门(如 IT 部门)的重要同事合作。这些同事应以其业务知识提供支持,内部官僚主义则会成为主要约束。

4、 组织收集的数据是否合适

计算机视觉算法并非魔法。它们需要数据才能运作,输入数据的质量决定其性能。有多种不同方法和来源可供收集合适数据,这取决于你的目标。无论如何,拥有的输入数据越多,计算机视觉模型性能优秀的可能性越大。如果你对数据的量和质存在疑虑,你可以请数据科学家帮忙评估数据集质量,必要情况下,找到获取第三方数据的最优方式。

5. 组织是否以恰当格式收集数据?

除了拥有合适量和类型的数据以外,你还需要确保数据的格式。假设你使用数千张完美的手机照片(分辨率高,背景为白色)训练目标检测算法。然后发现算法无法运行,因为实际用例是在不同光照/对比度/背景条件下检测持有手机的人,而不是检测手机本身。这样你之前的数据收集努力基本上就作废了,你还需要重头再来。此外,你应该了解,如果数据存在偏见,算法会学到该偏见。

关于如何开启成功的计算机视觉项目,参见博客:https://tryolabs.com/blog/2019/02/13/11-questions-to-ask-before-starting-a-successful-machine-learning-project/。

希望本文能够帮助读者了解计算机视觉概念、运作原理以及现实应用。

原文链接:
https://tryolabs.com/resources/introductory-guide-computer-vision/

计算机视觉入门

阅读数 86

没有更多推荐了,返回首页