Supershipの名畑です。6月となり、2023年春アニメが次々とクライマックスを迎える中、2023年夏アニメの情報も盛り上がり、落ち着かない毎日です。
はじめに
Clipdropというサービスがあります。Stable Diffusionの提供元であるstability.aiによる画像編集ツールです。
Stability AI 日本公式が公開している「様々な生成AIが無料で使えるClipdropが凄い」という記事に概要がまとまっています。一部の物体のみ取り除いたり、背景のみ取り除いたり、様々な画像加工が可能です。
ブラウザ上で利用できるのですが、今回はClipDrop APIs経由で使ってみましたので、その内容を記事にします。
APIとしては下記が提供されていますが、今回はこのうちの3つInpainting、Remove Background、Remove Textを試します。
- Inpainting
- Remove Background
- Super resolution
- Remove Text(Beta)
- Text to Image(Beta)
- Replace Background(Beta)
- Portrait Depth Estimation
- Portrait Surface Normals
アカウント作成
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で生成した下記画像を用いました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2Ff71db539-a1bc-1840-8ed0-8392d8f27d05.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=88066426d144e713916b29a63d9f3f13)
今回はこの画像から通行人を取り除いてみようと思います。
そのため、マスクとしては、通行人がいる箇所のみ白とした画像を用意します。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2Fd6f4c477-cca1-cb71-1f9d-f43df8e7f9ab.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=0f437e42d86fbb931f094f2eb69ac9f1)
この結果として生成された画像は下記です。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2Fd7462f3e-2aa9-25aa-ab32-99c871bd5760.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=10c835ba4fe1e740dbb2246654d537fd)
人の痕跡は残ってはいますが、かなり綺麗に取り除かれているように思えます。
二つ並べて比較してみましょう。
元画像 | 生成画像 |
---|---|
![]() |
![]() |
元々がAI生成で背景が明瞭ではないこともあってか、違和感少ないですね。
パターン2
次は実際の写真を元にして試してみようと思います。
弊社オフィスは虎ノ門ヒルズ ビジネスタワーにあるのですが、こちらはよくランチで堪能させていただいております福島屋食堂様の館が森高原豚の生姜焼き定食です。こういった使い方をする予定なかったので雑な写真ですみません。本当に美味しいし小鉢が嬉しい素晴らしい定食です。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2Fdbc4cdde-d6cc-5346-3a99-6f8356cead24.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e74fd5e61083c13a041f783e22972e6b)
今回はこの画像からお手拭きを取り除いてみましょう。
ということでマスク画像は下記。お手拭きのあたりのみ白にしています。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2Ff224eef9-e90b-46a7-b31d-f0a177f18cc5.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=04dd29b000806b1e439fce050d55455f)
そして出来上がった画像は下記です。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2F76844778-8fac-a997-67c1-0df2571cd0a4.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=6f3512668de274dcf6849711aa88ccaa)
めちゃくちゃ自然ではないでしょうか?
今回も二つ並べて比較してみましょう。
元画像 | 生成画像 |
---|---|
![]() |
![]() |
トレイの模様にせよ影にせよ、不自然さがないと言えば嘘ですが、鈍感な私はきっと、加工したものだと知らなければなにも思わない。
パターン3
次は同じく館が森高原豚の生姜焼き定食の写真から、右側の汁物を取り除くことに挑戦してみます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2F4164b9a0-535c-60fc-92df-25e812994210.jpeg?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5d2da2d7b11fb39786225ae0ed97a4fd)
マスク画像は下記。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2F787a4a2b-d88d-a713-07ee-cbfd2c4254e7.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=99121e45f25e03c811a5176482ad4748)
元画像と結果を並べたものは以下です。
元画像 | 生成画像 |
---|---|
![]() |
![]() |
流石にちょっと厳しかったですね。
ただ、除去はきっちりされているので、用途によっては充分に目的達成かもしれません。
背景除去
次は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")}
)
元画像は先ほどと同じものとします。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2F5f47203f-5192-37df-1122-7a054939f1a9.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d4ec92a7743d5f1fc19b27d9a33fc8b5)
結果はこちら。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2F300e321c-e31e-d258-a045-9b23ad956cc1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=5f09abb7982422b2f7ff886d7e1e8e21)
かなり綺麗に背景を取り除いてくれていますね。
rembgで試す
インストールして
$ pip install rembg
呼び出して
$ rembg i image.png output.png
結果はこちら。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F869934%2F30eb8c98-3ba2-879c-85f8-2a5d04a9c820.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=1933f6bf57efaaec1527bcbb2f572364)
髪の毛や輪郭の辺りが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
まずは文字と絵が重なっていないもので試してみました。
元画像 | 生成画像 |
---|---|
![]() |
![]() |
綺麗に文字だけ取り除かれているように見えますが、よく見ると左手の先も取り除かれてしまっていますね。
左手の先も数字の3のような形をしていますものね。
パターン2
次は模様のある吹き出し内に文字がある画像で同様のことをしてみました。
元画像 | 生成画像 |
---|---|
![]() |
![]() |
文字は取り除かれていますが、それ以外の箇所にも明らかな影響が出ていますね。文字として扱われても仕方ないと思えはしますが。
価格
先述しましたようにフリークレジットがありますが、それを超えて使用する場合はクレジットの購入が必要です。
価格は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 |
以下が各機能毎のクレジット消費数です。
今回試してみたCleanup、Remove text and logo、Remove 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株式会社 採用サイトよりご確認ください。