AntiGravity Bot commited on
Commit
c29bac1
·
1 Parent(s): 7b122ec

Update: Medical Image Segmentation (2026-01-27 15:29)

Browse files
app.py CHANGED
@@ -36,7 +36,8 @@ class Configs:
36
  IMAGE_SIZE: Tuple[int, int] = (288, 288) # W, H
37
  MEAN: Tuple[float, ...] = (0.485, 0.456, 0.406)
38
  STD: Tuple[float, ...] = (0.229, 0.224, 0.225)
39
- MODEL_PATH: str = os.path.join(os.getcwd(), "segformer_trained_weights")
 
40
 
41
 
42
  def get_model(*, model_path, num_classes):
 
36
  IMAGE_SIZE: Tuple[int, int] = (288, 288) # W, H
37
  MEAN: Tuple[float, ...] = (0.485, 0.456, 0.406)
38
  STD: Tuple[float, ...] = (0.229, 0.224, 0.225)
39
+ # Sử dụng model mới huấn luyện, fallback sang model cũ nếu không tìm thấy
40
+ MODEL_PATH: str = os.path.join(os.getcwd(), "models", "best_model") if os.path.exists(os.path.join(os.getcwd(), "models", "best_model")) else os.path.join(os.getcwd(), "segformer_trained_weights")
41
 
42
 
43
  def get_model(*, model_path, num_classes):
download_dataset.py CHANGED
@@ -22,25 +22,42 @@ def setup_kaggle_api():
22
  return False
23
 
24
  def check_kaggle_credentials():
