Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
DelphiRAD Studio

簡単で強力なニューラルネットワークを使用して顔写真を漫画化してみる

smartmockups_korfoay5

この記事は、Heru Susanto氏のブログの抄訳です

このwikiに基づいた情報ですが、畳み込みニューラルネットワーク(CNN、または ConvNet)は、ディープニューラルネットワークの一種であり、最も一般的では、視覚画像の分析等の分野に利用されています。シフト不変または位置不変の人工ニューラルネットワーク(SIANN)とも呼ばれています。

畳み込みニューラルネットワーク?なんだか難しそうですが・・・?

朗報です。DeepAI.orgはCNNにアクセスするためのAPIを提供していますので、それを使用して素早くアプリケーションを作ることができます。このブログでは、その方法についてご紹介いたします。

DeepAI APIを使用してアプリを設定するにはどうすればよいですか?

DeepAI APIを利用するためには、https://deepai.org へサインアップしてください。

サインアップが完了すると、下図のようにapi keyが取得できます。これはユーザー固有のIDで、Toonify APIへアクセスするためには、このapi keyが必要になります。

cartoonify-photos-with-this-easy-but-powerful-neural-network-ja-1-9377062

Toonify APIへアクセスすると、畳み込みニューラルネットワークを使用して、どんな顔の写真でも、人工知能で瞬時にカートゥーン(漫画)な画像に変換されます。

toonify-6170351-5672534

詳しくは、以下のToonify API のドキュメントを参照してください。

https://deepai.org/machine-learning-model/toonify

curlコマンドを利用してDeepAI APIにアクセスするためのエミュレートが行えます。これが最も簡単な方法です。

curl
    -F 'image=@/path/to/your/file.jpg'
    -H 'api-key:1ade887c-a8e2-4b91-b888-947aa67cde17'
    https://api.deepai.org/api/toonify

これと同じ事をDelphiでコーディングすると、以下のようなコード例になります。

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データは、以下の通りです。

{
    "id": "fcf837eb-640f-4f02-97e29ab02377",
    "output_url": "https://api.deepai.org/job-view-file/fcf837eb-ab02377/outputs/output.jpg"}
取得したJSON出力のデータの中には、output_urlという項目があり、これは元画像を漫画加工されたJPEG画像のURLです。

APIから取得した画像データの表示

せっかくなのでoutput_urlの画像をダウンロードし、TImageコンポーネントで表示できるように変換してみましょう、そのコードは以下の通りです。
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アプリケーションの全ソースコードです。

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

このサンプルプロジェクトをビルドして実行すると、こんな感じです。

screen-shot-2021-05-16-at-23-57-16

上記は、このブログの作者であるHeru Susanto氏の写真を漫画化した例です。どうでしょう? 元の雰囲気は残っているような・・別人のような(笑)

皆さんは、いかがでしょうか?  

もし興味がございましたら、是非 試してみてください!!

Kai for RAD Studio is Now Available! Special Live Webinar: Introducing Kai - A New Chapter for RAD Studio RAD Studio 13.1 Florence Now Available

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.

Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

IN THE ARTICLES