Python 计算机视觉(十七)—— 基于KNN的图像分类
參考的一些文章以及論文我都會給大家分享出來 —— 鏈接就貼在原文,論文我上傳到資源中去,大家可以免費下載學(xué)習(xí),如果當(dāng)天資源區(qū)找不到論文,那就等等,可能正在審核,審核完后就可以下載了。大家一起學(xué)習(xí),一起進(jìn)步!加油!!?????
目錄
1. 圖像分類概述
(1)背景及意義
(2)概念及任務(wù)
a. 有監(jiān)督學(xué)習(xí)
b. 半監(jiān)督學(xué)習(xí)
c. 無監(jiān)督學(xué)習(xí)
2. 基于KNN的圖像分類
(1). 基本概念
(2). 代碼實現(xiàn)
StepOne.切分訓(xùn)練集和數(shù)據(jù)集
StepTwo.圖像的讀取及處理
StepThree.KNN算法分類
3. 結(jié)束語
4. 參考論文
1. 圖像分類概述
此處參考:《基于特征學(xué)習(xí)和機器學(xué)習(xí)的圖像分類識別算法研究_李 青》
(1)背景及意義
? ? ? ?在互聯(lián)網(wǎng)和數(shù)據(jù)及其發(fā)達(dá)的今天,我們每時每刻都要面對海量的圖像數(shù)據(jù),其內(nèi)容和形式呈現(xiàn)出復(fù)雜多樣化。試圖通過人工辨識的方法來處理這些圖片是不可能的,因為人工辨識需要消耗大量的人力時間和經(jīng)驗去分析和判斷圖片,這是非常復(fù)雜并且費時耗力的工作。因此,利用計算機輔助自動將圖片按照人們理解的方式,劃分到不同的類別屬性的圖像分類和識別技術(shù)已成為近些年的研究熱點。而圖像分類識別技術(shù)正是解決這個問題的關(guān)鍵技術(shù)。
(2)概念及任務(wù)
? ? ? ?圖像分類是從給定的分類集合中給輸入的圖像匹配一個標(biāo)簽,即輸入一個圖像,那么輸出的是計算機通過判斷給這個圖像貼上的標(biāo)簽。
? ? ? ? 圖像分類和識別主要任務(wù)是學(xué)習(xí)和判斷圖像中是否包含某種特定的目標(biāo)內(nèi)容(物體或者場景等),并依據(jù)其內(nèi)容信息進(jìn)行多類單標(biāo)簽或者多類多標(biāo)簽的分類和識別。由于圖像分類識別的數(shù)據(jù)集種類不同,根據(jù)輸入數(shù)據(jù)標(biāo)簽對應(yīng)注釋比例的情況主要分為三種,有監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)。針對不同標(biāo)簽類型的數(shù)據(jù)集,則需要設(shè)計不同的圖像分類識別算法。
a. 有監(jiān)督學(xué)習(xí)
? ? ? ?輸入的數(shù)據(jù)集內(nèi)的所有樣本都被標(biāo)注了標(biāo)簽,計算機通過對這些圖像的特征進(jìn)行觀察和學(xué)習(xí),對它們進(jìn)行分類,當(dāng)再次輸入一幅圖像時它就會對該輸入進(jìn)行判斷并輸出相應(yīng)的標(biāo)簽。簡單來說就像是給計算機標(biāo)準(zhǔn)答案然后讓它作同一種類型的題目。
b. 半監(jiān)督學(xué)習(xí)
? ? ? ?跟有監(jiān)督學(xué)習(xí)進(jìn)行類比,該學(xué)習(xí)方式是給部分的樣本標(biāo)注了標(biāo)簽,首先計算機通過對數(shù)據(jù)集的觀察得到樣本的特征,然后根據(jù)部分樣本的標(biāo)簽為它們進(jìn)行分類,也對后續(xù)輸入進(jìn)行判別。?
c. 無監(jiān)督學(xué)習(xí)
? ? ? ?數(shù)據(jù)集中的所有樣本都是沒有標(biāo)注標(biāo)簽的,而計算機要做的是通過觀察這些樣本的特征將它們進(jìn)行分類聚合,將它認(rèn)為是一類的樣本(相似特征較為明顯)進(jìn)行聚類。
2. 基于KNN的圖像分類
基本概念參考:《基于傳統(tǒng)機器學(xué)習(xí)與深度學(xué)習(xí)的圖像分類算法對比分析_劉華祠》
代碼實現(xiàn)參考自下面這位博主的文章:?Eastmount
大家如果想要深入學(xué)習(xí)可以進(jìn)行參考
(1). 基本概念
KNN 算法是通過計算待測樣本與已知樣本之間的數(shù)據(jù)點的相似度進(jìn)行樣本點的分類,對于相似度的判定該算法通常使用的是歐氏距離:
簡單來說,該算法就是尋找最近的樣本點并將其歸為一類,也就是物以類聚、人以群分。
一般該算法的判別步驟如下:
step one: 計算測試集特征向量與訓(xùn)練集特征向量之間的距離。
step two:?按照距離的遠(yuǎn)近進(jìn)行排序。
step three:?選取距離最近的 K 個點。
step four:?計算前 K 個點所在類別的出現(xiàn)頻率。
step five: 統(tǒng)計前 K 個點中出現(xiàn)頻率最高的類別,作為測試集的分類類別。
(2). 代碼實現(xiàn)
若是直接想手?jǐn)]這個算法可以參考博主的這篇文章:機器學(xué)習(xí)實戰(zhàn)(一)—— K-近鄰算法(KNN)
下面咱們使用 Python 中提供的分類器進(jìn)行圖像的分類,其中使用的訓(xùn)練數(shù)據(jù)集可以到博主的網(wǎng)盤中下載:
鏈接:https://pan.baidu.com/s/1MoSYo3bt35UM0I7Vx0popg?
提取碼:jmh3
我們知道,Python的一大優(yōu)勢就是提供了大量的第三方庫,在本文中我們也是調(diào)用分類器進(jìn)行圖像的識別,在這之前我們需要對待訓(xùn)練的圖像進(jìn)行一些操作來使它們滿足K近鄰算法的運算方式,基本步驟以及代碼實現(xiàn)如下:
StepOne.切分訓(xùn)練集和數(shù)據(jù)集
os.listdir(path):path為需要列出的目錄的路徑,該函數(shù)返回指定文件和文件夾目錄。append():向列表的尾部添加一個新的元素。split():通過指定的分隔符對字符串進(jìn)行切片。 """ Author:XiaoMa date:2021/12/14 """ #調(diào)用第三方庫 import os import cv2 import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, classification_report# 第一步 切分訓(xùn)練集和測試集 X = [] #定義圖像名稱 Y = [] #定義圖像分類類標(biāo) Z = [] #定義圖像像素 for i in range(0, 10):#遍歷文件夾,讀取圖片,本例中的圖像文件可以在上面分享的鏈接中提取for f in os.listdir("E:\Python\Study\\venv\Lib\photo/%s" % i):#獲取圖像名稱X.append("photo//" +str(i) + "//" + str(f))#獲取圖像類標(biāo)即為文件夾名稱Y.append(i) X = np.array(X) Y = np.array(Y) #隨機率為100% 選取其中的30%作為測試集 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3, random_state = 1) print(len(X_train), len(X_test), len(y_train), len(y_test))得到的輸出如下:
數(shù)據(jù)集提供了一共一千張圖像,并將它們分為了十類,大家下載下來就可以查看:
StepTwo.圖像的讀取及處理
# 第二步 圖像讀取及轉(zhuǎn)換為像素直方圖 #訓(xùn)練集 XX_train = [] for i in X_train:#讀取圖像image = cv2.imread(i)#圖像像素大小一致img = cv2.resize(image, (256, 256), interpolation=cv2.INTER_CUBIC)#計算圖像直方圖并存儲至X數(shù)組hist = cv2.calcHist([img], [0, 1], None, [256, 256], [0.0, 255.0, 0.0, 255.0])XX_train.append(((hist/255).flatten()))#測試集 XX_test = [] for i in X_test:#讀取圖像#print iimage = cv2.imread(i)#圖像像素大小一致img = cv2.resize(image, (256, 256), interpolation=cv2.INTER_CUBIC)#計算圖像直方圖并存儲至X數(shù)組hist = cv2.calcHist([img], [0, 1], None, [256, 256], [0.0, 255.0, 0.0, 255.0])XX_test.append(((hist/255).flatten()))StepThree.KNN算法分類
# 第三步 基于KNN的圖像分類處理 from sklearn.neighbors import KNeighborsClassifier #調(diào)用分類器clf = KNeighborsClassifier(n_neighbors=11).fit(XX_train, y_train) predictions_labels = clf.predict(XX_test)print('預(yù)測結(jié)果:') print(predictions_labels)print('算法評價:') print((classification_report(y_test, predictions_labels)))#輸出前10張圖片及預(yù)測結(jié)果 k = 0 while k < 10:#讀取圖像print(X_test[k])image = cv2.imread(X_test[k])print(predictions_labels[k])#顯示圖像cv2.imshow("img", image)cv2.waitKey(0)cv2.destroyAllWindows()k = k + 1?預(yù)測結(jié)果以及算法評價如下:
下面只展示部分圖像的分類結(jié)果:
第一張圖像選擇的是大象并且判斷正確
?因為在原數(shù)據(jù)集中大象就是在第五個文件夾中:
但也會有一些判斷出現(xiàn)錯誤,如下:?
就因為圖像中出現(xiàn)了1人就將該圖像分類到了第一類人類的部分中了。?
3. 結(jié)束語
本篇文章主要介紹了機器學(xué)習(xí)的一些基本概念以及基于KNN的圖像分類,主要參考的是論文以及前面提到的博主?Eastmount的文章,大家如果想深入了解可以去跟他們學(xué)習(xí)。這幾天忙于各種ddl,其他的一些方法寒假再更,加油!
4. 參考論文
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Python 计算机视觉(十七)—— 基于KNN的图像分类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习实战(一)—— K-近邻算法(K
- 下一篇: Python 科学计算库 Numpy(一