バッチ処理で複数のOpenPose、DWposeを作成する

2023年12月26日

今回はダウンロードしたモデルデータを使用できるように対応しました

コード

# -*- coding: utf-8 -*-
import requests
from PIL import Image
from io import BytesIO
import os

#
from controlnet_aux import DWposeDetector,OpenposeDetector


pretrained_model_or_path = "model"
body_filename =  "body_pose_model.pth"
hand_filename =  "hand_pose_model.pth"
face_filename =  "facenet.pth"

        
open_pose = OpenposeDetector.from_pretrained( pretrained_model_or_path, 
                                             filename=body_filename,
                                             hand_filename=hand_filename, 
                                             face_filename=face_filename,
                                             cache_dir=None)
# specify configs, ckpts and device, or it will be downloaded automatically and use cpu by default
# det_config: ./src/controlnet_aux/dwpose/yolox_config/yolox_l_8xb8-300e_coco.py
# det_ckpt: https://download.openmmlab.com/mmdetection/v2.0/yolox/yolox_l_8x8_300e_coco/yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth
# pose_config: ./src/controlnet_aux/dwpose/dwpose_config/dwpose-l_384x288.py
# pose_ckpt: https://huggingface.co/wanghaofan/dw-ll_ucoco_384/resolve/main/dw-ll_ucoco_384.pth
det_config = 'dwpose_config/yolox_config/yolox_l_8xb8-300e_coco.py'
det_ckpt = 'model/yolox_l_8x8_300e_coco_20211126_140236-d3bd2b23.pth'
det_config = 'dwpose_config/dwpose_config/dwpose-l_384x288.py'
pose_ckpt = 'model/dw-ll_ucoco_384.pth'
import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#dwpose = DWposeDetector( device=device)
#dwpose = DWposeDetector(det_config=det_config, det_ckpt=det_ckpt, pose_config=pose_config, pose_ckpt=pose_ckpt, device=device)
#
dwpose = DWposeDetector( det_ckpt=det_ckpt,  pose_ckpt=pose_ckpt, device=device)

input_folder = 'input_folder/'
output_folder = 'output_folder/'

# 出力フォルダーが存在しない場合は作成します
if not os.path.exists(output_folder):
    os.makedirs(output_folder)
# 画像フォルダー内のファイルをループで処理します
for filename in os.listdir(input_folder):
    if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'):
        img = Image.open(os.path.join(input_folder, filename))

#        processed_image = dwpose(img, to_pil=True)    
        processed_image = open_pose(img, to_pil=True,include_hand=True, include_face=True) 
        output_path = os.path.join(output_folder, filename)
        processed_image.save(output_path)

あらかじめダウンロードしたモデルファイルを用意して自分の環境に設置してください。

OpenPose、DWposeを用意しているので必要な方を選んで使用してください

モデルデータを自動でダウンロードするコード

# -*- coding: utf-8 -*-
import requests
from PIL import Image
from io import BytesIO
import os

#
from controlnet_aux import DWposeDetector,OpenposeDetector

processor_id = 'openpose_face'
processor_id = 'openpose_faceonly'
processor_id = 'openpose_full'
processor_id = 'openpose_hand'
processor_id = 'openpose'
processor = Processor(processor_id)

import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#dwpose = DWposeDetector( device=device)

input_folder = 'input_folder/'
output_folder = 'output_folder/'

# 出力フォルダーが存在しない場合は作成します
if not os.path.exists(output_folder):
    os.makedirs(output_folder)
# 画像フォルダー内のファイルをループで処理します
for filename in os.listdir(input_folder):
    if filename.endswith('.jpg') or filename.endswith('.jpeg') or filename.endswith('.png'):
        img = Image.open(os.path.join(input_folder, filename))
        processed_image = processor(img, to_pil=True)        

#        processed_image = dwpose(img, to_pil=True)    
#        processed_image = processor(img, to_pil=True,include_hand=True, include_face=True) 
        output_path = os.path.join(output_folder, filename)
        processed_image.save(output_path)

stable-diffusion

Posted by eightban