クラウド接続なしでなりすまし耐性のある顔認識を迅速に実装
著者 Stephen Evanczuk 氏
Digi-Keyの北米担当編集者 提供
2021-02-24
マルツ掲載日:2021-06-28
顔認識はスマートフォンへのアクセスを認証するために広く受け入れられていますが、その効果性や使いやすさにもかかわらず、この技術を他の分野へより広範に応用する試みは成功していません。
開発者は、信頼性の高い低コストの機械学習ソリューションを実装するという技術的な課題とともに、なりすましに対して脆弱なクラウド接続に依存する、従来の顔認識方法の信頼性やプライバシーに関するユーザーの懸念に対処しなければなりません。
この記事では、安全な認証の難しさについて説明し、この問題を解決するNXP Semiconductorsのハードウェアおよびソフトウェアソリューションを紹介します。その後、機械学習手法の適切な経験を持たない開発者がこのソリューションを使用して、スマート製品にオフラインのなりすまし防止顔認識を迅速に実装する方法を示します。
スマート製品向けの安全な認証の課題点
スマート製品のセキュリティに関する懸念の高まりに対応する際に、迅速で安全なアクセスを求めるユーザーを確実に認証するための実行可能なオプションがほとんどないことに開発者は気付きます。
これまでの方法は、従来の3つの認証要素のいくつかを組み合わせた多要素認証方法に依存しています。つまり、パスワードなどの「知っているもの」、物理的な鍵やキーカードなどの「持っているもの」、指紋や虹彩などの生体要素である「自分自身」です。このアプローチを使用すると、強力に認証化されたドアロックを解除するために、ユーザーがパスコードを入力し、キーカードを使用し、さらに指紋を提供する必要があります。
実際には、このような厳しい要件は、スマートフォンやその他の日常的に使用するデバイスで頻繁かつ容易に再認証を行う必要がある消費者にとって煩わしくなるか、単に非実用的です。
顔認識の利用により、スマートフォンユーザーの認証が大幅に簡素化されましたが、スマートフォンが備えている利点がすべてのデバイスにあるわけではありません。最先端のスマートフォンに搭載されている処理能力の高さと常時接続性は、ユーザーが日常的に期待する高度なサービスを提供するための基本要件です。
安全な認証を必要とする多くの製品において基盤となるオペレーティングプラットフォームが提供するのは通常、より控えめなコンピューティングリソースとより限定された接続性です。
大手クラウドサービスプロバイダーの顔認識サービスは、処理負荷をクラウドに移行させていますが、応答待ち時間を最小限に抑えるための堅牢な接続性のニーズにより、プラットフォームの能力を超えた要件が課される可能性があります。
ユーザーがそれと同等以上に懸念しているのは、処理用に自分の画像を公共ネットワークを介して送信し、クラウドに保存する可能性があるため、重大なプライバシーの問題が生じることです。
NXP Semiconductorsのi.MX RT106Fプロセッサと関連ソフトウェアを使用することで、開発者はこれらの懸念に直接対処するオフライン顔認識を実装できるようになりました。
なりすまし防止オフライン顔認識のためのハードウェアとソフトウェア
NXPのi.MX RT1060クロスオーバーマイクロコントローラ(MCU)ファミリに属するNXP i.MX RT106Fシリーズは、スマートホームデバイス、民生用機器、セキュリティデバイス、産業用機器へのオフライン顔認識の容易な統合をサポートするように特別設計されています。
Arm Cortex-M7プロセッサコアをベースにしたこのプロセッサは、産業用グレードのMIMXRT106FCVL5Bでは528MHz、MIMXRT106FDVL6AやMIMXRT106FDVL6Bなどの商用グレードのプロセッサでは600MHzで動作します。
i.MX RT106Fプロセッサは、幅広い外部メモリインターフェースをサポートするほか、1MバイトのオンチップRAMを搭載しており、そのうち512Kバイトは汎用RAMとして構成されています。残りの512Kバイトは、汎用RAMとして、または命令(I-TCM)/データ(D-TCM)用の密結合メモリ(TCM)として構成することができます。
これらのプロセッサは、オンチップの電源管理に加えて、グラフィックス、セキュリティ、システム制御、コンシューマ機器、産業用ヒューマンマシンインターフェース(HMI)、モータ制御をサポートするために一般的に必要とされるアナログとデジタルの両方のインターフェースのための広範な統合機能を提供します(図1)。
図1:NXP Semiconductorのi.MX RT106Fプロセッサは、民生用製品、産業用製品、セキュリティ製品の顔認識をサポートするために必要な機能ブロックのフルセットを組み合わせています。(画像提供:NXP)
他のi.MX RT1060ファミリ製品と似ていますが、i.MX RT106Fプロセッサには、NXPのOasis Lite顔認識ソフトウェアのランタイムライセンスがバンドルされています。このクラスのプロセッサ上で推論を高速化するために設計されたOasis Liteランタイム環境は、推論エンジンとMiniCV(オープンソースのOpenCVコンピュータビジョンライブラリの縮小版)上で動作するニューラルネットワーク(NN)推論モデルを使用して、顔検出、認識、さらには限定的な感情分類までを実行します。推論エンジンは、NXP NNライブラリとArm Cortexマイクロコントローラシステムインターフェース規格NN(CMSIS-NN)ライブラリをベースに構築されています(図2)。
図2:NXP Oasis Liteランタイムライブラリには、MiniCVを使用したOasis Liteコアと、NXPとArmのニューラルネットワークライブラリをベースに構築されたNXP推論エンジンが含まれています。(画像提供:NXP)
推論モデルはi.MX RT106Fプラットフォーム上にあるため、機械学習アルゴリズムを実行するためにクラウドベースのリソースに依存する他のソリューションとは異なり、顔検出と認識がローカルで実行されます。
このオフライン顔認識機能により、スマート製品の設計者は、低帯域幅やインターネット接続が不安定な場合でも、非公開で安全な認証を確保することができます。さらに、このハードウェアとソフトウェアの組み合わせによって認証が迅速に行われ、プロセッサが低電力スタンバイから起動して顔認識が完了するまでに800ms未満しかかかりません。
i.MX RT106Fプロセッサと一緒に使用されるOasis Liteランタイムは、スマート製品のオフライン顔認識の実装を簡素化しますが、もちろんプロセッサとランタイム環境は必要なシステムソリューションの一部に過ぎません。
効果的な認証ソリューションには、システムコンポーネントのより完全なセットとともに、プレゼンテーション攻撃と呼ばれる一種のセキュリティ脅威を軽減できるイメージング機能が必要です。これらの攻撃では、写真を利用して顔認識を偽装しようとします。
自社製品に顔認証を迅速に展開したいと考えている開発者のために、NXPのSLN-VIZNAS-IOT開発キットと関連ソフトウェアは、オフラインのなりすまし防止顔認証の評価、試作、開発のためにすぐに使えるプラットフォームを提供します。
顔認識のための完全なセキュアシステムソリューション
i.MX RT106Fプロセッサはほとんどの先進的なプロセッサと同様に、効果的なコンピューティングプラットフォームを提供するために、わずかな追加コンポーネントしか必要としません。NXP SLN-VIZNAS-IOTキットは、i.MX RT106Fと追加デバイスを統合して完全なハードウェアプラットフォームを提供することで、設計を完成させます(図3)。
図3:NXP SLN-VIZNAS-IOTキットには、認証ソフトウェアの実行に必要となる堅牢な接続システムプラットフォームを提供する接続モジュールが含まれています。(画像提供:NXP)
キットの接続モジュールボードには、NXPのMIMXRT106FDVL6A i.MX RT106Fプロセッサ、NXPのA71CHセキュアエレメント、2つの接続オプションとして、NXPのMKW41Z512VHT4 Kinetis KW41Z Bluetooth Low Energy(BLE)システムオンチップ(SoC)とMurata ElectronicsのLBEE5KL1DX-883 Wi-Fi/Bluetoothモジュールを組み合わせています。
プロセッサのオンチップメモリを補完するために、接続モジュールには、Winbond ElectronicsのW9825G6JB 256メガビット同期ダイナミックRAM(SDRAM)、Integrated Silicon Solution.Inc.(ISSI)のIS26KL256S-DABLI00 256メガビットNORフラッシュ、ISSIのIS25LP256D 256MビットクワッドSPIデバイスが追加されます。
最後に、このモジュールには、接続モジュールボード上の追加デバイスのために、i.MX RT106Fプロセッサの内部電源管理機能を補完するTorex SemiconductorのXCL214B333DR降圧コンバータが追加されます。
次に、接続モジュールは、Murata ElectronicsのIRA-S210ST01パッシブ赤外線(PIR)センサ、モーションセンサ、バッテリチャージャ、オーディオサポート、発光ダイオード(LED)、ボタン、インターフェースコネクタを組み合わせたビジョンアプリケーションボードにマウントされます(図4)。
図4:NXP SLN-VIZNAS-IOTキットでは、接続モジュール(左)がビジョンアプリケーションボードに取り付けられ、顔認識のためのハードウェア基盤を提供します。(画像提供:NXP)
顔認識システムの設計には、このシステムプラットフォームとともに、ユーザーの顔の画像をキャプチャするための適切なカメラセンサが必要であることが明らかです。しかし、前述したように、プレゼンテーション攻撃に関する懸念により、追加のイメージング機能が必要になります。
プレゼンテーション攻撃の軽減
長年にわたって研究者たちは、潜在指紋や顔の画像を使用して生体認証システムを偽装するなどの試みを軽減するために設計された、さまざまなプレゼンテーション攻撃検出(PAD)手法を検討してきました。
その詳細はこの記事の範囲をはるかに超えていますが、一般的にPAD手法では、プロセスの一部としてキャプチャされた生体認証データの品質と特性の深い分析と、生体認証データが生きている人間から取得されたかどうかを判定するように設計された「生体」検知方法を使用します。
これらさまざまな手法の多くの基礎となっているディープニューラルネットワーク(DNN)モデルは、顔認識だけでなく、システムを偽装しようとする試みを特定するためにも重要な役割を果たします。そのような試みにもかかわらず、ユーザーの顔をキャプチャするために使用されるイメージングシステムは、追加の生体検知サポートを提供することができます。
SLN-VIZNAS-IOTキットに対し、NXPはON SemiconductorのMT9M114イメージセンサのペアを含むカメラモジュールを内蔵しています。ここでは、1台のカメラに赤、緑、青(RGB)フィルタを搭載し、もう1台のカメラには赤外線(IR)フィルタを搭載しています。
カメラインターフェースを介してビジョンアプリケーションボードに接続されたRGBカメラは、通常の可視光画像を生成し、IRカメラは人物の画像と比較して、生身の人物とは異なる画像をキャプチャします。
SLN-VIZNAS-IOTキットは、この生体検知アプローチと内部の顔認識機能を使用して、約30×40mmサイズのパッケージで、オフラインのなりすまし防止顔認識機能を提供します(図5)。
図5:NXP SLN-VIZNAS-IOTハードウェアキットは、生体検知用のデュアルカメラシステム(上)とビジョンアプリケーションボード(下)を接続モジュールと統合し、なりすまし防止機能を備えたオフラインの顔認識用ドロップインソリューションを提供します。(画像提供:NXP)
SLN-VIZNAS-IOTキットの使用方法
NXP SLN-VIZNAS-IOTキットは、顔認識モデルを内蔵し、すぐに使できる状態で提供されます。開発者は、USBケーブルを差し込んでキットのボタンをタッチし、プリロードされた「elock」アプリケーションと付属のモバイルアプリを使用して、手動の簡単な顔登録を行うことができます(図6、左)。
登録後は、キットが登録した顔を認証すると、モバイルアプリに「おかえりなさい」のメッセージと「ロック解除」のラベルが表示されます(図6、右)。
図6:NXP SLN-VIZNAS-IOTハードウェアキットは、コンパニオンアプリを利用して顔の登録(左)と登録された顔の認識(右)を行うことで、すぐに使用できます。(画像提供:NXP)
キットのOasis Lite顔認識ソフトウェアは、認識精度99.6%で最大3000枚のRGB顔画像のデータベースからモデルを処理し、なりすまし防止精度96.5%で最大100枚のIR顔画像のデータベースからモデルを処理します。
前述したように、NXPのハードウェア/ソフトウェアソリューションが0.2~1.0mの範囲で顔検出、画像整列、品質チェック、生体検知、および認識を行うのに必要な時間は、1秒未満です。
実際、このシステムは、同じシーケンスを0.5秒未満で実行できる代替の「光」推論モデルをサポートしていますが、最大データベースサイズはRGB顔画像1000枚、IR顔画像50枚と小さくなります。
カスタム顔認識アプリケーションの構築
NXP SLN-VIZNAS-IOTキットをそのまま使用することで、開発者は顔認識アプリケーションの評価、試作、開発を迅速に行うことができます。カスタムハードウェアソリューションを作成する場合、キットは完全な回路図と詳細な部品表(BOM)を含む完全なリファレンス設計として機能します。
ソフトウェア開発では、プログラマはFreeRTOSサポートと設定ツールを備えたNXP MCUXpresso統合開発環境(IDE)を使用することができます。このアプリケーションの開発者は、NXPのオンラインMCUXpresso SDK Builderを使用して、NXPのOasis Lite機械学習ビジョンエンジンを含むNXPのVIZNAS SDKを備えたソフトウェア開発環境を設定するだけです(図7)。
図7:NXPは、FreeRTOSオペレーティングシステム上でNXPのOasis Liteランタイムライブラリとユーティリティミドルウェアを実行する包括的なソフトウェア環境を提供しています。(画像提供:NXP)
ソフトウェアパッケージには、前述のelockサンプルアプリケーションと同様に、動作環境のための完全なソースコードが含まれます。NXPは、独自開発したOasis Liteエンジンやモデルのソースコードを提供していません。その代わりに、開発者は提供されているアプリケーションプログラミングインターフェース(API)を使用して、Oasis Liteランタイムライブラリと連携します。
これには、サポートされている操作を実行するための直感的な関数呼び出しのセットが含まれます。さらに、開発者は提供されたC定義と構造体のセットを使用して、Oasis Liteランタイム環境を起動する際にシステムが使用する画像サイズ、メモリ割り当て、コールバック、有効化された関数などのさまざまなパラメータを指定します(リスト1)。
typedef struct {
//max input image height, width and channel, min_face: minimum face can be detected
int height;
int width;
//only valid for RGB images; for IR image, always GREY888 format
OASISLTImageFormat_t img_format;
OASISLTImageType_t img_type;
//min_face should not smaller than 40
int min_face;
/*memory pool pointer, this memory pool should only be used by OASIS LIB*/
char* mem_pool;
/*memory pool size*/
int size;
/*output parameter,indicate authenticated or not*/
int auth;
/*callback functions provided by caller*/
InfCallbacks_t cbs;
/*what functions should be enabled in OASIS LIB*/
uint8_t enable_flags;
/*only valid when OASIS_ENABLE_EMO is activated*/
OASISLTEmoMode_t emo_mode;
/*false accept rate*/
OASISLTFar_t false_accept_rate;
/*model class */
OASISLTModelClass_t mod_class;
} OASISLTInitPara_t;
リスト1:開発者は、Oasis Liteランタイムの初期化のためにここに示されているような構造体の内容を変更することで、ソフトウェアの実行パラメータを変更することができます。(コード提供:NXP)
elockのサンプルアプリケーションコードは、FreeRTOSで実行するタスクとしてOasisを起動し、環境を初期化し、通常の実行ステージに入るための重要な設計パターンを示しています。実行ステージでは、ランタイム環境は画像の各フレーム上で動作し、環境で定義された各イベントに関連付けられた提供されたコールバック関数を実行します(リスト2)。
typedef enum {
/*indicate the start of face detection, user can update frame data if it is needed.
* all parameter in callback parameter is invalid.*/
OASISLT_EVT_DET_START,
/*The end of face detection.
*if a face is found, pfaceBox(OASISLTCbPara_t) indicated the rect(left,top,right,bottom point value)
*info and landmark value of the face.
*if no face is found,pfaceBox is NULL, following event will not be triggered for current frame.
*other parameter in callback parameter is invalid */
OASISLT_EVT_DET_COMPLETE,
/*Face quality check is done before face recognition*/
OASISLT_EVT_QUALITY_CHK_START,
OASISLT_EVT_QUALITY_CHK_COMPLETE,
/*Start of face recognition*/
OASISLT_EVT_REC_START,
/*The end of face recognition.
* when face feature in current frame is gotten, GetRegisteredFaces callback will be called to get all
* faces feature registered and OASIS lib will try to search this face in registered faces, if this face
* is matched, a valid face ID will be set in callback parameter faceID and corresponding simularity(indicate
* how confidence for the match) also will be set.
* if no face match, a invalid(INVALID_FACE_ID) will be set.*/
OASISLT_EVT_REC_COMPLETE,
/*start of emotion recognition*/
OASISLT_EVT_EMO_REC_START,
/*End of emotion recognition, emoID indicate which emotion current face is.*/
OASISLT_EVT_EMO_REC_COMPLETE,
/*if user set a registration flag in a call of OASISLT_run and a face is detected, this two events will be notified
* for auto registration mode, only new face(not recognized) is added(call AddNewFace callback function)
* for manu registration mode, face will be added forcely.
* for both cases, face ID of new added face will be set in callback function */
OASISLT_EVT_REG_START,
/*when registration start, for each valid frame is handled,this event will be triggered and indicate
* registration process is going forward a little.
* */
OASISLT_EVT_REG_IN_PROGRESS,
OASISLT_EVT_REG_COMPLETE,
OASISLT_EVT_NUM
} OASISLTEvt_t;
リスト2:Oasis Liteランタイムは、Oasis Liteランタイムヘッダファイルで列挙セットとして文書化された一連のイベントを認識します。(コード提供:NXP)
サンプルアプリケーションは、イベントハンドラ(EvtHandler)で処理された各イベントに関連する結果を記述した段階的なデバッグメッセージを開発者に提供することができます。たとえば、品質チェックが完了した後(OASISLT_EVT_QUALITY_CHK_COMPLETE)、システムは結果を説明するデバッグメッセージをプリントアウトします。
顔認識が完了した後(OASISLT_EVT_REC_COMPLETE)、システムは認識された顔に対してデータベースからユーザーIDと名前を引き出し、その情報をプリントアウトします(リスト3)。
static void EvtHandler(ImageFrame_t *frames[], OASISLTEvt_t evt, OASISLTCbPara_t *para, void *user_data)
{
[code redacted for simplification]
case OASISLT_EVT_QUALITY_CHK_COMPLETE:
{
UsbShell_Printf("[OASIS]:quality chk res:%d\r\n", para->qualityResult);
pQMsg->msg.info.irLive = para->reserved[5];
pQMsg->msg.info.front = para->reserved[1];
pQMsg->msg.info.blur = para->reserved[3];
pQMsg->msg.info.rgbLive = para->reserved[8];
if (para->qualityResult == OASIS_QUALITY_RESULT_FACE_OK_WITHOUT_GLASSES ||
para->qualityResult == OASIS_QUALITY_RESULT_FACE_OK_WITH_GLASSES)
{
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]:ok!\r\n");
}
else if (OASIS_QUALITY_RESULT_FACE_SIDE_FACE == para->qualityResult)
{
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]:side face!\r\n");
}
else if (para->qualityResult == OASIS_QUALITY_RESULT_FACE_TOO_SMALL)
{
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]:Small Face!\r\n");
}
else if (para->qualityResult == OASIS_QUALITY_RESULT_FACE_BLUR)
{
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]: Blurry Face!\r\n");
}
else if (para->qualityResult == OASIS_QUALITY_RESULT_FAIL_LIVENESS_IR)
{
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]: IR Fake Face!\r\n");
}
else if (para->qualityResult == OASIS_QUALITY_RESULT_FAIL_LIVENESS_RGB)
{
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[EVT]: RGB Fake Face!\r\n");
}
}
break;
[code redacted for simplification]
case OASISLT_EVT_REC_COMPLETE:
{
int diff;
unsigned id = para->faceID;
OASISLTRecognizeRes_t recResult = para->recResult;
timeState->rec_comp = Time_Now();
pQMsg->msg.info.rt = timeState->rec_start - timeState->rec_comp;
face_info.rt = pQMsg->msg.info.rt;
#ifdef SHOW_FPS
/*pit timer unit is us*/
timeState->rec_fps++;
diff = abs(timeState->rec_fps_start - timeState->rec_comp);
if (diff > 1000000 / PIT_TIMER_UNIT)
{
// update fps
pQMsg->msg.info.recognize_fps = timeState->rec_fps * 1000.0f / diff;
timeState->rec_fps = 0;
timeState->rec_fps_start = timeState->rec_comp;
}
#endif
memset(pQMsg->msg.info.name, 0x0, sizeof(pQMsg->msg.info.name));
if (recResult == OASIS_REC_RESULT_KNOWN_FACE)
{
std::string name;
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[OASIS]:face id:%d\r\n", id);
DB_GetName(id, name);
memcpy(pQMsg->msg.info.name, name.c_str(), name.size());
face_info.recognize = true;
face_info.name = std::string(name);
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[OASIS]:face id:%d name:%s\r\n", id, pQMsg->msg.info.name);
}
else
{
// face is not recognized, do nothing
UsbShell_DbgPrintf(VERBOSE_MODE_L2, "[OASIS]:face unrecognized\r\n");
face_info.recognize = false;
}
VIZN_RecognizeEvent(gApiHandle, face_info);
}
break;
リスト3:NXPソフトウェアディストリビューションのサンプルアプリケーションにあるこのスニペットで示されているように、イベントハンドラは顔認識シーケンス中に発生したイベントを処理します。(コード提供:NXP)
NXP SLN-VIZNAS-IOTソフトウェアは、顔認識処理の要件をサポートするだけでなく、動作環境を保護するように設計されています。ランタイムセキュリティを確保するために、システムはSLN-VIZNAS-IOTキットのファイルシステムに保存されている証明書を使用して、システムに読み込まれた各署名付き画像の完全性と信頼性を検証するように設計されています。
この検証シーケンスは読み取り専用メモリ(ROM)に格納された信頼されたブートローダから始まるため、このプロセスはアプリケーションファームウェアを実行するための信頼チェーンを提供します。また、コード署名と検証は開発を遅延させるため、この検証プロセスはソフトウェアの設計やデバッグの際にバイパスされるように設計されています。
実際、SLN-VIZNAS-IOTキットには署名付き画像がプリロードされていますが、コード署名検証はデフォルトでバイパスされています。開発者は、本番用に完全なコード署名検証を有効にするためのオプションを簡単に設定できます。
NXPは、ランタイム環境と関連するサンプルアプリケーションコードとともに、完全なJavaソースコードを含むAndroidモバイルアプリを提供しています。VIZNAS FaceRec Managerというアプリは、顔登録やユーザー管理のためのシンプルなインターフェースを提供します。
VIZNAS Companionという別のアプリにより、ユーザーは既存のWi-FiまたはBLE接続を使用し、Wi-Fi認証情報でキットをプロビジョニングすることができます。
結論
顔認識はスマート製品へのアクセスを認証するための効果的なアプローチを提供しますが、これを実装するには通常、迅速な応答のために、ローカルの高性能コンピューティングや常時接続の高帯域幅接続が必要でした。また、なりすましの対象にもなっており、ユーザーのプライバシーに関する懸念があります。
この記事で説明したように、NXP Semiconductorsの特殊なプロセッサとソフトウェアライブラリは、クラウド接続なしでオフライン顔認識を1秒未満で正確に実行しつつ、なりすましの試みを軽減する代替的なアプローチを提供しています。
免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、Digi-Key Electronicsの意見、信念および視点またはDigi-Key Electronicsの公式な方針を必ずしも反映するものではありません。
このページのコンテンツはDigi-Key社より提供されています。
英文でのオリジナルのコンテンツはDigi-Keyサイトでご確認いただけます。
Digi-Key社の全製品は 1個からマルツオンラインで購入できます
ODM、OEM、EMSで定期購入や量産をご検討のお客様へ【価格交渉OK】
毎月一定額をご購入予定のお客様や量産部品としてご検討されているお客様には、マルツ特別価格にてDigi-Key社製品を供給いたします。
条件に応じて、マルツオンライン表示価格よりもお安い価格をご提示できる場合がございます。
是非一度、マルツエレックにお見積もりをご用命ください。