毕设项目分享 基于 SVM 分类器的动作识别系统(源码+论文)


0 项目说明

基于 SVM 分类器的动作识别系统

提示:适合用于课程设计或毕业设计,工作量达标,源码开放


1 研究目的

本项目对经典 SVM 二分类算法进行研究,在此基础上将 SVM 算法推广到了多分类中。此外通过获取智能手机中的加速度传感器、陀螺仪和方位传感器的数据,搭建了一个动作数据采集、传输和存储平台,支持多用户传输存储其动作数据。采用 SVM 多分类算法训练预处理后的动作数据,并采用粒子群优化算法(PSO)对 SVM 参数进行优化,建立动作分类模型识别出用户的动作意图。

2 研究方法

在分析理解 SVM 算法的基础上,将传统的 SVM 二分类模型延伸到多分类,使其适应本文的动作识别系统的需要。并提出使用 PSO 对 SVM 参数进行优化;

搭建了一个针对动作数据的采集、传输和存储平台。

搭建智能家居模拟模块,能够模拟实体智能家居设备的各类属性和状态,包括:能够发出学习信号,对新的动作数据进行有效的学习;能够接收控制命令,并根据控制命令改变自身的属性和状态;

完成 SVM 核心算法模块,模块功能包含:对动作数据进行系列预处理,对新的动作数据进行 SVM 算法学习并构建模型,能够通过模型对用户的动作数据进行学习并预测得出的动作意图结果,向智能家居模拟模块广播控制命令,使其相应地改变属性状态;

为了验证 SVM 分类器动作识别系统应用到智能家居控制交互模块中的大规模应用的可能性,整合上述功能,并实现了多用户同时在线使用和分析的场景;

最后运用其他分类算法,如 KNN 算法、神经网络等对相同动作数据进行分类学习,简单比较不同算法的不同特性。

2.1 动作采集

智能手机中的各类传感器模块可以很好地满足搭建动作识别系统的动作采集需要。智能手机集成的各类传感器模块不断丰富,这些传感器模块可以通过 Android编程很顺利地进行调用并获取到其传感器状态信息,这为我们实时高效地捕捉动作数据带来了极大的便利性。通过 Android 编程,调用和获取传感器的状态信息,包括:加速度传感器、陀螺仪和方位传感器,加速度、角速度和方位这几个维度的数据可以很好地还原出设备持有者当时的三维轨迹信息,为后面的 SVM 算法分类器训练带来了可能。
在这里插入图片描述
动作采集系统搭载运行在 Android 平台,通过编程实现了对智能手机传感器模块(包括:加速度传感器、陀螺仪和方位传感器模块)的调用,得到了某一时刻下三种传感器的状态信息。
在这里插入图片描述

2.2 动作识别

构建了一个基于 SVM 分类器的动作识别系统,通过对动作采集模块采集到的动作数据进行有效的接收和储存,而后对数据进行噪声处理、归一化等预处理过程,并利用改进的 SVM 多分类算法对动作数据进行分类器的训练。通过实践,搭建的 SVM 分类器的动作识别系统,动作识别准确率达到 94.03%。
在这里插入图片描述

2.3 智能家居模拟

基于 SVM 分类器的动作识别系统,是一个从动作采集,到动作数据的传输和存储系统,并通过改进的 SVM 分类算法,训练得到 SVM 分类器,对新的动作数据输入能够有较好的分类效果。
在这里插入图片描述
模拟显示模块能接收动作识别模块对于新动作的预测结果,并更新该家电的状态显示。
在这里插入图片描述

3 论文目录

前 言
第一章 绪 论
第一节 研究背景及意义
第二节 国内外研究现状
第三节 论文结构
第四节 本文主要任务与成果
第五节 本章小结
第二章 SVM 算法研究
第一节 SVM 方法介绍.
一、最优分类面
二、支持向量机
第二节 多分类的支持向量机
第三节 本文 SVM 算法的实现
第四节 粒子群优化 SVM 参数
一、SVM 参数介绍
二、粒子群优化算法介绍
三、粒子群优化 SVM 参数
第五节 本章小结
第三章 动作采集模块设计与实现.
第一节 动作采集模块概述
第二节 采集动作特征说明
一、加速度传感器
二、陀螺仪
三、方向传感器
第三节 动作采集 APP 设计与实现
一、APP 设计概要
二、动作采集和传输方案
第四节 本章小结
第四章 动作识别模块设计与实现
第一节 动作识别模块概述
一、后台架构
二、系统运行流程
第二节 数据预处理
第三节 动作预测模块
第四节 动作学习模块
第五节 本章小结
第五章 智能家居模拟模块的设计与实现
第一节 模拟学习模块
第二节 模拟显示模块
第三节 本章小结
第六章 结 论
第一节 其他分类算法效果比较
一、K 临近算法
二、神经网络算法
三、结论
第二节 总结与展望
一、总结
二、展望
第三节 本章小结
致 谢
参考文献
附 录
一、 英文原文
二、 英文翻译
三、 部分核心源程序代码

