劉海房,蔣 謹
(廣東白云學院大數據與計算機學院,廣州 510000)
我國是世界上臍橙種植面積最大的國家,但臍橙品質分級處理程度低。臍橙品質分級可以提高臍橙質量,臍橙按照成熟度、大小、表面缺陷等進行品質分級后,可以創造更大的商品價值,同時可以提高果農收益[1]。
近年來,隨著機器視覺、數字圖像處理技術、機器學習技術的快速發展,國內外對水果品質分級做了較深入的研究[2]。Arivazhagan 等[3]提出了一種基于顏色和紋理特征有效融合的水果識別方法。Wu[4]使用主成分分析(principal component analysis,PCA)來減少顏色、紋理和形態特征,并引入了內核支持向量機(kernel support vector machine,KSVM)作為分類器。Ji[5]用 適 應 度 標 準 混 沌(fitness-scaled chaotic ABC,FSCABC)取代了KSVM,從而提高了準確率。Lu[6]使用分數傅里葉熵作為特征,使用反向傳播神經網絡(back propagation neural network,BPNN)作為分類器。姚立健等[7]采用數字圖像處理的方法提取水果的特征,設計一種反向傳播神經網絡,實現蘋果的多特征融合。
神經網絡有很強的非線性擬合能力,可映射任意復雜的非線性關系,而且學習規則簡單,便于計算機實現,具有很強的魯棒性、記憶能力、非線性映射能力以及強大的自學習能力,因此有很大的應用市場。但是,當數據不充分的時候,神經網絡就無法進行工作[8]。
支持向量機(support vector machine,SVM)是一種有堅實理論基礎的、新穎的小樣本學習方法,它基本上不涉及概率測度及大數定律等,因此不同于現有的統計方法。從本質上看,它避開了從歸納到演繹的傳統過程,實現了高效的從訓練樣本到預報樣本的“轉導推理”,大大簡化了通常的分類和回歸等問題。
基于目前臍橙圖像數據集數據量較少,神經網絡模型的預測效果明顯低于SVM 算法,故本文采用SVM算法實現臍橙品質分級。
根據國家臍橙分級標準[9],將臍橙分為特級果、一級果、二級果,等外果。具體可參考表1。

表1 國家臍橙分級標準(GB/T 21488-2008)的部分參數
以贛南臍橙果園為數據采集基地,選取特級果、一級果、二級果、等外果各110個,用手機攝像頭對這些臍橙進行拍照,分別從上面、下面和3 個側面共5 個角度進行拍攝,采集臍橙圖像數據[10]。
將每個臍橙采集到的5 張圖像分別進行裁剪,對裁剪后的5張圖像進行摳圖,最后進行合成,融合為1 張圖像。多角度多區域圖像融合,能更全面反映該臍橙的大小、成熟度、果面缺陷等特征。單個臍橙的5張不同角度的圖像融合后的圖像如圖1 所示,從左到右分別是上面圖像、下面圖像、3 張側面圖像。同時根據大小、成熟度、果面缺陷面積對這張臍橙圖像進行級別標注,圖像文件名稱中標明是特級果(SUPER)、一級果(FIRST)、二級果(SECOND)或等外果(EXCEPTION)。每個臍橙可以得到1張融合后的圖像數據,共440張。這些臍橙圖像構成了臍橙品質分級圖像數據集。隨機選取400張圖像進行訓練,剩下40張用于測試。

