SVM实现分类识别及参数调优(一)

前言

 项目有一个模块需要将不同类别的图片进行分类,共有三个类别,使用SVM实现分类。

实现步骤:

1.创建训练样本库;

2.训练、测试SVM模型;

3.SVM的数据要求;

实现系统:

windows_x64、opencv2.4.10、 VS2013

实现过程:

1.创建训练样本库;

1)将图片以包含类别的名称进行命名,比如0(1).jpg等等;

2)将所有已命名正确的训练样本保存在同一个文件夹中;

3)在训练样本库的文件夹目录下创建python源文件;

python代码:

复制代码
import sys
import os
import string
import re

if __name__=='__main__':
    print('Begin generate path and label.')
    path_file=open('train_path.txt','w')
    path='E:/carriage_recognition/redplate_detection/svm_train_test/data/train/model'
    pic_type='.png'
    pat=re.compile(r'^(\d+)')
    files=os.listdir(path)
    files_tmp=[]
    for i in files:
        if pic_type in i and not os.path.isdir(path+'/'+i):
            files_tmp.append(i)
    files=files_tmp
    for file in range(len(files)):
        ret=pat.match(files[file])
        path_file.write(path+'/'+files[file]+'\n')
        if file<len(files)-1:           
            path_file.write(ret.group(1)+'\n')
        else:           
            path_file.write(ret.group(1))
    path_file.close()
    print('finish......')
View Code
复制代码

4)运行代码,即可,生成包含图片名称和类别的文本文件,用于SVM训练过程中读物图片获取相应的类别标签;

1
2
3
4
E:/carriage_recognition/redplate_detection/svm_train_test/data/train/model/0 (1).png
0
E:/carriage_recognition/redplate_detection/svm_train_test/data/train/model/0 (10).png
0

奇数行表示训练样本图片的路径名称;偶数行表示该图片的类别标签;

2.训练、测试SVM模型;

1)image.h,主要实现过程的代码;

  

2)主要函数说明;

2.1)SVMTrain函数主要实现模型的训练,其中训练参数使用RBF核,主要调整gamma和C这两个参数,固定一个参数调整另一个参数,最后确定模型参数分别为0.5/0.2;

2.2)SVMPredict函数主要实现对测试样本库的测试,并使用FScore指标测试SVM模型的性能;也可以使用混淆矩阵测试性能;

2.3)ReadTrainData/ ReadTestData函数分别用于获取训练和测试样本库图片的名称和类别标签;

2.4)LoadTrainData函数用于读取训练数据,并进行图像处理;

2.5)代码中使用整张图片的信息进行归一化之后作为特征;

3)主函数入口

复制代码
#include "image.h"

int main(int argc, char *argv[])
{
#if (ON_STUDY)
    ReadTrainData();
    LoadTrainData();
    SVMTrain(buffer);
#else
    ReadTestData();
    SVMPredict();
#endif

    getchar();
}
复制代码

参数ON_STUDY表示选择进行训练或者测试的标志位;

3.SVM的数据要求;

需要说明的是就是SVM对于输入的数据类型是有要求的,即mTrainData(训练数据矩阵)以及mFlagPosNeg(标签矩阵)都必须为CV_32FC1类型(我的环境标签矩阵是CV_32SC1类型的),因此需要进行类型转换,而且必须保证转换完之后数值都不能大于1,这就给我们了两点启示:1)不能直接用下采样后的图像像素作为训练数据的输入,需要进行类型的归一化。2)类型转换时要使用normlize函数,保证其数值范围不大于1,而不能简单的使用Mat的成员函数coverto,只变类型不变数值范围。( 需要注意!)

问题:

该实现过程需要人工调整参数,比较繁琐,可以思考一下,是否还存在其他问题;

参考:

1.http://blog.csdn.net/firefight/article/details/6452188

2.opencv中SVM的那些事儿

 

posted on   鹅要长大  阅读(1088)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示