4 项目源码

package com.zhuke.svmclassifier.controller;

import com.google.gson.Gson;
import com.zhuke.smart_home.central.SHConfig;
import com.zhuke.svmclassifier.config.SystemConfig;
import com.zhuke.svmclassifier.entity.Message;
import com.zhuke.svmclassifier.entity.UserInfo;
import com.zhuke.svmclassifier.exceptions.UsernameExistedException;
import com.zhuke.svmclassifier.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Created by ZHUKE on 2016/3/31.
 */
@Controller
public class SVMController {

    @Autowired
    private DataRecordService dataRecordService;

    @Autowired
    private LearningService learningService;

    @Autowired
    private PredictService predictService;

    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private ThreadPoolExecutor threadPoolExecutor;

    @Autowired
    private RegisterLoginService registerLoginService;

    @RequestMapping("/predict/start.do")
    public void startPredict(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Long userId = Long.parseLong(request.getParameter("userId"));
        SVMConfig svmConfig = SystemConfig.getSVMConfig(userId);
        if (SystemConfig.IS_PREDICTING == 0) {
            SystemConfig.IS_PREDICTING = 1;
            threadPoolExecutor.execute(predictService);
            response.getWriter().print("预测服务开启成功。");
        } else {
            response.getWriter().print("预测服务正在运行中,无需重复启动。");
        }

    }

    @RequestMapping("/predict/stop.do")
    public void stopPredict(HttpServletRequest request, HttpServletResponse response) throws IOException {
        SystemConfig.IS_PREDICTING = 0;
        response.getWriter().print("终止预测成功");
    }


    @RequestMapping("/learning.do")
    public void learning(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletRequestBindingException {

        Long userId = Long.parseLong(request.getParameter("userId"));

        String lable = ServletRequestUtils.getStringParameter(request, "lable");
        learningService.learning(userId, lable);
        response.getWriter().print("OK");
    }

    @RequestMapping("/action_record.do")
    public void actionRecord(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Long userId = Long.parseLong(request.getParameter("userId"));
        dataRecordService.dataRecieve(userId, URLDecoder.decode(request.getParameter("action"), "UTF-8"));
        response.getWriter().print("OK");
    }

    @RequestMapping("/login.do")
    public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        UserInfo loginUser = userInfoService.login(name, password);
        if (loginUser != null) {
            response.getWriter().print(loginUser.getId());
        } else {
            response.getWriter().print("FAILED");
        }
    }

    @RequestMapping("/register.do")
    public void register(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            String name = URLDecoder.decode(request.getParameter("email"), "UTF-8");
            String password = URLDecoder.decode(request.getParameter("password"), "UTF-8");

            UserInfo userInfo = new UserInfo();
            userInfo.setCreatedOn(new Date());
            userInfo.setUserName(name);
            userInfo.setPassword(password);
            userInfo.setEmail(name);

            registerLoginService.register(userInfo);
            response.getWriter().print("OK");
        } catch (UsernameExistedException e) {
            e.printStackTrace();
            response.getWriter().print(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            response.getWriter().print("服务器错误");
        }
    }

    @RequestMapping(value = "/smarthome/device_list.do", method = RequestMethod.GET)
    public void getDeviceVector(HttpServletRequest request, HttpServletResponse response) {
        try {
            Gson gson = new Gson();
            String deviceListJson = gson.toJson(SHConfig.deviceVector);
            response.getWriter().print(deviceListJson);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @RequestMapping(value = "/smarthome/messages.do")
    public void getMessages(HttpServletRequest request, HttpServletResponse response) throws IOException {
        try {
            Long userId = Long.parseLong(request.getParameter("userId"));
            List<Message> messages = SystemConfig.getMessage(userId);
            response.getWriter().write(new Gson().toJson(messages));
        } catch (Exception e) {
            e.printStackTrace();
            response.getWriter().write("服务器繁忙,errMsg=" + e.getMessage() + "\n请退出重新登陆。");
        }
    }
}

5 最后

项目分享 :
https://gitee.com/asoonis/htw

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值