關於人工智能
人工智能是計算機科學的一個分支,它企圖瞭解智能的實質,並生產出一種新的能以人類智能相似的方式做出反應的智能機器。計算機視覺是人工智能的一個分支,它研究如何使人工系統從圖像或多維數據中“感知”的科學。
人類技術發展歷史
- 人類歷史就是一部技術發展的歷史,經歷了這麼幾個階段:
- 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高手隊
- … 人類可能在很多方面完全無法和計算機匹敵
- 80年代以後
計算機視覺應用趨勢
- 服務機器人
- 安防監控
- 自動駕駛
- 智能穿戴
- 無人機快遞
- …
第一個視覺系統程序
1 ) C++版本
環境:
- win10
- Visual Studio 2015或更高版本(社區版免費)
- OpenCV 3.x版本
- 具體配置方式: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 )圖像改變大小
- 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]]])
- C++:
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版)》