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