本文目錄一覽:
- 1、高大上的YOLOV3對象檢測演算法,使用python也可輕鬆實現
- 2、如何利用 Python 實現 SVM 模型
- 3、怎樣用python實現深度學習
- 4、CNN詳解-基於python基礎庫實現的簡單CNN
高大上的YOLOV3對象檢測演算法,使用python也可輕鬆實現
繼續我們的目標檢測演算法的分享,前期我們介紹了SSD目標檢測演算法的python實現以及Faster-RCNN目標檢測演算法的python實現以及yolo目標檢測演算法的darknet的window環境安裝,本期我們簡單介紹一下如何使用python來進行YOLOV3的對象檢測演算法
YOLOV3的基礎知識大家可以參考往期文章,本期重點介紹如何使用python來實現
1、初始化模型
14-16 行:
模型的初始化依然使用cv下的DNN模型來載入模型,需要注意的是CV的版本需要大於3.4.2
5-8行:
初始化模型在coco上的label以便後期圖片識別使用
10-12行:
初始化圖片顯示方框的顏色
2、載入圖片,進行圖片識別
輸入識別的圖片進行圖片識別,這部分代碼跟往期的SSD 以及RCNN目標檢測演算法類似
19-20行:輸入圖片,獲取圖片的長度與寬度
25-29行:計算圖片的blob值,輸入神經網路,進行前向反饋預測圖片
只不過net.forward裡面是ln, 神經網路的所有out層
3、遍歷所有的out層,獲取檢測圖片的label與置信度
遍歷out層,獲取檢測到的label值以及置信度,檢測到這裡YOLOV3以及把所有的檢測計算完成,但是由於yolov3對重疊圖片或者靠的比較近的圖片檢測存在一定的問題,使用YOLOV3使用非最大值抑制來抑制弱的重疊邊界
竟然把墨鏡識別了手機,體現了YOLOV3在重疊圖片識別的缺點
4、應用非最大值抑制來抑制弱的重疊邊界,顯示圖片
56: 使用 非最大值抑制來抑制弱的重疊邊界
58-59行:遍歷所有圖片
61-62行:提取檢測圖片的BOX
64-68行:顯示圖片信息
70-71行:顯示圖片
利用python來實現YOLOV3,與SSD 以及RCNN代碼有很多類似的地方,大家可以參考往期的文章進行對比學習,把代碼執行一遍
進行視頻識別的思路:從視頻中提取圖片,進行圖片識別,識別完成後,再把識別的結果實時體現在視頻中,這部分代碼結合前期的視頻識別,大家可以參考多進程視頻實時識別篇,因為沒有多進程,檢測速度很慢,視頻看著比較卡
1、初始化模型以及視頻流
2、從視頻中提取圖片,進行圖片的blob值計算,進行神經網路的預測
3、提取檢測到圖片的置信度以及ID值
4、 應用非最大值抑制來抑制弱的重疊邊界,顯示圖片
5、關閉資源,顯示圖片處理信息
每個目標檢測演算法都有自己的優缺點,個人感覺,在精度要求不是太高的情況下SSD檢測演算法可以實現較快的速度實現,畢竟精度差不多的情況下,我們希望速度越快越好
如何利用 Python 實現 SVM 模型
我先直觀地闡述我對SVM的理解,這其中不會涉及數學公式,然後給出Python代碼。
SVM是一種二分類模型,處理的數據可以分為三類:
線性可分,通過硬間隔最大化,學習線性分類器
近似線性可分,通過軟間隔最大化,學習線性分類器
線性不可分,通過核函數以及軟間隔最大化,學習非線性分類器
線性分類器,在平面上對應直線;非線性分類器,在平面上對應曲線。
硬間隔對應於線性可分數據集,可以將所有樣本正確分類,也正因為如此,受雜訊樣本影響很大,不推薦。
軟間隔對應於通常情況下的數據集(近似線性可分或線性不可分),允許一些超平面附近的樣本被錯誤分類,從而提升了泛化性能。
如下圖:
實線是由硬間隔最大化得到的,預測能力顯然不及由軟間隔最大化得到的虛線。
對於線性不可分的數據集,如下圖:
我們直觀上覺得這時線性分類器,也就是直線,不能很好的分開紅點和藍點。
但是可以用一個介於紅點與藍點之間的類似圓的曲線將二者分開,如下圖:
我們假設這個黃色的曲線就是圓,不妨設其方程為x^2+y^2=1,那麼核函數是幹什麼的呢?
我們將x^2映射為X,y^2映射為Y,那麼超平面變成了X+Y=1。
那麼原空間的線性不可分問題,就變成了新空間的(近似)線性可分問題。
此時就可以運用處理(近似)線性可分問題的方法去解決線性不可分數據集的分類問題。
—————————————————————————————————————————
以上我用最簡單的語言粗略地解釋了SVM,沒有用到任何數學知識。但是沒有數學,就體會不到SVM的精髓。因此接下來我會用盡量簡潔的語言敘述SVM的數學思想,如果沒有看過SVM推導過程的朋友完全可以跳過下面這段。
對於求解(近似)線性可分問題:
由最大間隔法,得到凸二次規劃問題,這類問題是有最優解的(理論上可以直接調用二次規劃計算包,得出最優解)
我們得到以上凸優化問題的對偶問題,一是因為對偶問題更容易求解,二是引入核函數,推廣到非線性問題。
求解對偶問題得到原始問題的解,進而確定分離超平面和分類決策函數。由於對偶問題里目標函數和分類決策函數只涉及實例與實例之間的內積,即xi,xj。我們引入核函數的概念。
拓展到求解線性不可分問題:
如之前的例子,對於線性不可分的數據集的任意兩個實例:xi,xj。當我們取某個特定映射f之後,f(xi)與f(xj)在高維空間中線性可分,運用上述的求解(近似)線性可分問題的方法,我們看到目標函數和分類決策函數只涉及內積f(xi),f(xj)。由於高維空間中的內積計算非常複雜,我們可以引入核函數K(xi,xj)=f(xi),f(xj),因此內積問題變成了求函數值問題。最有趣的是,我們根本不需要知道映射f。精彩!
我不準備在這裡放推導過程,因為已經有很多非常好的學習資料,如果有興趣,可以看:CS229 Lecture notes
最後就是SMO演算法求解SVM問題,有興趣的話直接看作者論文:Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines
我直接給出代碼:SMO+SVM
在線性可分數據集上運行結果:
圖中標出了支持向量這個非常完美,支持向量都在超平面附近。
在線性不可分數據集上運行結果(200個樣本):
核函數用了高斯核,取了不同的sigma
sigma=1,有189個支持向量,相當於用整個數據集進行分類。
sigma=10,有20個支持向量,邊界曲線能較好的擬合數據集特點。
我們可以看到,當支持向量太少,可能會得到很差的決策邊界。如果支持向量太多,就相當於每次都利用整個數據集進行分類,類似KNN。
怎樣用python實現深度學習
基於Python的深度學習庫、深度學習方向、機器學習方向、自然語言處理方向的一些網站基本都是通過Python來實現的。
機器學習,尤其是現在火爆的深度學習,其工具框架大都提供了Python介面。Python在科學計算領域一直有著較好的聲譽,其簡潔清晰的語法以及豐富的計算工具,深受此領域開發者喜愛。
早在深度學習以及Tensorflow等框架流行之前,Python中即有scikit-learn,能夠很方便地完成幾乎所有機器學習模型,從經典數據集下載到構建模型只需要簡單的幾行代碼。配合Pandas、matplotlib等工具,能很簡單地進行調整。
而Tensorflow、PyTorch、MXNet、Keras等深度學習框架更是極大地拓展了機器學習的可能。使用Keras編寫一個手寫數字識別的深度學習網路僅僅需要寥寥數十行代碼,即可藉助底層實現,方便地調用包括GPU在內的大量資源完成工作。
值得一提的是,無論什麼框架,Python只是作為前端描述用的語言,實際計算則是通過底層的C/C++實現。由於Python能很方便地引入和使用C/C++項目和庫,從而實現功能和性能上的擴展,這樣的大規模計算中,讓開發者更關注邏輯於數據本身,而從內存分配等繁雜工作中解放出來,是Python被廣泛應用到機器學習領域的重要原因。
CNN詳解-基於python基礎庫實現的簡單CNN
CNN,即卷積神經網路,主要用於圖像識別,分類。由輸入層,卷積層,池化層,全連接層(Affline層),Softmax層疊加而成。卷積神經網路中還有一個非常重要的結構:過濾器,它作用於層與層之間(卷積層與池化層),決定了怎樣對數據進行卷積和池化。下面先直觀理解下卷積和池化
二維卷積
三維卷積
池化
好了,知道卷積池化,下面就來實現最簡單的一個卷積網路:
原創文章,作者:SYPS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/134311.html