今日、AIテクノロジーの普及は著しく、私たちの生活のさまざまな領域で使われています。例えば、スマートフォンの顔認証にAIが使われています。ソーシャルネットワークでは、写真に(AR、コラージュなど)さまざまな効果を追加できるようになっています。 AIツールを用いれば、ユーザーはさまざまなオブジェクトを識別することができます。これらは、ビデオ監視システムにおいて、車、人、動物などを識別し、さまざまな実用的な機能を追加するのにも使われています。
この記事では、人気の多機能AIサービスである「DeepAI」を分析し、クロスプラットフォームアプリでいかに簡単に利用できるかを紹介します。DeepAIサービスを用いれば、ユーザーはシンプルでわかりやすいAPIを介して、AIが提供するあらゆる機能とそのメリットを享受することができます。あるDeepAIは、古い白黒写真を着色する機能を提供しています。さらに、写真内のいくつかの望ましくないアイテム(武器など)を識別し、他の多くの可能性を提供します。
では、Delphi FMXクロスプラットフォームアプリで、DeepAIサービスを簡単に利用する方法を紹介しましょう。画像の操作には、Image Colorization APIを使うことにします。
Table of Contents
DeepAI Image Colorization APIでできること
このサービスは、白黒写真に着色しカラー写真化するもので、APIによって利用できます。
APIを介して作業するには、DeepAIサーバーに POST
リクエストを送信し、白黒画像ファイルパスとAPIキーを渡します。また、DeepAI Image Colorization APIサービスに接続するためのリンクを使用します。
DeepAI APIキーを取得するには
APIキーを取得するには、サインアップする必要があります。手順は簡単で、[SIGNUP]ボタンをクリックします。
そして、ユーザー名、Eメール、パスワードを入力します。
サインアップが完了したら、アカウント確認用のリンクが含まれるメールが送られてきます。このリンクをクリックします。
以上でAPIキーが発行されるので、FMX Delphiアプリで使用できるようにキーをコピーして保存します。
また、「Billing」タブで、クレジットカード情報(カード番号、有効期限、CVV)を入力し、サービス利用料の支払い設定を行う必要があります。なおDeepAIでは、5ドルまでの無料トライアル上限を用意しています。
Delphi FMXクロスプラットフォームアプリでDeepAIを使うには
ここでは、Delphi FMXアプリから白黒写真を POST
リクエストでサーバーへ送信し、JSON形式でカラー写真化の処理が行われた画像URLリンクを取得するサンプルを作成してみます。
Delphiでは、DeepAIサーバーを操作するために、いくつかの標準コンポーネント、つまり TNetHttpRequest
および TNetHttpClient
を用いることができます。TNetHttpRequestコンポーネントのClientフィールドに配置したTNetHttpClientコンポーネント(NetHttpClient1)を指定し、MethodStringフィールドに「POST」と設定します。
カラー写真化したDeepAI画像をDelphiクロスプラットフォームアプリで表示するには
FMXアプリで変換前の白黒画像を表示するには、標準コンポーネントであるTImageを使います。
DeepAIサービスのREST APIを使用して取得した処理済のカラー画像を表示するにも、標準コンポーネントのTImageを使用します。
Delphi FMXアプリでは、サーバーからのJSONレスポンス内容を表示するため、標準コンポーネントの[Standard]タブにあるTMemoを使います。
APIキー、コンピューター上の白黒画像へのパスといったパラメーターをPOSTリクエストを介してサーバーに送信するには、以下で解説する変数を使用します。
DeepAI APIリクエストをサーバーに送信する
APIキーをREST DeepAIサーバーに送信するには、TNameValuePairヘッダークラス変数(オブジェクト)を用います。
コンピューター上のパスに従って白黒画像を送信するには、TMultipartFormDataクラスのLMultiPartFormDataオブジェクトを使います。path変数の行では、画像ファイルへのパスを保存しています。
画像へのパスは、MSWindowsとAndroidで異なります。そのため、それぞれのプラットフォーム用に条件付きコンパイルを適用します。
MSWindowsでコンパイルする場合、イメージファイルはCドライブ(c:Einstein.jpeg)に保存されているものとします。
Androidの場合、画像ファイルはスマートフォンの内部メモリのPicturesフォルダに保存されているものとします。
変換前の白黒画像をTImageコンポーネントに読み込むには、LoadFromFileメソッドを用います。パラメータに、path変数を指定します。
path変数の行では、画像ファイル名とパスを保存しています。
POSTリクエストを実行して必要なすべてのデータ(画像ファイルへのパス、APIキー)をサーバーに送信するには、NetHTTPRequest1コンポーネントのPOSTメソッドを使用します。
このメソッドには、サーバーに接続するためのリンク、画像ファイルへのパスを格納したLMultiPartFormDataオブジェクト、TMemoryStreamクラスのLMSオブジェクト、APIキーを保持するheader変数を指定します。
LMSオブジェクトは、サーバーから受信した応答をJSON形式で保存するために使用します。
サーバーから受信したJSONレスポンスは、LoadFromStreamメソッドを使用してTMemoに表示します。
サーバーからの受信したJSONレスポンスには、処理済のカラー画像ファイルへのURLリンク(output_urlパラメーター)が含まれます。
DeepAI APIのJSONレスポンスから画像URLをパースするには
カラー画像を読み込むには、DeepAIサーバーから取得したJSONレスポンスをパースしてURLリンクを取得します。
JSONレスポンスの解析には、TJSONObjectクラスのJSONオブジェクトを使用します。
JSONレスポンスを解析してURLリンクを取得したら、これをColorizedImagePathに代入します。
サーバーからカラー画像をダウンロードするには、TNetHttpClientコンポーネントのGETメソッドを使用します。
GETメソッドには、サーバー上のカラー画像のURLリンクとTMemoryStreamクラスのLResponseオブジェクトを指定します。LResponseオブジェクトには、このあとTImageに表示するカラー画像が返されます。
カラー画像をロードして表示するには、TImageコンポーネントのLoadFromStreamを使います。
DeepAIを使用して画像を着色するDelphiアプリのサンプルコード
以下は、DeepAIにリクエストを送信し、処理された画像をロードするDelphiアプリのコード例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
procedure TForm1.Button1Click(Sender: TObject); begin TTask.Run( procedure var LMultipartFormData: TMultipartFormData; LMS: TMemoryStream; header: TNameValuePair; Json: TJSONObject; begin LMultipartFormData := TMultipartFormData.Create; header := TNameValuePair.Create(‘api-key’, ‘5a84f646-474f-4b86-ab69-a7a5ef0ad537’); {$IFDEF ANDROID} path := TPath.Combine(TPath.GetSharedPicturesPath, ‘Einstein.jpeg’); LMultipartFormData.AddFile(‘image’, path, ‘image/*’); Image1.Bitmap.LoadFromFile(path); {$ENDIF} {$IFDEF MSWINDOWS} path := ‘c:Einstein.jpeg’; LMultipartFormData.AddFile(‘image’, path, ‘application/octet-stream’); Image1.Bitmap.LoadFromFile(path); {$ENDIF} LMS := TMemoryStream.Create; NetHTTPRequest1.Post(‘https://api.deepai.org/api/colorizer’, LMultipartFormData, LMS, [header]); TThread.Synchronize(nil, procedure begin Memo1.Lines.LoadFromStream(LMS); TabControl1.GotoVisibleTab(1) end); Json := TJSONObject.ParseJSONValue(Memo1.Text) as TJSONObject; TThread.Synchronize(nil, procedure begin ColorizedImagePath := Json.GetValue(‘output_url’).Value; end); LMS.Free; LMultipartFormData.Free; end); end; procedure TForm1.Button2Click(Sender: TObject); begin Label2.Text := ColorizedImagePath; if NetHTTPClient1.Tag = NOT_BUSY then begin NetHTTPClient1.Tag := BUSY; TTask.Run( procedure var LResponse: TMemoryStream; begin LResponse := TMemoryStream.Create; try NetHTTPClient1.Get(ColorizedImagePath, LResponse); TThread.Synchronize(nil, procedure begin Image2.Bitmap.LoadFromStream(LResponse); end); finally LResponse.Free; NetHTTPClient1.Tag := NOT_BUSY; TabControl1.GotoVisibleTab(2) end; end); end; end; |
Delphi AndroidアプリでDeepAIを使用する際に注意すべき事項
AndroidプラットフォームでDelphiFMXアプリを正しく機能させるには、スマートフォンのメモリおよびインターネット接続へのアクセス許可を設定する必要があります。
では、作成したEmbarcadero Delphi FMXアプリを、WindowsとAndroidプラットフォームの双方で実行してみましょう。白黒の画像を送信して、Deep AIサーバーから処理済のカラー画像を取得します。
DeepAIを用いたクロスプラットフォームDelphi Android FMXアプリ
AndroidデバイスでFMXアプリを実行してみましょう。
この記事のステップバイステップガイドは、Softacom Youtubeチャンネルをご覧ください。
この記事は、エンバカデロ・テクノロジーズパートナーのSoftacomによって執筆されています。
SoftacomのAI実装サービスの詳細については、以下のページをご確認ください。
https://softacom.com/services/artificial_intelligence_implementation_with_delphi/
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition