MATLAB實現整合系列第三期:Compiler SDK(上)C#.NET環境為例

Fred Liu
8 min readAug 21, 2023

--

如何利用Compiler SDK將MATLAB中撰寫好的程式碼/演算法/使用者介面,透過封裝成DLL/LIB後讓其他語言進行呼叫與使用。

在此篇文章中會介紹在MATLAB端怎樣去進行封裝,也會介紹在C++與C#端如何去執行。

Compiler是將MATLAB的程式碼封裝成執行檔,而Compiler SDK就是將MATLAB的程式碼封裝成函式庫/動態函式庫,下圖則是目所支援的封裝類型,以及使用Library Compiler的APP來進行封裝。

MATLAB Compiler SDK

MATLAB端的Function撰寫:轉出.NET DLL為例

MATLAB端我們先寫一個用於驗證的function,在這裡面的內容是呼叫一個YOLOv4來執行一個隨機亂數生成的影像,但最終我們輸出的結果是一個數值,只是為了確認此程式有沒有順利被呼叫,因此也可以把前幾行刪除,保留res = 1這行即可。

function res = YOLOv4Detect(~)

detector = yolov4ObjectDetector('tiny-yolov4-coco');

img = uint8(rand(416,416,3)*255);

detect(detector,img);

res = 1;

end

開啟Library Compiler後,就可在上方的EXPORTED FUNCIOTNS中加入上述提到的Function,並且在旁邊的TYPE中選擇之後要做轉出的Library類別,在這邊先轉出.NET Assembly的類別。

Suggested Support Packages中先只要選擇YOLOv4的選項即可。

.NET的環境中,會需要設定Class,因此將此Function的Class Name命名為detect(名稱可以隨意定義)。

在下段中會是生成出來的內容以及一些額外的設定,例如可以在這邊選擇要使用.NET Framework Version,看是否需要設定成5.0或是以上的版本,預設是下方的.NET 4.x(NET Framework)

接下來就可以按右上角的Package,旁邊的Settings這邊就不詳細說明了。

以下是我們生成出來的檔案,分別有兩個.dll與一個GettingStarted以及overview,這兩個文件就是詳細介紹怎樣在.net的環境中使用,以及怎麼設定.net的環境。

下方的圖是YOLOv4Detect_overview的內容,主要就是提醒說要下載MATLAB Runtime,以及要將MWArrary.dll加入。

YOLOv4Detect_overview

在另一份檔案GettingStarted,主要就是介紹要怎麼建置.NET的環境,以及如何Compiling .NET Driver Applications與Executing .NET Driver Applications

C#端環境設定,與呼叫由MATLAB轉出的DLL

首先可以先打開這個頁面:MATLAB Compiler SDK .NET Target Requirements,這裡面有關於在.NET的相關設定。

基本上在MATLAB轉出的DLL可以支援以下幾個版本做使用。

如果走Data API的話,目前是支援在4.0以上的.NET Framework。

一些更詳細的內容介紹,就請大家看上述的連結了,接下來會換到Visual Studio的環境中,用C#來做整合。

Visual Studio端嵌入MATLAB DLL

以下的流程也可以參考下面的連結。
Generate .NET Assembly and Build .NET Application

在Visual Studio的環境中先新開啟一個新專案(Create a new project),並且選擇使用Console APP(.NET Framework)來建立新專案。

開啟新專案
Console APP(.NET Framework)

接下來就是取一下專案名稱,選擇一下Framework版本.就可以建起這個新專案了。

接著就是針對整個專案的環境做設定,第一步先將Any CPU更改為x64,點選Any CPU旁邊的下拉式選單後開啟Configuration Manager,並且在Platform中選擇New,並且將New platform更改成x64。

Any CPU > x64
更改為x64

第二步就是加入參考,以及MWArray,首先參考的部分就是加入我們剛剛轉出的YOLOv4Detect.dll,透過下圖的方式將此dll加入參考。

另外就是加入MWArray的參考,但這邊的MWArray的檔案有兩種不同的途徑,這邊可能要注意一下。

一種是直接吃本機端MATLAB的MWArray,另一種則是吃MATLAB Runtime的MWArray,前者可以用於本機端測試或是本身環境就有MATLAB,後者則用於部署的環境之中。

MWArray API

加入參考後就會如下面的圖示一樣。

先使用本機端路徑的MWArray,接著就是撰寫程式碼的部分,在上方的加入底下兩行。

using MathWorks.MATLAB.NET.Arrays;
using YOLOv4Detect;

使用的方式如下,我們會需要去new一個class出來,detect()是在MATLAB內設定的Class Name,而YOLOv4Detect既是Method Name也是DLL的檔案名稱。

所以在12行就在做這件事,另外是建一個新的副程式來執行這件事情,13行則是用MWArray建一個變數,來儲存我們執行輸出的結果。

最後透過14行與19行做輸出,輸出的結果是原先執行的這個function是否執行完畢,所以如果拿到了1的數值就代表有順利執行完畢。

主程式
在複習一下原先轉出的設定
輸出結果

這邊附上完整的程式碼,下一篇文章則會介紹怎麼在C++的環境完成Compiler SDK DLL的嵌入,並且在這邊使用的時候其實並沒有真正的把影像作載入跟輸出,這部分之後如果有些空檔,我會努力整理一下,這邊只是初步的用很少的程式碼呈現一個YOLOv4 DL部屬在.NET環境上的應用。

using System;
using MathWorks.MATLAB.NET.Arrays;
using YOLOv4Detect;


namespace test230804003
{
class Program
{
public static void exsample()
{
detect usingClass = new detect();
MWArray output = usingClass.YOLOv4Detect();
Console.WriteLine(output);
}
static void Main(string[] args)
{
exsample();
Console.WriteLine("Test end");
}
}
}

--

--