最近实验室项目结项,需要向云平台上上传模型进行动作识别,记得这是刚来实验室接手的第一个项目,做完这个项目的时间正好两年前我的生日的那天,老师给买了个蛋糕,实验室师哥陪我过完了我在实验室的第一个生日。这里再把整个流程整理一下,方便后来的师弟们学习。
去官网https://releases.ubuntu.com/bionic/,下载Ubuntu 18.04.6 LTS (Bionic Beaver)镜像文件。
使用Ventoy2Disk制作Ubuntu的系统盘
等进度条跑完或出现下面两个盘:
上述软件我放在了CSDN的资源里面https://download.csdn.net/download/qq_41990294/86805178(PS:发布博客的时候资源还没有审核通过,上传的时候我设置的积分为0)
这里用的是实验室的拯救者,把刚制作好的U盘插入电脑,然后开机疯狂按F12:
选择带有AI的U盘,然后回车:
我们选择尝试Ubuntu就会先进入Ubuntu系统,在系统的桌面有如下两个图标,双击第一个开始系统安装:
语言选择简体中文,其实我更建议选择英文,因为中文安装完有些路径是中文的,用起来有些不方便。
选择键盘布局:
这里去掉下载时更新,要不然安装起来很慢,而且我也不知道更新啥,可能更新完就不是18.04了。
选择否
选择其他安装,自己配置分区大小
这里给拯救者加装了一条1T的西数黑盘,我留了700G给Ubuntu,选中空闲的分区,然后点击下面的“+”,进行分区
给**/boot**2G,也就是2048MB:
给交换空间60G:
给 EFI 2G:
剩下的都给根目录:
选择“安装启动云到期的设备”与/boot一样:
点击现在安装,然后点击继续
设置一个密码,这里里的密码我习惯设置成 0,方便使用。
等进度条走完,出现如下,点击现在重启
去搜狗官网下载Linux版本的安装包
sudo dpkg -i sogoupinyin_4.0.1.2800_x86_64.deb
安装依赖
sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2
sudo apt install libgsettings-qt1
打开设置的语言支持,设置键盘输入法系统为fcitx
sudo apt install fcitx-config-gtk
下载matlab安装包:
链接:https://pan.baidu.com/s/18v7ovyn4q4nmAAkr6iaQMw?pwd=hxnu
提取码:hxnu
下载完成之后可以看到如下的文件:
mkdir matlab
sudo mount -t auto -o loop ~/Matlab2018bLinux/R2018b_glnxa64_dvd1.iso matlab/
先挂载一个盘,挂载上后如下所示:
sudo ./matlab/install
09806-07443-53955-64350-21751-41297
这时候需要挂载第二个盘,需要新开一个终端
sudo mount -t auto -o loop ~/Matlab2018bLinux/R2018b_glnxa64_dvd2.iso matlab/
cd /usr/local/MATLAB/R2018b/bin
sudo ./matlab
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
cd /Matlab2018bLinux/MATLAB R2018b Linux64 Crack
sudo cp -f license_standalone.lic /usr/local/MATLAB/R2018b/licenses/
cd /usr/local/MATLAB/R2018b/bin
sudo ./matlab
然后,我们吧之前挂载的两个盘取消挂载:
sudo umount matlab/
要注意,这两条代码要在输入挂载命令的两个终端分别执行一次才能将两次挂载分别取消。
sudo rm -r matlab/ # 删除空的文件夹
去官网下载对应matlab版本的MATLAB Runtime:
https://ww2.mathworks.cn/products/compiler/matlab-runtime.html
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
上面图片给出的变量地址,记录下来:
/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
把上述记录的环境变量地址放掉以下文件:
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
source ~/.bashrc
到此安装结束!
gcc -v
sudo apt-get install cmake
sudo apt-get install kdevelop
不需要自己下载汉化包,Kdevelop安装后,在终端执行
aptitude search kdevelop
会提示未安装,则自己安装一下
sudo apt-get install aptitude
然后再次执行
aptitude search kdevelop
sudo apt-get install kdevelop-l10n
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。
#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;
}
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")
上述所有文件都放在这个文件夹中:
mkdir build
cd build
cmake ..
make
sudo ./main
可以看到如下结果,看到计算结果是正确的:
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
/
#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;
}
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")
运行程序:
该程序是服务端,需要客户端向他发送一个路径,该路径为特征文件、模型文件所在的地址,该程序才可以输出相应的识别结果。
注:
这种方式是一种串行运行方式,也就是只有一个socket服务端,如果有多个用户需要在云平台上训练,那么上传的数据只能排队进行识别,因为没有办法同时建立两个socket,如果建立多个会报如下的错: