如何利用Compiler SDK將MATLAB中撰寫好的程式碼/演算法/使用者介面,透過封裝成DLL/LIB後讓其他語言進行呼叫與使用。
在此篇文章中會介紹在MATLAB端怎樣去進行封裝,也會介紹在C++與C#端如何去執行。
Compiler是將MATLAB的程式碼封裝成執行檔,而Compiler SDK就是將MATLAB的程式碼封裝成函式庫/動態函式庫,下圖則是目所支援的封裝類型,以及使用Library Compiler的APP來進行封裝。
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加入。
在另一份檔案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)來建立新專案。
接下來就是取一下專案名稱,選擇一下Framework版本.就可以建起這個新專案了。
接著就是針對整個專案的環境做設定,第一步先將Any CPU更改為x64,點選Any CPU旁邊的下拉式選單後開啟Configuration Manager,並且在Platform中選擇New,並且將New platform更改成x64。
第二步就是加入參考,以及MWArray,首先參考的部分就是加入我們剛剛轉出的YOLOv4Detect.dll,透過下圖的方式將此dll加入參考。
另外就是加入MWArray的參考,但這邊的MWArray的檔案有兩種不同的途徑,這邊可能要注意一下。
一種是直接吃本機端MATLAB的MWArray,另一種則是吃MATLAB Runtime的MWArray,前者可以用於本機端測試或是本身環境就有MATLAB,後者則用於部署的環境之中。
加入參考後就會如下面的圖示一樣。
先使用本機端路徑的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");
}
}
}