<p id="bffd9"><cite id="bffd9"></cite></p>

      <cite id="bffd9"><b id="bffd9"><thead id="bffd9"></thead></b></cite>
        <output id="bffd9"><cite id="bffd9"></cite></output>

              <p id="bffd9"></p>

                    <p id="bffd9"></p>
                    只發布交易干貨的網站
                    用實戰期貨交易系統和心得助你重塑交易認知

                    正規期貨開戶 | 手續費只+1分

                    90%交易者的手續費都被加收超1倍,一起看看最新的交易所手續費一覽表吧!

                    人工智能概念(人工智能解析)

                    AI 已經被炒得如火如荼,那么生活在這個快速變化時代的我們,不管你身處哪個行業,都不該置身事外,多多少少去了解一下,才不會和這個快速變化的時代格格不入,倍感孤獨。開篇我提過兩本書,如果你粗略翻看過,多少能理解個大概。為了讓沒有任何經驗的外行能夠快速的進入AI的神秘世界,今天就來好好討論怎么開始,如何下嘴。

                    AI 是個很寬泛的東西,我們通常的理解,它包括機器學習,自然語言處理,視覺識別,涉及的學科如計算機科學,數學,認知學,心理學,社會學,哲學等,我們可以把一切關于計算模擬人腦思維或功能的模擬均可以認為是AI。可以看出 AI 不是一個孤立的學科領域,其實很好理解,人類智能的形成也是包含多方面的,要模擬人的智能,離不開各領域的研究。如此說來,想進入AI領域豈不是很難?這里討論的只是AI中的某些領域,或許通過這一領域的學習,以點帶面的去了解AI的全貌,或許是個比較切合實際的做法,在接下來的篇章中,各領域均會涉及,因為是入門級別的,所以淺嘗則止,你可以選擇你喜歡的領域去專研。

                    接下來把我們將要涉及的內容概述一下:

                    1)數據挖掘和分析:主要探討數據的抓取,處理和分析

                    2)機器學習:主要探討深度學習模型及應用

                    3)計算機視覺:主要介紹和視覺識別有關的庫及其應用

                    4)自然語言分析:主要介紹自然語言的識別和合成,另外會涉及到情感分析的內容

                    5)深度學習算法:介紹幾個常見的深度學習算法及應用

                    以上每一個分支都可以展開來講,都可以作為一個獨立的領域花一輩子去研究,但人生苦短,這里只是點到為止,盡可能地取其精華。

                    一、首先來說說什么是數據挖掘

                    數據挖掘就是指從數據中獲取知識。

                    這樣的定義方式比較抽象,但這也是業界認可度最高的一種解釋了。對于如何開發一個大數據環境下完整的數據挖掘項目,業界至今仍沒有統一的規范。說白了,大家都聽說過大數據、數據挖掘等概念,在我們的商業社會里,每個人或組織的任何行為都會產生大量的數據,從表面上看這些數據是多么的繁雜無序,然而,這些數據的背后往往有某種潛在的邏輯,針對這些邏輯的挖掘探討,往往可以發掘出非常有價值的東西。這個就是數據挖掘需要做的事情。

                    那么,數據挖掘通常的流程是怎么樣的呢?從形式上來說,數據挖掘的開發流程是迭代式的。開發人員通過如下幾個階段對數據進行迭代式處理:

                    其中,

                    解讀需求

                    絕大多數的數據挖掘工程都是針對具體領域的,因此數據挖掘工作人員不應該沉浸在自己的世界里YY算法模型,而應該多和具體領域的專家交流合作以正確的解讀出項目需求。這種合作應當貫穿整個項目生命周期。

                    搜集數據

                    在大型公司,數據搜集大都是從其他業務系統數據庫提取。很多時候我們是對數據進行抽樣,在這種情況下必須理解數據的抽樣過程是如何影響取樣分布,以確保評估模型環節中用于訓練(train)和檢驗(test)模型的數據來自同一個分布。

                    預處理數據

                    預處理數據可主要分為數據準備和數據歸約兩部分。其中前者包含了缺失值處理、異常值處理、歸一化、平整化、時間序列加權等;而后者主要包含維度歸約、值歸約、以及案例歸約。后面兩篇博文將分別講解數據準備和數據歸約。

                    評估模型

                    確切來說,這一步就是在不同的模型之間做出選擇,找到最優模型。很多人認為這一步是數據挖掘的全部,但顯然這是以偏概全的,甚至絕大多數情況下這一步耗費的時間和精力在整個流程里是最少的。

                    解釋模型

                    數據挖掘模型在大多數情況下是用來輔助決策的,人們顯然不會根據"黑箱模型"來制定決策。如何針對具體環境對模型做出合理解釋也是一項非常重要的任務。

                    二、機器學習

                    作為機器學習領域的先驅,Arthur Samuel在 IBM Journal of Research and Development期刊上發表了一篇名為《Some Studies in Machine Learning Using the Game of Checkers》的論文中,將機器學習非正式定義為:”在不直接針對問題進行編程的情況下,賦予計算機學習能力的一個研究領域。”

                    在機器學習的歷史上,Arthur Samuel做了一些非常酷的事情。他曾經做了一個西洋棋程序,讓計算機自己跟自己下棋,下棋速度非常快,因此Arthur Samuel讓他的程序自己和自己下了成千上萬盤棋,逐漸的,程序開始慢慢意識到怎樣的局勢能導致勝利,怎樣的局勢能導致失敗,因此它反復的自己學習“如果讓競爭對手的棋子占據了這些地方,那么我輸的概率可能更大”或者“如果我的棋子占據了這些地方,那么我贏的概率可能更大”所以漸漸的,Arthur Samuel的程序掌握了哪些局面可能會輸,哪些局面可能會贏,因此奇跡出現了,他的程序的棋藝甚至遠遠超過了他自己。ArthurSamuel讓他的程序比他自己更會下棋,但是他并沒有明確的教給程序具體應該怎么下,而是讓它自學成材。

                    機器學習的類型有哪些呢?

                    監督學習

                    訓練數據中,每個樣本都帶有正確答案。

                    個人理解,這種方式有正確答案的監督或者說參照,所以稱為監督學習。就好像老師提供對錯指示、告知最終答案的學習過程。

                    學習器從訓練數據中學到正確答案的決策函數 y=f(x) 用于新的數據預測。

                    典型任務:預測數值型數據的回歸、預測分類標簽的分類、預測順序的排列

                    應用:手寫文字識別、聲音處理、圖像處理、垃圾郵件分類與攔截、網頁檢索、基因診斷、股票預測等。

                    無監督學習

                    訓練數據中,每個樣本都沒有正確答案。

                    學習器自己在訓練數據中找規律。就像在沒有老師的情況下,學生自學的過程。 所以稱為無監督學習。

                    典型任務:聚類(相似點)、異常檢測(異常點)。

                    應用:人造衛星故障診斷、視頻分析、社交網站解析、聲音信號解析、數據可視化、監督學習的前處理工具等。

                    半監督學習

                    訓練數據中,少部分樣本有正確答案。

                    學習器使用大量的沒有正確答案的數據,以及同時使用有正確答案的數據,來進行模式識別工作。在有正確答案的樣本幫助下,獲得比只用無正確答案的樣本得到的結果更好的學習效果,提高學習器的精度。是無監督學習和監督學習的結合,所以稱為半監督學習。

                    典型任務:半監督分類,半監督回歸,半監督聚類,半監督降維

                    強化學習

                    強化學習把學習看作試探評價過程,Agent選擇一個動作用于環境,環境接受該動作后狀態發生變化,同時產生一個強化信號(獎或懲)反饋給Agent,Agent根據強化信號和環境當前狀態再選擇下一個動作,選擇的原則是使受到正強化(獎)的概率增大。選擇的動作不僅影響立即強化值,而且影響環境下一時刻的狀態及最終的強化值。

                    三、計算機視覺

                    通俗地講,計算機視覺就是給機器賦予視覺的能力,比如裝上攝像頭,通過程序算法讓機器通過攝像頭獲取的圖像進行處理,模式識別,并達到理解的目的。這個比較好理解,現在我們身邊就可以看到相關的應用,比如OCR技術,識別圖像文字,人臉識別,指紋識別,這個很多智能手機已經內建了這些功能,而且趨于成熟。

                    計算機視覺學習過程中會用到不少現成的庫,比如openCV, DLIB, Face++等等開源的庫文件,在以后的篇幅中會詳細講解。

                    四、自然語言處理(NLP)

                    一般來說,自然語言處理的目的是讓機器能夠執行人類所期望的某些語言功能自然語言處理是人工智能的終極發展目標,大概可以分為人類語言的處理(語言學)和機器語言的翻譯.

                    其大致流程是語音識別與合成---語音分析、詞法分析、句法分析、語義分析、語用分析

                    后面篇幅重點介紹第三方庫的使用,實現簡單的語音識別和合成,并初步涉略情感語義的分析模型。非常成熟的模型目前還沒有,但這方面的研究非常的熱,畢竟它是實現AI應用的很重要的一部分。

                    五、深度學習

                    深度學習,主要就是多層神經網絡。而多層神經網絡目前效果比較好的是卷積神經網絡,目前在圖像和音頻信號上效果比較好,而在自然語言處理上效果沒有顯示出來。

                    深度學習從統計學的角度來說,就是在預測數據的分布,從數據中學得一個模型然后再通過這個模型去預測新的數據,這一點就要求測試數據和訓練數據必須是同分布。

                    從Inception的角度上來看的話,其實深度學習是在模擬人腦的工作機制,但實際上,目前對于人腦的認知機制還不是很清楚,神經網絡算法也只是簡單模擬人腦而且,談不上真正模擬。以下是神經網絡的模型圖:

                    定義一個深度學習模型,需要解決以下3個問題:

                    1)激活函數,也就是先對于輸入神經元的激活值。一般的有 logistic 、tanh、以及ReLU。

                    2)代價函數。一般學習過程都是優化問題。代價函數一般采用歐式距離。

                    3)優化策略。最簡單的用剃度下降。

                    根據剃度更新權重,進而減小代價函數。

                    由于多層神經網絡通常模型很復雜,為此還需要解決過擬合問題,目前比較有效的是通過數據增廣和dropout技術。

                    區別于一般的機器學習算法,深度學習更新是機器學習,之所以這么說是因為它能自動學習特征,不用人工定義特征,所以你可以不需要懂太多領域相關的知識,因為算法懂得自動學習特征。

                    好的,到現在為止,大家對AI涉及的這幾個方面有了初步的印象,是不是很有趣,雖然有不少專業名詞,聽起來諱莫如深,不過不要擔心,只需要你依然保持這個熱情和好奇心,隨我逐一展開,一起窺探AI的奧秘。

                    一、開發環境搭建

                    學習AI涉及到計算機編程,在正式進入相關主題學習之前,有必要了解一下用什么編程語言來實現。這里我大力推薦大家使用python,有句話說的好:“人生苦短,我用python”,為什么這么說呢,因為是python的特性決定的,python相對來說比較容易掌握,而且粘性強,可以方便的適應不同平臺,另外有用不完的開源庫可供選擇,你省去了大量的開發時間,我們學習編程,目的就是快速應用,為我們的日常生活工作解決問題的,如果學習一門語言花掉我們大半生的經歷,那又有什么意義呢?

                    毫無疑問,如果你沒有任何編程經驗,請你使用python吧,當然,如果你有其它編程經驗,比如學過C或者JAVA,也無妨,轉到python更是易如反掌。python就像是為數據分析,機器學習而生的,好的,先來看看如何配置python的開發環境。

                    開發環境的搭建大家可以參考網上資料,根據你所使用的平臺選擇,我在這里就不啰嗦了,相信大家會用度娘。這里可以提供一個參考鏈接:

                    https://www.cnblogs.com/EmptyFS/p/6184627.html

                    這里提醒一下,python的版本主要有2.7.6 和 3.5/3.6, 2 和3語法上有許多區別,建議你直接用3,當然,網上還有很多用舊版本寫的例程,如果你想在3的環境下運行,需要做一些更改才行,為了不必要的麻煩,這里提到的例程均采用3以上的版本。如果你在搭建的時間遇到問題,可以留言。

                    開發環境搭建好之后,建議你抽空翻一下python入門的教程,至少懂得怎么運行一個hello world程序。可以參考網上教程:http://www.runoob.com/python/python-tutorial.html

                    我估計你只要花一周,每天1個小時的時間過一遍這些內容,基本上就可以了,當然,想要進階熟悉python編程,一周肯定是不夠的,但不影響你對后面的學習,基礎打好是便于你理解后面的一些代碼,加上不斷的練習,你一定可以邊學邊深入編程的精髓的,所以不用擔心,也不要著急。

                    關于集成的開發環境IDE,這個我不作推薦,個人習慣問題,我自己一般采用windows下或者linux下的終端,運行程序或安裝必需的包之類的,用Note

                    pad++編寫程序代碼,當然也可以用現在比較流行的jupyter notebook實現實時編程體驗,非常直觀(如下圖),相關教程可以度娘,不在這里詳述了。

                    接下來安裝一些必要的第三方庫,數據挖掘工作需要用到這些庫,在正式開始第一個模塊之前確保一下庫已經安裝:

                    1)numpy:Python科學計算的基礎包。

                    2)scipy:是一組專門解決科學計算中各種標準問題域的包的集合。

                    3)matplotlib:是最流行的用于繪制數據圖表的Python庫。

                    4)pandas:主要提供快速便捷地處理結構化數據的大量數據結構和函數。

                    5)lxml – C語言編寫高效HTML/ XML處理庫。支持XPath。

                    8)BeautifulSoup – 低效HTML/ XML處理庫,純Python實現。

                    當然,以上是主要的,還有很多,碰到需要的時候再講解。安裝方法可以參考:http://blog.csdn.net/github_35160620/article/details/52203682 這里有詳細的介紹,也非常簡單。

                    好的,到此為止,你基本完成了基礎的搭建,接下來讓python帶我們飛,開啟神奇之旅吧!

                    二、數據采集

                    談到數據采集,我們說一切的真相的基礎來自于數據,沒有數據,一切盲目的下結論都是耍流氓。所以說數據的采集是多么的重要,后面我們要講到的數據分析和挖掘,前提是要有數據,而且這個數據量越大越好,這也就是為什么大數據這么熱的原因,有人比喻大數據是石油,誰掌握了大數據誰就掌握了資源,掌握未來的經濟命脈。看看幾大BAT就知道了,他們掌握著巨量的數據,包括現在很多的共享經濟,主要目的就是收集用戶數據,用戶數據就是未來的金礦,有些人可能不太理解,不過沒關系,知道一下就行了,只要明白數據的重要性就足夠了。又扯遠了。

                    話說回來,我們如何獲取數據呢?當然獲取數據的方式有很多,你可以去圖書館翻閱資料,也可以自己試驗獲取數據,然而很多情況是上網獲取,不要忘了互聯網這個寶庫,今天的例程主要講如何從網絡獲取數據,也就是編寫一個簡單的網絡爬蟲,幫助你自動獲取你想要的數據。

                    編寫網絡爬蟲有很多的方法,復雜程度也各異,考慮到大家還是初學者,今天的例子將會非常簡單,所以說是小試牛刀嘛!

                    比如我想抓取新浪網頁的科技新聞內容,用最簡單的bs4庫就可以輕松實現,以下是例程,運行這個例程前確保你已經安裝了beautifulsoup4,安裝方法很簡單,打開cmd如下圖:

                    在>頭后面輸入pip install BeautifulSoup4 就會自動安裝了。

                    完整代碼:

                    第一行from bs4 import BeautifulSoup 從BeautifulSoup庫中導入bs4方法,python中導入第三方庫的方式 import 庫名,from xxx import xxx表示從第三方庫中導入需要的方法或函數,不需要全部的方法,這樣可以節省資源,上面提到的json是網絡數據交互解析時需要的庫,re是正側表達式庫,主要用于字符串匹配的包,兩個庫均屬于python的標準庫,requests庫網頁請求時需要的庫,暫時大概知道這些庫干嘛的就行,不必深究。

                    第10行requests.get(url)方法把整個網頁內容獲取并存入web_data變量,第11行用encoding()解析網頁內容為utf-8格式,便于后續處理。第12行用bs方法提取文本,并存入soup列表,這個列表獲取的是新聞標題鏈接。

                    下面的for循環就是分別把前面5條新聞打印輸出。不出意外,你的窗口會輸出以下內容:

                    恭喜你!你在自己的機子上運行了一個爬蟲,是不是很酷

                    三、人臉識別的程序

                    上回討論了一下數據收集的一點皮毛,今天我們嘗試一下人臉識別吧,利用你計算機的攝像頭,或者USB即插即用的外置攝像頭也行。看完今天的教程,你一定也能做出一個人臉識別的程序來,而且用不了多少代碼,好了,開工吧。

                    在正式寫代碼之前,確保你的計算機安裝了openCV,openCV是一個基于BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。

                    和之前安裝第三方庫一樣,在終端下輸入以下命令:

                    pip install opencv-python

                    等安裝好了輸入>import cv2 as cv 測試一下,如果沒有出現錯誤提示,而是換行出現>>>,說明安裝成功了。好的接下來我測試輸入幾行代碼測試一下openCV, 你可以在jupyter notebook上面運行或者用其它你喜歡的IDE都可以,建議你先使用notepad++ 或者editplug專門的代碼編輯器。這兩個工具均可以免費下載使用。

                    測試代碼:

                    確保d:python文件夾中含有test.jpg測試圖片,代碼寫好之后保存到一個目錄下面,比如d:python文件夾中,保存文件名為test1.py, 當然你可以自己建一個文件夾用于存放代碼。然后在命令終端進入到這個文件夾,然后用以下命令運行python腳本。

                    d:python python test1.py 回車運行腳本。

                    如果不出意外,程序運行完會出現測試圖片窗口。

                    簡單解釋一下上面的腳本:

                    第一行帶#號的是注釋,解釋代碼用的,便于程序的閱讀和理解

                    第二行導入我們開始安裝的opencv庫

                    第四行用cv的一個.imread()方法讀取一張外部圖片并存入img變量

                    第六行用namedWindow()方法定義一個叫Image的窗口

                    第七行用imshow()方法把圖片img通過叫Image的窗口來顯示

                    第八行.waitKey()方法接受鍵盤輸入,0表示任意鍵輸入

                    最后一行.destroyAllWindows()方法銷毀所有顯示的窗體,也就是說當檢測到鍵盤輸入后,窗體關閉。也就是退出程序了。是不是很好理解,至于那些方法怎來的,你不用太細究,這些方法都是cv2模塊定義好的,直接拿來用就行了。以下是我機子上測試的效果,顯示一張企鵝圖:

                    到此為止,你已經離夢想又進了一步,呵呵。

                    接下來,我們試試怎么調用攝像頭來獲取視頻或圖像,這個為接下來的人臉識別打下基礎:

                    例程已經有非常詳細的注解了,我就不另外說明。獲取攝像頭視頻是不是也很簡單?不到15行的代碼。好了離我們的目標又進了一步,接下來怎么識別圖像中的人臉呢?

                    要識別出人臉,必須下載haar特征分類器,如果你是直接從openCV官網下載并單獨安裝的話,可以在opencv目錄里面找到分類器,我機子上的目錄是C:opencvsourcesdatahaarcascades

                    下載OpenCV中的Haar特征分類器,你可以從Opencv官網下載源程序解壓后獲得Haar特征分類器,也可以直接下載所需的xml文件。我建議你從官網下載,解壓后可以找到haar目錄,下面程序目錄記住相應做更改。

                    完整代碼如下,多了幾行代碼,但還是很簡潔的:

                    運行效果如圖:

                    是不是沒有你想象的這么復雜呢?當然,我們借助了好幾個庫,所有直接調用了一些方法,只要我們知道怎么使用這些方法就行。真正不需要你敲多少代碼。保留你的好奇心,后面還有更有意思的應用等著你,我們將在后面學習了語言合成之后,讓計算機真正識別出你是誰,而不只是圈出視頻中的臉而已

                    四、爬取動態頁面數據

                    今天我們將實戰一下,如果抓取動態頁面的內容,這些內容的抓取比較麻煩一些,需要分析網站源文件才行,Javascript 腳本寫的頁面,我們需要利用chrome里面的開發者工具,來找到真正的信息鏈接,并找到頁面內容加載的邏輯才行。

                    比例商品評論信息是我們關注的,舉一個京東上的商品例子,就拿我們的產品Jabra elite sport這個產品的用戶評論練手。

                    首先用chrome瀏覽器打開京東,找到這個產品,產品頁面如下:

                    再選擇評論,你會發現網絡頁面主題是不變的,只是動態的顯示商品評論在特定區域,并且一次顯示10個評論,總共有效評論有100頁。

                    我們在選擇其它其中一個頁面,比如第二頁,你會發現地址欄是不變的,說明這個評論信息是JS腳本動態加載的,這時我們就需要利用開發者工具進行分析找到真正的鏈接地址。開發者工具可以按圖找到:

                    打開工具后,選擇其中兩頁評論,刷新頁面后,工具會重新載入詳細的信息,具體如下:

                    分別點擊‘name’欄里的‘productPageComments...’ 分析兩個頁面的header里面的url地址,

                    第一頁的url:https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv1008&productId=5308806&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&rid=0&fold=1

                    第二頁的url:https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv1008&productId=5308806&score=0&sortType=5&page=1&pageSize=10&isShadowSku=0&rid=0&fold=1

                    兩者的區別就是‘page=’后面的數字,第一頁是0第二頁是1。我們再看看是否評論就在這個鏈接的頁面里加載的,切換到‘preview’查看具體腳本:

                    紅色框起來的就是頁面顯示的十條評論,沒有問題,所以就是它了。找到確切的url地址就好辦了。接下來上代碼:

                    為了便于維護代碼,把商品名,對應實際的url地址,頁碼總數等信息放到excel表格中,可以隨時添加修改,上面代碼包含了excel文件讀取操作,可以適用于大部分商品的評論數據抓取。抓取后的數據包含評論ID,分數,時間,內容,設備等內容并自動存入CSV格式的文檔,便于后續的數據分析處理。

                    程序運行后,按照提示輸入excel文件名,商品行數,然后自動運行,根據數據量大小,需要抓取的時間也不同。以下是實例運行的情況:

                    這里說明一下:為了避免json請求操作過于頻繁,招致京東服務器限制,甚至封堵IP,同時作為有道德的數據采集者,理應遵行一定的規則,所以設置間隔時間,time.sleep(), 10~15的隨機間隔時間。

                    好了到此為止,你在數據挖掘的路上又近了一步,后續課程將對爬取得數據進行分析處理

                    五、簡單的數據分析,詞云圖

                    今天的課程講一下簡單的數據分析,詞云圖,當然數據分析遠不止做一個詞云圖,這里只是從簡單的開始,你會驚訝于python的強大。做出漂亮的詞云圖非常簡單。

                    詞云圖,能直觀的展示詞匯的使用頻率,頻度越高,顯示的越大,可以了解關注度情況。在數據分析和挖掘方面有一定用途,也是比較常見的一個方法。

                    生成詞云需要用到wordCloud庫,這個安裝和其它庫的安裝一樣,很簡單,這里不再贅述。先導入需要的庫文件

                    結巴清洗庫jieba主要用于生產詞云前對文本文件進行清洗,把一些沒有意義的詞剔除。matplotlib是數據可視化常用的庫,pickle是python語言的一個標準模塊,安裝python后已包含pickle庫,不需要單獨再安裝。pickle模塊實現了基本的數據序列化和反序列化。通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲;通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。

                    序列化的方法為 pickle.dump(),該方法的相關參數如下:

                    pickle.dump(obj, file, protocol=None,*,fix_imports=True)

                    該方法實現的是將序列化后的對象obj以二進制形式寫入文件file中,進行保存。它的功能等同于 Pickler(file, protocol).dump(obj)。關于參數file,有一點需要注意,必須是以二進制的形式進行操作(寫入)。

                    創建詞云函數wordCloud(), 帶三個參數,便于用戶自定義輸入: 文本文件,背景圖片和顏色,確保文件在同一目錄下。還是以Jabra耳機的客戶評論數據來做例子,前面課程已經從網站上抓取出來了。

                    函數定義好之后,就可以調用了:

                    測試一下效果,還算不錯:

                    六、人臉識別

                    前面講的人臉識別,其實談不上真正識別,只是識別是不是人臉,然后標注出來,在現實中我們更希望機器識別出誰來,而不僅僅把臉標注出來,今天這個例子就是教你怎么識別出你是誰。

                    好的,要識別出人臉并標注出身份,必然需要解決一個問題,就是數據比對問題,至少要告訴機器某個人的特征,通過學習之后,機器就可以通過算法識別出圖像或攝像頭看到的人是誰。

                    這次引入一個新的庫,叫face_recognition, 這個庫屬于第三方庫,也需要安裝,很簡單,和之前介紹的方法一樣直接安裝就行了。

                    直接上代碼,我這里用了幾位同事的大頭照片作為測試,呵呵。

                    上面代碼主要就是建立人臉的特征模型,用于后面的識別對比,當然你可以根據需要建立這個特征數據庫,或者可以調用外部數據,便于代碼維護和可拓展性。

                    然后通過攝像頭獲取圖像,并進行比對識別。應該很好理解,我就不展開解釋了。

                    運行的效果如下:

                    七、卷積神經網絡VGGNet

                    深度學習因其強大的特征表示和特征學習,可以顯著提高機器學習算法的效果。與基本的機器學習算法不同,深度學習算法自動學習到特征的表示方法,不需要人工參與特征的提取,深度學習算法在語音、圖像和文本方面得到廣泛的應用。

                    深度學習里面比較流行的如卷積神經網絡(CNN),在解釋什么是卷積神經網絡之前,先了解一下什么是神經網絡。

                    傳統的神經網絡

                    一個神經網絡最簡單的結構包括輸入層、隱含層和輸出層,每一層網絡有多個神經元,上一層的神經元通過激活函數映射到下一層神經元,每個神經元之間有相對應的權值,輸出即為我們的分類類別。

                    其對應的公式如下:

                    其中,該單元也可以被稱作是Logistic回歸模型。當將多個單元組合起來并具有分層結構時,就形成了神經網絡模型。下圖展示了一個具有一個隱含層的神經網絡。

                    其對應的公式如下:

                    比較類似的,可以拓展到有2,3,4,5,…個隱含層。神經網絡的訓練方法也同Logistic類似,不過由于其多層性,還需要利用鏈式求導法則對隱含層的節點進行求導,即梯度下降+鏈式求導法則,專業名稱為反向傳播,關于算法在機器學習相關資料中參考,這里不詳細介紹。

                    卷積神經網絡CNN

                    卷積神經網絡與普通神經網絡的區別在于,卷積神經網絡包含了一個由卷積層和子采樣層構成的特征抽取器。在卷積神經網絡的卷積層中,一個神經元只與部分鄰層神經元連接。在CNN的一個卷積層中,通常包含若干個特征平面(featureMap),每個特征平面由一些矩形排列的的神經元組成,同一特征平面的神經元共享權值,這里共享的權值就是卷積核。卷積核一般以隨機小數矩陣的形式初始化,在網絡的訓練過程中卷積核將學習得到合理的權值。共享權值(卷積核)帶來的直接好處是減少網絡各層之間的連接,同時又降低了過擬合的風險。子采樣也叫做池化(pooling),通常有均值子采樣(mean pooling)和最大值子采樣(max pooling)兩種形式。子采樣可以看作一種特殊的卷積過程。卷積和子采樣大大簡化了模型復雜度,減少了模型的參數。卷積神經網絡的基本結構如圖所示:

                    卷積神經網絡由三部分構成。

                    第一部分是輸入層。

                    第二部分由n個卷積層和池化層的組合組成。

                    第三部分由一個全連結的多層感知機分類器構成。

                    局部感受野

                    卷積神經網絡有兩種神器可以降低參數數目,第一種神器叫做局部感知野。一般認為人對外界的認知是從局部到全局的,而圖像的空間聯系也是局部的像素聯系較為緊密,而距離較遠的像素相關性則較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。網絡部分連通的思想,也是受啟發于生物學里面的視覺系統結構。視覺皮層的神經元就是局部接受信息的(即這些神經元只響應某些特定區域的刺激)。如下圖所示:左圖為全連接,右圖為局部連接。

                    在上右圖中,假如每個神經元只和10×10個像素值相連,那么權值數據為1000000×100個參數,減少為原來的萬分之一。而那10×10個像素值對應的10×10個參數,其實就相當于卷積操作。

                    權值共享

                    人工智能概念(人工智能解析)

                    但其實這樣的話參數仍然過多,那么就啟動第二級神器,即權值共享。在上面的局部連接中,每個神經元都對應100個參數,一共1000000個神經元,如果這1000000個神經元的100個參數都是相等的,那么參數數目就變為100了。

                    怎么理解權值共享呢?我們可以這100個參數(也就是卷積操作)看成是提取特征的方式,該方式與位置無關。這其中隱含的原理則是:圖像的一部分的統計特性與其他部分是一樣的。這也意味著我們在這一部分學習的特征也能用在另一部分上,所以對于這個圖像上的所有位置,我們都能使用同樣的學習特征。

                    更直觀一些,當從一個大尺寸圖像中隨機選取一小塊,比如說 8x8 作為樣本,并且從這個小塊樣本中學習到了一些特征,這時我們可以把從這個 8x8 樣本中學習到的特征作為探測器,應用到這個圖像的任意地方中去。特別是,我們可以用從 8x8 樣本中所學習到的特征跟原本的大尺寸圖像作卷積,從而對這個大尺寸圖像上的任一位置獲得一個不同特征的激活值。

                    如下圖所示,展示了一個3×3的卷積核在5×5的圖像上做卷積的過程。每個卷積都是一種特征提取方式,就像一個篩子,將圖像中符合條件(激活值越大越符合條件)的部分篩選出來。

                    多卷積核

                    上面所述只有100個參數時,表明只有1個10*10的卷積核,顯然,特征提取是不充分的,我們可以添加多個卷積核,比如32個卷積核,可以學習32種特征。在有多個卷積核時,如下圖所示:

                    上圖右,不同顏色表明不同的卷積核。每個卷積核都會將圖像生成為另一幅圖像。比如兩個卷積核就可以將生成兩幅圖像,這兩幅圖像可以看做是一張圖像的不同的通道。如下圖所示,下圖有個小錯誤,即將w1改為w0,w2改為w1即可。下文中仍以w1和w2稱呼它們。

                    下圖展示了在四個通道上的卷積操作,有兩個卷積核,生成兩個通道。其中需要注意的是,四個通道上每個通道對應一個卷積核,先將w2忽略,只看w1,那么在w1的某位置(i,j)處的值,是由四個通道上(i,j)處的卷積結果相加然后再取激活函數值得到的。

                    所以,在上圖由4個通道卷積得到2個通道的過程中,參數的數目為4×2×2×2個,其中4表示4個通道,第一個2表示生成2個通道,最后的2×2表示卷積核大小。

                    Down-pooling

                    在通過卷積獲得了特征 (features) 之后,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓練分類器,例如 softmax 分類器,但這樣做面臨計算量的挑戰。例如:對于一個 96X96 像素的圖像,假設我們已經學習得到了400個定義在8X8輸入上的特征,每一個特征和圖像卷積都會得到一個 (96 ? 8 + 1) × (96 ? 8 + 1) = 7921 維的卷積特征,由于有 400 個特征,所以每個樣例 (example) 都會得到一個 7921 × 400 = 3,168,400 維的卷積特征向量。學習一個擁有超過 3 百萬特征輸入的分類器十分不便,并且容易出現過擬合 (over-fitting)。

                    為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態性”的屬性,這也就意味著在一個圖像區域有用的特征極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決于計算池化的方法)。

                    子采樣有兩種形式,一種是均值子采樣(mean-pooling),一種是最大值子采樣(max-pooling)。兩種子采樣看成特殊的卷積過程,如圖下圖所示:

                    (1)均值子采樣的卷積核中每個權重都是0.25,卷積核在原圖inputX上的滑動的步長為2。均值子采樣的效果相當于把原圖模糊縮減至原來的1/4。

                    (2)最大值子采樣的卷積核中各權重值中只有一個為1,其余均為0,卷積核中為1的位置對應inputX被卷積核覆蓋部分值最大的位置。卷積核在原圖inputX上的滑動步長為2。最大值子采樣的效果是把原圖縮減至原來的1/4,并保留每個2*2區域的最強輸入。

                    至此,卷積神經網絡的基本結構和原理已經闡述完畢。

                    多卷積層

                    在實際應用中,往往使用多層卷積,然后再使用全連接層進行訓練,多層卷積的目的是一層卷積學到的特征往往是局部的,層數越高,學到的特征就越全局化。

                    卷積神經網絡的訓練

                    本文的主要目的是介紹CNN參數在使用bp算法時該怎么訓練,畢竟CNN中有卷積層和下采樣層,雖然和MLP的bp算法本質上相同,但形式上還是有些區別的,很顯然在完成CNN反向傳播前了解bp算法是必須的。

                    Forward前向傳播

                    前向過程的卷積為典型valid的卷積過程,即卷積核kernalW覆蓋在輸入圖inputX上,對應位置求積再求和得到一個值并賦給輸出圖OutputY對應的位置。每次卷積核在inputX上移動一個位置,從上到下從左到右交疊覆蓋一遍之后得到輸出矩陣outputY(如圖4.1與圖4.3所示)。如果卷積核的輸入圖inputX為Mx*Nx大小,卷積核為Mw*Nw大小,那么輸出圖Y為(Mx-Mw+1)*(Nx-Nw+1)大小。

                    BackForward反向傳播

                    在錯誤信號反向傳播過程中,先按照神經網絡的錯誤反傳方式得到尾部分類器中各神經元的錯誤信號,然后錯誤信號由分類器向前面的特征抽取器傳播。錯誤信號從子采樣層的特征圖(subFeatureMap)往前面卷積層的特征圖(featureMap)傳播要通過一次full卷積過程來完成。這里的卷積和上一節卷積的略有區別。如果卷積核kernalW的長度為Mw*Mw的方陣,那么subFeatureMap的錯誤信號矩陣Q_err需要上下左右各拓展Mw-1行或列,與此同時卷積核自身旋轉180度。subFeatureMap的錯誤信號矩陣P_err等于featureMap的誤差矩陣Q_err卷積旋轉180度的卷積核W_rot180。

                    下圖錯誤信號矩陣Q_err中的A,它的產生是P中左上2*2小方塊導致的,該2*2的小方塊的對A的責任正好可以用卷積核W表示,錯誤信號A通過卷積核將錯誤信號加權傳遞到與錯誤信號量為A的神經元所相連的神經元a、b、d、e中,所以在下圖中的P_err左上角的2*2位置錯誤值包含A、2A、3A、4A。同理,我們可以論證錯誤信號B、C、D的反向傳播過程。綜上所述,錯誤信號反向傳播過程可以用下圖中的卷積過程表示。

                    權值更新過程中的卷積

                    卷積神經網絡中卷積層的權重更新過程本質是卷積核的更新過程。由神經網絡的權重修改策略我們知道一條連接權重的更新量為該條連接的前層神經元的興奮輸出乘以后層神經元的輸入錯誤信號,卷積核的更新也是按照這個規律來進行。

                    在前向卷積過程中,卷積核的每個元素(鏈接權重)被使用過四次,所以卷積核每個元素的產生四個更新量。把前向卷積過程當做切割小圖進行多個神經網絡訓練過程,我們得到四個4*1的神經網絡的前層興奮輸入和后層輸入錯誤信號,如圖所示。

                    根據神經網絡的權重修改策略,我們可以算出如圖所示卷積核的更新量W_delta。權重更新量W_delta可由P_out和Q_err卷積得到,如圖下圖所示。

                    VGGNet

                    該模型是Karen Simonyan和 Andrew Zisserman提出的卷積神經網絡,并獲得ILSVRC 2014的第二名,現在稱其為VGGNet。它主要的貢獻是展示出網絡的深度是算法優良性能的關鍵部分。他們最好的網絡包含了16個卷積/全連接層。網絡的結構非常一致,從頭到尾全部使用的是3x3的卷積和2x2的匯聚。他們的預訓練模型是可以在網絡上獲得并在Caffe中使用的。VGGNet不好的一點是它耗費更多計算資源,并且使用了更多的參數,導致更多的內存占用(140M)。其中絕大多數的參數都是來自于第一個全連接層。后來發現這些全連接層即使被去除,對于性能也沒有什么影響,這樣就顯著降低了參數數量。

                    目前使用比較多的網絡結構主要有ResNet(152-1000層),GooleNet(22層),VGGNet(19層)。大多數模型都是基于這幾個模型上改進,采用新的優化算法,多模型融合等。

                    八、CNN手寫字識別

                    手寫字識別基于MNIST數字庫,可以說是圖像識別領域的“hello world!”,它是google實驗室的Corrina Cortes和紐約大學柯朗研究所的Yann LeCun聯合創建的手寫數字數據庫,每個樣本數據是一張28x28像素的灰度手寫數字圖片,每張圖片對應一個數字,訓練庫有60000張手寫數字圖像,測試庫有10000張。如果你已經安裝了tensorflow,這個庫就已經在文件夾了,可以直接調用。

                    上圖簡單描述了識別過程

                    接下來我們就來構建基于CNN網絡來識別手寫數字,看看效果如何。如果你不是很了解CNN,你可以閱讀上一期關于卷積神經網絡的介紹,不然理解下面代碼可能存在問題。

                    先來為卷積神經網絡構建一個叫CNN()的類:

                    當定義好卷積神經網絡類CNN的初始化函數后,我們需要在卷積神經網絡類中定義卷積神經網絡CNN的訓練過程,其具體的訓練過程如下:

                    以上構建一個fit函數用于對卷積神經網絡模型進行訓練,在如上的卷積神經網絡中,包含了三個卷積層和下采樣層。當構建完整個卷積神經網絡模型后,將卷積神經網絡模型的對數據的預測值與樣本的真實標簽之間的交叉熵作為最終的損失函數,并求損失函數中的最小值。

                    接下來,我們來訓練CNN模型,用構建好的類,對MNIST手寫體識別的數據集進行訓練。

                    程序運行時,由于電腦配置原因,運行完成需要一點時間,深度學習考驗機器性能,卷積神經網絡實際上是對經典神經網絡的優化,減少了計算量而不顯著犧牲精確度的深度學習模型,通過稀疏連接,共享權值,池化來簡化計算的過程。如果不做卷積處理,運算時間可能需要好幾倍,以下是訓練過程:

                    可以看到訓練到第6步時可以達到0.9892水平了,一般到最后在驗證集上的準確率可以達到0.99以上,對于測試集,最終也可以達到0.99以上。

                    九、計算機視覺openCV進階

                    閑話少說,直接進入正題,當然,這個進階實戰前提是你已經配置好了python的openCV環境,以下代碼運行在python3.6環境,所以確保你的系統配置好編程環境。建議你安裝jupyter notebook,代碼輸入效率高。

                    例程-1通過matplotlib在圖像上繪制圖形:

                    可以看到圖像上繪制了一條直線。在圖像處理方面,matplotlib提供了很多方法,當然,openCV本身也有很好的處理方法。

                    例程-2 加載視頻圖像

                    不過需要注意的是,如果例程在jupyternotebook 中運行,視頻輸出是黑色的,這個有點奇怪,但是在終端運行正常。

                    例程-3 錄制并保持視頻片段

                    是不是非常簡單,openCV提供了豐富的函數實現你需要的結果。

                    例程-4 openCV圖形繪制函數實現圖形繪制

                    以上例程通過openCV的繪圖函數實現圖像上繪制各種圖形,適用于不同的源,比如視頻流。

                    例程-5 圖像像素操作

                    [255255 255]

                    [[[129138 135]

                    [129 138 135]

                    [129 138 135]

                    ...,

                    [ 37 39 39]

                    [ 37 39 39]

                    [ 36 38 38]]

                    [[129 138 135]

                    [129 138 135]

                    [129 138 135]

                    ...,

                    [ 35 37 37]

                    [ 34 36 36]

                    [ 33 35 35]]

                    [[128 137 134]

                    [128 137 134]

                    [128 137 134]

                    ...,

                    [ 32 34 34]

                    [ 31 33 33]

                    [ 29 31 31]]

                    ...,

                    [[130 141 139]

                    [130 141 139]

                    [129 140 138]

                    ...,

                    [ 96 104 133]

                    [ 97 107 137]

                    [ 93 104 134]]

                    [[130 141 139]

                    [130 141 139]

                    [130 141 139]

                    ...,

                    [ 97 108 136]

                    [ 98 109 141]

                    [ 94 107 139]]

                    [[130 141 139]

                    [130 141 139]

                    [129 140 138]

                    ...,

                    [ 97 107 137]

                    [100 111 143]

                    [ 98 111 143]]]

                    (652,536, 3)

                    1048416

                    uint8

                    以上例程是對圖像進行操作,實現特定區域的像素修改,剪切,移動操作

                    ======================================================

                    例程-6 相同大小的圖像疊加操作

                    以上例程實現兩張圖片進行疊加操作,發現類似過曝的情況,這是因為圖像的像素RGB值有一個范圍0-255,超過255的均為白色顯示。

                    例程-7 依然是圖像疊加操作,對以上例程修改設置適當權重

                    通過設置權重,疊加后的圖像正常顯示了。

                    例程-8 大小不同的圖像疊加

                    在大的圖像上疊加另一個小一點的圖像,并且以透視的方式疊加,這里需要用到閾值的概念,先看看效果。要注意的是,疊加操作確保圖像的格式一致性。

                    在圖像上疊加了python的logo,以透視的方式疊加,也就是說logo背景如果是白色的,透明顯示。

                    例程-9 繼續討論閾值(threshold(THRESH_BINARY))

                    當我們需要對一張曝光很差的圖像進行處理以便閱讀時,這個閾值就很有效果。當然,上面這個效果還是不好,沒有達到我們希望的結果,不著急。

                    例程-10 調整閾值,去除顏色

                    閱讀性好了很多,但是還有大片區域黑乎乎的。

                    例程-11 自適應閾值

                    自適應閾值的使用對于文本的處理還是很好的,可閱讀性好了很多,當然,最后效果和圖像本身的清晰度有很大關系。本例中算是取得了比較好的效果。

                    例程-12 大津閾值

                    本例中大津閾值并沒有取得很好的效果。

                    例程-13 顏色過濾

                    例程對紅色部分過濾的效果。帽子部分有些缺失。這只是一個例子,以紅色為目標。它的工作方式是,我們所看到的是圖像范圍內的任何東西,基本上是30-255,150-255和50-180.它用于紅色,但可以隨便嘗試找到自己的顏色。HSV在這里效果最好的原因是,我們想要范圍內的顏色,這里通常需要相似的顏色。很多時候,經典的紅色仍然會有一些綠色和藍色分量,所以必須允許一些綠色和藍色,但是我們會想要幾乎全紅。這意味著我們會在這里獲得所有顏色的低光混合。

                    為了確定HSV的范圍,最好的方法就是試錯。OpenCV內置了將BGR轉換為HSV的方法。如果你想挑選單一顏色,那么BGR到HSV將會很好用。為了理解,下面是這個代碼的一個例子:

                    Dark_red=np.uint8([[[12,22,121]]])

                    Dark_red=cv2.cvtColor(Dark_red,cv2.COLOR_BGR2HSV)

                    這里的結果是一個HSV值,與Dark_red值相同。但是,同樣你遇到了顏色范圍和HSV范圍的基本問題,他們根本不同。你可能合理使用BGR范圍,他們仍然可以工作,但是對于檢測一種顏色,則無法正常工作。

                    回到上面例程,我們首先要把幀轉換成HSV。那里沒有什么特別的。接下來,為紅色指定一些HSV值。使用inRange函數,為我們的特定范圍創建掩碼。這是真或假,黑色或白色。接下來,通過執行按位操作來恢復我們的紅色,基本上,我們顯示了capand mask。掩碼的白色部分是紅色范圍,被轉換為純白色,而其他一切都變成黑色。最好我們展示所以東西。在下面例程中,我們將對圖像中存在的一些噪音,比如那些顆粒感的黑點,進行處理,就需要運用到模糊和平滑來解決這個問題。

                    例程-14 模糊和平滑

                    在這個例程中,將介紹如何嘗試從我們的過濾器中消除噪聲,例如簡單的閾值,或者使用以前特定的過濾器:

                    這里使用了一個簡單的平滑,計算每個像素塊的均值。使用15x15的正方形,意味著我們有225個總像素,進行平均化處理得到上面的效果。但是犧牲了很多粒度,接下來我們嘗試一些高斯模糊:

                    例程-15 高斯模糊和中值模糊

                    例程-16 雙向模糊

                    通過對比,選擇效果較好的那個,這取決于圖像本身,可能不同的模糊類型適合不同的情況。

                    例程-17 形態轉換-腐蝕和膨脹

                    有些時候需要對圖像進行變換操作,先介紹腐蝕和膨脹。腐蝕是對邊緣操作,它的工作方式是使用滑塊(核)。我們讓滑塊滑動,如果所有的像素是白色的,那么我們得到白色,否則是黑色。這可能有助于消除一些白色噪音。另外是膨脹,它基本上是起相反的作用,讓滑塊滑動,如果整個區域不是黑色的,就會轉換成白色。

                    例程-18 形態轉換-開放和關閉

                    開放的目標是消除假陽性。有時候在背景中,你會得到一些像素噪音。關閉的想法是消除假陰性,基本上用于檢測形狀,例如我么的帽子,但是物體仍然有些黑色像素。關閉將嘗試清除它們。

                    接下來將討論邊緣檢測和漸變。圖像漸變可以用來測量方向的強度,邊緣檢測可以用來查找邊緣。

                    首先我們來看漸變的例子:

                    例程-19 漸變

                    cv2.CV_64F是數據類型,ksize是核大小,我們使用5,所以每次查詢5x5的區域。雖然可以使用這些漸變轉換為純邊緣,但是也可以使用Canny邊緣檢測。

                    例程-20 邊緣檢測

                    邊緣檢測效果不錯,本例中背景比較雜亂。

                    模板匹配

                    在下一個章節討論模板匹配,介紹如何在其他圖像中搜索和查找相同的圖像模板,這個將非常有用處,尤其在特征匹配的時候。

                    模板匹配用于對象識別。給出一定的閾值,找到匹配我們提供的模板圖像的相同區域。對于具體的對象匹配,具有精確的照明/刻度/角度的圖像會表現的很好。通常會遇到這些情況的例子就是計算機上的任何GUI。按鈕等東西總是相同的,所以你可以使用模板匹配,結合模板匹配和一些鼠標控制,你就可以實現一個基本web的機器人。

                    首先你需要一個主要圖像和一個模板。你應該從你正在圖像中查找的東西選取你的模板。主要圖像:

                    匹配模板

                    ,通過這個模板看看能在主圖中識別出多少來。

                    例程-21 模板匹配

                    加載兩個圖像,轉換成灰度。保留原始的RGB圖像,并創建一個灰度版本。加載模板圖像并且記下尺寸。在這里用img_gray,模板和我們要使用的匹配方法調用matchTemplate并將返回值保存到res。指定一個閾值這里先試用80%匹配度,然后我們使用邏輯語句找到res大于或等于閾值的位置。最后使用灰度圖像中找到的坐標標記原始圖像上的所有匹配。

                    看來遺漏不少,再試試閾值0.5,大部分標識出來了,右邊幾個因為視角的問題,和模板差距較大,需要更大的容錯才能識別出來,但是很難避免假陽性的問題,所以要精確識別,圖像最好要有好的辨識度才行。

                    再調低閾值0.4

                    雖然找到所有的,但是出現大量假陽性,并且出現重復查找的現象。可以繼續調整直到100%找到,另外一種方式就是使用另一個模板圖像。有時候使用相同對象的對各圖像是有用的,這樣你可以使閾值足夠高來確保你的結果準確。

                    十、openCV實戰篇

                    上一節介紹了關于openCV的一些基本內容,雖然不多,但是多少可以感受到它的強大,先拋出一個openCV的有意思的應用,不需要加載額外太多的庫,就可以實現,所以你不妨可以自己試試,你會發現,隔空操作實現起來其實并不難。好的,直接上代碼,后面再講解實現的原理。

                    代碼大部分都有解釋,看起來很多,其實去掉注釋,不到60行,可謂短小精悍。這里稍微多解釋一點關于cv2.findContours() 方法,這個函數是用來查找物體輪廓的,需要注意的是cv2.findContours()函數接受的參數為二值圖,即黑白的(不是灰度圖),所以讀取的圖像要先轉成灰度的,再轉成二值圖,也就是前面提到的cv2.threshold(), 加上cv2.THRESH_OTSU. 我們舉一個例子來說明。

                    以上就是使用不同過濾器之后的效果,你會發現高斯后使用Otsu閾值過濾得到的效果非常好,輪廓清晰。

                    再舉例說明cv2.findContours()函數。

                    原圖是:

                    應用查找后:

                    函數的原型cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]]) 返回兩個值:contours:hierarchy。

                    參數

                    第一個參數是尋找輪廓的圖像;

                    第二個參數表示輪廓的檢索模式,有四種(本文介紹的都是新的cv2接口):

                    cv2.RETR_EXTERNAL表示只檢測外輪廓

                    cv2.RETR_LIST檢測的輪廓不建立等級關系

                    cv2.RETR_CCOMP建立兩個等級的輪廓,上面的一層為外邊界,里面的一層為內孔的邊界信息。如果內孔內還有一個連通物體,這個物體的邊界也在頂層。

                    cv2.RETR_TREE建立一個等級樹結構的輪廓。

                    第三個參數method為輪廓的近似辦法

                    cv2.CHAIN_APPROX_NONE存儲所有的輪廓點,相鄰的兩個點的像素位置差不超過1,即max(abs(x1-x2),abs(y2-y1))==1

                    cv2.CHAIN_APPROX_SIMPLE壓縮水平方向,垂直方向,對角線方向的元素,只保留該方向的終點坐標,例如一個矩形輪廓只需4個點來保存輪廓信息

                    cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

                    返回值

                    cv2.findContours()函數返回兩個值,一個是輪廓本身,還有一個是每條輪廓對應的屬性。

                    通過上述講解,你應該熟悉了這幾個函數的用法,你可以嘗試一下在其它方面的應用。好的,我們來看看例程實現的效果:

                    當然,結果可能沒有這么理想,這和你所處的環境有關,你可以嘗試通過圖像優化來實現手勢識別的準確性。

                    本文名稱:《人工智能概念(人工智能解析)》
                    本文鏈接:http://www.bjhqmc.com/gu/236481.html
                    免責聲明:投資有風險!入市需謹慎!本站內容均由用戶自發貢獻,或整編自互聯網,或AI編輯完成,因此對于內容真實性不能作任何類型的保證!請自行判斷內容真假!但是如您發現有涉嫌:抄襲侵權、違法違規、疑似詐騙、虛假不良等內容,請通過底部“聯系&建議”通道,及時與本站聯系,本站始終秉持積極配合態度處理各類問題,因此在收到郵件后,必會刪除相應內容!另外,如需做其他配合工作,如:設置相關詞匯屏蔽等,均可配合完成,以防止后續出現此類內容。生活不易,還請手下留情!由衷希望大家能多多理解,在此先謝過大家了~

                    我要說說 搶沙發

                    評論前必須登錄!

                    立即登錄   注冊

                    切換注冊

                    登錄

                    忘記密碼 ?

                    切換登錄

                    注冊

                    我們將發送一封驗證郵件至你的郵箱, 請正確填寫以完成賬號注冊和激活

                      <p id="bffd9"><cite id="bffd9"></cite></p>

                        <cite id="bffd9"><b id="bffd9"><thead id="bffd9"></thead></b></cite>
                          <output id="bffd9"><cite id="bffd9"></cite></output>

                                <p id="bffd9"></p>

                                      <p id="bffd9"></p>
                                      成人电影