10
2

More than 1 year has passed since last update.

お題は不問!Qiita Engineer Festa 2023で記事投稿!

画像からの「人や物」「背景」「テキスト」の除去をPythonとClipdrop APIsで実装してみた

Posted at

Supershipの名畑です。6月となり、2023年春アニメが次々とクライマックスを迎える中、2023年夏アニメの情報も盛り上がり、落ち着かない毎日です。

はじめに

Clipdropというサービスがあります。Stable Diffusionの提供元であるstability.aiによる画像編集ツールです。

Stability AI 日本公式が公開している「様々な生成AIが無料で使えるClipdropが凄い」という記事に概要がまとまっています。一部の物体のみ取り除いたり、背景のみ取り除いたり、様々な画像加工が可能です。

ブラウザ上で利用できるのですが、今回はClipDrop APIs経由で使ってみましたので、その内容を記事にします。

APIとしては下記が提供されていますが、今回はこのうちの3つInpaintingRemove BackgroundRemove Textを試します。

アカウント作成

Sing inにてメールアドレスを入力すると、メールが届きます。そこに記載されているリンクを押すとSign up/Sign in完了です。

My AccountのページのClaim my 100 free creditsを押し、名前と電話番号を入力してSMSでの認証を行えば100クレジットを入手することができます。

API KEY

API KEYはMy AccountのページのReveal API KEYを押すと取得できます。

取得したAPI KEYはいつも通りに環境変数にセットしました。CLIPDROP_API_KEYという環境変数名としました。

export CLIPDROP_API_KEY=ここに取得したAPI KEYを書く

人や物の除去

まずはInpaintingのAPIを使用して画像から特定オブジェクトの除去をしてみました。

コードは以下で全部です。非常にシンプルです。
元画像」と「取り除く対象を示したマスク画像」をパラメータとして渡します。

import requests
import os
import time

## API呼び出し
r = requests.post('https://clipdrop-api.co/cleanup/v1',
                  files={
                      'image_file': ('image.jpg', open("./image.jpg", "rb"), 'image/jpeg'),
                      'mask_file': ('mask.png', open("./mask.png", "rb"), 'image/png')
                  },
                  headers={'x-api-key': os.getenv("CLIPDROP_API_KEY")}
                  )

## レスポンスから画像を生成
if r.ok:
    with open(f"./clipdrop_{int(time.time())}.png", "wb") as f:
        f.write(r.content)
else:
    r.raise_for_status()

パターン1

元画像としては前の記事にてStable Diffusionで生成した下記画像を用いました。

今回はこの画像から通行人を取り除いてみようと思います。

そのため、マスクとしては、通行人がいる箇所のみとした画像を用意します。

この結果として生成された画像は下記です。

人の痕跡は残ってはいますが、かなり綺麗に取り除かれているように思えます。

二つ並べて比較してみましょう。

元画像 生成画像
image_1_a.png image_1_c.png

元々がAI生成で背景が明瞭ではないこともあってか、違和感少ないですね。

パターン2

次は実際の写真を元にして試してみようと思います。

弊社オフィスは虎ノ門ヒルズ ビジネスタワーにあるのですが、こちらはよくランチで堪能させていただいております福島屋食堂様の館が森高原豚の生姜焼き定食です。こういった使い方をする予定なかったので雑な写真ですみません。本当に美味しいし小鉢が嬉しい素晴らしい定食です。

今回はこの画像からお手拭きを取り除いてみましょう。

ということでマスク画像は下記。お手拭きのあたりのみにしています。

そして出来上がった画像は下記です。

めちゃくちゃ自然ではないでしょうか?

今回も二つ並べて比較してみましょう。

元画像 生成画像
image_2_a.jpg image_2_c.png

トレイの模様にせよ影にせよ、不自然さがないと言えば嘘ですが、鈍感な私はきっと、加工したものだと知らなければなにも思わない。

パターン3

次は同じく館が森高原豚の生姜焼き定食の写真から、右側の汁物を取り除くことに挑戦してみます。

マスク画像は下記。

元画像と結果を並べたものは以下です。

元画像 生成画像
image_2_a.jpg image_3_c.png

流石にちょっと厳しかったですね。

ただ、除去はきっちりされているので、用途によっては充分に目的達成かもしれません。

背景除去

次はRemove BackgroundのAPIを使って、背景を取り除いてみます。

コードの呼び出すエンドポイントを変えます。mask_fileは不要です。

API呼び出し箇所のみ抜粋したコードは下記です。

r = requests.post('https://clipdrop-api.co/remove-background/v1',
                  files={
                      'image_file': ('image.png', open("./image.png", "rb"), 'image/png'),
                  },
                  headers={'x-api-key': os.getenv("CLIPDROP_API_KEY")}
                  )

元画像は先ほどと同じものとします。

結果はこちら。

かなり綺麗に背景を取り除いてくれていますね。

rembgで試す

前回の記事で用いたライブラリrembgだとどうでしょうか。

インストールして

$ pip install rembg

呼び出して

$ rembg i image.png output.png

結果はこちら。

髪の毛や輪郭の辺りがClipdropのAPIに比べて荒いですが、一画像をさくっとデフォルト環境で試しただけですので、まあ、参考ということで。

テキスト除去

最後にRemove TextのAPIを用いたテキスト除去です。こちらはまだBetaとなっています。

先ほどのコードのエンドポイントを変えるのみです。

API呼び出し部分のみ抜粋したコードは下記です。

r = requests.post('https://clipdrop-api.co/remove-text/v1',
                  files={
                      'image_file': ('image.png', open("./image.png", "rb"), 'image/png'),
                  },
                  headers={'x-api-key': os.getenv("CLIPDROP_API_KEY")}
                  )

パターン1

まずは文字と絵が重なっていないもので試してみました。

元画像 生成画像
image_5_a.png image_5_b.png

綺麗に文字だけ取り除かれているように見えますが、よく見ると左手の先も取り除かれてしまっていますね。

左手の先も数字の3のような形をしていますものね。

パターン2

次は模様のある吹き出し内に文字がある画像で同様のことをしてみました。

元画像 生成画像
image_5_c.png image_5_d.png

文字は取り除かれていますが、それ以外の箇所にも明らかな影響が出ていますね。文字として扱われても仕方ないと思えはしますが。

価格

先述しましたようにフリークレジットがありますが、それを超えて使用する場合はクレジットの購入が必要です。
価格はPricingに記載されています。

クレジット数 金額(円) 1クレジットあたりの金額(円)
500 ¥4,064 ¥8.128
5,000 ¥20,000 ¥4.000
25,000 ¥80,000 ¥3.200
50,000 ¥140,000 ¥2.800
100,000 ¥259,924 ¥2.599
500,000 ¥990,000 ¥1.980
1,000,000 ¥1,563,000 ¥1.563

以下が各機能毎のクレジット消費数です。

今回試してみたCleanupRemove text and logoRemove backgroundはすべて呼び出し一回あたり1クレジットです。

機能 クレジット数
Cleanup 1 credit / call
Remove text and logo 1 credit / call
Depth estimation 1 credit / call
Normals estimation 1 credit / call
Remove background 1 credit / call
Replace background 1.5 credit / call
Text to image 0.5 credit / call
Upscaler From 0.2 credit / output megapixel

最後に

技術の進化というのは手間を含めたコストの改善を生むわけですが、それを強く実感します。
前からPhotoshopを使うなりして似たようなことはできますが、そのハードルは確実に下がっているなと。

かなり近い未来では格段に良いアウトプットが出ているのでしょうね。

宣伝

SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。

10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2