服务器端调用Matlab模型进行动作/意图识别

最近实验室项目结项,需要向云平台上上传模型进行动作识别,记得这是刚来实验室接手的第一个项目,做完这个项目的时间正好两年前我的生日的那天,老师给买了个蛋糕,实验室师哥陪我过完了我在实验室的第一个生日。这里再把整个流程整理一下,方便后来的师弟们学习。

服务器端调用Matlab模型进行动作/意图识别

  • Ubuntu 18.04.6 LTS 安装
    • 下载ISO镜像
    • 制作系统盘
    • 系统安装
    • 安装NVIDIA系统
    • 安装搜狗输入法
  • 安装Matlab
  • 安装MATLAB Runtime
  • 安装Kdevelop
  • C++调用MATLAB函数的简单例子
    • 编写MATLAB函数
    • 生成动态链接库
    • 编写c++工程
      • main.cpp
      • CMakeLists.txt
  • 项目中的栗子——socket
    • matlab函数
    • c++程序
    • CMakeLists.txt

Ubuntu 18.04.6 LTS 安装

下载ISO镜像

去官网https://releases.ubuntu.com/bionic/,下载Ubuntu 18.04.6 LTS (Bionic Beaver)镜像文件。

服务器端调用Matlab模型进行动作/意图识别_第1张图片

制作系统盘

使用Ventoy2Disk制作Ubuntu的系统盘

服务器端调用Matlab模型进行动作/意图识别_第2张图片

等进度条跑完或出现下面两个盘:

服务器端调用Matlab模型进行动作/意图识别_第3张图片

上述软件我放在了CSDN的资源里面https://download.csdn.net/download/qq_41990294/86805178(PS:发布博客的时候资源还没有审核通过,上传的时候我设置的积分为0)

系统安装

这里用的是实验室的拯救者,把刚制作好的U盘插入电脑,然后开机疯狂按F12:

选择带有AI的U盘,然后回车:

服务器端调用Matlab模型进行动作/意图识别_第4张图片
服务器端调用Matlab模型进行动作/意图识别_第5张图片

我们选择尝试Ubuntu就会先进入Ubuntu系统,在系统的桌面有如下两个图标,双击第一个开始系统安装:

服务器端调用Matlab模型进行动作/意图识别_第6张图片

语言选择简体中文,其实我更建议选择英文,因为中文安装完有些路径是中文的,用起来有些不方便。

服务器端调用Matlab模型进行动作/意图识别_第7张图片

选择键盘布局:

服务器端调用Matlab模型进行动作/意图识别_第8张图片

这里去掉下载时更新,要不然安装起来很慢,而且我也不知道更新啥,可能更新完就不是18.04了。

服务器端调用Matlab模型进行动作/意图识别_第9张图片

选择

服务器端调用Matlab模型进行动作/意图识别_第10张图片

选择其他安装,自己配置分区大小

服务器端调用Matlab模型进行动作/意图识别_第11张图片

这里给拯救者加装了一条1T的西数黑盘,我留了700G给Ubuntu,选中空闲的分区,然后点击下面的“+”,进行分区

服务器端调用Matlab模型进行动作/意图识别_第12张图片

给**/boot**2G,也就是2048MB:

服务器端调用Matlab模型进行动作/意图识别_第13张图片

交换空间60G:

服务器端调用Matlab模型进行动作/意图识别_第14张图片

EFI 2G:

服务器端调用Matlab模型进行动作/意图识别_第15张图片

剩下的都给根目录

服务器端调用Matlab模型进行动作/意图识别_第16张图片

选择“安装启动云到期的设备”与/boot一样:

服务器端调用Matlab模型进行动作/意图识别_第17张图片

点击现在安装,然后点击继续

服务器端调用Matlab模型进行动作/意图识别_第18张图片

服务器端调用Matlab模型进行动作/意图识别_第19张图片

设置一个密码,这里里的密码我习惯设置成 0,方便使用。

服务器端调用Matlab模型进行动作/意图识别_第20张图片

服务器端调用Matlab模型进行动作/意图识别_第21张图片

等进度条走完,出现如下,点击现在重启

服务器端调用Matlab模型进行动作/意图识别_第22张图片

安装NVIDIA系统

服务器端调用Matlab模型进行动作/意图识别_第23张图片

安装搜狗输入法

去搜狗官网下载Linux版本的安装包

服务器端调用Matlab模型进行动作/意图识别_第24张图片
服务器端调用Matlab模型进行动作/意图识别_第25张图片

sudo dpkg -i sogoupinyin_4.0.1.2800_x86_64.deb

服务器端调用Matlab模型进行动作/意图识别_第26张图片

安装依赖

sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2
sudo apt install libgsettings-qt1

打开设置的语言支持,设置键盘输入法系统为fcitx

