Python實現簡單的圖像識別

一、什麼是圖像識別

圖像識別是一種模式識別技術,也稱為計算機視覺。其可以通過計算機程序自動分析圖片中的內容,並進行分類、識別等操作。圖像識別是人工智能的一個重要領域,目前已被廣泛應用於人臉識別、自動駕駛、安防監控等領域。

二、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 15:43
下一篇 2024-12-22 15:43

相關推薦

  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論