25
- """Kiểm tra Kaggle credentials"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  kaggle_dir = Path.home() / ".kaggle"
27
  kaggle_json = kaggle_dir / "kaggle.json"
28
 
29
  if not kaggle_json.exists():
30
  print("\n⚠️ Kaggle credentials không được tìm thấy!")
31
- print("Hướng dẫn:")
32
- print("1. Truy cập: https://www.kaggle.com/account")
33
- print("2. Scroll xuống, click 'Create New API Token'")
34
- print("3. File kaggle.json sẽ tải xuống")
35
- print(f"4. Di chuyển file vào: {kaggle_dir}")
36
- print("5. Chạy: chmod 600 ~/.kaggle/kaggle.json (trên Linux/Mac)")
 
 
37
  return False
38
 
39
  # Đặt permissions (Linux/Mac)
40
  if not os.name == 'nt': # Không phải Windows
41
  os.chmod(str(kaggle_json), 0o600)
42
 
43
- print("✓ Kaggle credentials được tìm thấy")
44
  return True
45
 
46
  def download_dataset(competition_name="uw-madison-gi-tract-image-segmentation",
 
22
  return False
23
 
24
  def check_kaggle_credentials():
25
+ """Kiểm tra Kaggle credentials - hỗ trợ cả file JSON và environment variable"""
26
+
27
+ # Kiểm tra KAGGLE_API_TOKEN environment variable (phương thức mới)
28
+ kaggle_token = os.environ.get("KAGGLE_API_TOKEN")
29
+ if kaggle_token:
30
+ print("✓ Kaggle API Token được tìm thấy từ environment variable")
31
+ return True
32
+
33
+ # Kiểm tra KAGGLE_USERNAME và KAGGLE_KEY (phương thức cũ với env vars)
34
+ kaggle_username = os.environ.get("KAGGLE_USERNAME")
35
+ kaggle_key = os.environ.get("KAGGLE_KEY")
36
+ if kaggle_username and kaggle_key:
37
+ print("✓ Kaggle credentials được tìm thấy từ environment variables")
38
+ return True
39
+
40
+ # Kiểm tra file kaggle.json
41
  kaggle_dir = Path.home() / ".kaggle"
42
  kaggle_json = kaggle_dir / "kaggle.json"
43
 
44
  if not kaggle_json.exists():
45
  print("\n⚠️ Kaggle credentials không được tìm thấy!")
46
+ print("\nCách 1: Sử dụng Environment Variable (khuyến nghị)")
47
+ print(" PowerShell: $env:KAGGLE_API_TOKEN = 'your_token'")
48
+ print(" Hoặc tạo token tại: https://www.kaggle.com/settings")
49
+ print("\nCách 2: Sử dụng file kaggle.json")
50
+ print(" 1. Truy cập: https://www.kaggle.com/account")
51
+ print(" 2. Scroll xuống, click 'Create New API Token'")
52
+ print(" 3. File kaggle.json sẽ tải xuống")
53
+ print(f" 4. Di chuyển file vào: {kaggle_dir}")
54
  return False
55
 
56
  # Đặt permissions (Linux/Mac)
57
  if not os.name == 'nt': # Không phải Windows
58
  os.chmod(str(kaggle_json), 0o600)
59
 
60
+ print("✓ Kaggle credentials được tìm thấy từ kaggle.json")
61
  return True
62
 
63
  def download_dataset(competition_name="uw-madison-gi-tract-image-segmentation",
segformer_trained_weights/config.json CHANGED
@@ -1,16 +1,15 @@
1
  {
2
- "_name_or_path": "nvidia/segformer-b4-finetuned-ade-512-512",
3
  "architectures": [
4
  "SegformerForSemanticSegmentation"
5
  ],
6
  "attention_probs_dropout_prob": 0.0,
7
  "classifier_dropout_prob": 0.1,
8
- "decoder_hidden_size": 768,
9
  "depths": [
10
- 3,
11
- 8,
12
- 27,
13
- 3
14
  ],
15
  "downsampling_rates": [
16
  1,
@@ -19,27 +18,28 @@
19
  16
20
  ],
21
  "drop_path_rate": 0.1,
 
22
  "hidden_act": "gelu",
23
  "hidden_dropout_prob": 0.0,
24
  "hidden_sizes": [
 
25
  64,
26
- 128,
27
- 320,
28
- 512
29
  ],
30
  "id2label": {
31
- "0": "LABEL_0",
32
- "1": "LABEL_1",
33
- "2": "LABEL_2",
34
- "3": "LABEL_3"
35
  },
36
  "image_size": 224,
37
  "initializer_range": 0.02,
38
  "label2id": {
39
- "LABEL_0": 0,
40
- "LABEL_1": 1,
41
- "LABEL_2": 2,
42
- "LABEL_3": 3
43
  },
44
  "layer_norm_eps": 1e-06,
45
  "mlp_ratios": [
@@ -77,6 +77,5 @@
77
  2,
78
  2
79
  ],
80
- "torch_dtype": "float32",
81
- "transformers_version": "4.30.2"
82
  }
 
1
  {
 
2
  "architectures": [
3
  "SegformerForSemanticSegmentation"
4
  ],
5
  "attention_probs_dropout_prob": 0.0,
6
  "classifier_dropout_prob": 0.1,
7
+ "decoder_hidden_size": 256,
8
  "depths": [
9
+ 2,
10
+ 2,
11
+ 2,
12
+ 2
13
  ],
14
  "downsampling_rates": [
15
  1,
 
18
  16
19
  ],
20
  "drop_path_rate": 0.1,
21
+ "dtype": "float32",
22
  "hidden_act": "gelu",
23
  "hidden_dropout_prob": 0.0,
24
  "hidden_sizes": [
25
+ 32,
26
  64,
27
+ 160,
28
+ 256
 
29
  ],
30
  "id2label": {
31
+ "0": "background",
32
+ "1": "large_bowel",
33
+ "2": "small_bowel",
34
+ "3": "stomach"
35
  },
36
  "image_size": 224,
37
  "initializer_range": 0.02,
38
  "label2id": {
39
+ "background": 0,
40
+ "large_bowel": 1,
41
+ "small_bowel": 2,
42
+ "stomach": 3
43
  },
44
  "layer_norm_eps": 1e-06,
45
  "mlp_ratios": [
 
77
  2,
78
  2
79
  ],
80
+ "transformers_version": "4.57.6"
 
81
  }
segformer_trained_weights/model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1f7160c06dd44ce9b8684ccf2b758dd06d3a708100a6d7cf9a8b67d49996019b
3
+ size 14886832
train.py CHANGED
@@ -116,10 +116,11 @@ class MedicalImageSegmentationTrainer:
116
  print("\n🧠 Loading SegFormer model...")
117
 
118
  model = SegformerForSemanticSegmentation.from_pretrained(
119
- "nvidia/segformer-b0-finetuned-cityscapes-1024-1024",
120
  num_labels=4, # background + 3 organs
121
  id2label={0: "background", 1: "large_bowel", 2: "small_bowel", 3: "stomach"},
122
- label2id={"background": 0, "large_bowel": 1, "small_bowel": 2, "stomach": 3}
 
123
  )
124
 
125
  model.to(self.device)
@@ -148,7 +149,7 @@ class MedicalImageSegmentationTrainer:
148
  optimizer.step()
149
 
150
  total_loss += loss.item()
151
- pbar.set_postfix({'loss': loss.item():.4f})
152
 
153
  return total_loss / len(train_loader)
154
 
 
116
  print("\n🧠 Loading SegFormer model...")
117
 
118
  model = SegformerForSemanticSegmentation.from_pretrained(
119
+ "nvidia/mit-b0",
120
  num_labels=4, # background + 3 organs
121
  id2label={0: "background", 1: "large_bowel", 2: "small_bowel", 3: "stomach"},
122
+ label2id={"background": 0, "large_bowel": 1, "small_bowel": 2, "stomach": 3},
123
+ ignore_mismatched_sizes=True
124
  )
125
 
126
  model.to(self.device)
 
149
  optimizer.step()
150
 
151
  total_loss += loss.item()
152
+ pbar.set_postfix({'loss': f'{loss.item():.4f}'})
153
 
154
  return total_loss / len(train_loader)
155