Main Content

MATLAB Coder を使用したピクセルストリーミング設計の高速化

この例では、MATLAB Coder™ を使用して MATLAB® でのピクセルストリーム動画処理アルゴリズムを高速化する方法を示します。

この例を実行するには、MATLAB Coder のライセンスが必要です。

MATLAB Coder による高速化により、1080p ビデオのような大きいフレーム サイズのシミュレーションを実用的な速度で実行できます。この高速化ワークフローは、小さいフレーム サイズを使用してアルゴリズムをデバッグしてから使用してください。小さいイメージを使用した設計のテストについては、Pixel-Streaming Design in MATLAB (Vision HDL Toolbox)の例で説明しています。

MATLAB Coder の動作

MATLAB Coder は、MATLAB コードから C コードを生成します。コード生成により、変数のサイズとデータ型をロックすることでシミュレーションが高速化されます。この処理によって、コードの各行でサイズとデータ型をチェックするインタープリター型言語のオーバーヘッドが排除されます。この例では、テスト ベンチ ファイル DesignAccelerationHDLTestBench.m と設計ファイル DesignAccelerationHDLDesign.m の両方を MEX 関数にコンパイルし、結果として得られる MEX ファイルを使用してシミュレーションを高速化します。

関数シグネチャの下の命令 (またはプラグマ) %#codegen は、MATLAB アルゴリズムのコードを生成することを示すものです。この命令を追加することで、コード生成時にエラーになる違反を診断して修正するように MATLAB コード アナライザーに指示します。命令 %#codegen は、インタープリター型のシミュレーションには影響しません。

ベスト プラクティス

インタープリター型モードでは、シミュレーション時間が長いため、大きいフレーム サイズでシミュレーションをデバッグするのは現実的でありません。一方で、MEX シミュレーションのデバッグは、コードへのデバッグ アクセスが十分でないため困難な作業になります。

これらのシナリオを避けるためのベスト プラクティスは、アルゴリズムとテスト ベンチをサムネイル フレーム サイズを使用して開発し、それらを検証することです。ほとんどの場合、HDL をターゲットとする設計は、フレーム サイズに依存せずに実装できます。設計とテスト ベンチが正しく機能することを確信したら、テスト ベンチでフレーム サイズを大きくし、MATLAB Coder を使用してシミュレーションを高速化します。DesignAccelerationHDLTestBench.mPixel-Streaming Design in MATLAB (Vision HDL Toolbox)PixelStreamingDesignHDLTestBench.m を比較すればわかるように、フレーム サイズを大きくするためのテスト ベンチでの変更はわずかで済みます。

テスト ベンチ

テスト ベンチ DesignAccelerationHDLTestBench.m では、"videoIn" オブジェクトが RGB からグレースケールに変換されたビデオ ソースから各フレームを読み取り、関数 "imresize" がこのフレームを 240p から 1080p に内挿します。この 1080p のイメージが frm2pix オブジェクトに渡され、完全なイメージ フレームがピクセルと制御構造のストリームに変換されます。その後、関数 DesignAccelerationHDLDesign が呼び出され、ピクセル (およびそれに関連付けられた制御構造) が一度に 1 つずつ処理されます。ピクセルストリーム全体の処理が完了して出力ストリームを収集すると、pix2frm オブジェクトが出力ストリームをフルフレームのビデオに変換します。関数 DesignAccelerationHDLViewer は、出力と元のイメージを左右に並べて表示します。

上記のワークフローは、DesignAccelerationHDLTestBench.m の次の行で実装されます。

for f = 1:numFrm
    frmFull = rgb2gray(readFrame(videoIn));            % Get a new frame
    frmIn = imresize(frmFull,[actLine actPixPerLine]); % Enlarge the frame
     [pixInVec,ctrlInVec] = frm2pix(frmIn);
     for p = 1:numPixPerFrm
         [pixOutVec(p),ctrlOutVec(p)] = DesignAccelerationHDLDesign(pixInVec(p),ctrlInVec(p));
     end
     frmOut = pix2frm(pixOutVec,ctrlOutVec);
     DesignAccelerationHDLViewer(actPixPerLine,actLine,[frmIn uint8(255*frmOut)]);
 end

frmIn のデータ型は uint8 であるのに対し、frmOut (エッジ検出の出力) のデータ型は logical です。データ型が異なる行列は連結できないため、uint8(255*frmOut) で logical の false と true を uint8(0) と uint8(255) にそれぞれマッピングしています。

フルフレームとピクセルストリームの領域間の変換には、frm2pixpix2frm の両方が使用されます。内側の for ループは、ピクセルストリームの処理を実行します。テスト ベンチの残りの部分は、フルフレームの処理 (つまり、関数 DesignAccelerationHDLViewer 内の videoInscaler、および viewer) を実行します。

テスト ベンチが終了する前に、シミュレーション速度を示すフレーム レートが表示されます。

テスト ベンチで使用されるすべての関数が C コード生成をサポートしているわけではありません。サポートしていない tictocfprintf などについては、coder.extrinsic を使用して外部関数として宣言します。外部関数は MEX の生成から除外されます。シミュレーションでは、それらを通常のインタープリター型モードで実行します。

ピクセルストリームの設計

DesignAccelerationHDLDesign.m で定義されている関数は、ピクセル ストリームと 5 つの制御信号を受け入れ、変更されたピクセル ストリームと制御信号を返します。Vision HDL Toolbox™ の System object で使用されるストリーミング ピクセル プロトコルの詳細については、Streaming Pixel Interface (Vision HDL Toolbox)を参照してください。

この例の関数には Edge Detector System object が含まれています。

この例の焦点はワークフローであり、アルゴリズム設計そのものではありません。そのため、設計コードはかなり単純なものになっています。ワークフローを理解してしまえば、Vision HDL Toolbox の System object で提供される機能を利用して高度なビデオ アルゴリズムも簡単に実装できます。

MEX ファイルの作成と設計のシミュレーション

MEX ファイルを生成して実行します。

codegen('DesignAccelerationHDLTestBench');
DesignAccelerationHDLTestBench_mex;
Code generation successful.


10 frames have been processed in 5.34 seconds.
Average frame rate is 1.87 frames/second.

viewer は、元のビデオを左に、出力を右に表示します。

HDL コード生成

次のコマンドを入力して、新しい HDL Coder™ プロジェクトを一時フォルダーに作成します。

coder -hdlcoder -new DesignAccelerationProject

次に、DesignAccelerationHDLDesign.m ファイルを [MATLAB 関数] としてプロジェクトに追加し、DesignAccelerationHDLTestBench.m を [MATLAB テスト ベンチ] として追加します。

MATLAB HDL Coder プロジェクトの作成と入力に関するチュートリアルについては、MATLAB から HDL へのワークフロー入門を参照してください。

ワークフロー アドバイザーを起動します。ワークフロー アドバイザーで、[コード生成] の手順を右クリックします。[選択したタスクまで実行] オプションを選択して、最初から HDL コード生成までのすべての手順を実行します。

ログ ウィンドウにあるリンクをクリックして、生成された HDL コードを確認します。