Uyên Vương commited on
Commit
a5a74d1
·
1 Parent(s): a0ffc51
Files changed (1) hide show
  1. app.py +93 -0
app.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import base64
3
+ import numpy as np
4
+ from PIL import Image
5
+ from io import BytesIO
6
+ import gradio as gr
7
+
8
+ # Định nghĩa API và token cho việc gọi upscale
9
+ OCTOAI_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjNkMjMzOTQ5In0.eyJzdWIiOiI2N2M0ODE1Yi1lY2VkLTQzOGMtODJjNi00MmJhYzQwNDYyY2MiLCJ0eXBlIjoidXNlckFjY2Vzc1Rva2VuIiwidGVuYW50SWQiOiJjOWQ4YjZiNi1mZWRlLTQzYmEtYmI3OS00Y2EwNWEwMDRmZTAiLCJ1c2VySWQiOiI2NDIxOTBlZi1hZTMxLTRjYTctYjUzZS0yZmIzNDhjZmQ5MjUiLCJhcHBsaWNhdGlvbklkIjoiYTkyNmZlYmQtMjFlYS00ODdiLTg1ZjUtMzQ5NDA5N2VjODMzIiwicm9sZXMiOlsiRkVUQ0gtUk9MRVMtQlktQVBJIl0sInBlcm1pc3Npb25zIjpbIkZFVENILVBFUk1JU1NJT05TLUJZLUFQSSJdLCJhdWQiOiIzZDIzMzk0OS1hMmZiLTRhYjAtYjdlYy00NmY2MjU1YzUxMGUiLCJpc3MiOiJodHRwczovL2lkZW50aXR5Lm9jdG8uYWkiLCJpYXQiOjE3MjYzNjkyODd9.ZHL9Vd31oeaBC0aDr9N0WzcuxTn96mLbX2SxDYzcf5tZjWfX2oc3OFSrIh1nxN_CWgTlP4ISMsGXp5ees3hqW48G2KsB5HlyywpVdL2J6ChqSRqWDmPV4aVo4sz9It_sc7FvtFRd1VKA7kGffXwiRN3yuIGsxegmxHzNWZWebOA1ArrcfmraojZ_QK5qDu-bF4HeqtpJ7c2Lkyh4rY2S5UKsIjxdRKrmb0QaSjjv5NDzd7zIaq0x1SIaxj2GcHIEhZ3Ex5hAMi3gfKkn5gRJewtNd1kZLBK2OPm-6dEP6BFfNKJ4jSoMvL7bR8C16KExe1MiQlLbFutPsjKoGRDvJw"
10
+ url = "https://image.octoai.run/upscaling"
11
+ headers = {
12
+ "Content-Type": "application/json",
13
+ "Authorization": f"Bearer {OCTOAI_TOKEN}"
14
+ }
15
+
16
+ # Độ phân giải tùy chọn
17
+ resolution_options = {
18
+ "1K": 1024,
19
+ "2K": 2048,
20
+ "4K": 4096,
21
+ "8K": 8192
22
+ }
23
+
24
+ # Hàm gửi yêu cầu đến API và nhận kết quả
25
+ def upscale(image, resolution):
26
+ model = "real-esrgan-x4-v3" # Mô hình mặc định
27
+
28
+ # Kích thước ảnh hiện tại
29
+ width, height = image.size
30
+
31
+ # Độ phân giải mục tiêu
32
+ target_resolution = resolution_options[resolution]
33
+
34
+ # Kiểm tra xem ảnh gốc có lớn hơn kích thước 2048x2048 không
35
+ if width > 2048 or height > 2048:
36
+ scale_factor = 1
37
+ print(f"Image is larger than 2048x2048. Using scale factor: {scale_factor}")
38
+ # Kiểm tra nếu ảnh gốc lớn hơn độ phân giải mục tiêu mà người dùng đã chọn
39
+ elif width > target_resolution or height > target_resolution:
40
+ scale_factor = 1
41
+ print(f"Image is larger than the selected resolution ({resolution}). Using scale factor: {scale_factor}")
42
+ else:
43
+ # Tính scale factor dựa trên kích thước ảnh đầu vào và độ phân giải mục tiêu
44
+ scale_factor_width = target_resolution // width
45
+ scale_factor_height = target_resolution // height
46
+ scale_factor = min(scale_factor_width, scale_factor_height) # Sử dụng scale nhỏ nhất giữa chiều rộng và chiều cao
47
+
48
+ if scale_factor < 1:
49
+ scale_factor = 1 # Đảm bảo scale tối thiểu là 1
50
+
51
+ print(f"Calculated scale factor: {scale_factor}")
52
+
53
+ # Convert PIL image to base64
54
+ buffered = BytesIO()
55
+ image.save(buffered, format="PNG")
56
+ img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
57
+
58
+ payload = {
59
+ "model": model,
60
+ "scale": scale_factor, # Gửi scale tính toán hoặc mặc định là 1
61
+ "init_image": img_str,
62
+ "output_image_encoding": "png"
63
+ }
64
+
65
+ response = requests.post(url, json=payload, headers=headers)
66
+
67
+ if response.status_code == 200:
68
+ result = response.json()
69
+ image_b64 = result.get("image_b64", None)
70
+
71
+ if image_b64:
72
+ # Convert base64 string back to an image
73
+ image_data = base64.b64decode(image_b64)
74
+ image = Image.open(BytesIO(image_data))
75
+ return image
76
+ else:
77
+ return None
78
+
79
+ # Tạo giao diện Gradio
80
+ css = ".output-image, .input-image, .image-preview {height: 480px !important} "
81
+
82
+ gr.Interface(
83
+ fn=upscale,
84
+ inputs=[
85
+ gr.Image(type="pil", label="Input Image"), # Đầu vào ảnh từ người dùng
86
+ gr.Radio(list(resolution_options.keys()), type="value", label="Chọn độ phân giải"), # Chọn độ phân giải 1K, 2K, 4K, 8K
87
+ ],
88
+ outputs="image", # Trả về ảnh đầu ra
89
+ title="Image Upscaling 🦆",
90
+ description="Tăng độ phân giải hình ảnh dựa trên mô hình real-esrgan-x4-v3. Nếu ảnh lớn hơn 2048x2048 hoặc lớn hơn độ phân giải mục tiêu, không upscale.",
91
+ allow_flagging="never",
92
+ css=css
93
+ ).launch()