Halcon例程(基于GMM模型的分類)詳解 —— classify_citrus_fruits.hdev

一、例程簡介

該例程比較有代表性,屬于Halcon里的分類方法之一,直接調用Halcon封裝好的GMM分類器(高斯混合模型)對橘子和檸檬進行分類。GMM屬于概率分類方法,屬于P(Y|X),通過對樣本的概率密度分布進行估計,然后對模型進行加權求和,并通過投影,最后選取概率最大的類所為判決結果,這種分類方法只在不同檢測類之間有明顯的區別(在兩類物體圓度和面積有較大區別)的情況下適用。
具體原理可以詳見有位大佬的解釋說明,鏈接如下:
[原理]https://blog.csdn.net/weixin_42555080
后面我也會針對機器學習的相關方法進行分享,求點贊評論哦。

二、代碼詳解(對每一步進行注釋)

第一篇注釋下,后面再寫就只注釋關鍵部分了。

*讀取圖片
read_image (Image, 'color/citrus_fruits_01')
*返回輸入圖像對象Image的第一個通道的Pointer(指示器)。另外,這個算子也返回圖像類型和圖像的大小(width和height)。
get_image_pointer1 (Image, Pointer, Type, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'white', WindowHandle)
*用來設置當前窗口的字體屬性,參數意思為字體大小為12,字體類型為“Courier New字體”,粗體,不傾斜。
set_display_font (WindowHandle, 12, 'mono', 'true', 'false')
* 定義region的填充模式, 如果參數DrawMode設置為'fill',region顯示為填充,如果設置為'margin',則只顯示輪廓。
dev_set_draw ('margin')
*設置線寬
dev_set_line_width (2)
*顯示圖片
dev_display (Image)
*其實以下幾句可以寫為一句dev_update_off ()
dev_update_window ('off')
dev_update_pc ('off')
dev_update_var ('off')
* 為特征量(區域的面積,圓度,和分類名)賦值
FeaturesArea := []
FeaturesCircularity := []
ClassName := ['orange','lemon']* 創建GMM分類器(特征數量,樣本分類個數,類中心的個數,協方差矩陣的形式,預處理的形式,轉換特征數,隨機種子初始化GMM,GMM句柄)
create_class_gmm (2, 2, 1, 'spherical', 'normalization', 10, 42, GMMHandle)
* 
* 添加訓練樣本
for I := 1 to 4 by 1read_image (Image, 'color/citrus_fruits_' + I$'.2d')dev_display (Image)* 自定義函數,將圖片進行預處理,得到區域特征。get_regions (Image, SelectedRegions)*將彩色圖片分離為三個單通道圖片(decompose3 (Image, ImageRed, ImageGreen, ImageBlue)*用于區域對象的顏色設為白dev_set_color ('white')*對單通道圖片進行閾值處理,得到灰度值在50-255區間的圖片threshold (ImageRed, Region, 50, 255)*將區域進行填充fill_up (Region, RegionFillUp)*用來計算輸入區域中的所有連通域connection (RegionFillUp, ConnectedRegions)*根據形狀特征(這里是面積)對區域進行篩選,對于大于50小于999999的形狀保留。select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 50, 999999)return ())dev_display (SelectedRegions)*計算區域數量count_obj (SelectedRegions, NumberObjects)*對三個目標進行遍歷,獲取特征for J := 1 to NumberObjects by 1*從一個對象元組中選擇一個區域,區域的排序索引應該是根據上面計算連通域的時候完成的。select_obj (SelectedRegions, ObjectSelected, J)*自定義函數,分別對圓度和面積進行計算,并返回區域中心點的坐標值。get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)(circularity (ObjectSelected, Circularity)area_center (ObjectSelected, Area, Row, Column)dev_set_color ('white')return ())* 對變量賦值FeaturesArea := [FeaturesArea,Area]FeaturesCircularity := [FeaturesCircularity,Circularity]*將元組的數值轉換為浮點型FeatureVector := real([Circularity,Area])*該方法已提前將樣本分為兩類,每類數量已提前設定好,橘子和檸檬各兩張圖片if (I <= 2)*將訓練樣本添加到訓練數據中(GMM句柄,特征向量,類別ID為0,不添加高斯噪聲)add_sample_class_gmm (GMMHandle, FeatureVector, 0, 0)*此過程在圖形窗口“窗口句柄”中的位置(Row,Column)顯示文本。(文本顯示Add to Class加類名,行坐標,列坐標,黑色,box參數為ture,表示文本顯示在橙色框中)disp_message (WindowHandle, 'Add to Class:' + ClassName[0], 'window', RowRegionCenter, ColumnRegionCenter - 100, 'black', 'true')else*ID為1add_sample_class_gmm (GMMHandle, FeatureVector, 1, 0)disp_message (WindowHandle, 'Add to Class:' + ClassName[1], 'window', RowRegionCenter, ColumnRegionCenter - 100, 'black', 'true')endifendfor*顯示 'Press Run (F5) to continue' 在屏幕的右下角disp_continue_message (WindowHandle, 'black', 'true')stop ()
endfor
dev_clear_window ()
* 
* 自定義函數,構建可視化空間,可以顯示圓度和面積的二維坐標系,里面內容有點復雜,包括畫坐標系,顯示特征值兩部分,有興趣的同學可以仔細看看里面的代碼來復現一遍,這里就不細述。兩個特征變量里面分別有12個值,對應每個對象的特征值,將其放到坐標系中,橘子為深灰,檸檬為淺灰色。
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[0:5], FeaturesCircularity[0:5], 'dim gray', 18)
* 'oranges', 40, 440
visualize_2D_feature_space (Cross, Height, Width, WindowHandle, FeaturesArea[6:11], FeaturesCircularity[6:11], 'light gray', 18)
* 'lemons', 70, 440
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* 訓練分類器(句柄,最大迭代次數,閾值,計算方法,防止協方差矩陣異常的正則化值,類中心數量,每個類的迭代次數)這里就是halcon的便利之處,直接將大量的代碼封裝,我們只需要更改幾個關鍵參數即可,但也要對GMM訓練算法有所了解,后面會專門寫一篇GMM算法的文章。
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.0001, Centers, Iter)
* 
* 分類,下面的基本就是上面提取特征值的過程,沒啥特殊的,就不每行注釋了。
for I := 1 to 15 by 1read_image (Image, 'color/citrus_fruits_' + I$'.2d')dev_display (Image)* 'Classify Image', 10, 10get_regions (Image, SelectedRegions)dev_display (SelectedRegions)count_obj (SelectedRegions, NumberObjects)for J := 1 to NumberObjects by 1select_obj (SelectedRegions, ObjectSelected, J)get_features (ObjectSelected, WindowHandle, Circularity, Area, RowRegionCenter, ColumnRegionCenter)FeaturesArea := [FeaturesArea,Area]FeaturesCircularity := [FeaturesCircularity,Circularity]FeatureVector := real([Circularity,Area])*應用上面訓練的模型對測試數據的特征進行分類(句柄,特征向量,最佳類數(我的理解是指返回一種結果),分類結果(橘子是0,檸檬是1),后驗概率,概率密度,歸一化概率(通過這個概率進行判斷))classify_class_gmm (GMMHandle, FeatureVector, 1, ClassID, ClassProb, Density, KSigmaProb)*顯示信息disp_message (WindowHandle, 'Class: ' + ClassName[ClassID], 'window', RowRegionCenter, ColumnRegionCenter - 100, 'black', 'true')disp_message (WindowHandle, 'KSigmaProb: ' + KSigmaProb, 'window', RowRegionCenter + 30, ColumnRegionCenter - 100, 'black', 'true')endfor*如果測試圖片數量不等于15,顯示暫停。if (I != 15)disp_continue_message (WindowHandle, 'black', 'true')endifstop ()
endfor
* 清除分類器內存
clear_class_gmm (GMMHandle)

