一、什麼是圖像識別
圖像識別是一種模式識別技術,也稱為計算機視覺。其可以通過計算機程序自動分析圖片中的內容,並進行分類、識別等操作。圖像識別是人工智能的一個重要領域,目前已被廣泛應用於人臉識別、自動駕駛、安防監控等領域。
二、Python圖像識別庫介紹
Python是一種強大的編程語言,也被廣泛應用於機器學習、數據分析、人工智能等領域。在Python中,有多個圖像識別相關的庫,其中比較常用的有:
1、OpenCV:OpenCV是一個流行的計算機視覺庫,其支持多種編程語言,並且提供了很多用於圖像處理、分析和識別的算法和工具。
2、Pillow:Pillow是Python Imaging Library(PIL)的一個分支,其提供了便捷的圖像處理和圖像格式轉換等功能。
3、Keras:Keras是一個高層次的人工智能庫,其提供了多種圖像識別算法和模型,包括卷積神經網絡、深度學習等。
三、Python實現圖像分類
為了演示Python實現圖像識別的過程,我們以圖像分類為例。具體而言,我們將使用OpenCV和Keras庫來訓練一個深度學習模型,以將一張圖片歸類為人臉或非人臉。
1. 數據集準備
圖像識別的基礎是數據集,我們需要使用足夠的數據集來訓練模型。在這個例子中,我們將使用MIT的人臉數據集,包含了數千張不同人臉的照片,以及一些非人臉的照片。
import cv2
import numpy as np
import os
people = ["Ben Affleck", "Elton John", "Jerry Seinfield", "Madonna", "Mindy Kaling"]
DIR = r"./faces/"
features = []
labels = []
def create_data():
for person in people:
path = os.path.join(DIR, person)
label = people.index(person)
for img in os.listdir(path):
img_path = os.path.join(path, img)
img_array = cv2.imread(img_path)
gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY)
# 把gray的照片壓縮到(50,50)
roi = cv2.resize(gray, (50, 50))
features.append(roi)
labels.append(label)
create_data()
代碼解釋:
我們首先導入必需的庫,包括OpenCV、numpy和os。在該代碼段中,我們定義了幾個變量,包括people(人名列表)、DIR(照片存儲路徑)、features(圖像集合)和labels(標籤集合)。
隨後,我們遍歷人名列表,並通過os庫找到對應人名文件夾中的所有照片。圖像在讀取後,我們將其轉換為灰度圖像,並將其大小壓縮到(50,50)。最後,我們將灰度圖像存儲到特徵向量集合中,並將對應的標籤存儲在標籤集合中。
在該代碼段執行完畢後,我們就得到了兩個集合,包括features和labels。其中,features是一個包含所有圖像特徵向量的集合,labels是一個包含所有標籤的集合,其對應於每個圖像的所屬類別。
2. 訓練模型
有了準備好的數據集之後,我們就可以開始訓練我們的模型了。在這個例子中,我們將使用Keras庫中的Sequential模型來搭建深度學習模型,包括卷積層、激活函數、池化層、全連接層等。
import tensorflow as tf
from keras.utils import np_utils
features = np.array(features).reshape(-1, 50, 50, 1) # -1自動設定數組行數
labels = np.array(labels)
# 標籤獨熱編碼
labels = np_utils.to_categorical(labels)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(64, (3, 3), input_shape=features.shape[1:])) # 卷積層
model.add(tf.keras.layers.Activation("relu")) # 激活函數
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) # 池化層
model.add(tf.keras.layers.Conv2D(64, (3, 3))) # 第二個卷積層
model.add(tf.keras.layers.Activation("relu")) # 第二個激活函數
model.add(tf.keras.layers.MaxPooling2D(pool_size=(2, 2))) # 第二個池化層
model.add(tf.keras.layers.Flatten()) # 展平
model.add(tf.keras.layers.Dense(64)) # 全連接層
model.add(tf.keras.layers.Activation('relu')) # 全連接層激活函數
model.add(tf.keras.layers.Dense(2)) # 輸出層,2種分類
model.add(tf.keras.layers.Activation('softmax')) # 輸出層激活函數
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(features, labels, epochs=10, validation_split=0.2)
代碼解釋:
我們首先導入必要的庫,包括tensorflow和Keras中的np_utils。在該代碼段開始之前,我們需要先對特徵集合進行一些預處理操作。我們使用np.array函數將特徵向量轉換為數組,並使用reshape函數來將它們轉換為適合模型輸入的形狀。
隨後,我們使用np_utils庫的to_categorical函數對標籤進行獨熱編碼。該操作將原始標籤轉換為二進制數組的形式,以便於模型的訓練。
接下來,我們開始搭建深度學習模型。在該代碼段中,我們使用Keras庫的Sequential模型,並通過Add方法添加多個層次。包括兩個卷積層、激活函數、池化層、展平層、全連接層和輸出層。
在模型搭建完畢之後,我們使用compile方法來配置模型的優化器、損失函數和評估指標。最後,通過fit方法來訓練我們的模型,包括傳入特徵向量集合、標籤集合、訓練輪次等參數。在訓練完成之後,我們就得到了一個訓練好的深度學習模型。
3. 圖像分類
有了訓練好的模型之後,我們就可以使用它來進行圖像分類了。在這個例子中,我們將以Kerala Blasters Women FC隊員的一張照片為例,來嘗試對其進行分類。
def classify_image(img_name):
img_path = os.path.join(DIR, "test", img_name)
img_array = cv2.imread(img_path)
gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY)
roi = cv2.resize(gray, (50, 50))
features = np.array(roi).reshape(-1, 50, 50, 1)
# 加載模型
model = tf.keras.models.load_model('models/model.h5')
prediction = model.predict([features])
prediction_label = people[int(prediction[0][0])]
# 如果預測為人臉
if prediction_label == "face":
cv2.putText(img_array, prediction_label, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 如果預測為非人臉
else:
cv2.putText(img_array, prediction_label, (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
return img_array
img = classify_image("face_test.jpg")
cv2.imshow("Result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
代碼解釋:
該代碼段首先定義了一個classify_image函數,用於對輸入的照片進行預測。該函數首先讀取輸入的圖像文件,並將其大小壓縮到(50,50)的灰度圖像。接下來,我們將其轉換為特徵向量,並使用訓練好的模型進行預測。最終,我們將預測結果的標籤添加到圖像中,並將其顯示在窗口中。
四、總結
本文介紹了Python實現簡單的圖像分類的過程。我們首先介紹了什麼是圖像識別,以及Python圖像識別庫的一些介紹。隨後,我們演示了如何通過OpenCV和Keras實現圖像分類過程,包括數據集準備、模型訓練和圖像分類。最後,我們給出了一個完整的代碼示例,以便讀者學習和參考。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/285129.html