盧昆鵬,潘宏俠
(中北大學 機械與動力工程學院,太原 030051)
?
移植Libsvm軟件實現TMS320F28335的支持向量機
盧昆鵬,潘宏俠
(中北大學 機械與動力工程學院,太原 030051)
摘要:化簡了支持向量機算法在實際應用中的步驟,提出了利用分解和提取代碼的方法在TMS320F28335芯片中移植Libsvm軟件,并實現了支持向量機。該方法解決了在C2000系列DSP芯片中實現支持向量機的問題,同時適用于其他型號的芯片。實驗結果表明,在保證較高的預測正確率、較快的運行速度和較大的數據量讀取的前提下,Libsvm能夠正確運行于芯片中。
關鍵詞:支持向量機;Libsvm;DSP;TMS320F28335;嵌入式系統
引言
支持向量機在小樣本、非線性及高維模式識別中表現出許多特有的優勢,并能夠推廣應用到函數擬合等其他機器學習問題中[1-4]。目前實現支持向量機的方法有軟件方法(如Libsvm、Liblinear、mySVM、SVMlight等[1]),也有硬件方法(如約翰霍普金斯大學開發的Kerneltron芯片[2]),但是這兩種方法都有缺點,如成本高、體積大、耗能多、通用性差等。
TI公司應用于控制領域的C2000系列芯片具有低功耗、低成本、通用性強和可實時控制的優點。采用其作為運行SVM的平臺,實現支持向量機的實時應用,比PC系統體積小,其控制能力和數據處理能力可以在滿足工作需要的同時有效控制成本。但是此類芯片具有運行頻率較低、可用內存小的缺點,如果在其中運行大型程序或讀取大量數據,會受到運行資源的限制。本文針對此問題,提出了一種解決方案。
1支持向量機的算法
支持向量機(SVM)能非常成功地處理回歸問題(時間序列分析)和模式識別(分類問題、判別分析)等諸多問題,并可推廣于預測和綜合評價等領域。C-支持向量分類機的算法步驟為[3]:
① 給定訓練集
T={(x1,y1),…,(xl,yl)}∈(Rn×y)l
其中,xi∈Rn,yi∈y={1,-1},i=1,2,…,l。
② 選取適當的核函數K(x,x’)及懲罰參數C>0。
③ 構造并求解凸二次規劃問題:


其中,0≤αi≤C,i=1,…,l,


⑤ 構造決策函數f(x)=sgn(g(x)),其中
⑥ 通過決策函數f(x)=sgn(g(x))預測數據。
2方案的設計和實現
2.1代碼分解和抽取
Libsvm是臺灣大學林智仁(LinChih-Jen)教授等開發設計的一個簡單、易于使用和快速有效的SVM模式識別與回歸的開源軟件包[5]。其源代碼文件有5個:svm-train.c,svm-predict.c,svm-scale.c,svm.h和svm.cpp。其中svm-train.c是訓練樣本工具的代碼,上述6步算法中的①~⑤都是在這個代碼文件中實現的;svm-predict.c是預測工具的代碼,實現上述算法中的第⑥步;svm-scale.c是歸一化數據工具的代碼;svm.h是頭文件;svm.cpp是類的實現代碼。后3個軟件分別實現訓練、預測和歸一化數據的功能。代碼文件svm-train.c、svm-predict.c、svm-scale.c分別與svm.h和svm.cpp編譯就可以得到這3個軟件。Libsvm代碼結構如圖1所示。

圖1 Libsvm代碼結構
如果在DSP平臺上實現以上支持向量分類機的6步算法,不僅需要進行大量的計算,而且實現起來非常麻煩。事實上,在實際應用的過程中,只需要實現第6步。
Libsvm的5個文件的代碼加起來總共有四千多行,而且分為3個共用類實現文件和頭文件的程序,把各部合為一個程序并且移植運行于DSP平臺難度較大。考慮到以上因素,同時為了節省DSP的存儲資源和運行資源,采取了以下的移植方案:
① 訓練數據部分在PC里實現,訓練完成后保存訓練模型,然后存儲在SD卡上;
② 預測部分在DSP里實現,即把svm-predict.c、svm.h、svm.cpp編譯運行于DSP內;
③ 預測時,利用DSP芯片上的SPI模塊和SD卡進行通信,讀取SD卡上的模型來對存儲于卡上的數據進行預測;
④ 預測結果存儲于SD卡內。
實現方案如圖2所示。

