File size: 3,646 Bytes
4555cad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# Pose processing utilities for dwpose-editor

import gradio as gr
from .dwpose_manager import DWPoseManager
from .dwpose_detector import DWPoseDetector
from .error_handler import handle_error, ModelLoadError, PoseDetectionError, safe_execute
from .notifications import notify_success, notify_warning, notify_error, notify_progress, NotificationMessages

# グローバルなDWPoseインスタンス
dwpose_manager = None
dwpose_detector = None

def initialize_dwpose():
    """DWPoseモデルを初期化"""
    global dwpose_manager, dwpose_detector
    
    def _init_process():
        global dwpose_manager, dwpose_detector
        dwpose_manager = DWPoseManager()
        success, message = dwpose_manager.initialize()
        
        if success:
            dwpose_detector = DWPoseDetector(dwpose_manager)
            notify_success(NotificationMessages.MODEL_LOADED)
            return True, "DWPoseモデル初期化完了"
        else:
            raise ModelLoadError(message)
    
    try:
        return safe_execute(
            _init_process,
            "DWPoseモデルの初期化に失敗しました",
            show_error=False
        ) or (False, "初期化処理でエラーが発生しました")
        
    except ModelLoadError as e:
        return False, str(e)
    except Exception as e:
        return False, f"予期しないエラー: {str(e)}"

def safe_detect_pose(image):
    """安全なポーズ検出(Gradio用)"""
    global dwpose_detector
    
    def _detection_process():
        if dwpose_detector is None:
            raise PoseDetectionError("DWPoseモデルが初期化されていません")
        
        if image is None:
            raise PoseDetectionError("画像が選択されていません")
        
        pose_data, error = dwpose_detector.detect(image)
        if error:
            raise PoseDetectionError(error)
        
        return pose_data
    
    try:
        result = safe_execute(
            _detection_process,
            "ポーズ検出に失敗しました",
            show_error=False
        )
        
        if result is not None:
            notify_success(NotificationMessages.POSE_DETECTED)
            return result
        else:
            return None
            
    except PoseDetectionError as e:
        handle_error(e)
        return None
    except Exception as e:
        handle_error(e)
        return None

def safe_detect_pose_with_progress(image):
    """進捗表示付きポーズ検出"""
    global dwpose_detector
    
    try:
        if dwpose_detector is None:
            notify_error("DWPoseモデルが初期化されていません")
            return None
        
        if image is None:
            notify_error("画像が選択されていません")
            return None
        
        # 進捗付きでポーズ検出実行
        notify_progress("画像を処理中...", 0.1)
        
        # 画像前処理
        notify_progress("画像前処理中...", 0.2)
        
        # 人物検出
        notify_progress("人物を検出中...", 0.4)
        
        # ポーズ推定
        notify_progress("ポーズを解析中...", 0.7)
        
        # 実際の検出処理
        pose_data, error = dwpose_detector.detect(image)
        
        if error:
            notify_error(error)
            return None
        
        notify_progress("完了", 1.0)
        notify_success(NotificationMessages.POSE_DETECTED)
        return pose_data
        
    except Exception as e:
        notify_error(f"ポーズ検出中にエラーが発生しました: {str(e)}")
        return None