File size: 2,998 Bytes
17b8cf5
 
767640d
17b8cf5
767640d
 
17b8cf5
5aafff0
 
76eee3f
767640d
 
 
7c6eadc
5aafff0
 
7c6eadc
767640d
efcb3a9
5aafff0
 
efcb3a9
5aafff0
767640d
5aafff0
efcb3a9
 
5aafff0
efcb3a9
 
 
767640d
5aafff0
efcb3a9
5aafff0
efcb3a9
5aafff0
efcb3a9
5aafff0
 
 
efcb3a9
5aafff0
 
efcb3a9
 
 
 
 
5aafff0
 
 
efcb3a9
5aafff0
767640d
76eee3f
5aafff0
 
efcb3a9
76eee3f
efcb3a9
767640d
efcb3a9
 
5aafff0
767640d
 
 
 
 
 
17b8cf5
5aafff0
767640d
 
efcb3a9
767640d
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
import os
import numpy as np
import cv2
import gradio as gr
import onnxruntime as ort
from PIL import Image

# 模型檔案路徑 (請確保檔名為 colorizer.onnx)
MODEL_PATH = "colorizer.onnx"

def colorize_ddcolor(input_pil):
    if input_pil is None:
        return None

    if not os.path.exists(MODEL_PATH):
        return "錯誤:找不到 colorizer.onnx 檔案,請確認已上傳。"

    try:
        # 啟動 AI 引擎
        session = ort.InferenceSession(MODEL_PATH, providers=['CPUExecutionProvider'])
        
        # 1. 預處理:將圖片轉為 RGB 並記錄原始大小
        img_np = np.array(input_pil.convert('RGB'))
        orig_h, orig_w = img_np.shape[:2]
        
        # 2. 縮放與格式轉換
        # 修正:很多 ONNX 模型內部其實是吃 BGR 順序,我們這裡做一次轉換
        input_256 = cv2.resize(img_np, (256, 256))
        input_256 = cv2.cvtColor(input_256, cv2.COLOR_RGB2BGR) 
        
        # 3. 歸一化:使用標準 AI 數值 (讓顏色填得進去的關鍵)
        input_256 = input_256.astype(np.float32) / 255.0
        
        # 4. 調整維度符合 AI 要求 (Batch, Channel, Height, Width)
        input_tensor = np.transpose(input_256, (2, 0, 1)) # HWC -> CHW
        input_tensor = np.expand_dims(input_tensor, axis=0) # 增加 Batch

        # 5. 運行 AI 上色
        input_name = session.get_inputs()[0].name
        output = session.run(None, {input_name: input_tensor})
        
        # 6. 後處理:將輸出的數據轉回圖片
        output_np = np.squeeze(output)
        output_np = np.transpose(output_np, (1, 2, 0)) # CHW -> HWC
        
        # 修正顏色順序:將 BGR 轉回 RGB 供螢幕顯示
        output_np = cv2.cvtColor(output_np, cv2.COLOR_BGR2RGB)
        
        # 確保數值在 0-255 之間
        output_np = np.clip(output_np, 0, 1)
        output_np = (output_np * 255).astype(np.uint8)
        
        # 7. 縮放回原始大小並輸出
        result_img = cv2.resize(output_np, (orig_w, orig_h))
        return Image.fromarray(result_img)

    except Exception as e:
        print(f"運行錯誤: {str(e)}")
        return f"發生錯誤: {str(e)}"

# --- Gradio 介面部分 (這部分保持不變,確保你能正常操作) ---
with gr.Blocks(title="AI DDColor 上色工具") as demo:
    gr.Markdown("# 🎨 DDColor 自動上色工具 (修正顏色版)")
    gr.Markdown("這是一個專門修復『變藍色』與『填不到色』問題的版本。")
    
    with gr.Row():
        with gr.Column():
            input_i = gr.Image(type="pil", label="上傳黑白圖片")
            btn = gr.Button("開始生成彩色", variant="primary")
        with gr.Column():
            output_i = gr.Image(type="pil", label="AI 上色結果")

    btn.click(colorize_ddcolor, inputs=input_i, outputs=output_i)

if __name__ == "__main__":
    # 使用 7860 端口運行
    demo.launch(server_name="0.0.0.0", server_port=int(os.environ.get("PORT", 7860)))