三、總結

Halcon進行GMM分類的全過程包括以下幾部分:

  1. 預處理,包括閾值處理,二值化,提取區域或者輪廓特征等;
  2. 提取樣本特征;可以是圓度,面積,也可以是顏色,輪廓,主要看那種特征適合分類。
  3. 用add_sample_class_gmm將樣本特征添加到分類器,對特征進行訓練,得到最終GMM模型。
  4. 提取測試樣本的特征。
  5. 應用分類器對測試數據進行分類,這里Halcon把代碼封裝了,大家可以去看看C++或python版本的分類代碼,會對這個分類方法有更深的了解,至于先驗后驗概率密度之類的東西,大家自己查下吧,哈哈,要慢慢理解。
    第一次寫博客,希望將自己的學習過程記錄下來,也分享給大家,希望共同進步。必須強調一點,一🗡三連。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256394.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

正則表達式匹配不包含特定字符串解決匹配溢出問題

匹配溢出問題在正則表達式當中算是比較常見的問題&#xff0c;它常常導致我們匹配結果莫名其妙的出錯&#xff0c;本文專門為你講解如何通過匹配不包含特定字符串的方法來解決這類問題。 那么&#xff0c;什么是匹配溢出呢&#xff1f; 下面我們來看個例子&#xff1a; 源文本&…

