Spaces:
Runtime error
Runtime error
import os | |
import json | |
from datetime import datetime | |
# Create a requirements.txt file for Hugging Face Spaces deployment | |
requirements = [ | |
"torch>=1.10.0", | |
"torchvision>=0.11.0", | |
"transformers>=4.18.0", | |
"gradio>=3.0.0", | |
"fastapi>=0.75.0", | |
"uvicorn>=0.17.0", | |
"pandas>=1.3.0", | |
"numpy>=1.20.0", | |
"Pillow>=9.0.0", | |
"faiss-cpu>=1.7.0", | |
"opencv-python-headless>=4.5.0", | |
"matplotlib>=3.5.0", | |
"tqdm>=4.62.0", | |
"python-multipart>=0.0.5" | |
] | |
# Write requirements to file | |
with open("requirements.txt", "w") as f: | |
for req in requirements: | |
f.write(f"{req}\n") | |
print("Created requirements.txt file for Hugging Face Spaces deployment") | |
# Create a README.md file for the Hugging Face Space | |
readme = """# MediQuery - AI Multimodal Medical Assistant | |
MediQuery is an AI-powered medical assistant that analyzes chest X-rays and answers medical queries using advanced deep learning models. | |
## Features | |
- **X-ray Analysis**: Upload a chest X-ray image for AI-powered analysis | |
- **Medical Query**: Ask questions about medical conditions, findings, and interpretations | |
- **Visual Explanations**: View attention maps highlighting important areas in X-rays | |
- **Comprehensive Reports**: Get detailed findings and impressions in structured format | |
## How to Use | |
### Image Analysis | |
1. Upload a chest X-ray image | |
2. Click "Analyze X-ray" | |
3. View the analysis results and attention map | |
### Text Query | |
1. Enter your medical question | |
2. Click "Submit Query" | |
3. Read the AI-generated response | |
## API Documentation | |
This Space also provides a REST API for integration with other applications: | |
- `POST /api/query`: Process a text query | |
- `POST /api/analyze-image`: Analyze an X-ray image | |
- `GET /api/health`: Check API health | |
## About | |
MediQuery combines state-of-the-art image models (DenseNet/CheXNet) with medical language models (BioBERT) and a fine-tuned FLAN-T5 generator to provide accurate and informative medical assistance. | |
Created by Tanishk Soni | |
""" | |
# Write README to file | |
with open("README.md", "w") as f: | |
f.write(readme) | |
print("Created README.md file for Hugging Face Spaces") | |
# Create a .gitignore file | |
gitignore = """# Python | |
__pycache__/ | |
*.py[cod] | |
*$py.class | |
*.so | |
.Python | |
env/ | |
build/ | |
develop-eggs/ | |
dist/ | |
downloads/ | |
eggs/ | |
.eggs/ | |
lib/ | |
lib64/ | |
parts/ | |
sdist/ | |
var/ | |
*.egg-info/ | |
.installed.cfg | |
*.egg | |
# Logs | |
logs/ | |
*.log | |
# Temporary files | |
/tmp/ | |
.DS_Store | |
# Virtual Environment | |
venv/ | |
ENV/ | |
# IDE | |
.idea/ | |
.vscode/ | |
*.swp | |
*.swo | |
# Model files (add these manually) | |
*.pt | |
*.pth | |
*.bin | |
*.faiss | |
""" | |
# Write .gitignore to file | |
with open(".gitignore", "w") as f: | |
f.write(gitignore) | |
print("Created .gitignore file") | |
# Create a simple script to download model weights | |
download_script = """import os | |
import torch | |
from torchvision import models | |
from transformers import AutoTokenizer, AutoModel, T5ForConditionalGeneration, T5Tokenizer | |
import faiss | |
import numpy as np | |
import pandas as pd | |
# Create directories | |
os.makedirs("models/flan-t5-finetuned", exist_ok=True) | |
os.makedirs("knowledge_base", exist_ok=True) | |
print("Downloading model weights...") | |
# Download image model (DenseNet121) | |
image_model = models.densenet121(pretrained=True) | |
torch.save(image_model.state_dict(), "models/densenet121.pt") | |
print("Downloaded DenseNet121 weights") | |
# Download text model (BioBERT) | |
tokenizer = AutoTokenizer.from_pretrained("dmis-lab/biobert-v1.1") | |
model = AutoModel.from_pretrained("dmis-lab/biobert-v1.1") | |
tokenizer.save_pretrained("models/biobert") | |
model.save_pretrained("models/biobert") | |
print("Downloaded BioBERT weights") | |
# Download generation model (FLAN-T5) | |
gen_tokenizer = T5Tokenizer.from_pretrained("google/flan-t5-base") | |
gen_model = T5ForConditionalGeneration.from_pretrained("google/flan-t5-base") | |
gen_tokenizer.save_pretrained("models/flan-t5-finetuned") | |
gen_model.save_pretrained("models/flan-t5-finetuned") | |
print("Downloaded FLAN-T5 weights") | |
# Create a minimal knowledge base | |
print("Creating minimal knowledge base...") | |
text_data = pd.DataFrame({ | |
'combined_text': [ | |
"The chest X-ray shows clear lung fields with no evidence of consolidation, effusion, or pneumothorax. The heart size is normal. No acute cardiopulmonary abnormality.", | |
"Bilateral patchy airspace opacities consistent with multifocal pneumonia. No pleural effusion or pneumothorax. Heart size is normal.", | |
"Cardiomegaly with pulmonary vascular congestion and bilateral pleural effusions, consistent with congestive heart failure. No pneumothorax or pneumonia.", | |
"Right upper lobe opacity concerning for pneumonia. No pleural effusion or pneumothorax. Heart size is normal.", | |
"Left lower lobe atelectasis. No pneumothorax or pleural effusion. Heart size is normal.", | |
"Bilateral pleural effusions with bibasilar atelectasis. Cardiomegaly present. Findings consistent with heart failure.", | |
"Right pneumothorax with partial lung collapse. No pleural effusion. Heart size is normal.", | |
"Endotracheal tube, central venous catheter, and nasogastric tube in place. No pneumothorax or pleural effusion.", | |
"Hyperinflated lungs with flattened diaphragms, consistent with COPD. No acute infiltrate or effusion.", | |
"Multiple rib fractures on the right side. No pneumothorax or hemothorax. Lung fields are clear." | |
], | |
'valid_index': list(range(10)) | |
}) | |
text_data.to_csv("knowledge_base/text_data.csv", index=False) | |
# Create dummy FAISS indices | |
text_dim = 768 | |
text_embeddings = np.random.rand(len(text_data), text_dim).astype('float32') | |
image_dim = 1024 | |
image_embeddings = np.random.rand(len(text_data), image_dim).astype('float32') | |
# Create FAISS indices | |
text_index = faiss.IndexFlatL2(text_dim) | |
text_index.add(text_embeddings) | |
faiss.write_index(text_index, "knowledge_base/text_index.faiss") | |
image_index = faiss.IndexFlatL2(image_dim) | |
image_index.add(image_embeddings) | |
faiss.write_index(image_index, "knowledge_base/image_index.faiss") | |
print("Created minimal knowledge base") | |
print("Setup complete!") | |
""" | |
# Write download script to file | |
with open("download_models.py", "w") as f: | |
f.write(download_script) | |
print("Created download_models.py script") | |
# Create a Hugging Face Space configuration file | |
space_config = { | |
"title": "MediQuery - AI Medical Assistant", | |
"emoji": "π©Ί", | |
"colorFrom": "blue", | |
"colorTo": "indigo", | |
"sdk": "gradio", | |
"sdk_version": "3.36.1", | |
"python_version": "3.10", | |
"app_file": "app.py", | |
"pinned": False | |
} | |
# Write space config to file | |
with open("README.md", "a") as f: | |
f.write("\n\n---\ntags: [healthcare, medical, xray, radiology, multimodal]\n") | |
print("Updated README.md with tags for Hugging Face Spaces") | |
print("All deployment files created successfully!") | |