IOPaintで簡単画像編集

# はじめに

IOPaint (旧 Lama Cleaner)は、「消しゴムマジック」の様にAIモデルを用いてインペインティングなどを行うことのできる画像編集のWebアプリです。

https://www.iopaint.com/

https://github.com/Sanster/IOPaint

# セットアップ

## インストール

pipでインストールすることもでき、そっちの方が簡単だと思いますが、あえてDockerを使います。リポジトリにある`Dockerfile`は更新されていないので、それを参考に以下の様に書き直します。

```dockerfile
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04

RUN apt update && apt install -y --no-install-recommends \
      software-properties-common \
      libsm6 libxext6 ffmpeg libfontconfig1 libxrender1 libgl1-mesa-glx \
      curl python3-pip && \
    apt autoremove -y && \
    apt clean && \
    rm -rf /var/lib/apt/lists/* && \
    rm -rf /usr/local/src/*

RUN pip install -U pip && \
    pip install --no-cache-dir torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu118 && \
    pip install --no-cache-dir iopaint gfpgan realesrgan rembg && \
    iopaint install-plugins-packages && \
    rm -r /root/.cache/pip

EXPOSE 8080
ENTRYPOINT ["iopaint"]
CMD ["start", "--config", "config.json"]
```

IOPaintは主にWebアプリとして動作させるので、`docker-compose.yml`も作成します。
```yaml
services:
  iopaint:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: iopaint
    ports:
      - 8080:8080
    volumes:
      - $HOME/.cache:/root/.cache
      - ./config.json:/config.json
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
```

各種設定は、`config.json`に記述します(コメントは削除して保存してください)。それぞれの詳細は公式サイトを参照してください。

```json-doc
{
  "host": "0.0.0.0",                       // 外部からアクセスできる様に
  "model": "lama",                         // Inpaintingに用いるモデル
  "device": "cuda",                        // CPUで動かす場合は"cpu"、以下同様
  "enable_interactive_seg": true,          // SAMによるマスクを生成を有効化
  "interactive_seg_device": "cuda",
  "interactive_seg_model": "vit_h",        // SAMのモデル
  "enable_remove_bg": true,                // 背景除去を有効化
  "remove_bg_device": "cuda",
  "remove_bg_model": "briaai/RMBG-2.0",    // 背景除去のモデル
  "enable_anime_seg": true,                // アニメキャラ抽出を有効化
  "enable_realesrgan": true,               // 超解像を有効化
  "realesrgan_device": "cuda",
  "realesrgan_model": "RealESRGAN_x4plus", // 超解像のモデル
  "enable_gfpgan": true,                   // 顔復元モデルその1を有効化
  "gfpgan_device": "cuda",
  "enable_restoreformer": true,            // 顔復元モデルその2を有効化
  "restoreformer_device": "cuda"
}
```

これら3つのファイルを同じフォルダに置いて、起動します。

```sh
docker compose up
```

しばらく待つと、以下の様に表示されるので(初回はimageのbuildとモデルのダウンロードが行われるため時間がかかります)、`http://localhost:8080/`にアクセスします。

```text
iopaint  | INFO:     Started server process [1]
iopaint  | INFO:     Waiting for application startup.
iopaint  | INFO:     Application startup complete.
iopaint  | INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
```

なお、Windows であれば [1-Click Installer](https://www.iopaint.com/install/windows_1click_installer) もありますが、有料($5)です。本ソフトが気に入った場合に、お礼として購入するのも良いでしょう。

## 設定

`http://localhost:8080/`にアクセスすると、以下の様な画面が表示されます。

![IOPaint_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/b954ee10-724d-ab9a-d079-a508687650f5.png)

右上の歯車から設定変更ができます。

![IOPaint_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/7ce208e1-144f-357f-6255-a0a3cd45d091.png)

InpaintやDiffusionのモデルは先にダウンロードしておかないと表示されないかもしれません。その場合は、`config.json`の`model`を別のものに変えて再起動すると、起動時にそのモデルがダウンロードされて、選択できる様になります。

![IOPaint_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/3e25113d-c75a-871f-ba34-c4de1a539a16.png)

一方、プラグインのモデルは設定を更新すると自動でモデルがダウンロードされるので、`config.json`の`interactive_seg_model`などを書き換える必要はありません。

![IOPaint_04](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/5ad24191-7e85-c338-9b0d-44a4cc7adee8.png)

また、マスク指定中に何度もインペインティングが実行されるのが気になる方は、`Enable manual inpainting`をonにしてください。

# 画像編集

それでは、画像編集をしてみます。

![IOPaint_05](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/a7520be8-0492-8e52-c2c5-b0d1fd175661.png)

`Interactive Segmentation`を有効にしていると、マスク指定が簡単にできるようになります。左上の四角アイコンから選択すると、マスク自動生成モードになります。

![IOPaint_06](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/543c41be-f1c8-549a-1c3b-5590e46282e3.png)

消去したい物体の点を左クリックすると、マスクが生成されるので、良ければ`Accept`を押します。マスク形状がイマイチの場合、追加で物体の点を左クリックしたり、マスクに含めたくない点を右クリックしたりすると、マスクが修正されます。

![IOPaint_07](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/8b5cbfea-8d79-f970-a20f-77ba72ccd500.png)

他にも消去したい物体があれば上記操作を繰り返し、マスクが完成したら下の消しゴムボタンを押します(前述の`Enable manual inpainting`がoffならこのボタンは表示されず、自動的に処理されます)。
もちろん、`Interactive Segmentation`を用いずに手動でマスクを塗っても構いません。

![IOPaint_08](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/53c183d4-949d-fda4-f521-f34b7ad7a34c.png)

綺麗に人物が消えてくれました。

この様に物体を消去するだけでなく、画像生成AIを用いた物体の差し替え・アウトペインティング・テキスト挿入・画風変換などもできます。また、プラグインを有効にすると、超解像・背景除去・顔の修正などもできます。

# まとめ

IOPaintを用いると、手軽に画像の修正ができました。画像生成AIをフル活用するならば、ComfyUIなどを使った方が良いと思いますが、こちらはインペインティングに特化していて、その分簡単で使いやすいのが良いです。