numpy——mgrid

x1,x2 np.mgrid(x1min:x1max:num1j,x2min:x2max:num2j)x1返回的是x1min到x1max間均勻分成num1個數&#xff0c;進行橫向擴展為方陣 x2返回的是x2min到x2max間均勻分成num2個數&#xff0c;進行縱向擴展為方陣 Examples -------- >>> np.mgrid[0:5,0:5] array([[[0,…

Halcon例程(基于3D形狀匹配識別方法)詳解 —— create_shape_model_3d_lowest_model_level.hdev

一、例程簡介 最近在研究3D識別方面的東西&#xff0c;查了不少資料&#xff0c;發現halcon里有不少關于三維物體識別的例程&#xff0c;這里對其中一個做出詳解。該例程是基于三維匹配方法的&#xff0c;因為有三維模型SM3&#xff0c;所以不需要自己創建&#xff1b;另因為例…

15.瀑布流、測量

排行界面TopProtocol &#xff1a;json數據就是寫字符串&#xff0c;所以不需要寫bean對象public class TopProtocol extends BaseProtocol<List<String>> { Override public List<String> paserJson(String json) { List<String> datasnew ArrayList&…

linear-gradient線性漸變

background:linear-gradient(180deg, sliver 20%, skyblue 80%, gray 100%);180deg 是線性漸變的角度,水平方向;如果是90deg,則是垂直方向. silver 20% 是最上面的顏色和該顏色所在的位置,可以為負值,,如 linear-gradient(180deg, silver -7%, pink 80%, skyblue 127%);的效果是…

numpy——stack

np.stack(array,axis,outNone)&#xff0c;函數原型。 其中最重要是的這個axis怎么理解的。 舉例說明&#xff1a;arrays [np.random.randn(3, 4) for _ in range(10)] 會生成一個 10 *( 3 * 4 )的矩陣列表。十個矩陣&#xff0c;每個矩陣是(3 * 4)大小。 首先說明一下axis的映…

C# —— 簡單工廠設計模式詳述

一、基本概念 眾所周知&#xff0c;C#是一種面向對象的語言&#xff0c;而其中封裝&#xff0c;繼承&#xff0c;多態是面向對象的三大重要特征&#xff0c;簡單工廠的設計模式則可以完全體現這些特征。要徹底理解這個模式&#xff0c;必須要先將封裝&#xff08;訪問修飾符的…

【計算機視覺】計算機視覺、模式識別、機器學習常用牛人主頁鏈接

計算機視覺、模式識別、機器學習常用牛人主頁鏈接 牛人主頁&#xff08;主頁有很多論文代碼&#xff09; Serge Belongie at UC San DiegoAntonio Torralba at MITAlexei Ffros at CMUCe Liu at Microsoft Research New EnglandVittorio Ferrari at Univ.of EdinburghKristen G…

C# 中的 ConfigurationManager類引用方法

