この記事は、Heru Susanto氏のブログの抄訳です
このwikiに基づいた情報ですが、畳み込みニューラルネットワーク(CNN、または ConvNet)は、ディープニューラルネットワークの一種であり、最も一般的では、視覚画像の分析等の分野に利用されています。シフト不変または位置不変の人工ニューラルネットワーク(SIANN)とも呼ばれています。
Table of Contents
畳み込みニューラルネットワーク?なんだか難しそうですが・・・?
朗報です。DeepAI.orgはCNNにアクセスするためのAPIを提供していますので、それを使用して素早くアプリケーションを作ることができます。このブログでは、その方法についてご紹介いたします。
DeepAI APIを使用してアプリを設定するにはどうすればよいですか?
DeepAI APIを利用するためには、https://deepai.org へサインアップしてください。
サインアップが完了すると、下図のようにapi keyが取得できます。これはユーザー固有のIDで、Toonify APIへアクセスするためには、このapi keyが必要になります。
Toonify APIへアクセスすると、畳み込みニューラルネットワークを使用して、どんな顔の写真でも、人工知能で瞬時にカートゥーン(漫画)な画像に変換されます。
詳しくは、以下のToonify API のドキュメントを参照してください。
https://deepai.org/machine-learning-model/toonify
curlコマンドを利用してDeepAI APIにアクセスするためのエミュレートが行えます。これが最も簡単な方法です。
1 2 3 4 |
curl -F <span class="s1">'image=@/path/to/your/file.jpg'</span> -H <span class="s1">'api-key:1ade887c-a8e2-4b91-b888-947aa67cde17'</span> https://api.deepai.org/api/toonify |
これと同じ事をDelphiでコーディングすると、以下のようなコード例になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
var LRestClient: TRESTClient; LRestRequest: TRESTRequest; LImageDownload: TDownloadURL; LResponse: TJSONObject; begin LRestClient := TRESTClient.Create(TOONIFY_API_URL); LRestRequest:= TRESTRequest.Create(nil); try LRestRequest.Method := rmPOST; LRestRequest.AddParameter('api-key', edtApiKey.Text, TRESTRequestParameterKind.pkHTTPHEADER, [poDoNotEncode]); LRestRequest.AddFile('image', OriginalFilename); LRestRequest.Client := LRestClient; LRestRequest.Execute; LResponse := LRestRequest.Response.JSONValue as TJSONObject; // LReponse image url processing here .. finally LRestRequest.Free; LRestClient.Free; end; end; |
APIから取得したJSONデータ
上記のコードは、Toonify APIへアクセスし、渡した元の画像の出力結果をJSON形式で取得しています。取得したJSONデータは、以下の通りです。
1 2 3 |
{ "id": "fcf837eb-640f-4f02-97e29ab02377", "output_url": "https://api.deepai.org/job-view-file/fcf837eb-ab02377/outputs/output.jpg"} |
output_url
という項目があり、これは元画像を漫画加工されたJPEG画像のURLです。
APIから取得した画像データの表示
せっかくなのでoutput_url
の画像をダウンロードし、TImage
コンポーネントで表示できるように変換してみましょう、そのコードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var .. LMemStream: TMemoryStream; LBitmapItem: TFixedBitmapItem; .. begin .. LImageDownload := TDownloadURL.Create; LMemStream := TMemoryStream.Create(); try LImageDownload.DownloadRawBytes(LResponse.GetValue('output_url').Value, LMemStream); LBitmapItem := Image2.MultiResBitmap.Add; LBitmapItem.Bitmap.LoadFromStream(LMemStream); except on E: Exception do ShowMessage('Error: '+E.Message); end; LImageDownload.Free; LMemStream.Free; .. end |
このブログで紹介した内容の完全なソースコード
以下は、DeepAI APIを使用して、元画像データを漫画化および取得した画像データを表示する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 |
procedure TForm2.Toonify; var LRestClient: TRESTClient; LRestRequest: TRESTRequest; LImageDownload: TDownloadURL; LResponse: TJSONObject; LMemStream: TMemoryStream; LBitmapItem: TFixedBitmapItem; begin LRestClient := TRESTClient.Create(TOONIFY_API_URL); LRestRequest:= TRESTRequest.Create(nil); try LRestRequest.Method := rmPOST; LRestRequest.AddParameter('api-key', edtApiKey.Text, TRESTRequestParameterKind.pkHTTPHEADER, [poDoNotEncode]); LRestRequest.AddFile('image', OriginalFilename); LRestRequest.Client := LRestClient; LRestRequest.Execute; LResponse := LRestRequest.Response.JSONValue as TJSONObject; LImageDownload := TDownloadURL.Create; LMemStream := TMemoryStream.Create(); try LImageDownload.DownloadRawBytes(LResponse.GetValue('output_url').Value, LMemStream); LBitmapItem := Image2.MultiResBitmap.Add; LBitmapItem.Bitmap.LoadFromStream(LMemStream); except on E: Exception do end; LImageDownload.Free; LMemStream.Free; finally LRestRequest.Free; LRestClient.Free; end; end; |
このブログで紹介したDelphiのFMXアプリケーションのプロジェクト一式は、以下のGitHubからダウンロードできます。
https://github.com/herux/DelphiDeepAI-Toonify.git
このサンプルプロジェクトをビルドして実行すると、こんな感じです。
上記は、このブログの作者であるHeru Susanto氏の写真を漫画化した例です。どうでしょう? 元の雰囲気は残っているような・・別人のような(笑)
皆さんは、いかがでしょうか?
もし興味がございましたら、是非 試してみてください!!
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition