eoeooe commited on
Commit
bb3a620
·
verified ·
1 Parent(s): 2a1ed0e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -18
app.py CHANGED
@@ -5,70 +5,96 @@ from torchvision import models
5
  from PIL import Image
6
  import gradio as gr
7
  import numpy as np
 
8
  from sklearn.metrics.pairwise import cosine_similarity
9
 
10
- # โหลดโมเดล pretrained ResNet50 (ตัด fully connected layer ออก)
11
  resnet = models.resnet50(pretrained=True)
12
  resnet.eval()
13
  feature_extractor = torch.nn.Sequential(*list(resnet.children())[:-1])
14
 
15
- # กำหนด transform รูปภาพให้ตรงกับ input โมเดล
16
  transform = transforms.Compose([
17
- transforms.Resize((224,224)),
18
  transforms.ToTensor(),
19
- transforms.Normalize(mean=[0.485, 0.456, 0.406],
20
- std=[0.229, 0.224, 0.225]),
 
 
21
  ])
22
 
23
- # กำหนดชื่อไฟล์โลโก้ธนาคารในโฟลเดอร์เดียวกับ app.py
24
  bank_logo_files = [
25
  "scb.jpg",
26
  "kbank.jpg",
27
  "bbl.jpeg",
28
- # เพิ่มชื่อไฟล์โลโก้ธนาคารของคุณที่นี่
29
  ]
30
 
31
- # โหลดโลโก้ธนาคารและสร้าง embedding
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  def load_bank_logo_embeddings():
33
  bank_embeddings = {}
34
  for filename in bank_logo_files:
35
  if os.path.isfile(filename):
36
  image = Image.open(filename).convert("RGB")
 
37
  img_t = transform(image).unsqueeze(0)
38
  with torch.no_grad():
39
  emb = feature_extractor(img_t).squeeze().numpy()
40
- emb = emb / np.linalg.norm(emb) # Normalize embedding
41
  bank_name = os.path.splitext(filename)[0]
42
  bank_embeddings[bank_name] = emb
43
  else:
44
- print(f"Warning: ไฟล์ {filename} ไม่พบในโฟลเดอร์")
45
  return bank_embeddings
46
 
47
  bank_embeddings = load_bank_logo_embeddings()
48
 
49
- # ฟังก์ชันทำนายธนาคารโดยเทียบ similarity
50
  def predict_bank_logo(input_img):
51
  if input_img.mode != "RGB":
52
  input_img = input_img.convert("RGB")
53
- img_t = transform(input_img).unsqueeze(0)
 
 
 
54
  with torch.no_grad():
55
  emb = feature_extractor(img_t).squeeze().numpy()
56
  emb = emb / np.linalg.norm(emb)
 
57
  sims = {}
58
  for bank, bank_emb in bank_embeddings.items():
59
  sim = cosine_similarity([emb], [bank_emb])[0][0]
60
  sims[bank] = sim
 
61
  sorted_sims = dict(sorted(sims.items(), key=lambda item: item[1], reverse=True))
62
- top3 = {k: round(v, 4) for k,v in list(sorted_sims.items())[:3]}
63
  return top3
64
 
65
- # สร้าง Gradio interface
66
  interface = gr.Interface(
67
  fn=predict_bank_logo,
68
- inputs=gr.Image(type="pil", label="Upload bank logo"),
69
- outputs=gr.Label(num_top_classes=3, label="Top 3 Matching Bank Logos"),
70
- title="Bank Logo Similarity Checker",
71
- description="Upload a bank logo image and find the most similar bank logos from the database."
72
  )
73
 
74
  if __name__ == "__main__":
 
5
  from PIL import Image
6
  import gradio as gr
7
  import numpy as np
8
+ import cv2
9
  from sklearn.metrics.pairwise import cosine_similarity
10
 
11
+ # โหลด ResNet50 และตัด FC Layer ออก
12
  resnet = models.resnet50(pretrained=True)
13
  resnet.eval()
14
  feature_extractor = torch.nn.Sequential(*list(resnet.children())[:-1])
15
 