c#添加了Configuration;后&#xff0c;竟然找不到 ConfigurationManager 這個類&#xff0c;后來才發現&#xff1a;雖然引用了using System.Configuration;這個包&#xff0c;但是還是不行的。 后來終于找到一個解決方法&#xff0c;就是在解決方案資源管理器里找到類文件選擇…

機器學習——支持向量機SVM之python實現簡單實例一(含數據預處理、交叉驗證、參數優化等)

目錄 一、SVM理論 二、numpy的相關函數介紹 三、python實現之準備 1、數據集的下載

工業相機常用類型詳述

一、工業相機定義 工業相機是應用于工業領域、安防和交通等對相機要求較高領域的攝像機&#xff0c;功能就是將光信號轉變成有序的電信號&#xff0c;此信號經過模數轉換為數字信號&#xff0c;然后傳遞給圖像處理器。與一般的家用相機相比&#xff0c;其具有更高的穩定性能&a…

機器學習——SVM之python實現數據樣本標準化和歸一化

目錄 一、標準化和歸一化的目的 1、標準化 2、歸一化 二、標準化和歸一化常用的理論公式 1、歸一化 2、標準化 三、python實現SVM樣本數據標準化和歸一化 1、標準化 2、歸一化 本文源代碼&#xff1a;《機器學習——支持向量機SVM之python實現簡單實例一》 一、標準化…

[黑群暉經典教程] 一步一步建立自己的黑群暉

【申明&#xff1a;本文并非本人所作&#xff0c;為內部網絡中一位大神所寫&#xff0c;個人覺得寫得很好&#xff0c;遂原文搬了過來&#xff0c;如有侵犯原作者的權利&#xff0c;請及時與我聯系】 PS:有好幾個兄弟覺得我擅自轉發&#xff0c;不是很妥。解釋一下&#xff1a;…

Java為什么能跨平臺運行

因為java程序編譯之后的代碼不是能被硬件系統直接運行的代碼&#xff0c;而是一種“中間碼”--字節碼。不同的硬件平臺上裝有不同的java虛擬機&#xff08;JVM&#xff09;&#xff0c;由JVM來把字節碼再翻譯成所對應的硬件平臺能夠執行的代碼&#xff0c;因此java可以跨平臺運…

C++和Opencv4.5 實現全景圖像拼接

前言 最近剛下了最新版的opencv4.5&#xff0c;急不可待的試下操作&#xff0c;就用了opencv自帶的Stitcher類拼接下圖像&#xff0c;結果傻眼了&#xff0c;程序顯示Stitcher沒有createDefault成員&#xff0c;看了好久&#xff0c;終于找到了解決方法。 Stitcher原理 Stit…

機器學習——python實現SVM模型w,b的查看

基于源代碼&#xff1a;《機器學習——支持向量機SVM之python實現簡單實例一》進行講解 1、線性模型 這里以二特征三類&#xff0c;一對多策略為案例 kernel “linear”&#xff1a;線性核&#xff0c;參數有w&#xff0c;b 線性模型的決策邊界是&#xff1a;w0iTx0i w1i…

Codeforces-712C-Memory and De-Evolution

轉載于:https://www.cnblogs.com/GrowingJlx/p/6642764.html

移動端輸入框彈出鍵盤控制

在移動端&#xff0c;我們公司通過輸入框主要收集用戶的姓名和電話&#xff0c;以下是對輸入框獲取焦點時&#xff0c;控制彈出鍵盤的樣式來增強用戶體驗。 輸入姓名 我們的用戶都是中國人&#xff0c;輸入用戶名為中文&#xff0c;所以彈出鍵盤是輸入中文狀態即可&#xff0c;…

Opencv4.5-C++ 攝像頭畫面鏡像顯示及文件保存

前言 想試下新買電腦的攝像頭好用不&#xff0c;就寫了個攝像頭調用程序&#xff0c;實現了鏡像和圖片截取保存。 代碼 #include <iostream> #include <opencv2/stitching.hpp> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.h…

機器學習之支持向量機SVM之python實現ROC曲線繪制(二分類和多分類)

目錄 一、ROC曲線 二、TP、FP、TN、FN 三、 python繪制ROC曲線(二分類) 1、思路 2、關鍵代碼