【Python × rembg】10秒動画の背景を消すAIアプリを作ってみた

python

今回は Python の人気ライブラリ「rembg」を使い、動画の背景を自動で削除する Web アプリを開発しました。動画の背景を消すのは、動画をクロマキー合成したり、骨格推定で邪魔なものを消して整理するのに役に立ちます。
本アプリは Streamlit 上で動作し、ユーザーがブラウザから簡単に操作できるのが大きな特徴です。動画の背景除去~動画として再構成する処理が重たいので、10秒以内程度の動画で利用するのがおすすめです。

以前紹介した人物以外を消すアプリのより高性能版だと思ってくれれば幸いです(記事URL:http://ktr-project.net/?p=140)。

基本的には動画をアップロードしてボタンクリックで処理を回すだけなので、ユーザの負担はほとんどありません。


使った技術・ライブラリ

  • Python:主要な開発言語。豊富なライブラリが無料で利用できる。
  • rembg:画像・動画の背景を高精度で除去できるAIライブラリ。静止画だけでなく動画フレームにも対応。
  • OpenCV:画像・動画のフレーム操作、保存、表示に使用。
  • Streamlit:機械学習やデータ可視化をすぐにWebアプリ化できる便利ツール。
  • onnxruntime:rembgのバックエンドとしてAIモデルをCPU上で効率的に実行。

アプリの主な機能と特徴

  • ユーザーは動画(mp4)をアップロードするだけ
  • アプリが動画をフレーム単位で分解し、各フレームの背景を除去
  • 背景が消えたフレームを連結し、再度動画として保存
  • 処理後の動画はその場でプレビュー可能、ダウンロードも可能

活用シーンの具体例

  • YouTube動画編集で不要な背景を消してクリーンな映像を作る
  • 動作解析やリハビリテーションの記録用動画の背景を消して対象者の動きに集中
  • SNS用動画で背景を除去し、目立つビジュアルを作成
  • ペット動画の背景除去、趣味のクリエイティブ用途にも最適

注意点・制約

  • Streamlit Cloudの無料プランではメモリ制限(約1GB)があるため、動画時間は短く、低解像度を推奨します。
  • rembgのモデルロードに最初の実行時は1~2分かかる場合あり
  • 高解像度動画や長時間動画はローカル実行推奨

解析コード

import streamlit as st
import cv2
import tempfile
import os
from rembg import remove
from PIL import Image
import numpy as np
import zipfile

st.title("rembg × Background Removal App (for ~10 sec videos)")

uploaded_file = st.file_uploader("Upload a video (.mp4)", type=["mp4"])

if uploaded_file:
    tfile = tempfile.NamedTemporaryFile(delete=False)
    tfile.write(uploaded_file.read())
    video_path = tfile.name

    st.video(uploaded_file)

    if st.button("Run Background Removal"):
        with st.spinner("Processing... (recommended for ~10 sec videos)"):
            cap = cv2.VideoCapture(video_path)
            fps = cap.get(cv2.CAP_PROP_FPS)
            width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
            height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
            frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

            output_dir = tempfile.mkdtemp()
            out_path = os.path.join(output_dir, "output.mp4")
            fourcc = cv2.VideoWriter_fourcc(*'mp4v')
            out = cv2.VideoWriter(out_path, fourcc, fps, (width, height), True)

            frame_idx = 0
            while cap.isOpened():
                ret, frame = cap.read()
                if not ret:
                    break

                frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                frame_pil = Image.fromarray(frame_rgb)
                removed_pil = remove(frame_pil)
                removed_np = np.array(removed_pil)

                # Replace transparent background with black
                alpha = removed_np[..., 3] / 255.0
                rgb = removed_np[..., :3]
                black_bg = np.zeros_like(rgb)
                combined = (rgb * alpha[..., None] + black_bg * (1 - alpha[..., None])).astype(np.uint8)
                combined_bgr = cv2.cvtColor(combined, cv2.COLOR_RGB2BGR)

                out.write(combined_bgr)
                frame_idx += 1

                if frame_idx % 10 == 0:
                    st.write(f"Processing frame: {frame_idx}/{frame_count}")

            cap.release()
            out.release()

            # Create ZIP file
            zip_path = os.path.join(output_dir, "output.zip")
            with zipfile.ZipFile(zip_path, "w") as zf:
                zf.write(out_path, arcname="output.mp4")

            with open(zip_path, "rb") as f:
                st.download_button("Download processed video (ZIP)", f, "output.zip", "application/zip")

            st.success("Processing completed for all frames!")

まとめ
Pythonとrembgを使った背景除去アプリは、AIの実用例として非常にわかりやすく、動画編集の作業効率化に役立ちます。特に手軽さや操作の簡単さは初心者にもおすすめです。

質問などはX(https://x.com/shimitaro_108)まで。

コメント

タイトルとURLをコピーしました