劉海房,蔣 謹(jǐn)
(廣東白云學(xué)院大數(shù)據(jù)與計(jì)算機(jī)學(xué)院,廣州 510000)
我國(guó)是世界上臍橙種植面積最大的國(guó)家,但臍橙品質(zhì)分級(jí)處理程度低。臍橙品質(zhì)分級(jí)可以提高臍橙質(zhì)量,臍橙按照成熟度、大小、表面缺陷等進(jìn)行品質(zhì)分級(jí)后,可以創(chuàng)造更大的商品價(jià)值,同時(shí)可以提高果農(nóng)收益[1]。
近年來,隨著機(jī)器視覺、數(shù)字圖像處理技術(shù)、機(jī)器學(xué)習(xí)技術(shù)的快速發(fā)展,國(guó)內(nèi)外對(duì)水果品質(zhì)分級(jí)做了較深入的研究[2]。Arivazhagan 等[3]提出了一種基于顏色和紋理特征有效融合的水果識(shí)別方法。Wu[4]使用主成分分析(principal component analysis,PCA)來減少顏色、紋理和形態(tài)特征,并引入了內(nèi)核支持向量機(jī)(kernel support vector machine,KSVM)作為分類器。Ji[5]用 適 應(yīng) 度 標(biāo) 準(zhǔn) 混 沌(fitness-scaled chaotic ABC,F(xiàn)SCABC)取代了KSVM,從而提高了準(zhǔn)確率。Lu[6]使用分?jǐn)?shù)傅里葉熵作為特征,使用反向傳播神經(jīng)網(wǎng)絡(luò)(back propagation neural network,BPNN)作為分類器。姚立健等[7]采用數(shù)字圖像處理的方法提取水果的特征,設(shè)計(jì)一種反向傳播神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)蘋果的多特征融合。
神經(jīng)網(wǎng)絡(luò)有很強(qiáng)的非線性擬合能力,可映射任意復(fù)雜的非線性關(guān)系,而且學(xué)習(xí)規(guī)則簡(jiǎn)單,便于計(jì)算機(jī)實(shí)現(xiàn),具有很強(qiáng)的魯棒性、記憶能力、非線性映射能力以及強(qiáng)大的自學(xué)習(xí)能力,因此有很大的應(yīng)用市場(chǎng)。但是,當(dāng)數(shù)據(jù)不充分的時(shí)候,神經(jīng)網(wǎng)絡(luò)就無法進(jìn)行工作[8]。
支持向量機(jī)(support vector machine,SVM)是一種有堅(jiān)實(shí)理論基礎(chǔ)的、新穎的小樣本學(xué)習(xí)方法,它基本上不涉及概率測(cè)度及大數(shù)定律等,因此不同于現(xiàn)有的統(tǒng)計(jì)方法。從本質(zhì)上看,它避開了從歸納到演繹的傳統(tǒng)過程,實(shí)現(xiàn)了高效的從訓(xùn)練樣本到預(yù)報(bào)樣本的“轉(zhuǎn)導(dǎo)推理”,大大簡(jiǎn)化了通常的分類和回歸等問題。
基于目前臍橙圖像數(shù)據(jù)集數(shù)據(jù)量較少,神經(jīng)網(wǎng)絡(luò)模型的預(yù)測(cè)效果明顯低于SVM 算法,故本文采用SVM算法實(shí)現(xiàn)臍橙品質(zhì)分級(jí)。
根據(jù)國(guó)家臍橙分級(jí)標(biāo)準(zhǔn)[9],將臍橙分為特級(jí)果、一級(jí)果、二級(jí)果,等外果。具體可參考表1。
表1 國(guó)家臍橙分級(jí)標(biāo)準(zhǔn)(GB/T 21488-2008)的部分參數(shù)
以贛南臍橙果園為數(shù)據(jù)采集基地,選取特級(jí)果、一級(jí)果、二級(jí)果、等外果各110個(gè),用手機(jī)攝像頭對(duì)這些臍橙進(jìn)行拍照,分別從上面、下面和3 個(gè)側(cè)面共5 個(gè)角度進(jìn)行拍攝,采集臍橙圖像數(shù)據(jù)[10]。
將每個(gè)臍橙采集到的5 張圖像分別進(jìn)行裁剪,對(duì)裁剪后的5張圖像進(jìn)行摳圖,最后進(jìn)行合成,融合為1 張圖像。多角度多區(qū)域圖像融合,能更全面反映該臍橙的大小、成熟度、果面缺陷等特征。單個(gè)臍橙的5張不同角度的圖像融合后的圖像如圖1 所示,從左到右分別是上面圖像、下面圖像、3 張側(cè)面圖像。同時(shí)根據(jù)大小、成熟度、果面缺陷面積對(duì)這張臍橙圖像進(jìn)行級(jí)別標(biāo)注,圖像文件名稱中標(biāo)明是特級(jí)果(SUPER)、一級(jí)果(FIRST)、二級(jí)果(SECOND)或等外果(EXCEPTION)。每個(gè)臍橙可以得到1張融合后的圖像數(shù)據(jù),共440張。這些臍橙圖像構(gòu)成了臍橙品質(zhì)分級(jí)圖像數(shù)據(jù)集。隨機(jī)選取400張圖像進(jìn)行訓(xùn)練,剩下40張用于測(cè)試。
圖1 臍橙合成圖像
支持向量機(jī)(support vector machine,SVM)是一種優(yōu)良的數(shù)據(jù)挖掘技術(shù),它利用最優(yōu)化原理處理數(shù)據(jù)挖掘中的相關(guān)問題,可以實(shí)現(xiàn)從低維數(shù)據(jù)空間到高維特征空間的映射,從而將一個(gè)低維非線性問題轉(zhuǎn)化為高維線性可分問題。在一定程度上解決了“維數(shù)災(zāi)難”和“過學(xué)習(xí)”難題,在處理小樣本、非線性和高維數(shù)上有很好的泛化能力和推廣性。
SVM 模型的核心是核函數(shù),選擇一個(gè)好的核函數(shù)對(duì)支持向量機(jī)精度十分重要。在SVM中,常見的核函數(shù)共分為四種:多項(xiàng)式核函數(shù)(PF)、徑向基核函數(shù)(RBF)、Sigmoid 核函數(shù)(SF)以及線性核函數(shù)(LF)。其優(yōu)劣各有不同,線性核函數(shù)比較簡(jiǎn)單,可以求解一個(gè)QP 問題,但是只能解決線性可分問題;多項(xiàng)式核函數(shù)依靠升維使得原本線性不可分的數(shù)據(jù)線性可分,可解決非線性問題。本項(xiàng)目樣本數(shù)較少,經(jīng)過比較,選擇預(yù)測(cè)效果較好的多項(xiàng)式核函數(shù)建模。
基于臍橙圖像數(shù)據(jù)集,訓(xùn)練基于多項(xiàng)式核函數(shù)的SVM 模型,并應(yīng)用訓(xùn)練好的模型進(jìn)行測(cè)試,步驟如下:
(1)讀取臍橙圖像數(shù)據(jù)集中的訓(xùn)練圖片;
(2)對(duì)圖片進(jìn)行變換處理,提取訓(xùn)練集圖片的特征值;
(3)對(duì)標(biāo)簽進(jìn)行編碼,標(biāo)準(zhǔn)化處理;
(4)建立基于多項(xiàng)式內(nèi)核的SVM算法模型;
(5)運(yùn)用圖像樣本數(shù)據(jù)集和圖像分類標(biāo)簽數(shù)據(jù)集,對(duì)SVM算法模型進(jìn)行訓(xùn)練;
(6)讀取測(cè)試圖像,運(yùn)用訓(xùn)練好的模型,對(duì)測(cè)試圖片進(jìn)行識(shí)別分類,得到分類結(jié)果。
2.2.1 模型訓(xùn)練函數(shù)代碼(Python代碼)
def trainPic(self,trainPicDir,savedModelDir):
#訓(xùn)練集圖片路徑
picDic,train_urls=search_files(self,trainPicDir)
#提取訓(xùn)練集圖片的特征值
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)
#訓(xùn)練集Y標(biāo)簽編碼
encoder=sp.LabelEncoder()
self.setEncoder(encoder)
train_y_label=self.getTheEncode(r).fit_transform
(train_y)
#建立SVM模型并訓(xùn)練模型
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 識(shí)別分類函數(shù)代碼(Python代碼)
def predictPic(self,preDir,classifyDir,model):
#加載測(cè)試集
test_urls,file_url=search_files(self,preDir)
prin(ttest_urls)
#使用模型識(shí)別圖片
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設(shè)計(jì)實(shí)現(xiàn),使用的環(huán)境有Windows 10、Python 3.7.2、PyQt5、Qt Designer、Pycharm 等。界面主要設(shè)計(jì)了兩大區(qū)域,操作區(qū)域和結(jié)果顯示區(qū)域,操作區(qū)域包括設(shè)置訓(xùn)練圖片路徑按鈕、開始訓(xùn)練按鈕、設(shè)置測(cè)試圖片路徑按鈕和識(shí)別分類按鈕,顯示區(qū)域用顯示框顯示實(shí)驗(yàn)結(jié)果。
程序界面操作步驟如下:
(1)點(diǎn)擊設(shè)置訓(xùn)練圖片路徑按鈕,選擇訓(xùn)練圖片文件夾;
(2)點(diǎn)擊開始訓(xùn)練,程序會(huì)調(diào)用訓(xùn)練函數(shù)進(jìn)行訓(xùn)練,大概等待五分鐘左右,訓(xùn)練完成;
(3)點(diǎn)擊設(shè)置測(cè)試圖片路徑按鈕,選擇測(cè)試圖片文件夾;
(4)點(diǎn)擊識(shí)別分類按鈕,程序會(huì)調(diào)用識(shí)別分類函數(shù)進(jìn)行圖像識(shí)別及分類;
(5)輸出窗口輸出每張測(cè)試圖片屬于特級(jí)果(SUPER)、一級(jí)果(FIRST)、二級(jí)果(SECOND)、等外果(EXCEPTION)的概率,概率最高的類別即為該臍橙所屬類別。
程序運(yùn)行結(jié)果如圖2所示,界面顯示區(qū)域顯示了40張測(cè)試圖片的測(cè)試結(jié)果。如SUPER_01.jpg圖片,識(shí)別為特級(jí)果(SUPER)、一級(jí)果(FIRST)、二級(jí)果(SECOND)、等外果(EXCEPTION)的概率分別為86.5%、1.1%、5.5%、6.6%,很顯然,該張圖片為特級(jí)果的概率最大,故屬于特級(jí)果,跟圖片原本的標(biāo)注(圖片名稱中標(biāo)注為SUPER特級(jí)果)一致,識(shí)別分類成功。FIRST_01.jpg 圖片,識(shí)別為特級(jí)果(SUPER)、一級(jí)果(FIRST)、二級(jí)果(SECOND)、等外果(EXCEPTION)的概率分別為0.3%、82.3%、4.6%、6%,很顯然,該張圖片為一級(jí)果的概率最大,故屬于一級(jí)果,跟圖片原本的標(biāo)注(圖片名稱中標(biāo)注為FIRST 一級(jí)果)一致,識(shí)別分類成功。其他圖片識(shí)別分類結(jié)果分析依此類推。最后,統(tǒng)計(jì)所有測(cè)試圖片識(shí)別分類結(jié)果,得出測(cè)試數(shù)據(jù)集整體識(shí)別分類成功的概率為92.5%。
圖2 程序運(yùn)行結(jié)果
本文通過圖像融合的方式將多角度多區(qū)域的臍橙圖像進(jìn)行融合,融合后的圖像更全面、更準(zhǔn)確地反映了臍橙的各項(xiàng)基本特征,有助于提高臍橙識(shí)別分類成功率。結(jié)合實(shí)際情況,本文選用了支持向量機(jī)(SVM)算法進(jìn)行模型訓(xùn)練,設(shè)計(jì)了算法過程,使用Python 編寫算法代碼,使用PyQt5等技術(shù)實(shí)現(xiàn)了界面程序。將測(cè)試圖片數(shù)據(jù)集導(dǎo)入程序,得出實(shí)驗(yàn)結(jié)果,結(jié)果顯示,臍橙識(shí)別分類成功率較高。但是,本文在圖像融合技術(shù)方面,只是做了簡(jiǎn)單的圖像合成,還有待進(jìn)一步提升。因數(shù)據(jù)量樣本較少,所以實(shí)驗(yàn)結(jié)果較為理想,若數(shù)據(jù)樣本量足夠大,則算法還有待進(jìn)一步優(yōu)化和研究。