AI笔记: 计算机视觉概述

关于人工智能

人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。计算机视觉是人工智能的一个分支,它研究如何使人工系统从图像或多维数据中“感知”的科学。

人类技术发展历史

  • 人类历史就是一部技术发展的历史,经历了这么几个阶段:
  • 1万年前人类开始种植粮食,进入农业阶段
  • 十七世纪后期的工业革命,大规模的机器生产代替手工作坊,解放了人类的双手和双脚
  • 20世纪7/80年代开始的信息和人工智能时代, 解放了人类的大脑
  • 人类智能体现在人类对周围环境的感知上,75%都是出于感知
  • 我们想要机器代替人类来感知外部世界

人类视觉

  • 视觉是自然智能不可思议的结晶
  • 猕猴大脑皮层中视觉部分占据大约50%
  • 人类大脑皮层中视觉部分所占最大, 大约55%
  • 人类视觉是由多块神经区域组成的
    • 通过眼睛感受外接物体反射的光线
    • 进一步通过视觉传导纤维到达脑后视觉处理中枢
    • 视觉处理中枢又分为v1~v5等多个区域
  • 人类采用神经网络对视觉信息进行深层次处理

计算机视觉

  • 计算机视觉:让计算机看懂图像和视频
  • 在图像识别中我们会关注以下几个信息,我们也希望计算机可以和我们一样识别
    • 目标是什么
    • 目标位置
    • 目标在做什么
    • 目标之间的关系

计算机视觉/深度学习发展史

  • 起源:20世纪50年代统计模式识别,二维图像分析
  • 诞生:1974年MIT科学家Minsky带其学生David Marr暑期课题进行研究,1981人工智能计算机视觉专辑,Marr视觉计算理论得到迅速发展
  • 发展:
    • 80年代以后
      • 计算能力迅速增长, 视觉计算成本极大降低
      • 以Marr理论为基础的视觉理论广泛研究
      • 视觉技术得到迅速发展,在视频监控、工业分析等领域得到广泛应用
    • 2000年后,特征提取和基于学习的视觉得到迅速发展
    • 2006年,Hinton提出深度学习
    • 2010年,微软使用深度学习再语音方面取得突破发展
    • 2015年后,深度学习在视觉个应用领域取得突破:
      • 2015, 在ImageNet上的识别准确率首次超越人类
      • 2016, Tesla创造了56亿公里自动驾驶路测数据
      • 2017, iPhonX宣布引入Face ID高精度人脸识别技术,随后,华为也在手机实现了该技术
      • 2018, OpenAI 2:1战胜人类DOTA2高手队
      • … 人类可能在很多方面完全无法和计算机匹敌

计算机视觉应用趋势

  • 服务机器人
  • 安防监控
  • 自动驾驶
  • 智能穿戴
  • 无人机快递

第一个视觉系统程序

1 ) C++版本

环境:

  1. win10
  2. Visual Studio 2015或更高版本(社区版免费)
  3. OpenCV 3.x版本
  4. 具体配置方式:https://jingyan.baidu.com/article/dca1fa6f13bd55f1a44052b9.html
#include "opencv2/opencv.hpp"
using namespace cv;

int main(void) {
    char *fn = "D:\\lena.jpg";
    Mat image = imread(fn);
    imshow("Hello, world!", image);
    waitKey(0); // 不加这句话,窗口会闪退
}

2 ) python版本

import cv2

img = cv2.imread(r'D:\lena.jpg') # 这里通过r不用进行转义了
cv2.imshow('Hello, world!', img)
cv2.waitKey()
cv2.destroyAllWindows()

视觉系统的构成要素

  1. 照明设备:光源
  2. 成像设备:相机
  3. 处理设备:主机
  4. 算法软件:视觉处理系统

程序扩展

1 )图像改变大小

  • C++函数: void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
  • Python函数: dst = cv.resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )

2 ) 图像平滑

  • 高斯平滑: 会把原始图像模糊化, 可以去除原始图片噪声
  • Opencv中提供一个函数对原始图像做高斯平滑滤波
    • C++: void GaussianBlur( const Mat& src, Mat& dst, Size ksize,double sigmaX, double sigmaY=0,int borderType=BORDER_DEFAULT );
      • 参数1:原始图像
      • 参数2:滤波后的图像
      • 参数3:采用的高斯滤波器模板的大小,通常取值33或55
      • 参数4和5:代表x和y方向高斯函数宽度的信息
    • Python: dst = cv.GaussianBlur(src,ksize,sigmaX[,dst[,sigmaY[,borderType]]])

