File size: 8,184 Bytes
425bbbe 7665df1 7aa3345 425bbbe e09eeb5 7aa3345 425bbbe 7aa3345 425bbbe 7aa3345 425bbbe fd37479 425bbbe 7aa3345 0b9f901 77394a6 7aa3345 425bbbe e09eeb5 947c62b e09eeb5 7665df1 e09eeb5 d323fcc 425bbbe fd37479 425bbbe fd37479 425bbbe e09eeb5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
from gradio_client import Client, handle_file
from huggingface_hub import snapshot_download, login, whoami
import argparse
import os
import subprocess as sp
import time
from datetime import datetime, timezone
import shutil # Add this import
import json
from huggingface_hub import HfApi, grant_access
import re
HF_GATE_ACESSLIST = ["SushantGautam",
"stevenah", "vlbthambawita"]
MEDVQA_SUBMIT = True if os.environ.get(
'_MEDVQA_SUBMIT_FLAG_', 'FALSE') == 'TRUE' else False
parser = argparse.ArgumentParser(
description='Run GI-1015 Task 2 (Image Generation)')
parser.add_argument('--repo_id', type=str, required=True,
help='Path to the HF submission repository')
args, _ = parser.parse_known_args()
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
submission_file = "submission_task2.py"
file_from_validation = "predictions_2.json"
min_library = ["datasets>=3.4.1", "transformers", "evaluate", "scipy", "scikit-learn", "diffusers", "peft",
"rouge_score", 'tqdm', "gradio_client>=1.8.0"]
print("π ImageCLEFmed-MEDVQA-GI-2025 π",
"https://github.com/simula/ImageCLEFmed-MEDVQA-GI-2025")
print("π Subtask 2: Creation of High-Fidelity Synthetic GI Images")
print(f"π Analyzing submission repository: {args.repo_id} π")
try:
print(f"Logged in to HuggingFace as: {whoami()['name']}")
except Exception:
print("β οΈβ οΈ Not logged in to HuggingFace! Please get your login token from https://huggingface.co/settings/tokens π")
login()
client = Client("SimulaMet/medvqa")
print("π Communicating with the Submission Server: Ping!")
result = client.predict(
api_name="/refresh_page"
)
print(result)
hf_username = whoami()['name']
assert len(hf_username) > 0, "π« HuggingFace login failed for some reason"
current_timestamp = int(time.time())
snap_dir = snapshot_download(
repo_id=args.repo_id, allow_patterns=[submission_file, "requirements.txt"])
if not os.path.isfile(os.path.join(snap_dir, submission_file)):
raise FileNotFoundError(
f"Submission file '{submission_file}' not found in the repository!")
if os.path.isfile(os.path.join(snap_dir, file_from_validation)):
os.remove(os.path.join(snap_dir, file_from_validation))
print("π¦ Making sure of the minimum requirements to run the script π¦")
sp.run(["python", "-m", "pip", "install", "-q"] + min_library, check=True)
if os.path.isfile(os.path.join(snap_dir, "requirements.txt")):
print(
f"π¦ Installing requirements from the submission repo: {args.repo_id}/requirements.txt")
sp.run(["python", "-m", "pip", "install", "-q", "-r",
f"{snap_dir}/requirements.txt"], cwd=snap_dir, check=True)
if os.environ.get("_MEDVQA_CHALLENGE_EVALUATE_FLAG_", "FALSE") == "TRUE":
# Patch submission file for challenge evaluation
challenge_file = submission_file.replace(".py", "_challenge.py")
submission_path = os.path.join(snap_dir, submission_file)
challenge_path = os.path.join(snap_dir, challenge_file)
with open(submission_path, "r", encoding="utf-8") as f:
code = f.read()
# Replace only the dataset string
if "SimulaMet/Kvasir-VQA-test" in code:
code = code.replace("SimulaMet/Kvasir-VQA-test",
"SimulaMet/Kvasir-VQA-private")
code = code.replace('"validation"', '"test"')
# Comment out specific lines
lines = code.splitlines()
for i, line in enumerate(lines):
if ("huggingface.co/datasets" in line or
re.search(r'^\s*prompt_to_real\s*=', line) or
re.search(r'^\s*jsons__\s*=', line)):
if not line.lstrip().startswith("#"):
leading_ws = len(line) - len(line.lstrip())
lines[i] = line[:leading_ws] + "# " + line[leading_ws:]
# Insert new code block after 'import requests'
for i, line in enumerate(lines):
if "import requests" in line:
insert_idx = i + 1
break
else:
insert_idx = None
new_block = [
'from huggingface_hub import hf_hub_download',
'prompt_to_real = json.load(open(hf_hub_download("SimulaMet/Kvasir-VQA-private", "real_mapping", repo_type="dataset")))',
'jsons__ = json.load(open(hf_hub_download("SimulaMet/Kvasir-VQA-private", "imagen-test", repo_type="dataset")))',
]
if insert_idx is not None:
lines[insert_idx:insert_idx] = new_block
code = "\n".join(lines)
with open(challenge_path, "w", encoding="utf-8") as f:
f.write(code)
submission_file = challenge_file
print(f"π Challenge file created at: {challenge_path}")
else:
print(
"β οΈ Challenge patch not applied: expected string not found in submission file.")
os.exit(
"Please check the submission file for compatibility with challenge evaluation.")
print("π Starting your script and loading submission details...")
sp.run(["python", f"{snap_dir}/{submission_file}"],
cwd=snap_dir, check=True)
print(
f"π The submission script ran successfully, the intermediate files are at {snap_dir}")
if not MEDVQA_SUBMIT:
print("\n You can now run medvqa validate_and_submit .... command to submit the task.")
else:
print("π Preparing for submission π")
file_path_to_upload = os.path.join(
snap_dir, f"{hf_username}-_-_-{current_timestamp}-_-_-task2.json")
shutil.copy(os.path.join(snap_dir, file_from_validation),
file_path_to_upload) # Use shutil.copy here
# add repo_id to the submission file
with open(file_path_to_upload, 'r', encoding='utf-8') as f:
data = json.load(f)
data['repo_id'] = args.repo_id
with open(file_path_to_upload, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False)
api = HfApi()
api.update_repo_visibility(args.repo_id, private=False) # Make public
api.update_repo_settings(
args.repo_id, gated='manual') # Enable gated access
for user in HF_GATE_ACESSLIST:
try:
grant_access(args.repo_id, user) # Grant access
except Exception as e:
print(user, ":", e)
print(
f'''β
{args.repo_id} model is now made public, but gated, and is shared with organizers.
You should not make the model private or remove/update it until the competition results are announced.
Feel feel to re-submit the task if you change the model on the repository.
We will notify you if there are any issues with the submission.
''')
result = client.predict(
file=handle_file(file_path_to_upload),
api_name="/add_submission"
)
print({"User": hf_username, "Task": "task2",
"Submitted_time": str(datetime.fromtimestamp(int(current_timestamp), tz=timezone.utc)) + " UTC"
})
print(result)
print("Visit this URL to see the entry: π")
Client("SimulaMet/medvqa")
if os.environ.get("_MEDVQA_CHALLENGE_EVALUATE_FLAG_", "FALSE") == "TRUE":
src_json = os.path.join(snap_dir, "predictions_2.json")
if os.path.isfile(src_json):
with open(src_json, "r", encoding="utf-8") as f:
data = json.load(f)
# Remove 'debug' key if present
data.pop("debug", None)
# Rename 'public_scores' to 'challenge_scores' if present
if "public_scores" in data:
data["challenge_scores"] = data.pop("public_scores")
# Get Team_Name from submission_info
team_name = data.get("submission_info", {}).get(
"Team_Name", "unknown_team")
team_name_safe = re.sub(r'[^a-zA-Z0-9_\-]', '_', team_name)
out_json = os.path.join(os.getcwd(), f"task2_{team_name_safe}.json")
with open(out_json, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"β
Copied and processed predictions to: {out_json}")
else:
print("β predictions_1.json not found in snapshot directory!")
# === End: Post-processing predictions_1.json ===
|