服务器端调用Matlab模型进行动作/意图识别_第27张图片

服务器端调用Matlab模型进行动作/意图识别_第28张图片

服务器端调用Matlab模型进行动作/意图识别_第29张图片

服务器端调用Matlab模型进行动作/意图识别_第30张图片

服务器端调用Matlab模型进行动作/意图识别_第31张图片

sudo apt install fcitx-config-gtk

服务器端调用Matlab模型进行动作/意图识别_第32张图片

安装Matlab

下载matlab安装包:

链接:https://pan.baidu.com/s/18v7ovyn4q4nmAAkr6iaQMw?pwd=hxnu
提取码:hxnu

下载完成之后可以看到如下的文件:

服务器端调用Matlab模型进行动作/意图识别_第33张图片

mkdir matlab
sudo mount -t auto -o loop ~/Matlab2018bLinux/R2018b_glnxa64_dvd1.iso matlab/

先挂载一个盘,挂载上后如下所示:

服务器端调用Matlab模型进行动作/意图识别_第34张图片

sudo ./matlab/install

服务器端调用Matlab模型进行动作/意图识别_第35张图片

服务器端调用Matlab模型进行动作/意图识别_第36张图片

09806-07443-53955-64350-21751-41297

服务器端调用Matlab模型进行动作/意图识别_第37张图片

服务器端调用Matlab模型进行动作/意图识别_第38张图片

服务器端调用Matlab模型进行动作/意图识别_第39张图片
服务器端调用Matlab模型进行动作/意图识别_第40张图片

服务器端调用Matlab模型进行动作/意图识别_第41张图片

服务器端调用Matlab模型进行动作/意图识别_第42张图片

这时候需要挂载第二个盘,需要新开一个终端

sudo mount -t auto -o loop ~/Matlab2018bLinux/R2018b_glnxa64_dvd2.iso matlab/

服务器端调用Matlab模型进行动作/意图识别_第43张图片
服务器端调用Matlab模型进行动作/意图识别_第44张图片

服务器端调用Matlab模型进行动作/意图识别_第45张图片

cd /usr/local/MATLAB/R2018b/bin
sudo ./matlab

服务器端调用Matlab模型进行动作/意图识别_第46张图片

服务器端调用Matlab模型进行动作/意图识别_第47张图片

服务器端调用Matlab模型进行动作/意图识别_第48张图片

服务器端调用Matlab模型进行动作/意图识别_第49张图片

cd /Matlab2018bLinux/MATLAB R2018b Linux64 Crack/R2018b/bin/glnxa64/matlab_startup_plugins/lmgrimpl
sudo cp libmwlmgrimpl.so /usr/local/MATLAB/R2018b/bin/glnxa64/matlab_startup_plugins//lmgrimpl

服务器端调用Matlab模型进行动作/意图识别_第50张图片

cd /Matlab2018bLinux/MATLAB R2018b Linux64 Crack
sudo cp -f license_standalone.lic /usr/local/MATLAB/R2018b/licenses/

服务器端调用Matlab模型进行动作/意图识别_第51张图片

cd /usr/local/MATLAB/R2018b/bin
sudo ./matlab

服务器端调用Matlab模型进行动作/意图识别_第52张图片
如此激活好的MATLAB就安装好了!

然后,我们吧之前挂载的两个盘取消挂载:

sudo umount matlab/

要注意,这两条代码要在输入挂载命令的两个终端分别执行一次才能将两次挂载分别取消。
服务器端调用Matlab模型进行动作/意图识别_第53张图片

sudo rm -r matlab/ # 删除空的文件夹

服务器端调用Matlab模型进行动作/意图识别_第54张图片

安装MATLAB Runtime

去官网下载对应matlab版本的MATLAB Runtime:

https://ww2.mathworks.cn/products/compiler/matlab-runtime.html

服务器端调用Matlab模型进行动作/意图识别_第55张图片
创建一个安装路径并对这个文件赋予权限:

cd /usr/local/MATLAB/
sudo mkdir MATLAB_Runtime
sudo chmod 777 MATLAB_Runtime

下载文件夹打开终端,输入以下命令进行安装

unzip MCR_R2018b_glnxa64_installer.zip
cd MCR_R2018b_glnxa64_installer/
sudo -H ./install

服务器端调用Matlab模型进行动作/意图识别_第56张图片

在这里插入图片描述

服务器端调用Matlab模型进行动作/意图识别_第57张图片

服务器端调用Matlab模型进行动作/意图识别_第58张图片
服务器端调用Matlab模型进行动作/意图识别_第59张图片

上面图片给出的变量地址,记录下来:

/usr/local/MATLAB/MATLAB_Runtime/v95/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/extern/bin/glnxa64

服务器端调用Matlab模型进行动作/意图识别_第60张图片

把上述记录的环境变量地址放掉以下文件:

