《HALCON機器視覺與算法原理編程實踐》第12章 圖像分類-學習筆記

圖像分類,根據各自在圖像信息中所反映的不同特徵,把不同類別的目標區分開來的圖像處理方法。它利用計算機對圖像進行定量分析,把圖像或圖像中的每個像元或區域劃歸爲若干個類別中的某一種,以代替人的視覺判讀。

12.1 分類器

分類意味着事先準備好若干個類別,然後將一個目標對象根據某種特徵劃到某個類別中去。以下幾種情況可以考慮使用分類:
(1)圖像分割
(2)目標識別
(3)良品檢測
(4)缺陷檢測
(5)光學字符識別(OCR)

12.1.1 分類的基礎知識

  1. 分類器的意義
    分類器的作用是將目標對象指定給多個類別中的一個。
    特徵參數儲存在特徵向量中,又稱特徵庫空間。
    使用線或者平面進行分類的分類器稱爲線性分類器。
  2. 分類器的種類
    (1)基於神經網絡,特別是多層感知層的MLP分類器
    (2)基於支持向量機的SVM分類器
    (3)基於高斯混合模型的GMM分類器
    (4)基於k近鄰的k-NN分類器
    此外,halcon還提供了一種盒式分類器,用於二值圖像的分類。
  3. 圖像分類的一般流程
    (1)準備一組已知屬於同一類別的樣本對象,從每個樣本對象中提取出一組特徵,並且存儲在個特徵向量中
    (2)創建分類器
    條件
    (3)用樣本的特徵向量訓練一個分類器。在訓練過程中,用分類器計算出屬於某個類別的邊界
    (4)對目標對象進行檢測,獲取待檢測對象的特徵向量。
    (5)分類器根據訓練得到的類別的邊界條件判斷檢測對象的特徵屬於哪個分類。
    (6)清除分類器
    總體來說,針對特定的分類任務,需要選擇一組合適的特徵和合適的分類器,以及合適的訓練樣本

12.1.2 MLP分類器

MLP是一種基於神經網絡的、動態的分類器。MLP分類器可用於通用特徵的分類、圖像分割、OCR等。

多層感知機(MLP,Multilayer Perceptron)也叫人工神經網絡(ANN,Artificial Neural Network),除了輸入輸出層,它中間可以有多個隱層,最簡單的MLP只含一個隱層,即三層的結構,如下圖:
在這裏插入圖片描述

12.1.3 SVN分類器

SVM即支持向量機,用於實現數據的二分類。SVM用於二分類,即只有兩種類別的分類。

SVM,英文全稱爲 Support Vector Machine,中文名爲支持向量機,由數學家Vapnik等人早在1963年提出。在深度學習興起之前,SVM一度風光無限,是機器學習近幾十年來最爲經典的,也是最受歡迎的分類方法之一。

如下圖所示,有兩類樣本數據(橙色和藍色的小圓點),中間的紅線是分類超平面,兩條虛線上的點(橙色圓點3個和藍色圓點2個)是距離超平面最近的點,這些點即爲支持向量。簡單地說,作爲支持向量的樣本點非常非常重要,以至於其他的樣本點可以視而不見。而這個分類超平面正是SVM分類器,通過這個分類超平面實現對樣本數據一分爲二。
在這裏插入圖片描述

12.1.4 GMM分類器

GMM分類器,即高斯混合模型分類器。高斯模型就是用高斯概率分佈曲線,即正態分佈曲線來量化概率的一種表達方式。其可以使用不止一條概率分佈曲線。

GMM(Gaussian Mixture Model, 高斯混合模型)是指該算法油多個高斯模型線 性疊加混合而成。每個高斯模型稱之爲component。GMM算法描述的是數據的 本身存在的一種分佈。
GMM算法常用於聚類應用中,component的個數就可以認爲是類別的數量。
假定GMM由k個Gaussian分佈線性疊加而成,那麼概率密度函數如下圖所示:

在這裏插入圖片描述

12.1.5 k-NN分類器

k-NN分類器是一個簡單但是功能非常強大的分類器,能夠儲存所有訓練集中的數據和分類,並且對新的樣品也能基於其鄰近的訓練數據進行分類。

K-近鄰( k-nearest neighbors / knn )是一類基於實例 ( instance-based ) 的非參數學習算法。在這裏,輸入是由數據集裏的 k 個最近的訓練實例組成,輸出是一個類成員。一個新對象的分類原則是,它被分到離它最近的 k 個鄰居中的多數所在的那個類中。特別地,k = 1 時,該對象被分到離它最近的鄰居所在的類中。通常,可以賦鄰居權值表示鄰居對分類的貢獻。例如,可以取對象到每個鄰居的距離的倒數作爲它的權值。knn 算法的缺點是,它對數據的局部結構敏感,容易過度擬合數據。
在這裏插入圖片描述