圖2 實現方案
預測部分代碼的主要函數包括:
read_model_header()——讀模型的參數;
svm_load_model()——載入模型;
svm_predict(),svm_predict_values()——實現預測功能。
類文件svm.cpp中需要提取的類成員函數包括:
k_function()——核函數的選擇函數;
dot()——內積函數;
svm_get_labels()——獲取標簽函數;
powi()——冪函數。
將這些函數代碼從svm-predict.c、svm.h和svm.cpp中提取出來,整合為一個程序文件。
2.2移植
代碼移植之前需要考慮的問題有:①源代碼編譯之后的程序運行于Win32控制平臺,利用命令行輸入參數,所以設置參數、傳遞參數的方式都與DSP程序有所不同;②在DSP運行標準輸入輸出函數會占用很多系統資源,使系統運行變慢,甚至會導致程序無法運行;③從SD卡中存儲和讀取文件,需要依賴于文件系統。
2.2.1參數的傳遞
源代碼編譯后的程序是從命令行讀取參數的,而DSP平臺沒有命令行,因而必須改變讀取參數方式,例如可把參數設置于文本文件中,再從文本文件中讀取參數,或者在得到訓練模型文件后,直接把參數固化于程序中。程序修改包括:
① 將read_model_header()函數中的格式化讀取函數FSCANF()用獲取字符串函數f_gets()、分解字符串函數strtok()和字符串轉浮點函數strtod()來代替,或者在read_model_header()函數中直接給模型結構體的各個參數變量賦值;
② svm-predict.c里面main函數參數改為void,增加相應的文件讀寫函數。
2.2.2利用文件系統接口函數

圖3 利用FatFS接口函數 存儲和讀取文件
從SD卡讀取文件,需要移植文件系統,本文所采用的是FatFS文件系統。其次,由于在DSP中使用標準I/O函數會占用很多的運行資源,導致程序無法正常運行,所以必須用FatFS文件系統的API接口函數來代替標準I/O函數,如圖3所示。
最后,還需屏蔽掉類似“fprintf(stderr,"can't open model file %s ",argv[i+1]);”的錯誤信息打印的語句,因為此類語句輸出為PC屏幕終端;或者可以把錯誤信息輸出到txt文本文件上,調取文件便可閱覽信息。
2.3優化運行環境參數和支持向量機的參數
嵌入式平臺的運行資源相對于PC來說比較少,如果需要運行大型程序或者是讀取大量數據,必須要考慮可用RAM和Flash的大小以及堆棧段的大小。DSP的.stack段也稱為系統棧,主要作用有:保存函數調用后的返回地址;給局部變量分配存儲空間;傳遞函數參數;保存臨時結果。

圖4 讀取數據到.stack段中
TMS320F28335型數字信號處理器為TI公司的TMS320C28x系列浮點DSP控制器,頻率為150 MHz,片內RAM大小為34 KB×16,片內Flash大小為256 KB×16。其.stack段大小默認為0x400,需要讀取大量數據時可能出現.stack段空間不足的情況,造成程序運行錯誤[7]。為了正確讀取數據,需要修改分配RAM空間的CMD文件,分配更大的空間給.stack段。讀取數據到.stack段中的示意圖如圖4所示。
修改后的程序主要分為3部分:初始化部分、讀取模型部分和預測部分。完成以上工作,程序便可以正常運行于DSP平臺。
Libsvm軟件包提供了支持向量機的參數優化工具grid.py。利用多重交叉驗證的方法對C-支持向量機的參數進行優化,可提高預測結果的正確率。在輸入訓練集文件之后,利用grid.py對支持向量機的參數C和gamma尋優,如圖5所示。

圖5 對支持向量機的參數尋優
3實驗驗證與比較
訓練集在PC中訓練后得到的模型,參數見表1。實驗數據為具有13個特征量的132組數據,轉換為Libsvm可讀取的數據類型之后,保存為data.txt文件,并存入SD卡中。利用CCS3.3軟件進行在線仿真時,程序運行時間在5 s之內。實驗結果如表2所列。

表1 模型參數

表2 預測結果(默認參數 序號∶標簽)
實驗結果表明,程序運行結果與原軟件包在PC平臺中的運行結果一致。訓練集支持向量的數量(nr)越多,預測正確率越高;但是由于受硬件的運行資源限制,支持向量不能過多。若采用優化過的參數和核函數,預測正確率更高(見表3)。程序燒錄到芯片中運行,結果與在線仿真時一致。

表3 優化前后的預測正確率比較
結語
經實驗驗證,在具備較高的預測正確率、較快的運行速度和較大的數據量讀取的同時,Libsvm能夠正確運行于芯片中。DSP的低功耗、便攜性、較高的運算速度優勢和支持向量機的算法優越性相結合, 促進了結合DSP的支持向量機模式識別技術在實踐中的廣泛應用[8]。本文的方案對于支持向量機在生物識別、文本分類等領域的具體應用和實現同樣具有借鑒意義。
參考文獻
[1] 鄧乃揚,田英杰.數據挖掘中的新方法—支持向量機[M].北京:科學出版社,2004.
Realization of TMS320F28335 Support Vector Machine Through Porting Libsvm
Lu Kunpeng,Pan Hongxia
(School of Mechanical and Power Engineering,North University of China,Taiyuan 030051,China)
Abstract:The steps in the practical application of support vector machine algorithm are simplified.The method of decomposing and extracting code in TMS320F28335 chip is proposed to realize support vector machine.The method solves the realization problem of support vector machine in C2000 series DSP chip,and it is suitable for other types of chip.The experiment results show that Libsvm can run on the chip properly under the premise of high prediction accuracy,fast running speed and large amount of data reading.
Key words:support vector machine;Libsvm;DSP;TMS320F28335;embedded system
中圖分類號:TP391.43
文獻標識碼:A