圖1 臍橙合成圖像
支持向量機(support vector machine,SVM)是一種優良的數據挖掘技術,它利用最優化原理處理數據挖掘中的相關問題,可以實現從低維數據空間到高維特征空間的映射,從而將一個低維非線性問題轉化為高維線性可分問題。在一定程度上解決了“維數災難”和“過學習”難題,在處理小樣本、非線性和高維數上有很好的泛化能力和推廣性。
SVM 模型的核心是核函數,選擇一個好的核函數對支持向量機精度十分重要。在SVM中,常見的核函數共分為四種:多項式核函數(PF)、徑向基核函數(RBF)、Sigmoid 核函數(SF)以及線性核函數(LF)。其優劣各有不同,線性核函數比較簡單,可以求解一個QP 問題,但是只能解決線性可分問題;多項式核函數依靠升維使得原本線性不可分的數據線性可分,可解決非線性問題。本項目樣本數較少,經過比較,選擇預測效果較好的多項式核函數建模。
基于臍橙圖像數據集,訓練基于多項式核函數的SVM 模型,并應用訓練好的模型進行測試,步驟如下:
(1)讀取臍橙圖像數據集中的訓練圖片;
(2)對圖片進行變換處理,提取訓練集圖片的特征值;
(3)對標簽進行編碼,標準化處理;
(4)建立基于多項式內核的SVM算法模型;
(5)運用圖像樣本數據集和圖像分類標簽數據集,對SVM算法模型進行訓練;
(6)讀取測試圖像,運用訓練好的模型,對測試圖片進行識別分類,得到分類結果。
2.2.1 模型訓練函數代碼(Python代碼)
def trainPic(self,trainPicDir,savedModelDir):
#訓練集圖片路徑
picDic,train_urls=search_files(self,trainPicDir)
#提取訓練集圖片的特征值
train_x,train_y=[],[]
for label,urls in picDic.items():
for file in urls:
image=cv.imread(file)
gray=cv.cvtColo(rimage,cv.COLOR_BGR2
GRAY)
h,w=gray.shape
f=200/min(h,w)
gray=cv.resize(gray,None,fx=f,fy=f)
shift=cv.xfeatures2d.SIFT_create()
keypoints=shift.detec(tgray)
_,desc=shift.compute(gray,keypoints)
sample=np.mean(desc,axis=0)
train_x.append(sample)
train_y.append(label)
train_x=np.array(train_x)
#訓練集Y標簽編碼
encoder=sp.LabelEncoder()
self.setEncoder(encoder)
train_y_label=self.getTheEncode(r).fit_transform
(train_y)
#建立SVM模型并訓練模型
self.model=svm.SVC(kernel=“poly”,degree=4,
gamma=“auto”,probability=True)
self.model.fi(ttrain_x,train_y_label)
prd_train_y=self.model.predic(ttrain_x)
with open(‘my_model.m’,‘wb’)as fw:
joblib.dump(self.model,fw)
return self.model;
2.2.2 識別分類函數代碼(Python代碼)
def predictPic(self,preDir,classifyDir,model):
#加載測試集
test_urls,file_url=search_files(self,preDir)
prin(ttest_urls)
#使用模型識別圖片
prd_test_y=model.predic(ttest_x)
prin(tsm.classification_repor(ttest_y_label,prd_
test_y))
#輸出圖片所屬類別概率
output_Str=“圖片名稱 所屬類別概率【SUPER
FIRST SECOND EXCEPTION】”
probs=model.predict_proba(test_x)
accuracyVar=st(raccuracy_score(test_y_label,prd_
test_y))
test_Res_Str=“”+accuracyVar
class_type=[‘SUPER’,‘FIRST’,‘SECOND’,
‘EXCEPTION’]
picTypeIndex=[]
j=0
for i in np.round(probs,3):
maxType=getMaxPossibily(i)
output_Str=output_Str+“ ”+file_ur[lj]+“ ”
+formatOutpu(ti)
j=j+1
picTypeIndex.append(class_type[maxType])
tmp_str1=‘’.join(str(i)for i in np.round(probs,
3))
prin(tnp.round(probs,3))
界面程序使用PyQt5設計實現,使用的環境有Windows 10、Python 3.7.2、PyQt5、Qt Designer、Pycharm 等。界面主要設計了兩大區域,操作區域和結果顯示區域,操作區域包括設置訓練圖片路徑按鈕、開始訓練按鈕、設置測試圖片路徑按鈕和識別分類按鈕,顯示區域用顯示框顯示實驗結果。
程序界面操作步驟如下:
(1)點擊設置訓練圖片路徑按鈕,選擇訓練圖片文件夾;
(2)點擊開始訓練,程序會調用訓練函數進行訓練,大概等待五分鐘左右,訓練完成;
(3)點擊設置測試圖片路徑按鈕,選擇測試圖片文件夾;
(4)點擊識別分類按鈕,程序會調用識別分類函數進行圖像識別及分類;
(5)輸出窗口輸出每張測試圖片屬于特級果(SUPER)、一級果(FIRST)、二級果(SECOND)、等外果(EXCEPTION)的概率,概率最高的類別即為該臍橙所屬類別。
程序運行結果如圖2所示,界面顯示區域顯示了40張測試圖片的測試結果。如SUPER_01.jpg圖片,識別為特級果(SUPER)、一級果(FIRST)、二級果(SECOND)、等外果(EXCEPTION)的概率分別為86.5%、1.1%、5.5%、6.6%,很顯然,該張圖片為特級果的概率最大,故屬于特級果,跟圖片原本的標注(圖片名稱中標注為SUPER特級果)一致,識別分類成功。FIRST_01.jpg 圖片,識別為特級果(SUPER)、一級果(FIRST)、二級果(SECOND)、等外果(EXCEPTION)的概率分別為0.3%、82.3%、4.6%、6%,很顯然,該張圖片為一級果的概率最大,故屬于一級果,跟圖片原本的標注(圖片名稱中標注為FIRST 一級果)一致,識別分類成功。其他圖片識別分類結果分析依此類推。最后,統計所有測試圖片識別分類結果,得出測試數據集整體識別分類成功的概率為92.5%。

圖2 程序運行結果
本文通過圖像融合的方式將多角度多區域的臍橙圖像進行融合,融合后的圖像更全面、更準確地反映了臍橙的各項基本特征,有助于提高臍橙識別分類成功率。結合實際情況,本文選用了支持向量機(SVM)算法進行模型訓練,設計了算法過程,使用Python 編寫算法代碼,使用PyQt5等技術實現了界面程序。將測試圖片數據集導入程序,得出實驗結果,結果顯示,臍橙識別分類成功率較高。但是,本文在圖像融合技術方面,只是做了簡單的圖像合成,還有待進一步提升。因數據量樣本較少,所以實驗結果較為理想,若數據樣本量足夠大,則算法還有待進一步優化和研究。