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版)》

發佈了412 篇原創文章 · 獲贊 222 · 訪問量 69萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章