sudo gedit ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/MATLAB/MATLAB_Runtime/v95/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/extern/bin/glnxa64

服务器端调用Matlab模型进行动作/意图识别_第61张图片
更新一下文件:

source ~/.bashrc

到此安装结束!

安装Kdevelop

gcc -v

服务器端调用Matlab模型进行动作/意图识别_第62张图片

sudo apt-get install cmake

服务器端调用Matlab模型进行动作/意图识别_第63张图片

sudo apt-get install kdevelop

服务器端调用Matlab模型进行动作/意图识别_第64张图片
汉化

不需要自己下载汉化包,Kdevelop安装后,在终端执行

aptitude search kdevelop

会提示未安装,则自己安装一下

sudo apt-get install aptitude

然后再次执行

aptitude search kdevelop

服务器端调用Matlab模型进行动作/意图识别_第65张图片
选择中间的 kdevelop-l10n 进行安装

sudo apt-get install kdevelop-l10n

服务器端调用Matlab模型进行动作/意图识别_第66张图片

C++调用MATLAB函数的简单例子

编写MATLAB函数

function [ C ] = myFunc(A, B)  
  
C = A+B;  
  
end

生成动态链接库

>> mex -setup
MEX 配置为使用 'gcc' 以进行 C 语言编译。
警告: MATLAB C 和 Fortran API 已更改,现可支持
	 包含 2^32-1 个以上元素的 MATLAB 变量。您需要
	 更新代码以利用新的 API。
	 您可以在以下网址找到更多的相关信息:
	 https://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。

要选择不同的语言,请从以下选项中选择一种命令:
 mex -setup C++ 
 mex -setup FORTRAN
 
>>  mbuild -setup
MBUILD 配置为使用 'gcc' 以进行 C 语言编译。

要选择不同的语言,请从以下选项中选择一种命令:
 mex -setup C++ -client MBUILD 
 mex -setup FORTRAN -client MBUILD

生成myFunc.m的动态链接库(.so)

>>  mcc -W cpplib:libmyFunc -T link:lib myFunc.m -C
You do not have write permission in the output directory:
  '/home/f216/test'.
Call to mcc failed with return code 1 (0x1).

没有权限,给文件夹一个权限,然后重新生成链接库:

>>  mcc -W cpplib:libmyFunc -T link:lib myFunc.m -C
使用 'g++' 编译。
警告: 您使用的 gcc 版本为 '7.5.0'。不支持该版本的 gcc。MEX 当前支持的版本为 '6.3.x'。有关当前支持的编译器列表,请参阅: https://www.mathworks.com/support/compilers/current_release。

编写c++工程

main.cpp

#include 
#include 
#include 
#include "mclmcrrt.h"  
#include "mclmcr.h"  
#include "matrix.h"  
#include "mclcppclass.h"  
#include "myFunc.h"  

  
using namespace std;  
  
int main() {  

    // Set up the application state for the MATLAB Runtime instance created in the application.
    if (!mclInitializeApplication(NULL,0)) 
    {
      std::cerr << "could not initialize the application properly"
                << std::endl;
    	  return -1;
    }
    
    // initialize lib,这里必须做初始化!  
    if( !myFuncInitialize())  
    {  
        std::cout << "Could not initialize libmyFunc!" << std::endl;  
        return -1;  
    }  
  
    // 用户输入2个数值  
    double a, b;  
    cout<<"Please input 2 numbers  and then press enter: "<<endl;  
    cin >> a;  
    cin >> b;  
    
    double c; //used to receive the result  
    // 为变量分配内存空间, maltab只有一种变量,就是矩阵,为了和c++变量接轨,设置成1*1的矩阵  
    mwArray mwA(1, 1, mxDOUBLE_CLASS); //1,1表示矩阵的大小, mxDOUBLE_CLASS表示变量的精度  
    mwArray mwB(1, 1, mxDOUBLE_CLASS);  
    mwArray mwC(1, 1, mxDOUBLE_CLASS);  
    
    // 调用类里面的SetData函数给类赋值  
    mwA.SetData(&a, 1);  
    mwB.SetData(&b, 1);  
    
    // 调用自己的函数,求和。  
    myFunc(1, mwC, mwA, mwB);  
    
    c = mwC.Get(1, 1);  
    
    cout<<"The sum is: "<<c<<endl;  
    
    // 后面是一些终止调用的程序  
    // terminate the lib  
    myFuncTerminate();  
    
    // terminate MCR  
    mclTerminateApplication();  
  
  
    return EXIT_SUCCESS;  
}  

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(main)

set(CMAKE_CXX_STANDARD 11)

include_directories("/usr/local/MATLAB/MATLAB_Runtime/v95/extern/include")

add_executable(main main.cpp)

target_link_libraries(main "/home/f216/test/libmyFunc.so")

