C语言&嵌入式机器视觉硬件&嵌入式

libsvm嵌入式移植

2020-10-07  本文已影响0人  行之与亦安

SVM(Support Vector Machine, 支持向量机)这个算法也是相当经典的一个分类算法了。如果想要使用SVM算法,大家一般也不会自己造轮子,开源的库也就够用了。开源的SVM库中最香的,应该是台湾大学林智仁(Lin Chih-Jen)教授开发的libsvm库了。

我最近的项目中,恰巧用到了SVM算法,libsvm很快解决了问题。但我最终希望把算法部署到嵌入式的设备中(STM32)。我一开始兴致勃勃地把整个源码都移植过去了,后来越想越不对,嵌入式的资源这么小,libsvm的底层搞得那么复杂,代码量那么大,全部移植过去岂不是亏大了。事实上,libsvm大部分的精力都在解决训练的问题,而推理部分,说实话,只有一点点。

公式如下:
\operatorname{sgn}\left(\boldsymbol{w}^{T} \phi(\boldsymbol{x})+b\right)=\operatorname{sgn}\left(\sum_{i=1}^{l} y_{i} \alpha_{i} K\left(\boldsymbol{x}_{i}, \boldsymbol{x}\right)+b\right)

如果想要了解公式的具体含义,可以参考这篇文章

多么简单清晰的一个公式,唯一需要变换的就只是核函数而已,而文章中也已经给出了不同的核函数的写法。

另一方面,libsvm训练好后会保存为一个模型文件。而进行libsvm推理时,需要先加载这个文件。而嵌入式的裸机开发中,是没有文件系统的,即使可以加上,也很麻烦。所以,我索性就干了这么个事:自己解析libsvm生成的模型文件,并生成对应的model.h和model.c文件。把数据和方法全部都放在model.h和model.c中,这样,就可以非常简单地在外部调用svm的推理方法了。

我把这个工作放到了我的github中。实现起来其实非常简单,但是却大量地缩小了嵌入式系统中存储的使用,免去了文件系统的搭建。如果你也有同样的需求,也可以试试看。

上一篇 下一篇

猜你喜欢

热点阅读