前言
現有的圖像中目標的分類常用深度學習模型處理,但是深度學習需要大量模型處理。對於明顯提取的目標,常常有幾個明顯特征,利用這幾個明顯特征使用少量圖片便可以完成圖像目標分類工作。這里介紹使用高斯混合模型GMM處理圖像。
常用算子及流程
1. 先提取特征,提取區域特征(或者邊緣,灰度特征等)
*計算區域圓度
circularity(區域,圓度值)
*計算區域面積
area_center(區域,面積)
*將兩個特征轉化為一個向量中
FeatureVector:=real([Circularity,Area])
2. 定義特征類
*定義特征面積
FeaturesArea:=[]
*定義特征圓度
FeaturesName:=[]
*定義類
ClassName:=['充電器','瓶蓋']
3. 創建分類高斯模型
creat_class_gmm(2,2,1,'spherical','normalization',10,42,GMMHandle)
//creat_class_gmm(2個類,2個特征,要分為1個,'spherical','normalization',10,42,GMMHandle)
之后,將瓶蓋的面積和圓度放到類中
add_sample_class_gum(GMMHandle,FeatureVector,0,0)
//add_sample_class_gum(GMMHandle,要存儲的訓練向量樣本,要存儲的訓練樣本的類ID,加載到樣本的標准差)
4. 訓練高斯混合模型
train_class_gmm(GMMHandle,100,0.001,'training',0.0001,centers,Iter)
//train_class_gmm(GMMHandle,最大迭代次數,期望偏差,'training',0.0001,每個類找到的中心數,每個迭代次數)
5. 使用高斯混合模型分類
classify_class_gmm(GMMHandle,FeatureVector,1,classID,classProb,Density,KSigmaProb)
//classify_class_gmm(GMMHandle,當前物體的特征向量,要確定的最大類數,對應className中的ID數,類后驗概率,概率密度,特征向量概率)
完整的高斯混合模型的案例如下,提取圖像特征用的笨方法,一個個提取的,如果成像比較好的話完全可以使用for循環,這里只是方便大家理解。
dev_close_window () dev_open_window (0, 0, 512, 512, 'black', WindowHandle) *已知瓶蓋1 read_image (Image, 'D:/瓶蓋.bmp.tif') rgb1_to_gray (Image, GrayImage) threshold (GrayImage, Regions1, 0, 32) connection (Regions1, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 210952, 500000) select_shape (SelectedRegions, SelectedRegions1, 'phi', 'and', 0.4861, 0.8447) fill_up (SelectedRegions1, RegionFillUp) circularity (RegionFillUp, Circularity) area_center (RegionFillUp, Area, Row, Column) *已知瓶蓋2 read_image (Image2, 'D:/1.bmp.tif') rgb1_to_gray (Image2, GrayImage2) threshold (GrayImage2, Regions2, 127, 255) connection (Regions2, ConnectedRegions2) select_shape (ConnectedRegions2, SelectedRegions3, 'area', 'and', 147143, 500000) fill_up (SelectedRegions3, RegionFillUp2) circularity (RegionFillUp2, Circularity2) area_center (RegionFillUp2, Area2, Row2, Column2) *已知瓶蓋3 read_image (Image3, 'D:/2.bmp.tif') rgb1_to_gray (Image3, GrayImage3) threshold (GrayImage3, Regions3, 0, 36) connection (Regions3, ConnectedRegions3) select_shape (ConnectedRegions3, SelectedRegions4, 'area', 'and', 210000, 500000) select_shape (SelectedRegions4, SelectedRegions5, 'area', 'and', 210000, 305453) fill_up (SelectedRegions5, RegionFillUp3) circularity (RegionFillUp3, Circularity3) area_center (RegionFillUp3, Area3, Row3, Column3) *已知瓶蓋4 read_image (Image4, 'D:/3.bmp.tif') rgb1_to_gray (Image4, GrayImage4) threshold (GrayImage4, Regions4, 121, 255) connection (Regions4, ConnectedRegions4) select_shape (ConnectedRegions4, SelectedRegions6, 'area', 'and', 280957, 452627) fill_up (SelectedRegions6, RegionFillUp4) circularity (RegionFillUp4, Circularity4) area_center (RegionFillUp4, Area4, Row4, Column4) *已知充電器1 read_image (Image1, 'D:/充電器.bmp.tif') rgb1_to_gray (Image1, GrayImage1) threshold (GrayImage1, Regions, 1, 32) connection (Regions, ConnectedRegions1) select_shape (ConnectedRegions1, SelectedRegions2, 'area', 'and', 498095, 1e+006) fill_up (SelectedRegions2, RegionFillUp1) circularity (RegionFillUp1, Circularity1) area_center (RegionFillUp1, Area1, Row1, Column1) *已知充電器2 read_image (Image5, 'D:/11.bmp.tif') rgb1_to_gray (Image5, GrayImage5) threshold (GrayImage5, Regions5, 124, 251) connection (Regions5, ConnectedRegions5) select_shape (ConnectedRegions5, SelectedRegions7, 'area', 'and', 549524, 1e+006) fill_up (SelectedRegions7, RegionFillUp5) circularity (RegionFillUp5, Circularity5) area_center (RegionFillUp5, Area5, Row5, Column5) *已知充電器3 read_image (Image6, 'D:/22.bmp.tif') rgb1_to_gray (Image6, GrayImage6) threshold (GrayImage6, Regions7, 152, 244) connection (Regions7, ConnectedRegions6) select_shape (ConnectedRegions6, SelectedRegions8, 'area', 'and', 293621, 1e+006) fill_up (SelectedRegions8, RegionFillUp6) circularity (RegionFillUp6, Circularity6) area_center (RegionFillUp6, Area6, Row6, Column6) *已知充電器4 read_image (Image7, 'D:/33.bmp.tif') rgb1_to_gray (Image7, GrayImage7) threshold (GrayImage7, Regions6, 0, 34) connection (Regions6, ConnectedRegions7) select_shape (ConnectedRegions7, SelectedRegions9, 'area', 'and', 293621, 1e+006) fill_up (SelectedRegions9, RegionFillUp7) circularity (RegionFillUp7, Circularity7) area_center (RegionFillUp7, Area7, Row7, Column7) ClassNum:=['瓶蓋','充電器'] *創建一個高斯混合模型分類器 create_class_gmm (2, 2, 1, 'spherical', 'normalization', 10, 42, GMMHandle) *增添瓶蓋的特征 FeatureVector:=real([Circularity,Area]) add_sample_class_gmm (GMMHandle, FeatureVector, 0, 0) FeatureVector2:=real([Circularity2,Area2]) add_sample_class_gmm (GMMHandle, FeatureVector2, 0, 0) FeatureVector3:=real([Circularity3,Area3]) add_sample_class_gmm (GMMHandle, FeatureVector3, 0, 0) FeatureVector4:=real([Circularity4,Area4]) add_sample_class_gmm (GMMHandle, FeatureVector4, 0, 0) *增添充電器的特征 FeatureVector1:=real([Circularity1,Area1]) add_sample_class_gmm (GMMHandle, FeatureVector1, 1, 0) FeatureVector5:=real([Circularity5,Area5]) add_sample_class_gmm (GMMHandle, FeatureVector5, 1, 0) FeatureVector6:=real([Circularity6,Area6]) add_sample_class_gmm (GMMHandle, FeatureVector6, 1, 0) FeatureVector7:=real([Circularity7,Area7]) add_sample_class_gmm (GMMHandle, FeatureVector7, 1, 0) *訓練高斯模型 train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.0001, Centers, Iter) *讀取現有瓶蓋模型 read_image (Image8, 'D:/驗證集.bmp.tif') rgb1_to_gray (Image8, GrayImage8) threshold (GrayImage8, Regions8, 128, 253) connection (Regions8, ConnectedRegions8) select_shape (ConnectedRegions8, SelectedRegions10, 'area', 'and', 150952, 500000) fill_up (SelectedRegions10, RegionFillUp8) circularity (RegionFillUp8, Circularity8) area_center (RegionFillUp8, Area8, Row8, Column8) *讀取現有充電器模型 read_image (Image9, 'D:/充電器驗證集.bmp.tif') rgb1_to_gray (Image9, GrayImage9) threshold (GrayImage9, Regions9, 113, 255) connection (Regions9, ConnectedRegions9) select_shape (ConnectedRegions9, SelectedRegions11, 'area', 'and', 787619, 1e+006) fill_up (SelectedRegions11, RegionFillUp9) circularity (RegionFillUp9, Circularity9) area_center (RegionFillUp9, Area9, Row9, Column9) *區分時,將現有瓶蓋物體特征輸入 FeatureVector8:=real([Circularity8,Area8]) classify_class_gmm (GMMHandle, FeatureVector8, 1, ClassID, ClassProb, Density, KSigmaProb) *分類后顯示瓶蓋類目名稱 dev_display (Image8) disp_message (WindowHandle, '類別:'+ClassNum[ClassID], 'window', 0,0, 'black', 'true') stop () *區分時,將現有充電器物體特征輸入 FeatureVector9:=real([Circularity9,Area9]) classify_class_gmm (GMMHandle, FeatureVector9, 1, ClassID, ClassProb, Density, KSigmaProb) dev_display (Image9) disp_message (WindowHandle, '類別:'+ClassNum[ClassID], 'window', 0,0, 'black', 'true') *清除分類器,釋放內容 clear_class_gmm (GMMHandle)