溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Python怎么實現(xiàn)一個圖像分類功能

發(fā)布時間:2021-04-29 15:43:29 來源:億速云 閱讀:1846 作者:Leah 欄目:開發(fā)技術

今天就跟大家聊聊有關使用Python怎么實現(xiàn)一個圖像分類功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

Python的優(yōu)點有哪些

1、簡單易用,與C/C++、Java、C# 等傳統(tǒng)語言相比,Python對代碼格式的要求沒有那么嚴格;2、Python屬于開源的,所有人都可以看到源代碼,并且可以被移植在許多平臺上使用;3、Python面向對象,能夠支持面向過程編程,也支持面向對象編程;4、Python是一種解釋性語言,Python寫的程序不需要編譯成二進制代碼,可以直接從源代碼運行程序;5、Python功能強大,擁有的模塊眾多,基本能夠實現(xiàn)所有的常見功能。

k-means聚類

k-means聚類算法以 k 為參數(shù),把 n 個對象分成 k 個簇,使簇內(nèi)具有較高的相似度,而簇間的相似度較低。其處理過程如下:

  • 隨機選擇 k 個點作為初始的聚類中心

  • 對于剩下的點,根據(jù)其與聚類中心的距離,將其歸入最近的簇。

  • 對每個簇,計算所有點的均值作為新的聚類中心。

  • 重復步驟2、3直到聚類中心不再發(fā)生改變

使用Python怎么實現(xiàn)一個圖像分類功能

k-means的算法原理比較非常簡潔、易于理解,但是這里面有個問題需要解決:

如何確定 k 值?

  • 在 k-means 算法實現(xiàn)過程中,首先面臨的問題就是如何確定好 K 值。因為在實際應用中,我們也不知道這些數(shù)據(jù)到底會有多少個類別,或者分為多少個類別會比較好,所以在選擇 K 值的時候會比較困難,只能根據(jù)經(jīng)驗預設一個數(shù)值。

  • 比較常用的一個方法:肘部法。就是去循環(huán)嘗試 K 值,計算在不同的 K 值情況下,所有數(shù)據(jù)的損失,即用每一個數(shù)據(jù)點到中心點的距離之和計算平均距離??梢韵氲剑?K=1 的時候,這個距離和肯定是最大的;當 K=m 的時候,每個點也是自己的中心點,這個時候全局的距離和是0,平均距離也是0,當然我們不可能設置成K=m。

  • 而在逐漸加大 K 的過程中,會有一個點,使這個平均距離發(fā)生急劇的變化,如果把這個距離與 K 的關系畫出來,就可以看到一個拐點,也就是我們說的手肘。

使用Python怎么實現(xiàn)一個圖像分類功能

要確定 K 值確實是一項比較費時費力的事情,但是也是 K-Means 聚類算法中必須要做好的工作。

三、圖像分類

現(xiàn)在進入正題,實現(xiàn)我們的貓狗圖像分類。

導入需要的依賴庫

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import cv2 as cv
import os, shutil
from pathlib import Path

獲取 animals 文件夾下所有 jpg 貓狗圖像

# 獲得該文件夾下所有jpg圖片路徑
p = Path(r"C:\Users\Administrator\DeepLearning\animals")
files = list(p.glob("**/*.jpg"))

opencv讀取圖像,并將圖像大小 resize 為(224,224),以匹配模型輸入層的大小以進行特征提取。圖像數(shù)組轉換為 float32 類型并reshape,然后做歸一化。

# opencv讀取圖像 并resize為(224,224)
images = [cv.resize(cv.imread(str(file)), (224, 224)) for file in files]
paths = [file for file in files]
# 圖像數(shù)組轉換為float32類型并reshape  然后做歸一化
images = np.array(np.float32(images).reshape(len(images), -1) / 255)

加載預訓練模型 MobileNetV2 來實現(xiàn)圖像分類

# 加載預先訓練的模型MobileNetV2來實現(xiàn)圖像分類
model = tf.keras.applications.MobileNetV2(include_top=False,
weights="imagenet", input_shape=(224, 224, 3))
predictions = model.predict(images.reshape(-1, 224, 224, 3))
pred_images = predictions.reshape(images.shape[0], -1)

k-means聚類算法

k = 2   # 2個類別
# K-Means聚類
kmodel = KMeans(n_clusters=k, n_jobs=-1, random_state=888)
kmodel.fit(pred_images)
kpredictions = kmodel.predict(pred_images)
print(kpredictions)   # 預測的類別
# 0:dog    1:cat

將分類后的圖像保存到不同文件夾下

for i in ["cat", "dog"]:
    os.mkdir(r"C:\Users\Administrator\DeepLearning\picture_" + str(i))

# 復制文件,保留元數(shù)據(jù) shutil.copy2('來源文件', '目標地址')
for i in range(len(paths)):
    if kpredictions[i] == 0:   
        shutil.copy2(paths[i], r"C:\Users\Administrator\DeepLearning\picture_dog")
    else:
        shutil.copy2(paths[i], r"C:\Users\Administrator\DeepLearning\picture_cat")

看完上述內(nèi)容,你們對使用Python怎么實現(xiàn)一個圖像分類功能有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI