參考的一些文章以及論文我都會給大家分享出來 —— 鏈接就貼在原文,論文我上傳到資源中去,大家可以免費下載學習,如果當天資源區找不到論文,那就等等,可能正在審核,審核完后就可以下載了,大家一起學習,一起進步!加油!!
目錄
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 i
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_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. 參考論文




轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/381907.html
標籤:AI