16
+ # Transform ให้เข้ากับ input โมเดล
17
  transform = transforms.Compose([
18
+ transforms.Resize((224, 224)),
19
  transforms.ToTensor(),
20
+ transforms.Normalize(
21
+ mean=[0.485, 0.456, 0.406],
22
+ std=[0.229, 0.224, 0.225]
23
+ ),
24
  ])
25
 
26
+ # รายชื่อไฟล์โลโก้ที่ใช้เป็นฐานข้อมูล
27
  bank_logo_files = [
28
  "scb.jpg",
29
  "kbank.jpg",
30
  "bbl.jpeg",
31
+ # เพิ่มรูปอื่นๆ ได้
32
  ]
33
 
34
+ # ===== 📌 ฟังก์ชันช่วย: ตัดโลโก้จากภาพด้วย OpenCV =====
35
+ def crop_logo(image_pil):
36
+ image_np = np.array(image_pil)
37
+ gray = cv2.cvtColor(image_np, cv2.COLOR_RGB2GRAY)
38
+ blurred = cv2.GaussianBlur(gray, (5, 5), 0)
39
+ _, thresh = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
40
+
41
+ # หา contour ที่ใหญ่สุด (คิดว่าเป็นโลโก้)
42
+ contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
43
+ if contours:
44
+ largest = max(contours, key=cv2.contourArea)
45
+ x, y, w, h = cv2.boundingRect(largest)
46
+ cropped = image_np[y:y+h, x:x+w]
47
+ return Image.fromarray(cropped)
48
+ else:
49
+ return image_pil # ถ้าไม่เจอ contour ก็ส่งภาพเดิมกลับ
50
+
51
+ # ===== 📌 โหลดฐานข้อมูลโลโก้และสร้าง embedding =====
52
  def load_bank_logo_embeddings():
53
  bank_embeddings = {}
54
  for filename in bank_logo_files:
55
  if os.path.isfile(filename):
56
  image = Image.open(filename).convert("RGB")
57
+ image = crop_logo(image)
58
  img_t = transform(image).unsqueeze(0)
59
  with torch.no_grad():
60
  emb = feature_extractor(img_t).squeeze().numpy()
61
+ emb = emb / np.linalg.norm(emb)
62
  bank_name = os.path.splitext(filename)[0]
63
  bank_embeddings[bank_name] = emb
64
  else:
65
+ print(f"⚠️ ไม่พบไฟล์: {filename}")
66
  return bank_embeddings
67
 
68
  bank_embeddings = load_bank_logo_embeddings()
69
 
70
+ # ===== 📌 ฟังก์ชันเทียบภาพที่อัปโหลดกับฐานข้อมูล =====
71
  def predict_bank_logo(input_img):
72
  if input_img.mode != "RGB":
73
  input_img = input_img.convert("RGB")
74
+
75
+ cropped_img = crop_logo(input_img)
76
+ img_t = transform(cropped_img).unsqueeze(0)
77
+
78
  with torch.no_grad():
79
  emb = feature_extractor(img_t).squeeze().numpy()
80
  emb = emb / np.linalg.norm(emb)
81
+
82
  sims = {}
83
  for bank, bank_emb in bank_embeddings.items():
84
  sim = cosine_similarity([emb], [bank_emb])[0][0]
85
  sims[bank] = sim
86
+
87
  sorted_sims = dict(sorted(sims.items(), key=lambda item: item[1], reverse=True))
88
+ top3 = {k: round(v, 4) for k, v in list(sorted_sims.items())[:3]}
89
  return top3
90
 
91
+ # ===== 📌 Gradio UI =====
92
  interface = gr.Interface(
93
  fn=predict_bank_logo,
94
+ inputs=gr.Image(type="pil", label="📤 Upload Bank Logo Image"),
95
+ outputs=gr.Label(num_top_classes=3, label="🏦 Top 3 Matching Bank Logos"),
96
+ title="🔍 Bank Logo Similarity Checker",
97
+ description="ระบบเปรียบเที��บโลโก้ธนาคารจากภาพที่อัปโหลด โดยใช้โมเดล ResNet50 + Cosine Similarity พร้อมการตัดโลโก้อัตโนมัติ"
98
  )
99
 
100
  if __name__ == "__main__":