2023.09.01
画像を使ったディープラーニング技術の活用例~顔置換の技術的アプローチ
#画像認識 #サイバーセキュリティ #AI #ディープラーニング #物体検出 #セマンティックセグメンテーション
トップ > 技術ナレッジのアーカイブ > 画像を使ったディープラーニング技術の活用例~顔置換の技術的アプローチ
2023.09.01
#画像認識 #サイバーセキュリティ #AI #ディープラーニング #物体検出 #セマンティックセグメンテーション
顔置換とはその名の通り、顔を入れ替える技術です。
映画業界ではよく使われている技術らしく、映画「ワイルド・スピード sky mission」で撮影途中で亡くなったポール・ウォーカーの代役に顔置換技術を使うことで作品を完成させました。
映画「アバター」も同様の技術が使われていて映像業界ではメジャーな手法のようです。
今回はその技術を体感してみたいと思います。
2013年にテクノプロ・デザイン社に中途入社。
POSレジシステムの開発・保守を約4年、WiFiとBluetooth制御ICチップを検査する専用ソフトウェアの開発・保守を2年経験。
その後、約4カ月のDST研修と2カ月OJT期間を経て現在のデータサイエンス業務に配属。
主にPoC実装・分析業務を担当。
趣味はRaspberry Pi、パン作り。
それでは環境構築を始めたいと思います。今回はPCに負荷のかかる作業になるのでGPUアリの前提で進めます。
CPU:i9-9900K
メモリ:48GB
GPU:NVIDEA Geforce RTX2070(8GB)
OS:Windows11 Pro
1.Dockerインストール
2.Dockerfile、docker-compose.yml作成
3.コンテナ作成(時間がかかる)
4.プログラム実行
Dockerのインストールについては別途調べてインストールしてください。(そのままインストールするだけなので難しくないはず) そのあとに、power shellで起動していることを確認してください。
Dockerを使い顔置換プログラム環境を作成します。
作業用のフォルダを適当に作成して2つファイルを作成します。
以下の内容で保存してください。
※Dockerfileは拡張子をなくしてください。
- version: '3'
- services:
- swap_face_image:
- build: ./
- image: swap_face_image
- container_name: swap_face
- command: jupyter lab --port 8888 --ip=0.0.0.0 --allow-root --NotebookApp.token='' --no-browser
- deploy:
- resources:
- reservations:
- devices:
- - driver: nvidia
- count: 1
- capabilities: [compute, utility, graphics]
- ports:
- - 8888:8888
- #FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04
- FROM meadml/cuda10.1-cudnn7-devel-ubuntu18.04-python3.6:latest
- ENV TZ=Asia/Tokyo
- RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
- # GPGキーの取得
- # apt-get update や apt-get upgrade の前に
- RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub
- RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
- RUN apt update
- RUN apt-get update
- RUN apt-get install -y python3-pip
- RUN pip3 install -U pip
- RUN pip3 install --upgrade setuptools
- RUN apt-get install -y wget libgl1-mesa-dev libglib2.0-0 git ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev
- RUN pip3 install jupyterlab
- RUN git clone https://github.com/sberbank-ai/sber-swap.git
- RUN pip3 install -r ./sber-swap/requirements.txt
- RUN sh ./sber-swap/download_models.sh
- RUN wget -P ./sber-swap/arcface_model https://github.com/sberbank-ai/sber-swap/releases/download/arcface/backbone.pth
- RUN wget -P ./sber-swap/arcface_model https://github.com/sberbank-ai/sber-swap/releases/download/arcface/iresnet.py
- RUN wget -P ./sber-swap/insightface_func/models/antelope https://github.com/sberbank-ai/sber-swap/releases/download/antelope/glintr100.onnx
- RUN wget -P ./sber-swap/insightface_func/models/antelope https://github.com/sberbank-ai/sber-swap/releases/download/antelope/scrfd_10g_bnkps.onnx
- RUN wget -P ./sber-swap/weights https://github.com/sberbank-ai/sber-swap/releases/download/sber-swap-v2.0/G_unet_2blocks.pth
- RUN wget -P ./sber-swap/weights https://github.com/sberbank-ai/sber-swap/releases/download/super-res/10_net_G.pth
- RUN pip3 install opencv-contrib-python
- RUN pip3 install opencv-python==4.4.0.46
以下のコマンドをpower shellで実行するとコンテナ作成できます。
- docker compose -f (docker-compose.ymlのフルパス) up -d
例えばworkフォルダを作成してDockerfile、docker-compose.ymlを作った場合は以下のようになります。
- docker compose -f D:\work\docker-compose.yml up -d
また、コンテナ作成には時間がかかります。(筆者環境では2~3時間)
構築が終わるまでゆっくりお過ごしください。
エラーが発生せずに終わるとコンテナが作成されて起動状態になっています。
ブラウザから「localhost:8888」を打ち込んでアクセスするとjupyter labの画面に入れます。
画面からsber-swapフォルダに入りノートブックファイル(SberSwapInference.ipynb)を動かすと顔置換スクリプトが実行できます。
今回は以下のサンプル画像を使って動かしてみました。
顔置換が分かりやすいように男女の画像を組み合わせて出しました。
この画像(Source Image)は歯を出していませんが元画像(Target Image)に合わせて歯を出した状態で顔置換されていることが分かります。
うまく言った顔置換ですが今度は見破れるかを検証したいと思います。
アナログ的な方法ですが拡大してみます。
拡大してみると顔のあたりがすごくぼかされていることがわかります。
また、生え際もよい感じで合わせていますが男性の髪色が反映されていることがわかります。細かい点相違点はほかにもありますが顔置換をなじませるためにぼかしを使っているようです。このぼかしに気づくことができれば何とか見破れるかもしれません。
ほかに有用な方法があるかもしれませんが、顔置換画像をいっぱい作って顔置換判別モデルを作ってみるのもいいかもせれませんね。