Spaces:
Sleeping
Sleeping
AntiGravity Bot
commited on
Commit
·
c29bac1
1
Parent(s):
7b122ec
Update: Medical Image Segmentation (2026-01-27 15:29)
Browse files- app.py +2 -1
- download_dataset.py +25 -8
- segformer_trained_weights/config.json +18 -19
- segformer_trained_weights/model.safetensors +3 -0
- train.py +4 -3
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 |
-
|
|
|
|
| 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("
|
| 32 |
-
print("
|
| 33 |
-
print("
|
| 34 |
-
print("
|
| 35 |
-
print(
|
| 36 |
-
print("
|
|
|
|
|
|
|
| 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":
|
| 9 |
"depths": [
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 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 |
-
|
| 27 |
-
|
| 28 |
-
512
|
| 29 |
],
|
| 30 |
"id2label": {
|
| 31 |
-
"0": "
|
| 32 |
-
"1": "
|
| 33 |
-
"2": "
|
| 34 |
-
"3": "
|
| 35 |
},
|
| 36 |
"image_size": 224,
|
| 37 |
"initializer_range": 0.02,
|
| 38 |
"label2id": {
|
| 39 |
-
"
|
| 40 |
-
"
|
| 41 |
-
"
|
| 42 |
-
"
|
| 43 |
},
|
| 44 |
"layer_norm_eps": 1e-06,
|
| 45 |
"mlp_ratios": [
|
|
@@ -77,6 +77,5 @@
|
|
| 77 |
2,
|
| 78 |
2
|
| 79 |
],
|
| 80 |
-
"
|
| 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/
|
| 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 |
|