3 ) 图像颜色空间转换和阈值化

  • void cvtColor(InputArray src, OutputArray dst, int code,int dstCn=0);
  • void threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);

4 ) 全部代码参考

C++版本:

#include "opencv2/opencv.hpp"
using namespace cv;

int main() {
    char * fn = "D:\\lena.jpg";
    Mat image = imread(fn);
    Mat imageGauss, image1, image2, gray, gray1, hsv, hsvChannels[3];

    // 对图像做高斯平滑处理并显示
    GaussianBlur(image, imageGauss, size(5, 5), 0);
    imshow("source image", image);
    imshow("Gaussian filtered image", imageGauss);
    waitKey();

    // 对图像使用resize和pyrDown缩小一半再一半, 显示图像
    resize(image, image1, Size(image.cols/2, image.rows/2)); // image1的大小就是原始图像image宽和高的一半
    pyrDown(image1, image2); // 另一个opencv的函数可以把image1图像缩小1半, 变为image2的图像(原始图像的1/4)

    // 彩色转灰度并作阈值化显示
    // cvtColor函数把原始图像转换为另外一种颜色空间的图像
    // threshold函数把原始图像通过指定的阈值转换成目标的黑白图像,大于阈值则白,小于则黑
    cvtColor(image, gray, COLOR_BGR2GRAY); // 将原始图像image转化为灰度图像, COLOR_BGR2GRAY 表示BGR三通道的图像向灰度图像的转换
    threshold(gray, gray1, 120, oxff, THRESH_BINARY); // 通过threshold完成了从gray到二值化图像gray1的转换,大于阈值120的所有的像素值都设置为16进制的ff白色
    imshow("gray", gray); // 显示灰度图像
    imshow("threshold image", gray1); // 显示二值化图像
    waitKey();
}

python版本

import cv2 as cv
filename = r'D:\lena.jpg'
img = cv.imread(filename)

imgGauss = cv.GaussianBlur(img, (5,5), 0) # 高斯模糊 使用了5*5大小的卷积模板
image1 = cv.resize(img, (int(img.shape[1]/2), int(img.shape[0]/2)))
image2 = cv.pyrDown(image1) # 颜色转化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # opencv缺省的彩色图像颜色排列是BGR模式与RGB模式略有区别
_, gray1 = cv.threshold(gray, 120, 0xff, cv.THRESH_BINARY) # 阈值化

cv.imshow("source image", img)
cv.imshow("Gaussian filtered image", imgGauss)
cv.imshow("half size", image1)
cv.imshow("quarter size", image2)
cv.imshow("gray", gray)
cv.imshow("threshold image", gray1)

cv.waitKey()
cv.destroyAllWindows()

视觉计算理论架构

  • 目的:通过视觉系统,重建三维物体的形状和位置
  • 理论的三个层次:
    • 初始略图(2维):过零点(zero-crossing)、短线段、端点等基元特征
    • 2.5维:对物体形状的一些粗略描述
    • 3维:对物体的三维描述
  • 计算机视觉的早期图像表示模型是Part-based, 这样就可以通过part这种组合式的方法表示物体。但很多自然场景的物体没有这么强的结构。
  • 80年代,特征检测和机器学习也开始组合应用,但对物体结构有严格限制(指定对象类型)。只能在少数场合取得比较好的效果。
  • 2000-2012年,局部特征描述得到迅速发展,如:SIFT/HOG
  • 特征描述具有通用性,结合SVM等机器学习方法, 但效果有限。
  • 2012年后,深度学习方法兴起。特征->自动提取;层数->很深
  • eg.MS的ResNet 152层

计算机视觉参考书

-《数字图像处理 基础篇》2002
-《数字图像处理(第三版)》2017
-《OpenCV2计算机视觉编程手册》2013
-《计算机视觉-算法与应用》2012
-《机器视觉》2017
-《计算机视觉教程(第2版)》

发布了417 篇原创文章 · 获赞 228 · 访问量 70万+

猜你喜欢

转载自blog.csdn.net/Tyro_java/article/details/104431943