12.1.6 選擇合適的分類器

多數情況下都可以考慮以上4中分類器。它們足夠靈活和高效。實際工作中,可以根據項目的需要或者硬件條件的限制選擇合適的分類器。
(1)MLP分類器:分類速度快,但訓練速度慢,對內存的要求低,支持多維特徵空間,特別適合需要快速分類並且支持離線訓練的場景,但不支持缺陷檢測。
(2)SVM分類器:分類檢測的速度快,當向量維度低時速度最快,但比MLP分類器慢,儘管其訓練速度比MLP分類器快得多。其對內存的佔用取決於樣本的數量,如果有大量的樣本,如字符庫這樣的樣本需要訓練,分類器會變得十分龐大。
(3)GMM分類器:訓練速度和檢測速度都很快,特別是類別較少時速度非常快,支持異常檢測,但不適用於高維度特徵檢測。
(4)kNN分類器:訓練速度非常快,分類速度比MLP分類器慢,適合缺陷檢測和多維度特徵分類,但對內存的需求較高。

除了分類器外,特徵和訓練樣本的選擇也會影響到分類結果,當分類結果不理想時,可以考慮調整這兩個因素。如果訓練樣本中已經包含了目標對象的全部相關特徵,但分類結果仍然不理想,那麼可以考慮換一個分類器。

12.1.7 選擇合適的特徵

選擇什麼樣的特徵完全取決於檢測的對象是什麼,以及分類的要求是什麼。

12.1.8 選擇合適的訓練樣本

~

12.2 特徵的分類

分類的步驟,首先是創建一個合適的分類器;然後考察對象的特徵,將合適的特徵向量添加到紋理分類器中;最後使用樣本數據進行訓練,使分類器學會某種分類的規則。在檢測時,提取檢測目標對應於分類器中的特徵值,使用訓練過的分類器進行分類。使用完分類器後,從內存中清除它。

12.2.1 一般步驟

(1)明確有哪些類別,並根據類別收集合適的圖像作爲樣本數據集。
(2)創建分類器
(3)獲取明確了類別的樣本的特徵向量
(4)將這些樣本按分類序號添加到分類器中
(5)訓練分類器
(6)保存分類器(供後續調用)
(7)獲取未知分類的被測對象的特徵向量,這些特徵向量應當是之前訓練分類器時使用過的特徵向量
(8)對被測對象的特徵向量進行分類
(9)從內存中清除分類器

12.2.2 MLP分類器

在這裏插入圖片描述

*關閉當前窗口
dev_close_window ()
*創建新窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*設置繪製形狀的方式
dev_set_draw ('margin')
dev_set_line_width (3)
*創建mlp分類器,特徵數爲1,輸出類爲2個,輸出方法選擇‘softmax’用於分類
create_class_mlp (1, 1, 2, 'softmax', 'normalization', 3, 42, MLPHandle)
*創建訓練樣本圖像與其分類的對應關係
*圖像和分類名稱一一對應
FileNames := ['m1','m2','m3','m4']
Classes := [0,0,1,1]
for J := 0 to |FileNames| - 1 by 1
	*讀取訓練圖像
	read_image (Image, 'data/' + FileNames[J])
	dev_display (Image)
	*對圖像進行分割
    rgb1_to_gray (Image, GrayImage)
    threshold (GrayImage, darkRegion, 0, 105)
    connection (darkRegion, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999)
	fill_up (SelectedRegions, Objects)
	dev_display (Objects)
	disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true')
	*將分割後的對象objects添加進分類器對應的分類Classes[J]中
	count_obj (Objects, Number)
    *提取特徵(圓度)
    for N := 1 to Number by 1
      select_obj (Objects, Region, N)
      circularity (Region, Circularity)
      add_sample_class_mlp (MLPHandle, Circularity,Classes[J])
    endfor
    stop()
	disp_continue_message (WindowHandle, 'black', 'true')
endfor
dev_clear_window ()
disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true')
*訓練mlp分類器
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
clear_samples_class_mlp (MLPHandle)

