Matlabで構築し​た関数のwebアプリ​ケーション(html​, javascript​内で使用するなど)へ​の導入について

45 ビュー (過去 30 日間)
Yuto Omae
Yuto Omae 2017 年 11 月 12 日
編集済み: Kojiro Saito 2022 年 5 月 20 日
Matlabを使用し、機械学習による判定モデル(Model)を構築しました。 Matlab内では、
Res = predict(Model,[x x x]);
のように記述すると、判定モデル(Model)に、x x xが入力されたときの判定結果がResに貯蔵されると思います。 このように、何らかの入力を行った後、Matlab上で構築済みのモデルで出力を得るような関数があります。 こちらを、javascriptなどを経由してwebアプリケーションとして使用したいのですが、どのような方法が考えられるでしょうか。 MATLAB Compilerを購入すると可能になるのでしょうか。
よろしくお願いします。

採用された回答

Kojiro Saito
Kojiro Saito 2017 年 11 月 13 日
編集済み: Kojiro Saito 2022 年 5 月 20 日
いくつか方法がありますが、MATLAB Web App Serverを使う方法が他言語を全く書かずにWebアプリ化できるので、最も簡単です。他にはMATLAB Production Serverを使う方法が拡張性も高いです。それ以外にもMATLAB CompilerやCompiler SDKでMATLABスクリプトを実行ファイルやライブラリファイルにしてサーバーに置き、サーバーアプリケーション(NodeJS、PHPやJavaなど)からキックする方法などがあります。
2019/5/14 更新
(1) MATLAB Compilerを使ってWebアプリを作成し、MATLAB Web App Serverにホストする方法
R2018aから、MATLAB Compilerを使用して、App Designerで作成したアプリ(.mlapp)からWebアプリを作成することができるようになりました。Webアプリは、製品版のMATLAB Web App Serverか、MATLAB Compilerに含まれる開発版Web App Server上で動作させることができます。
セキュリティの関係からインターネット上ではなくイントラネット上での使用が推奨されていますが、App Designerで作成したGUIのアプリケーションを、HTMLやJavaScriptなどを書くことなく手軽にWebアプリケーション化できます。手元にApp Designerのアプリが無い場合でも、ドキュメントにWebアプリのサンプルもありますのですぐにお試しいただけます。
(2) MATLAB Production Serverを使った方法
下記の(3)や(4)の方法ではMATLAB Runtimeの起動時間が掛かったり、ユーザー数が増えて同時アクセスが大量に来た場合にサーバーのリソースが枯渇したりするのがネックになります。その際には MATLAB Production Server というサーバー製品を使うのがオススメです。RESTful APIというWebアプリケーションでよく使われるAPIがサポートされていたり、Java、Python、.NET、C++などからのアクセスもできるようになっているので、Webアプリケーションとの親和性が高く、インタフェースの実装に掛かる手間も少なくて済みます。また、キューイングの機能やMATLAB Runtimeの起動時間がないという特徴があるのでユーザーからの大量の同時アクセスに対して待ち時間なく処理を返すことができるようになります。
(3) MATLAB Compilerを使ってスタンドアロンアプリを作成しWebサーバーから呼び出す方法
MATLAB ComilerでMATLABのスクリプトからスタンドアロンのアプリケーション(Windowsならexeファイル、Linuxならshファイル)が作成できますので、これをサーバー側に置き、サーバープログラムから実行します。 ここでは簡単な例として、魔方陣行列をリターンするMATLABスクリプトをexeファイルに変換し、サーバープログラムとしてNodeJSを用いたWebアプリケーションの作成法を記します。MATLABスクリプトで結果をファイル(ここではresult.csv)に保存し、これをサーバープログラムから読み込ませます。
コンパイルするMATLABのスクリプト(magicSquare.m)
function out = magicSquare(n)
if ischar(n)
n = str2num(n);
end
out = magic(n);
disp(out)
csvwrite('result.csv', out);
これをMATLAB CompilerでコンパイルしてmagicSquare.exeを作成し、後述するapp.jsと同じフォルダーに置きます。また、サーバーマシンにコンパイルしたMATLABと同じバージョンのMATLAB Runtimeをインストールする必要があります。インストーラーは こちら にあります。
サーバープログラム(NodeJSのapp.js)
var express = require('express');
var app = express();
var path = require('path');
var fs = require('fs');
var csv = require('comma-separated-values');
var child_process = require('child_process');
var qs = require('querystring');
app.use(express.static(path.join(__dirname, 'public')));
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname, 'index.html'));
});
app.post('/execMatlab', function (req, res) {
var body = '';
req.on('data', function (data) {
body += data;
});
req.on('end', function () {
var inputData = qs.parse(body);
// execFile: executes a file with the specified arguments
child_process.execFile('magicSquare.exe', [String(inputData.inputNum)], function (error, stdout, stderr) {
// If error occurs
if (error) {
console.error('stderr', stderr);
throw error;
}
console.log(stdout.toString());
var csvData = fs.readFileSync('result.csv', 'utf-8');
var resultData = [];
var csvArray = new csv(csvData);
csvArray.forEach(function (array) {
resultData.push(array);
});
res.writeHead(200, {'content-type': 'application/json'});
res.end(JSON.stringify(resultData));
});
});
});
// Listener
var server = app.listen(3000, function () {
console.log('Server listening on port 3000');
});
クライアント(index.html)
<!DOCTYPE html>
<html>
<head>
<title>Magic Square</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://code.jquery.com/jquery-2.2.3.min.js"></script>
</head>
<body>
<div>
Matrix Order: <input type="number" id="inputNum" value="5" required/><br/>
<button onclick="exec()">Run</button>
</div>
<div id="result"><div class="data"></div></div>
<script>
function exec() {
var inputNum = $("#inputNum").val();
$.post('/execMatlab', {inputNum: inputNum}, function (data) {
console.log('SUCCESS');
console.log(data);
var displayResult = '';
for (var i = 0; i < data.length; i++) {
displayResult += String(data[i]) + '<br/>';
}
$(".data").replaceWith(displayResult);
}
)
};
</script>
</body>
</html>
サーバー側でNodeJSのライブラリなどをインストール(npm install)した後に、プログラムを実行します。
node app.js
WebブラウザからサーバーのURL(下記の例ではhttp://localhost:3000)にアクセスし、画面からRunボタンを実行することでmagicSquare.exeからリターンされる魔方陣行列が表示されます。
(4) MATLAB Compiler SDKを使った方法
MATLAB Compiler SDKは共有ライブラリを作成できますので、MATLABスクリプトを例えばJavaやPythonなどのライブラリに変換し、JavaやPythonなどのサーバープログラムと連携してキックすることができます。

その他の回答 (1 件)

Yuto Omae
Yuto Omae 2017 年 12 月 19 日
お世話になります。質問者です。 諸事情で.sh拡張子での実行ファイルが欲しいのですが、windows版のMatlab Compilerですと、exe拡張子になってしまいます。 問い合わせたところ、WindowsやMac OSXだと.sh拡張子にはならないとのことでした。 UbuntuでMatlab Compilerを使用すると.sh拡張子ができるのでしょうか?
どうぞよろしくお願い致します。
  1 件のコメント
Kojiro Saito
Kojiro Saito 2017 年 12 月 19 日
MATLAB Compilerはクロスプラットフォームのコンパイルをサポートしていないため、Linux環境で実行できる実行ファイルを作成するには、Linuxでコンパイルする必要があります。
UbuntuでMATLAB Compilerを使用してコンパイルすれば実行ファイルのバイナリ(拡張子無しのファイル)と、ラッパー(.sh)が作成されます。

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!