sang1231 commited on
Commit
7af4e90
·
verified ·
1 Parent(s): 8e12093

Update app.py

Browse files

"Final code cleanup to use cached models and resolve initialization error."

Files changed (1) hide show
  1. app.py +42 -47
app.py CHANGED
@@ -1,75 +1,70 @@
1
- # TÊN TỆP: app.py (Đã Sửa lỗi Cuối cùng: Cập nhật URL Mô hình)
2
 
3
  import gradio as gr
4
  import cv2
5
  import numpy as np
6
  import insightface
7
  from insightface.app import FaceAnalysis
8
- import os
9
- import urllib.request
10
- import ssl
11
-
12
- # Bỏ qua xác minh SSL cho mục đích tải xuống, thường cần thiết trong môi trường container
13
- ssl._create_default_https_context = ssl._create_unverified_context
14
-
15
- # Đường dẫn URL MỚI đã sửa lỗi 404 tới mô hình inswapper_128.onnx
16
- MODEL_URL = 'https://huggingface.co/xingren23/comfyflow-models/resolve/976de8449674de379b02c144d0b3cfa2b61482f2/insightface/inswapper_128.onnx'
17
- MODEL_NAME = 'inswapper_128.onnx'
18
- MODEL_PATH = os.path.join(os.getcwd(), MODEL_NAME)
19
-
20
- # Hàm Tải Mô hình Bằng Tay (để đảm bảo tệp tồn tại)
21
- def download_model(url, filename):
22
- if not os.path.exists(filename):
23
- print(f"Downloading {filename} from {url}...")
24
- try:
25
- urllib.request.urlretrieve(url, filename)
26
- print(f"Successfully downloaded {filename}.")
27
- except Exception as e:
28
- print(f"FATAL ERROR: Failed to download model {filename}: {e}")
29
- raise e
30
- return filename
31
-
32
- # TẢI MÔ HÌNH VÀO THƯ MỤC LÀM VIỆC
33
- local_model_path = download_model(MODEL_URL, MODEL_NAME)
34
-
35
 
36
  # KHỞI TẠO MÔ HÌNH (Chỉ chạy một lần khi ứng dụng khởi động)
37
- app = FaceAnalysis(
38
- name='buffalo_l',
39
- providers=['CPUExecutionProvider'] # Sử dụng CPU
40
- )
41
- app.prepare(ctx_id=0, det_size=(640, 640))
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- # Tải mô hình Face Swapper (InSwapper)
44
- # SỬA LỖI: Sử dụng đường dẫn cục bộ (local_model_path) thay vì get_model
45
- # và loại bỏ download=True.
46
- swapper = insightface.model_zoo.get_model(local_model_path, providers=['CPUExecutionProvider'])
47
 
48
  # HÀM HOÁN ĐỔI KHUÔN MẶT THỰC TẾ
49
  def face_swap_function(source_path, target_path):
50
- """
51
- Hàm này nhận đường dẫn ảnh nguồn và ảnh đích để thực hiện hoán đổi khuôn mặt.
52
- """
53
-
54
- # Sử dụng try-except để đảm bảo ứng dụng không sập nếu không đọc được ảnh
55
  try:
56
- # Đọc ảnh (CV2 đọc dưới dạng BGR)
57
  img_source = cv2.imread(source_path)
58
  img_target = cv2.imread(target_path)
59
  except Exception:
60
- # Trả về ảnh đen nếu lỗi
61
  return cv2.cvtColor(np.zeros((200, 200, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
62
 
63
- # Xử lý lỗi nếu không đọc được ảnh
64
  if img_source is None or img_target is None:
65
  return cv2.cvtColor(np.zeros((200, 200, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
66
 
67
- # 1. Phát hiện khuôn mặt nguồn
68
  faces_source = app.get(img_source)
69
  if not faces_source:
70
  return cv2.cvtColor(img_target, cv2.COLOR_BGR2RGB)
71
 
72
  source_face = faces_source[0]
73
 
74
- # 2. Phát hiện khuôn mặt đích
75
  faces_target = app.get(img_target)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # TÊN TỆP: app.py ( đã được dọn dẹp sử dụng cache)
2
 
3
  import gradio as gr
4
  import cv2
5
  import numpy as np
6
  import insightface
7
  from insightface.app import FaceAnalysis
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8
 
9
  # KHỞI TẠO MÔ HÌNH (Chỉ chạy một lần khi ứng dụng khởi động)
10
+ # Sử dụng hàm get_model_path để buộc InsightFace sử dụng các mô hình đã tải
11
+ # LƯU Ý: Nếu lỗi, hãy xóa file model.py đã tạo trước đó (nếu có)
12
+ try:
13
+ # Tải mô hình Face Analysis để phát hiện khuôn mặt
14
+ app = FaceAnalysis(
15
+ name='buffalo_l',
16
+ providers=['CPUExecutionProvider']
17
+ )
18
+ app.prepare(ctx_id=0, det_size=(640, 640))
19
+
20
+ # Tải mô hình Face Swapper (InSwapper)
21
+ # Vì quá trình tải xuống trước đó đã thành công, tệp phải tồn tại trong cache
22
+ swapper = insightface.model_zoo.get_model('inswapper_128.onnx', providers=['CPUExecutionProvider'])
23
+
24
+ except Exception as e:
25
+ print(f"FATAL ERROR during model initialization: {e}")
26
+ # Nếu lỗi, ứng dụng sẽ không chạy, nhưng chúng ta đã loại bỏ nguyên nhân gây lỗi bên ngoài.
27
+ raise e
28
 
 
 
 
 
29
 
30
  # HÀM HOÁN ĐỔI KHUÔN MẶT THỰC TẾ
31
  def face_swap_function(source_path, target_path):
32
+ # ... (Giữ nguyên logic hàm)
 
 
 
 
33
  try:
 
34
  img_source = cv2.imread(source_path)
35
  img_target = cv2.imread(target_path)
36
  except Exception:
 
37
  return cv2.cvtColor(np.zeros((200, 200, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
38
 
 
39
  if img_source is None or img_target is None:
40
  return cv2.cvtColor(np.zeros((200, 200, 3), dtype=np.uint8), cv2.COLOR_BGR2RGB)
41
 
 
42
  faces_source = app.get(img_source)
43
  if not faces_source:
44
  return cv2.cvtColor(img_target, cv2.COLOR_BGR2RGB)
45
 
46
  source_face = faces_source[0]
47
 
 
48
  faces_target = app.get(img_target)
49
+ if not faces_target:
50
+ return cv2.cvtColor(img_target, cv2.COLOR_BGR2RGB)
51
+
52
+ target_face = faces_target[0]
53
+
54
+ result_img = swapper.get(img_target, target_face, source_face, paste_back=True)
55
+
56
+ return cv2.cvtColor(result_img, cv2.COLOR_BGR2RGB)
57
+
58
+ # TẠO GIAO DIỆN GRADIO
59
+ demo = gr.Interface(
60
+ fn=face_swap_function,
61
+ inputs=[
62
+ gr.Image(type="filepath", label="Ảnh Nguồn (Khuôn mặt bạn muốn dùng)"),
63
+ gr.Image(type="filepath", label="Ảnh Đích (Khuôn mặt bạn muốn thay thế)")
64
+ ],
65
+ outputs=gr.Image(type="numpy", label="Kết quả Hoán đổi Khuôn mặt (Face Swap)"),
66
+ title="Ứng dụng Hoán đổi Khuôn mặt INSIGHTFACE Hoàn chỉnh"
67
+ )
68
+
69
+ # Chạy ứng dụng
70
+ demo.launch()