【MediaPipe × Streamlit】動画の顔を自動検出してモザイク処理するアプリ

python

今回は、MediaPipe を使って動画内の顔を自動検出し、モザイク処理を行うアプリを作成しました。人物を含んだ動画データを外部に公開する際などに、顔を隠す必要がある際に役に立つと思うアプリです。

こういった顔にモザイク処理をするのは、有償の動画編集ソフトだと実装されている場合がありますが、無料のソフトなどの場合に、そういった処理をするのは手間です。定点だけモザイクをかけるという処理で対応することもできるかもしれませんが、画面内を頭部が移動する場合にはなかなかうまくいきません。


今回のアプリでは、顔を自動追従して髄時モザイクをかけることが可能で、さらに、Streamlit を利用することで、ブラウザ上で手軽に実行できるようにしています。

AIによる顔検出+モザイク処理が自動で行われ、処理後はワンクリックでダウンロード可能です!


✅ 使用ツール&ライブラリ

  • フレームワーク:Streamlit
  • 顔検出:Google MediaPipe Face Detection
  • 処理内容:動画 → 顔検出 → モザイク処理 → 動画生成

使用ライブラリ一覧

  • streamlit
  • mediapipe
  • opencv-python-headless
  • numpy

✅ 環境構築

以下のコマンドで環境構築が可能です。ご自身のpython環境で実装する場合には下記のコマンドでパッケージをインストールしましょう。

pip install streamlit mediapipe opencv-python-headless numpy

※ Streamlit Cloud にデプロイする場合も、この構成で動作確認済みです。


✅ アプリの概要

  1. 動画ファイルをアップロード
  2. 各フレームごとに MediaPipe で顔を検出
  3. 検出した顔領域に自動でモザイク処理
  4. 完了後、モザイク済み動画をダウンロード

アプリのリンクはこちらになります。環境構築せずに利用する場合には、下記のリンクをご利用ください。

アプリリンク:https://mediapipefaceedit-5wvzkjaqzdz3ssdjvpveax.streamlit.app/


✅ コード全文

ご自身のpython環境で実装する場合には、こちらのコードをコピペしてご利用ください。

import streamlit as st
import cv2
import numpy as np
import tempfile
import os
import mediapipe as mp

st.title("Face Mosaic App using MediaPipe")
st.write("Upload a video, and this app will automatically detect faces and apply mosaic blur.")

@st.cache_resource
def load_face_detector():
    mp_face = mp.solutions.face_detection
    return mp_face.FaceDetection(model_selection=1, min_detection_confidence=0.3)

face_detector = load_face_detector()

video_file = st.file_uploader("Upload a video file", type=["mp4", "mov", "avi"])

if video_file:
    with tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") as temp_video:
        temp_video.write(video_file.read())
        video_path = temp_video.name

    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    output_path = os.path.join(tempfile.gettempdir(), "output_mosaic.mp4")
    out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (w, h))

    progress_bar = st.progress(0)

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

        rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = face_detector.process(rgb_frame)

        if results.detections:
            for detection in results.detections:
                bboxC = detection.location_data.relative_bounding_box
                x = int(bboxC.xmin * w)
                y = int(bboxC.ymin * h)
                bw = int(bboxC.width * w)
                bh = int(bboxC.height * h)

                padding = 5
                x1 = max(0, x - padding)
                y1 = max(0, y - padding)
                x2 = min(w, x + bw + padding)
                y2 = min(h, y + bh + padding)

                face_region = frame[y1:y2, x1:x2]

                if face_region.size > 0:
                    mosaic = cv2.resize(face_region, (8, 8))
                    mosaic = cv2.resize(mosaic, (x2 - x1, y2 - y1), interpolation=cv2.INTER_NEAREST)
                    frame[y1:y2, x1:x2] = mosaic

        out.write(frame)
        frame_idx += 1
        progress_bar.progress(frame_idx / total_frames)

    cap.release()
    out.release()

    st.success("✅ Processing complete!")

    with open(output_path, "rb") as f:
        st.download_button("Download mosaic video", f, file_name="face_mosaic_output.mp4")

    if os.path.exists(video_path):
        os.remove(video_path)
    if os.path.exists(output_path):
        os.remove(output_path)

✅ 実行結果

  • アップロードした動画内のすべての顔に、しっかりモザイク処理が施されます。
  • 処理完了後にすぐダウンロード可能です。

✅ 注意点

  • 検出精度を緩めに設定しているので、多少の誤検出は発生する可能性があります。
  • 長時間・高解像度の動画は処理時間がかかるため、短めの動画推奨。
  • セキュリティ対策として、処理後は一時ファイルを自動削除しています。

ご質問などはX(https://x.com/shimitaro_108)までお願いします。

コメント

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