*讀取輸入的待檢測圖像
read_image (testImage, 'data/m5')
rgb1_to_gray (testImage, GrayTestImage)
*將圖像進行分割
threshold (GrayTestImage, darkTestRegion, 0, 105)
connection (darkTestRegion, ConnectedTestRegions)
select_shape (ConnectedTestRegions, SelectedTestRegions, 'area', 'and', 1500, 99999)
fill_up (SelectedTestRegions, testObjects)
*將分割後的對象objects進行分類
count_obj (testObjects, Number)
Classes := []
Colors := ['yellow','magenta']
dev_set_colored (6)
dev_display (testImage)
*提取特徵(圓度)
for J := 1 to Number by 1
    select_obj (testObjects, singleRegion, J)
    circularity (singleRegion, Circularity)
    classify_class_mlp (MLPHandle, Circularity, 1, Class, Confidence)
    Classes := [Classes,Class]
    dev_set_color (Colors[Classes[J-1]])
    dev_display (singleRegion)
endfor

*清除MLP分類器,釋放內存
clear_class_mlp (MLPHandle)

12.2.3 SVM分類器

應注意調整相應的參數

12.2.4 GMM分類器

應注意調整相應的參數

12.2.5 k-NN分類器

應注意調整相應的參數

12.3 光學字符識別

OCR(光學字符識別)是一種更進一步的分類方法,用於識別字符。識別的第一步,是將獨立的字符區域從圖像中提取出來,然後將其指定給某個字符的種類。MLP、SVM和k-NN分類器都可以用於OCR。

12.3.1 一般步驟

OCR的檢測分爲離線訓練和在線檢測兩部分。

  1. 離線訓練
    離線部分一般指的是字符的訓練過程,包括如下幾個步驟。
    (1)讀取樣本圖像,並對樣本中的已知字符進行區域分割,分割的單位是單個字符的包圍區域
    (2)將分割出的區域和對應的字符名稱存儲在訓練文件中
    (3)檢查訓練文件中的對應關係,即圖像與字符的名稱應一一對應
    (4)訓練分類器
    (5)保存分類器
    (6)清除分類器
  2. 在線檢測
    在線部分的OCR指的是對字符進行檢測,即分類,一般流程如下。
    (1)讀取分類器。
    (2)對待檢測的字符進行區域分割,提取出獨立的字符區域。
    (3)使用分類器對字符區域進行分類。
    (4)清除分類器。

12.3.2 OCR實例

在這裏插入圖片描述

dev_close_window()
read_image (Image, 'data/modelWords')
get_image_size(Image,width,height)
dev_open_window (0, 0, width, height, 'black', WindowHandle)
rgb1_to_gray (Image, GrayImage)  
gen_empty_obj (EmptyObject)
for Index := 1 to 4 by 1
	disp_message (WindowHandle, '請框選單個漢字區域,右鍵確認:','window', 12, 12, 'yellow', 'false')
	draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
	 **根據畫的矩形生成對應的矩形
	gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
	reduce_domain (GrayImage, Rectangle, ImageReduced1)
	 *閾值處理
	threshold (ImageReduced1, Region1, 128, 255)
	 *準備接收所有提取的字符區域
	concat_obj (EmptyObject, Region1, EmptyObject)
endfor
words:=['藝','術','中','心']
*排序
sort_region (EmptyObject, SortedRegions1, 'character', 'true', 'row')
for Index1:=1 to 4 by 1
select_obj (SortedRegions1, ObjectSelected1, Index1)
append_ocr_trainf (ObjectSelected1, Image, words[Index1-1], 'data/yszx.trf')
endfor
read_ocr_trainf_names ('data/yszx.trf', CharacterNames, CharacterCount)
create_ocr_class_mlp (50, 60, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
trainf_ocr_class_mlp (OCRHandle, 'data/yszx.trf', 200, 1, 0.01, Error, ErrorLog)
write_ocr_class_mlp (OCRHandle, 'data/yszx.omc')
*導入另一張做測試的圖
read_image (ImageTest, 'data/testWords.jpg')
rgb1_to_gray (ImageTest, Image1)
threshold (Image1, testwordregion, 125, 255)
*對符合條件的字符區域進行分割
connection (testwordregion, ConnectedwordRegions)
*篩選符合條件的字符形狀區域
select_shape (ConnectedwordRegions, SelectedwordRegions, 'area', 'and', 700, 2500)
*從左到右,排序
sort_region (SelectedwordRegions, SortedRegions2, 'upper_left', 'true', 'column')
count_obj(SortedRegions2, Number)
*開始字符識別
read_ocr_class_mlp ('data/yszx.omc', OCRHandle1)
do_ocr_multi_class_mlp (SortedRegions2, Image1, OCRHandle1, Class, Confidence)
*顯示結果
disp_message(WindowHandle, '識別結果:', 'image', 10, 10, 'white', 'false')
for i:=1 to 4 by 1
	disp_message(WindowHandle, Class[i-1], 'image', 90, 60*i, 'yellow', 'false')
endfor
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章