Python如何圖像識別?
謝邀,我給個簡單的例子吧,互聯網有很多貓的照片,我也很喜歡貓,許多人可以很容易地識別貓,但是我們可以訓練計算機這樣做嗎?答案是顯而易見的,可以。
我們在Tensorflow框架上使用了高級Keras API。Keras項目是一個高級Python神經網路API。 它設計為用戶友好和模塊化,支持多個後端。 默認的Keras後端是Tensorflow,一個符號數學庫,廣泛用於機器學習和神經網路任務。 我們將訓練我們的Keras / Tensorflow設置來對CIFAR-10圖像數據集進行分類,這是10%的貓圖片。
建立Model要使用Tensorflow運行Keras,我們將轉換一個帶有Tensorflow編譯安裝的環境,並使用conda添加Python HDF5軟體包以及Keras可用於可視化模型的幾個圖形軟體包,以及用於保存歷史記錄的dill。 然後我們將用pip安裝Keras。
CIFAR-10數據集是10個類中的60,000個彩色32x32像素圖像的集合,其中10,000個是測試批次。 Keras可以自動下載數據集,但我們可以通過將其下載到/ results來節省時間,並在需要時將該文件複製到正確的位置。
我們將運行128個圖像批次並設置兩個訓練批次運行:一個長的500個批次的運行來完成主要工作,以及一個簡短的5個批次的運行作為一個例子。
載入數據並使其成為合理的shape。 還設置了一個函數來查找文件,另一個用於查看我們正在分析的圖像,最後設置為進行實時輸入數據擴充。
讓我們隨意選擇一些訓練圖像,如下圖所示:
訓練模型我們將使用一個簡單的卷積網路模型(仍處於開發階段),增加了上面定義的數據擴充,以及一個檢查點編寫回調函數,它可以顯著提高準確性。
最後,讓我們看看我們的模型,包括文本summary和流程圖。
訓練上述模型,訓練過程中的列印信息及圖片識別如下所示:
那麼只要保存模型這個圖片識別就成功了,希望對你有幫助~
我會在這裡發布所有與科技、科學有關的有趣文章,歡迎訂閱我的頭條號。偶爾也回答有趣的問題,有問題可隨時在評論區回復和討論。
(碼字不易,若文章對你幫助可點贊支持~)
翻出我曾經寫的一篇文章來介紹這個問題。
為大家帶來一篇 初步使用Keras深度學習破解驗證碼 的文章。 當然我們這裡識別的是普通驗證碼,是Laravel常用的驗證碼庫
Captcha for Laravel 5
如下圖,又5個數字字母所組成的驗證碼。我用PHP一共生成了5萬個驗證碼。後面也會提供給大家
導入所需的庫
這裡我們還是使用Keras,底層使用Tensorflow做為底層庫。
本次使用的模型是簡單的卷積神經網路模型,後面也會使用更加複雜的模型
卷積神經網路(Convolutional Neural Network,CNN)是一種前饋神經網路,它的人工神經元可以響應一部分覆蓋範圍內的周圍單元,對於大型圖像處理有出色表現。它包括卷積層(alternating convolutional layer)和池層(pooling layer)。
一般地,CNN的基本結構包括兩層,其一為特徵提取層,每個神經元的輸入與前一層的局部接受域相連,並提取該局部的特徵。一旦該局部特徵被提取後,它與其它特徵間的位置關係也隨之確定下來;其二是特徵映射層,網路的每個計算層由多個特徵映射組成,每個特徵映射是一個平面,平面上所有神經元的權值相等。特徵映射結構採用影響函數核小的sigmoid函數作為卷積網路的激活函數,使得特徵映射具有位移不變性。此外,由於一個映射面上的神經元共享權值,因而減少了網路自由參數的個數。卷積神經網路中的每一個卷積層都緊跟著一個用來求局部平均與二次提取的計算層,這種特有的兩次特徵提取結構減小了特徵解析度。
配置參數
載入數據
訓練模型的時候,我們可以選擇兩種方式來生成我們的訓練數據,一種是直接全部載入內存,然後開始訓練,一種是定義一個數據生成器,然後利用 fit_generator 分批載入數據來訓練。
因為樣本是5萬張,但是只有200多M,可以一次性載入內存。
最後會生成pickle文件。python的pickle模塊實現了基本的數據序列和反序列化。通過pickle模塊的序列化操作我們能夠將程序中運行的對象信息保存到文件中去,永久存儲;通過pickle模塊的反序列化操作,我們能夠從文件中創建上一次程序保存的對象。
如果使用我保存好的pickle文件,可以不用執行下列步驟
載入數據,讀取pickle文件
創建模型
開始訓練模型
訓練完成,進行驗證
改進
對於這種按順序的文字驗證碼,還有一種更好方法可以使用,那就是循環神經網路來識別序列。 我會在後面繼續介紹如何用循環神經網路構建模型。
代碼地址:https://github.com/szpnygo/keras-cnn-captcha
Pickle地址:https://pan.baidu.com/s/1i4JiZOT
這個問題換個問法會更好:python做圖像識別的學習方法或者入門書籍有什麼?
首先切記心急是吃不了熱豆腐的,想要徹底明白如何做圖像識別,單靠跑一個demo,看一個視頻是不行的。就分為三大步走吧:
模式識別打基礎建議先大致閱讀模式識別和計算機視覺相關書籍。先理解圖像這個信息本身,才來嘗試識別。這裡建議直接學習python下的opencv相關知識
機器學習來尋路在學習深度學習理論前,建議學習淺層模型及其理論。推薦書籍《機器學習實戰》,《統計學習方法》。
深度學習全升華這裡推薦斯坦福大學吳恩達的課程。可以邊學邊做練習,理論實踐兩不誤。通過上面的學習之後,就可以開始手把手實戰了。
開始之前,先了解一下框架的選擇目前學術界主流的框架還是caffe和tensorflow,theano和torch倒沒見多少人用。caffe是賈楊清大大的開山之作,雖然是用c++寫的,但是同樣支持matlab和python 介面。tensorflow是谷歌在caffe發布之後發布的基於python開發的深度學習框架。
TensorFlow
TensorFlow是機器學習的開源軟體庫,它由Google在2015年發布並很快成為全世界的研究者和學習者中最流行的機器學習庫之一。它在圖像分類模型中承擔重要作用。
接下來,我們就要開始學習如何用TensorFlow搭建一個合適的模型。
建立模型,一個Softmax分類器
Github支持這個模型的完整代碼。在使用之前,你需要安裝以下軟體:
· Python(代碼經過了Python2.7測試,Python3.3+也應該可以工作)
· TensorFlow
· CIFAR-10數據集:下載Python版本的數據集從https://www.cs.toronto.edu/~kriz/cifar.html下載或者使用鏈接中的壓縮文檔。請把 cifar-10-batches-py解壓到python源代碼的目錄下,這樣圖像的路徑應該為/path-to-your-python-source-code-files/cifar-10-batches-py/。 好了,現在我們可以開始了。讓我們先來看看試驗的主文件softmax.py,一行一行地來分析:from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
import tensorflow as tf
import time
import data_helpers
根據TensorFlow代碼規範,在所有TensorFlow Python文件中為了Python2和3的兼容性,都應該添加future語句。然後導入TensorFlow,numpy用於數值計算和時間模塊。data_helper.py包括載入和準備數據集的函數。
beginTime = time.time()
# Parameter definitions
batch_size = 100
learning_rate = 0.005
max_steps = 1000
# Prepare data
data_sets = data_helpers.load_data()
我們啟動一個計時器測量運行時間和定義一些參數。稍後在實際使用它們時再進行討論。然後載入CIFAR-10數據集。因為讀取數據並不是我們要做的核心,我把這部分的函數單獨放在data_helper.py文件中。它只是負責讀取包含數據集的文件,並把數據放入一個方便我們操作的數據結構中。
需要提到的重要的一點是,load_data()是將60000幅圖像分為兩部分。大的一部分包含50000幅圖像。這些數據集用於訓練我們的模型。另外的10000幅圖像被稱作測試集。在訓練結束之前,我們的模型將不會看到這些圖像。直到模型中的參數不再變換,我們使用測試集作為模型輸入來檢驗模型的性能。
將數據分為訓練集和測試集非常重要。我們並不知道我們的模型在遇到訓練數據集或測試數據集的時候是否有相同的表現。最糟的情況在於,模型記錄下了它看過的所有圖像。如果我們使用相同的訓練集進行測試,模型通過查找存儲下來的正確答案,可能表現得非常完美。但是如果使用它從未見過的圖像則原形畢露。這在模型學習中有個專門的概念叫做過度擬合,就是說特定的訓練數據可能掩蓋一些更為通常的特徵。在機器學習中避免過度擬合是一項重大的課題。關於過度擬合和為什麼建議將數據分成2個或者3個數據集,可以參考Coursera上吳恩達(Andrew Ng)機器學習課程的節選視頻。
回到我們的代碼,load_data()返回一個dictionary類型數據:
images_train:訓練集轉換為50000x3072(32像素x32像素x3個顏色通道)的數組
labels_train:訓練集的50000個標籤(每個數字從0到9代表圖像訓練集的10個分類)
images_test:測試集(10000x3072)
labels_test:測試集的10000個標籤
classes:10個文本標籤,將數字轉換成文字(0代表「飛機」,1代表「車」,等等)
# Define input placeholders
images_placeholder = tf.placeholder(tf.float32, shape=[None, 3072])
labels_placeholder = tf.placeholder(tf.int64, shape=[None])
推薦閱讀:
※Leetcode python 數組問題
※淺談 編程語言研究 與 程序分析
※Python的基本數據類型--Dictionary
※新手自學C語言編程,提高效率的方法
※徹底搞懂自增自減運算符