target_link_libraries(main "/usr/local/MATLAB/MATLAB_Runtime/v95/bin/glnxa64/libmwmclmcr.so")

target_link_libraries(main "/usr/local/MATLAB/MATLAB_Runtime/v95/runtime/glnxa64/libmwmclmcrrt.so")

上述所有文件都放在这个文件夹中:

服务器端调用Matlab模型进行动作/意图识别_第67张图片
在这个文件夹中执行以下命令:

mkdir build
cd build
cmake ..
make
sudo ./main

可以看到如下结果,看到计算结果是正确的:

服务器端调用Matlab模型进行动作/意图识别_第68张图片

项目中的栗子——socket

matlab函数

function outputresult = Predict_Act_on_Cloud_incloud(mode_path, feature)
    modelpath=[mode_path,'model.mat'];
	PSpath=[mode_path,'PS.mat'];

	test_new_feature=csvread(feature);
	load (modelpath);
	load (PSpath);
	Test_m = mapminmax('apply',test_new_feature,PS);
	test_m = Test_m';

	[predict_label_2,accuracy_2,decision_values2] = svmpredict(test_l,test_m,model);
	outputresult = predict_label_2
end

c++程序

/

#include 

#include "mclmcrrt.h"//
#include "mclmcr.h"  
#include "matrix.h"  
#include "mclcppclass.h"

#include "libmyFunc.h"//

/
#include
#include
#include
#include
#include
#include
#include
#include

#define MAXLINE 4096

using namespace std;  

int main(int argc, char** argv)
{
    int  listenfd, connfd;
    struct sockaddr_in  servaddr;
    char  buff[4096];
    int  n;
    char sendBuf[16];

    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
        printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }

    memset(&servaddr, 0, sizeof(servaddr));//用0填充每个字节
    servaddr.sin_family = AF_INET;//使用PF_INET地址族,也就是IPv4
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//具体的地址
    servaddr.sin_port = htons(6666);//端口

    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
        printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }

    if( listen(listenfd, 10) == -1){
        printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
        return 0;
    }
    
    ///
    
    ///初始化应用程序///
    // Set up the application state for the MATLAB Runtime instance created in the application.
    if (!mclInitializeApplication(NULL,0)) 
    {
      printf("could not initialize the application properly");
    	  return -1;
    }
    printf("I initialize the application properly\n");
    
    //初始化函数库
    // initialize lib,这里必须做初始化!  
    if( !libmyFuncInitialize())  
    {  
        printf("Could not initialize libfeatureInitialize!");  
        return -1;  
    }
    printf("I initialize libfeatureInitialize!\n");
    
    ///

    printf("======waiting for client's request======\n");
    
    if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
    {
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
    }
    
    while(1)
    {
        recv(connfd, buff, MAXLINE, 0); //阻塞函数,等待接受内容
        
        
        
        int len = strlen(buff);
        
        mwArray outputresult(1, 1, mxINT32_CLASS); //1,1表示矩阵的大小, mxDOUBLE_CLASS表示变量的精度  
        
        mwArray path(buff);

        Predict_Act_on_Cloud_incloud(1, outputresult, path);

        int Result = outputresult.Get(1, 1);

        printf("%d\n", Result);
        
        strcpy(sendBuf, to_string(Result).c_str());
        send(connfd,sendBuf,strlen(sendBuf),0); //回送信息
        ///
        
        
        buff[n] = '\0';

        //close(connfd);
    }
    
    ///
    // 后面是一些终止调用的程序  
    // terminate the lib  
    libmyFuncTerminate();  

    // terminate MCR  
    mclTerminateApplication(); 
    ///
    
    
    close(listenfd);
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(main)

set(CMAKE_CXX_STANDARD 11)

include_directories("/usr/local/MATLAB/MATLAB_Runtime/v95/extern/include")

add_executable(main main.cpp)

target_link_libraries(main "/home/f216/test_c/libmyFunc.so")

target_link_libraries(main "/usr/local/MATLAB/MATLAB_Runtime/v95/bin/glnxa64/libmwmclmcr.so")

target_link_libraries(main "/usr/local/MATLAB/MATLAB_Runtime/v95/runtime/glnxa64/libmwmclmcrrt.so")

运行程序:

服务器端调用Matlab模型进行动作/意图识别_第69张图片

该程序是服务端,需要客户端向他发送一个路径,该路径为特征文件、模型文件所在的地址,该程序才可以输出相应的识别结果。

注:

这种方式是一种串行运行方式,也就是只有一个socket服务端,如果有多个用户需要在云平台上训练,那么上传的数据只能排队进行识别,因为没有办法同时建立两个socket,如果建立多个会报如下的错:

服务器端调用Matlab模型进行动作/意图识别_第70张图片

你可能感兴趣的:(Ubuntu,matlab,ubuntu,开发语言)