Commit Β·
b9a3037
1
Parent(s): 3cf931d
Deploying CIFAR 100 best model
Browse files- .gitignore +37 -0
- .python-version +1 -0
- COMPLETE_SETUP_SUMMARY.txt +296 -0
- FILES_EXPLAINED.md +268 -0
- GRADIO_DEPLOYMENT.md +327 -0
- INDEX.md +241 -0
- PROJECT_SUMMARY.md +189 -0
- QUICKSTART.md +96 -0
- README.md +154 -8
- README_GRADIO.txt +365 -0
- START_HERE.md +282 -0
- app.py +370 -0
- cifar100_model.pth +3 -0
- gitignore +37 -0
- main.py +6 -0
- model.py +130 -0
- pyproject.toml +16 -0
- requirements.txt +6 -0
- run_local.bat +36 -0
- run_local.sh +32 -0
- test_app_locally.py +173 -0
- uv.lock +0 -0
.gitignore
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Python
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.py[cod]
|
| 4 |
+
*$py.class
|
| 5 |
+
*.so
|
| 6 |
+
.Python
|
| 7 |
+
env/
|
| 8 |
+
venv/
|
| 9 |
+
.venv/
|
| 10 |
+
ENV/
|
| 11 |
+
|
| 12 |
+
# IDEs
|
| 13 |
+
.vscode/
|
| 14 |
+
.idea/
|
| 15 |
+
*.swp
|
| 16 |
+
*.swo
|
| 17 |
+
*~
|
| 18 |
+
|
| 19 |
+
# OS
|
| 20 |
+
.DS_Store
|
| 21 |
+
Thumbs.db
|
| 22 |
+
|
| 23 |
+
# Streamlit
|
| 24 |
+
.streamlit/
|
| 25 |
+
|
| 26 |
+
# Testing
|
| 27 |
+
test_images/
|
| 28 |
+
*.jpg
|
| 29 |
+
*.png
|
| 30 |
+
*.jpeg
|
| 31 |
+
!examples/*.jpg
|
| 32 |
+
!examples/*.png
|
| 33 |
+
|
| 34 |
+
# Logs
|
| 35 |
+
*.log
|
| 36 |
+
logs/
|
| 37 |
+
|
.python-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
3.11
|
COMPLETE_SETUP_SUMMARY.txt
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
================================================================================
|
| 2 |
+
CIFAR-100 CLASSIFIER - HUGGING FACE DEPLOYMENT PACKAGE
|
| 3 |
+
Complete Setup Summary
|
| 4 |
+
================================================================================
|
| 5 |
+
|
| 6 |
+
PROJECT LOCATION:
|
| 7 |
+
C:\Users\krish\Documents\Krishnakanth\Learnings\Learnings\MNIST_Model\Reference\CIFAR100HFS
|
| 8 |
+
|
| 9 |
+
STATUS: β
READY FOR DEPLOYMENT
|
| 10 |
+
|
| 11 |
+
================================================================================
|
| 12 |
+
FILES CREATED (13 files)
|
| 13 |
+
================================================================================
|
| 14 |
+
|
| 15 |
+
CORE APPLICATION FILES (Required for Hugging Face):
|
| 16 |
+
---------------------------------------------------
|
| 17 |
+
β
app.py (16 KB) - Streamlit web application
|
| 18 |
+
β
model.py (7 KB) - ResNet-34 architecture
|
| 19 |
+
β
cifar100_model.pth (93 MB) - Trained model weights
|
| 20 |
+
β
requirements.txt (102 B) - Python dependencies
|
| 21 |
+
β
README.md (4 KB) - Hugging Face Space description
|
| 22 |
+
β
.gitattributes (174 B) - Git LFS configuration
|
| 23 |
+
|
| 24 |
+
TESTING & DEVELOPMENT FILES (Optional):
|
| 25 |
+
----------------------------------------
|
| 26 |
+
β
test_app_locally.py (5 KB) - Automated testing script
|
| 27 |
+
β
run_local.bat (911 B) - Windows quick launcher
|
| 28 |
+
β
run_local.sh (903 B) - Linux/Mac quick launcher
|
| 29 |
+
β
.gitignore (302 B) - Git ignore rules
|
| 30 |
+
|
| 31 |
+
DOCUMENTATION FILES (Helpful guides):
|
| 32 |
+
-------------------------------------
|
| 33 |
+
β
START_HERE.md (4 KB) - First-time setup guide
|
| 34 |
+
β
QUICKSTART.md (2 KB) - Quick reference
|
| 35 |
+
β
DEPLOYMENT_GUIDE.md (5 KB) - Detailed deployment steps
|
| 36 |
+
β
PROJECT_SUMMARY.md (5 KB) - Complete project overview
|
| 37 |
+
β
FILES_EXPLAINED.md (4 KB) - Explanation of each file
|
| 38 |
+
|
| 39 |
+
================================================================================
|
| 40 |
+
QUICK START OPTIONS
|
| 41 |
+
================================================================================
|
| 42 |
+
|
| 43 |
+
OPTION 1: TEST LOCALLY (Recommended First)
|
| 44 |
+
-------------------------------------------
|
| 45 |
+
Windows:
|
| 46 |
+
β Double-click: run_local.bat
|
| 47 |
+
β Or run: python test_app_locally.py
|
| 48 |
+
|
| 49 |
+
Linux/Mac:
|
| 50 |
+
β Run: chmod +x run_local.sh && ./run_local.sh
|
| 51 |
+
β Or run: python test_app_locally.py
|
| 52 |
+
|
| 53 |
+
Any OS:
|
| 54 |
+
β Run: streamlit run app.py
|
| 55 |
+
β Then open: http://localhost:8501
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
OPTION 2: DEPLOY TO HUGGING FACE SPACES
|
| 59 |
+
----------------------------------------
|
| 60 |
+
1. Create Space at: https://huggingface.co/new-space
|
| 61 |
+
- SDK: Streamlit
|
| 62 |
+
- Name: cifar100-classifier (or your choice)
|
| 63 |
+
|
| 64 |
+
2. Upload files (Web UI or Git):
|
| 65 |
+
|
| 66 |
+
Web UI Method:
|
| 67 |
+
- Click "Files" β "Upload files"
|
| 68 |
+
- Upload all 6 core files
|
| 69 |
+
- Commit changes
|
| 70 |
+
|
| 71 |
+
Git CLI Method:
|
| 72 |
+
```
|
| 73 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE
|
| 74 |
+
cd YOUR_SPACE
|
| 75 |
+
(copy all files from CIFAR100HFS folder)
|
| 76 |
+
git lfs install
|
| 77 |
+
git lfs track "*.pth"
|
| 78 |
+
git add .
|
| 79 |
+
git commit -m "Deploy CIFAR-100 classifier"
|
| 80 |
+
git push
|
| 81 |
+
```
|
| 82 |
+
|
| 83 |
+
3. Wait 2-5 minutes for build
|
| 84 |
+
|
| 85 |
+
4. Access at: https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE
|
| 86 |
+
|
| 87 |
+
================================================================================
|
| 88 |
+
APP FEATURES
|
| 89 |
+
================================================================================
|
| 90 |
+
|
| 91 |
+
β
Upload images (JPG, PNG, BMP, WEBP)
|
| 92 |
+
β
Classify into 100 categories
|
| 93 |
+
β
Show confidence scores (0-100%)
|
| 94 |
+
β
Display top-K predictions (configurable 3-20)
|
| 95 |
+
β
Interactive probability charts (Plotly)
|
| 96 |
+
β
Color-coded confidence levels:
|
| 97 |
+
- Green: High confidence (>70%)
|
| 98 |
+
- Yellow: Medium confidence (40-70%)
|
| 99 |
+
- Gray: Low confidence (<40%)
|
| 100 |
+
β
Download results as TXT file
|
| 101 |
+
β
View all 100 class probabilities (optional)
|
| 102 |
+
β
Responsive design (mobile-friendly)
|
| 103 |
+
β
Professional UI with custom CSS
|
| 104 |
+
|
| 105 |
+
================================================================================
|
| 106 |
+
MODEL SPECIFICATIONS
|
| 107 |
+
================================================================================
|
| 108 |
+
|
| 109 |
+
Architecture: ResNet-34 with BasicBlock
|
| 110 |
+
Parameters: ~21 Million
|
| 111 |
+
Input Size: 32Γ32 RGB images
|
| 112 |
+
Output: 100 class probabilities
|
| 113 |
+
Classes: CIFAR-100 (animals, vehicles, objects, nature, etc.)
|
| 114 |
+
Normalization: Mean=(0.5071, 0.4867, 0.4408)
|
| 115 |
+
Std=(0.2675, 0.2565, 0.2761)
|
| 116 |
+
Dropout: 5%
|
| 117 |
+
Activation: Log Softmax
|
| 118 |
+
|
| 119 |
+
================================================================================
|
| 120 |
+
TESTING CHECKLIST
|
| 121 |
+
================================================================================
|
| 122 |
+
|
| 123 |
+
Before deploying, verify:
|
| 124 |
+
|
| 125 |
+
Local Testing:
|
| 126 |
+
β‘ Run: python test_app_locally.py
|
| 127 |
+
β‘ All tests pass (imports, model file, model loading)
|
| 128 |
+
β‘ App runs: streamlit run app.py
|
| 129 |
+
β‘ Can upload test image
|
| 130 |
+
β‘ Predictions are generated
|
| 131 |
+
β‘ Confidence scores displayed
|
| 132 |
+
β‘ Charts render correctly
|
| 133 |
+
β‘ Download button works
|
| 134 |
+
|
| 135 |
+
Pre-Deployment:
|
| 136 |
+
β‘ All 6 core files present
|
| 137 |
+
β‘ requirements.txt complete
|
| 138 |
+
β‘ README.md updated with your info
|
| 139 |
+
β‘ Model file size reasonable (<500 MB)
|
| 140 |
+
β‘ Git LFS configured (.gitattributes)
|
| 141 |
+
|
| 142 |
+
================================================================================
|
| 143 |
+
FILE UPLOAD ORDER FOR HUGGING FACE
|
| 144 |
+
================================================================================
|
| 145 |
+
|
| 146 |
+
Upload in this order (if using web UI):
|
| 147 |
+
|
| 148 |
+
1. .gitattributes (First - sets up LFS)
|
| 149 |
+
2. requirements.txt (Dependencies)
|
| 150 |
+
3. model.py (Architecture)
|
| 151 |
+
4. README.md (Description)
|
| 152 |
+
5. app.py (Main app)
|
| 153 |
+
6. cifar100_model.pth (Last - large file)
|
| 154 |
+
|
| 155 |
+
================================================================================
|
| 156 |
+
TROUBLESHOOTING QUICK REFERENCE
|
| 157 |
+
================================================================================
|
| 158 |
+
|
| 159 |
+
Issue: "Module not found"
|
| 160 |
+
Fix: pip install -r requirements.txt
|
| 161 |
+
|
| 162 |
+
Issue: "Model file not found"
|
| 163 |
+
Fix: Ensure cifar100_model.pth is in same folder as app.py
|
| 164 |
+
|
| 165 |
+
Issue: "Build failed on HF"
|
| 166 |
+
Fix: Check Logs tab, verify requirements.txt, ensure Git LFS used
|
| 167 |
+
|
| 168 |
+
Issue: "Model won't load"
|
| 169 |
+
Fix: Verify model.py matches training architecture
|
| 170 |
+
|
| 171 |
+
Issue: "Slow predictions"
|
| 172 |
+
Fix: First prediction is always slower, consider GPU hardware on HF
|
| 173 |
+
|
| 174 |
+
================================================================================
|
| 175 |
+
IMPORTANT NOTES
|
| 176 |
+
================================================================================
|
| 177 |
+
|
| 178 |
+
β οΈ Model File Size: 93 MB - MUST use Git LFS when pushing to Hugging Face
|
| 179 |
+
β οΈ Python Version: Requires Python 3.8 or higher
|
| 180 |
+
β οΈ Dependencies: All listed in requirements.txt must be installed
|
| 181 |
+
β οΈ Architecture Match: model.py MUST match how cifar100_model.pth was trained
|
| 182 |
+
|
| 183 |
+
π‘ First Deployment: May take 5-10 minutes for initial build
|
| 184 |
+
π‘ Updates: Usually build in 2-3 minutes
|
| 185 |
+
π‘ Free Tier: CPU inference is free on Hugging Face
|
| 186 |
+
π‘ GPU: Available with paid plans for faster inference
|
| 187 |
+
|
| 188 |
+
================================================================================
|
| 189 |
+
WHAT HAPPENS WHEN YOU DEPLOY
|
| 190 |
+
================================================================================
|
| 191 |
+
|
| 192 |
+
1. Hugging Face receives your files
|
| 193 |
+
2. Reads README.md metadata (SDK, version, etc.)
|
| 194 |
+
3. Creates a container environment
|
| 195 |
+
4. Installs packages from requirements.txt
|
| 196 |
+
5. Runs app.py with Streamlit
|
| 197 |
+
6. Makes your app publicly accessible
|
| 198 |
+
7. Provides URL: https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE
|
| 199 |
+
|
| 200 |
+
================================================================================
|
| 201 |
+
EXPECTED PERFORMANCE
|
| 202 |
+
================================================================================
|
| 203 |
+
|
| 204 |
+
Local (CPU): 50-200ms per image
|
| 205 |
+
Local (GPU): 10-30ms per image
|
| 206 |
+
HF Spaces (CPU): 100-500ms per image (includes network latency)
|
| 207 |
+
HF Spaces (GPU): 30-100ms per image
|
| 208 |
+
|
| 209 |
+
Memory Usage: ~500 MB (model + app)
|
| 210 |
+
Model Load Time: 1-3 seconds (first time)
|
| 211 |
+
App Load Time: 2-5 seconds (browser)
|
| 212 |
+
|
| 213 |
+
================================================================================
|
| 214 |
+
CUSTOMIZATION POSSIBILITIES
|
| 215 |
+
================================================================================
|
| 216 |
+
|
| 217 |
+
Easy (No code changes needed):
|
| 218 |
+
- Change number of top predictions (slider in app)
|
| 219 |
+
- Toggle all probabilities view (checkbox in app)
|
| 220 |
+
- Change emoji/colors (README.md YAML)
|
| 221 |
+
|
| 222 |
+
Medium (Minor code edits):
|
| 223 |
+
- Modify CSS styling (app.py lines 37-60)
|
| 224 |
+
- Change default settings (app.py sliders)
|
| 225 |
+
- Update model info sidebar (app.py lines 135-155)
|
| 226 |
+
|
| 227 |
+
Advanced (Requires coding):
|
| 228 |
+
- Add GradCAM visualizations
|
| 229 |
+
- Add batch upload
|
| 230 |
+
- Add comparison mode
|
| 231 |
+
- Create REST API
|
| 232 |
+
- Add model metrics display
|
| 233 |
+
|
| 234 |
+
================================================================================
|
| 235 |
+
RECOMMENDED NEXT STEPS
|
| 236 |
+
================================================================================
|
| 237 |
+
|
| 238 |
+
STEP 1: Test Locally
|
| 239 |
+
β Open PowerShell/Terminal in CIFAR100HFS folder
|
| 240 |
+
β Run: python test_app_locally.py
|
| 241 |
+
β Follow prompts
|
| 242 |
+
|
| 243 |
+
STEP 2: Verify App Works
|
| 244 |
+
β Upload a test image
|
| 245 |
+
β Check predictions make sense
|
| 246 |
+
β Test all features (charts, download, etc.)
|
| 247 |
+
|
| 248 |
+
STEP 3: Deploy to Hugging Face
|
| 249 |
+
β Follow DEPLOYMENT_GUIDE.md
|
| 250 |
+
β Or use quick steps in QUICKSTART.md
|
| 251 |
+
|
| 252 |
+
STEP 4: Share Your App
|
| 253 |
+
β Get your HF Spaces URL
|
| 254 |
+
β Share with friends, colleagues
|
| 255 |
+
β Add to portfolio/resume!
|
| 256 |
+
|
| 257 |
+
================================================================================
|
| 258 |
+
SUPPORT & RESOURCES
|
| 259 |
+
================================================================================
|
| 260 |
+
|
| 261 |
+
Documentation in this folder:
|
| 262 |
+
- START_HERE.md : Overview and orientation
|
| 263 |
+
- QUICKSTART.md : Fast reference
|
| 264 |
+
- DEPLOYMENT_GUIDE.md : Step-by-step deployment
|
| 265 |
+
- FILES_EXPLAINED.md : What each file does (this file)
|
| 266 |
+
|
| 267 |
+
External Resources:
|
| 268 |
+
- Streamlit Docs: https://docs.streamlit.io
|
| 269 |
+
- HF Spaces Docs: https://huggingface.co/docs/hub/spaces
|
| 270 |
+
- Git LFS Guide: https://git-lfs.github.com
|
| 271 |
+
|
| 272 |
+
================================================================================
|
| 273 |
+
FINAL CHECKLIST BEFORE DEPLOYMENT
|
| 274 |
+
================================================================================
|
| 275 |
+
|
| 276 |
+
β‘ Tested locally and app works
|
| 277 |
+
β‘ Model predictions are accurate
|
| 278 |
+
β‘ All visualizations render correctly
|
| 279 |
+
β‘ No errors in console/logs
|
| 280 |
+
β‘ README.md has correct information
|
| 281 |
+
β‘ requirements.txt includes all packages
|
| 282 |
+
β‘ .gitattributes set up for LFS
|
| 283 |
+
β‘ Ready to create Hugging Face Space
|
| 284 |
+
|
| 285 |
+
================================================================================
|
| 286 |
+
|
| 287 |
+
YOU'RE ALL SET! π
|
| 288 |
+
|
| 289 |
+
Next Action: Open START_HERE.md or run test_app_locally.py
|
| 290 |
+
|
| 291 |
+
================================================================================
|
| 292 |
+
Created: October 10, 2025
|
| 293 |
+
Author: Krishnakanth
|
| 294 |
+
Project: CIFAR-100 Image Classifier
|
| 295 |
+
================================================================================
|
| 296 |
+
|
FILES_EXPLAINED.md
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# π Files Explained - What Each File Does
|
| 2 |
+
|
| 3 |
+
## π― Essential Files (Must Upload to Hugging Face)
|
| 4 |
+
|
| 5 |
+
### 1. `app.py` (Main Application)
|
| 6 |
+
**What it does**: The Streamlit web application
|
| 7 |
+
**Key features**:
|
| 8 |
+
- Image upload interface
|
| 9 |
+
- Model loading and inference
|
| 10 |
+
- Results visualization
|
| 11 |
+
- Interactive charts
|
| 12 |
+
- Download functionality
|
| 13 |
+
|
| 14 |
+
**Don't modify unless**: You want to customize UI or add features
|
| 15 |
+
|
| 16 |
+
---
|
| 17 |
+
|
| 18 |
+
### 2. `model.py` (Model Architecture)
|
| 19 |
+
**What it does**: Defines the ResNet-34 neural network
|
| 20 |
+
**Contains**:
|
| 21 |
+
- `CIFAR100ResNet34` class
|
| 22 |
+
- `BasicBlock` and `BottleneckBlock` classes
|
| 23 |
+
- `ModelConfig` dataclass
|
| 24 |
+
- Weight initialization
|
| 25 |
+
|
| 26 |
+
**Don't modify**: This must match your trained model architecture
|
| 27 |
+
|
| 28 |
+
---
|
| 29 |
+
|
| 30 |
+
### 3. `cifar100_model.pth` (Trained Model Weights)
|
| 31 |
+
**What it does**: Your trained model parameters
|
| 32 |
+
**Size**: ~93 MB
|
| 33 |
+
**Contains**: Neural network weights from training
|
| 34 |
+
|
| 35 |
+
**Important**: Must be uploaded with Git LFS
|
| 36 |
+
|
| 37 |
+
---
|
| 38 |
+
|
| 39 |
+
### 4. `requirements.txt` (Dependencies)
|
| 40 |
+
**What it does**: Lists Python packages needed
|
| 41 |
+
**Contains**:
|
| 42 |
+
```
|
| 43 |
+
torch>=2.0.0
|
| 44 |
+
torchvision>=0.15.0
|
| 45 |
+
streamlit>=1.28.0
|
| 46 |
+
Pillow>=9.5.0
|
| 47 |
+
numpy>=1.24.0
|
| 48 |
+
plotly>=5.17.0
|
| 49 |
+
```
|
| 50 |
+
|
| 51 |
+
**When to modify**: If you add new Python imports to `app.py`
|
| 52 |
+
|
| 53 |
+
---
|
| 54 |
+
|
| 55 |
+
### 5. `README.md` (Space Description)
|
| 56 |
+
**What it does**: Displays on your Hugging Face Space homepage
|
| 57 |
+
**Contains**:
|
| 58 |
+
- YAML metadata (title, emoji, SDK settings)
|
| 59 |
+
- Project description
|
| 60 |
+
- Features list
|
| 61 |
+
- Model details
|
| 62 |
+
- Usage instructions
|
| 63 |
+
|
| 64 |
+
**Customize**: Add your info, update accuracy numbers
|
| 65 |
+
|
| 66 |
+
---
|
| 67 |
+
|
| 68 |
+
### 6. `.gitattributes` (Git LFS Configuration)
|
| 69 |
+
**What it does**: Tells Git to use LFS for large files
|
| 70 |
+
**Contains**: Rules to track `*.pth` files
|
| 71 |
+
|
| 72 |
+
**Don't modify**: Unless you know what you're doing
|
| 73 |
+
|
| 74 |
+
---
|
| 75 |
+
|
| 76 |
+
## π οΈ Development Files (Optional, Not Required for HF)
|
| 77 |
+
|
| 78 |
+
### 7. `test_app_locally.py` (Testing Script)
|
| 79 |
+
**What it does**: Automated testing before deployment
|
| 80 |
+
**Tests**:
|
| 81 |
+
- Package installation
|
| 82 |
+
- Model file presence
|
| 83 |
+
- Model loading
|
| 84 |
+
- Inference test
|
| 85 |
+
|
| 86 |
+
**Use when**: Before deploying to verify everything works
|
| 87 |
+
|
| 88 |
+
---
|
| 89 |
+
|
| 90 |
+
### 8. `run_local.bat` (Windows Launcher)
|
| 91 |
+
**What it does**: Quick launcher for Windows
|
| 92 |
+
**Usage**: Double-click to run app locally
|
| 93 |
+
|
| 94 |
+
---
|
| 95 |
+
|
| 96 |
+
### 9. `run_local.sh` (Linux/Mac Launcher)
|
| 97 |
+
**What it does**: Quick launcher for Unix systems
|
| 98 |
+
**Usage**: `chmod +x run_local.sh && ./run_local.sh`
|
| 99 |
+
|
| 100 |
+
---
|
| 101 |
+
|
| 102 |
+
### 10. `.gitignore` (Git Ignore Rules)
|
| 103 |
+
**What it does**: Tells Git which files to ignore
|
| 104 |
+
**Ignores**: Cache files, logs, test images, etc.
|
| 105 |
+
|
| 106 |
+
---
|
| 107 |
+
|
| 108 |
+
## π Documentation Files
|
| 109 |
+
|
| 110 |
+
### 11. `DEPLOYMENT_GUIDE.md`
|
| 111 |
+
**For**: Detailed step-by-step deployment instructions
|
| 112 |
+
**Read when**: You're ready to deploy to Hugging Face
|
| 113 |
+
|
| 114 |
+
---
|
| 115 |
+
|
| 116 |
+
### 12. `QUICKSTART.md`
|
| 117 |
+
**For**: Quick reference for common tasks
|
| 118 |
+
**Read when**: You want a fast overview
|
| 119 |
+
|
| 120 |
+
---
|
| 121 |
+
|
| 122 |
+
### 13. `PROJECT_SUMMARY.md`
|
| 123 |
+
**For**: Complete project overview
|
| 124 |
+
**Contains**: All features, structure, customization options
|
| 125 |
+
|
| 126 |
+
---
|
| 127 |
+
|
| 128 |
+
### 14. `START_HERE.md`
|
| 129 |
+
**For**: First-time setup and orientation
|
| 130 |
+
**Read when**: You're starting fresh
|
| 131 |
+
|
| 132 |
+
---
|
| 133 |
+
|
| 134 |
+
### 15. `FILES_EXPLAINED.md` (This file!)
|
| 135 |
+
**For**: Understanding what each file does
|
| 136 |
+
|
| 137 |
+
---
|
| 138 |
+
|
| 139 |
+
## π― Minimum Files for Hugging Face Deployment
|
| 140 |
+
|
| 141 |
+
Upload these 6 files:
|
| 142 |
+
|
| 143 |
+
1. β
`app.py`
|
| 144 |
+
2. β
`model.py`
|
| 145 |
+
3. β
`cifar100_model.pth`
|
| 146 |
+
4. β
`requirements.txt`
|
| 147 |
+
5. β
`README.md`
|
| 148 |
+
6. β
`.gitattributes`
|
| 149 |
+
|
| 150 |
+
Everything else is optional but helpful for development.
|
| 151 |
+
|
| 152 |
+
---
|
| 153 |
+
|
| 154 |
+
## π File Dependencies
|
| 155 |
+
|
| 156 |
+
```
|
| 157 |
+
app.py
|
| 158 |
+
βββ requires: model.py (imports CIFAR100ResNet34)
|
| 159 |
+
βββ requires: cifar100_model.pth (loads weights)
|
| 160 |
+
βββ requires: requirements.txt (dependencies)
|
| 161 |
+
|
| 162 |
+
model.py
|
| 163 |
+
βββ standalone (no dependencies on other project files)
|
| 164 |
+
|
| 165 |
+
cifar100_model.pth
|
| 166 |
+
βββ must match: model.py architecture
|
| 167 |
+
|
| 168 |
+
README.md
|
| 169 |
+
βββ used by: Hugging Face Space (homepage)
|
| 170 |
+
|
| 171 |
+
.gitattributes
|
| 172 |
+
βββ used by: Git LFS (for cifar100_model.pth)
|
| 173 |
+
```
|
| 174 |
+
|
| 175 |
+
---
|
| 176 |
+
|
| 177 |
+
## π Editing Guide
|
| 178 |
+
|
| 179 |
+
### To Change App Appearance
|
| 180 |
+
β Edit `app.py` (CSS section, lines 37-60)
|
| 181 |
+
|
| 182 |
+
### To Change Model
|
| 183 |
+
β Replace `cifar100_model.pth` and update `model.py` if architecture changed
|
| 184 |
+
|
| 185 |
+
### To Add Dependencies
|
| 186 |
+
β Edit `requirements.txt` and add package name
|
| 187 |
+
|
| 188 |
+
### To Update Documentation
|
| 189 |
+
β Edit `README.md` (shows on HF Space homepage)
|
| 190 |
+
|
| 191 |
+
---
|
| 192 |
+
|
| 193 |
+
## π¨ Quick Customization Examples
|
| 194 |
+
|
| 195 |
+
### Change Top-K Default
|
| 196 |
+
`app.py` line 97:
|
| 197 |
+
```python
|
| 198 |
+
value=5, # Change to 3, 10, etc.
|
| 199 |
+
```
|
| 200 |
+
|
| 201 |
+
### Change Page Title
|
| 202 |
+
`app.py` line 29:
|
| 203 |
+
```python
|
| 204 |
+
page_title="Your Title Here",
|
| 205 |
+
```
|
| 206 |
+
|
| 207 |
+
### Change Emoji
|
| 208 |
+
`README.md` line 3:
|
| 209 |
+
```yaml
|
| 210 |
+
emoji: πΌοΈ # Change to any emoji
|
| 211 |
+
```
|
| 212 |
+
|
| 213 |
+
### Change Color Theme
|
| 214 |
+
`README.md` lines 4-5:
|
| 215 |
+
```yaml
|
| 216 |
+
colorFrom: blue # Options: red, green, yellow, pink, purple
|
| 217 |
+
colorTo: purple # Options: indigo, teal, orange, lime
|
| 218 |
+
```
|
| 219 |
+
|
| 220 |
+
---
|
| 221 |
+
|
| 222 |
+
## π File Sizes
|
| 223 |
+
|
| 224 |
+
```
|
| 225 |
+
app.py : ~16 KB
|
| 226 |
+
model.py : ~7 KB
|
| 227 |
+
cifar100_model.pth : ~93 MB β Large file (needs Git LFS)
|
| 228 |
+
requirements.txt : ~100 bytes
|
| 229 |
+
README.md : ~4 KB
|
| 230 |
+
.gitattributes : ~200 bytes
|
| 231 |
+
```
|
| 232 |
+
|
| 233 |
+
**Total**: ~93 MB (mostly the model file)
|
| 234 |
+
|
| 235 |
+
---
|
| 236 |
+
|
| 237 |
+
## β‘ Quick Actions
|
| 238 |
+
|
| 239 |
+
**Test locally**:
|
| 240 |
+
```bash
|
| 241 |
+
python test_app_locally.py
|
| 242 |
+
```
|
| 243 |
+
|
| 244 |
+
**Run app**:
|
| 245 |
+
```bash
|
| 246 |
+
streamlit run app.py
|
| 247 |
+
```
|
| 248 |
+
|
| 249 |
+
**Check model**:
|
| 250 |
+
```python
|
| 251 |
+
import torch
|
| 252 |
+
checkpoint = torch.load("cifar100_model.pth", map_location='cpu')
|
| 253 |
+
print(checkpoint.keys())
|
| 254 |
+
```
|
| 255 |
+
|
| 256 |
+
---
|
| 257 |
+
|
| 258 |
+
## π― Next Steps
|
| 259 |
+
|
| 260 |
+
1. **Read**: `START_HERE.md` for overall guide
|
| 261 |
+
2. **Test**: Run `python test_app_locally.py`
|
| 262 |
+
3. **Deploy**: Follow `DEPLOYMENT_GUIDE.md`
|
| 263 |
+
4. **Enjoy**: Share your deployed app!
|
| 264 |
+
|
| 265 |
+
---
|
| 266 |
+
|
| 267 |
+
*Last updated: October 10, 2025*
|
| 268 |
+
|
GRADIO_DEPLOYMENT.md
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# π¨ CIFAR-100 Gradio App - Deployment Guide
|
| 2 |
+
|
| 3 |
+
## β
Updated to Gradio!
|
| 4 |
+
|
| 5 |
+
Your app has been converted from Streamlit to **Gradio** for Hugging Face Spaces deployment.
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## π― Why Gradio?
|
| 10 |
+
|
| 11 |
+
β
**Native HF Integration** - Built specifically for Hugging Face
|
| 12 |
+
β
**Simpler Deployment** - Less configuration needed
|
| 13 |
+
β
**Better Performance** - Faster loading times
|
| 14 |
+
β
**Easier Sharing** - One-click share links
|
| 15 |
+
β
**Beautiful UI** - Modern, clean interface out of the box
|
| 16 |
+
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
## π Quick Start (3 Steps)
|
| 20 |
+
|
| 21 |
+
### Step 1: Test Locally
|
| 22 |
+
|
| 23 |
+
```bash
|
| 24 |
+
# Install dependencies
|
| 25 |
+
pip install -r requirements.txt
|
| 26 |
+
|
| 27 |
+
# Run the app
|
| 28 |
+
python app.py
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
Open browser at: `http://localhost:7860`
|
| 32 |
+
|
| 33 |
+
### Step 2: Create Hugging Face Space
|
| 34 |
+
|
| 35 |
+
1. Go to [huggingface.co/new-space](https://huggingface.co/new-space)
|
| 36 |
+
2. Choose:
|
| 37 |
+
- **SDK**: Gradio
|
| 38 |
+
- **Name**: cifar100-classifier
|
| 39 |
+
- **Hardware**: CPU (free)
|
| 40 |
+
|
| 41 |
+
### Step 3: Upload Files
|
| 42 |
+
|
| 43 |
+
Upload these 6 files via web interface:
|
| 44 |
+
1. `app.py`
|
| 45 |
+
2. `model.py`
|
| 46 |
+
3. `cifar100_model.pth`
|
| 47 |
+
4. `requirements.txt`
|
| 48 |
+
5. `README.md`
|
| 49 |
+
6. `.gitattributes`
|
| 50 |
+
|
| 51 |
+
**Done!** Your app will be live in 2-3 minutes.
|
| 52 |
+
|
| 53 |
+
---
|
| 54 |
+
|
| 55 |
+
## π¨ Gradio App Features
|
| 56 |
+
|
| 57 |
+
### User Interface
|
| 58 |
+
```
|
| 59 |
+
βββββββββββββββββββββββββββββββββββββββββββββββ
|
| 60 |
+
β πΌοΈ CIFAR-100 Image Classifier β
|
| 61 |
+
βββββββββββββββββββββββββββββββββββββββββββββββ€
|
| 62 |
+
β β
|
| 63 |
+
β π€ Upload Image β π― Results β
|
| 64 |
+
β βββββββββββββββββββ β ββββββββββββββββββ β
|
| 65 |
+
β β β β β DOLPHIN β β
|
| 66 |
+
β β [Your Image] β β β 87.45% β β
|
| 67 |
+
β β β β ββββββββββββββββββ β
|
| 68 |
+
β βββββββββββββββββββ β β
|
| 69 |
+
β [Upload] [Webcam] β Top 10 Predictions:β
|
| 70 |
+
β [Clipboard] β 1. dolphin 87.45% β
|
| 71 |
+
β β 2. whale 5.23% β
|
| 72 |
+
β π‘ Tips: β 3. seal 3.12% β
|
| 73 |
+
β β’ Clear images β 4. shark 1.87% β
|
| 74 |
+
β β’ Centered object β 5. fish 0.95% β
|
| 75 |
+
β β ... β
|
| 76 |
+
βββββββββββββββββββββββββββββββββββββββββββββββ
|
| 77 |
+
```
|
| 78 |
+
|
| 79 |
+
### Key Features
|
| 80 |
+
|
| 81 |
+
β
**Automatic Prediction** - Classifies on upload
|
| 82 |
+
β
**Top-10 Results** - Shows best predictions
|
| 83 |
+
β
**Confidence Bars** - Visual probability display
|
| 84 |
+
β
**Multiple Upload Options** - File, webcam, or clipboard
|
| 85 |
+
β
**Responsive Design** - Works on mobile
|
| 86 |
+
β
**Clean Interface** - No clutter, easy to use
|
| 87 |
+
|
| 88 |
+
---
|
| 89 |
+
|
| 90 |
+
## π Changes from Streamlit
|
| 91 |
+
|
| 92 |
+
### What's Different
|
| 93 |
+
|
| 94 |
+
| Feature | Streamlit | Gradio |
|
| 95 |
+
|---------|-----------|--------|
|
| 96 |
+
| **Port** | 8501 | 7860 |
|
| 97 |
+
| **Run Command** | `streamlit run app.py` | `python app.py` |
|
| 98 |
+
| **SDK in README** | `sdk: streamlit` | `sdk: gradio` |
|
| 99 |
+
| **Dependencies** | streamlit | gradio |
|
| 100 |
+
| **Upload Options** | File only | File, webcam, clipboard |
|
| 101 |
+
| **Auto-predict** | Manual button | Automatic on upload |
|
| 102 |
+
|
| 103 |
+
### What Stayed the Same
|
| 104 |
+
|
| 105 |
+
β
Model architecture (`model.py`)
|
| 106 |
+
β
Model weights (`cifar100_model.pth`)
|
| 107 |
+
β
Core functionality (classification)
|
| 108 |
+
β
100 classes
|
| 109 |
+
β
Confidence scores
|
| 110 |
+
β
Top-K predictions
|
| 111 |
+
|
| 112 |
+
---
|
| 113 |
+
|
| 114 |
+
## π Updated Files
|
| 115 |
+
|
| 116 |
+
### Modified:
|
| 117 |
+
- β
`app.py` - Now uses Gradio instead of Streamlit
|
| 118 |
+
- β
`requirements.txt` - Changed streamlit to gradio
|
| 119 |
+
- β
`README.md` - Updated SDK to gradio
|
| 120 |
+
- β
`run_local.bat` - Updated port number
|
| 121 |
+
- β
`run_local.sh` - Updated port number
|
| 122 |
+
- β
`test_app_locally.py` - Updated for Gradio
|
| 123 |
+
|
| 124 |
+
### Unchanged:
|
| 125 |
+
- β
`model.py` - Same architecture
|
| 126 |
+
- β
`cifar100_model.pth` - Same model weights
|
| 127 |
+
- β
`.gitattributes` - Same LFS config
|
| 128 |
+
|
| 129 |
+
---
|
| 130 |
+
|
| 131 |
+
## π§ͺ Testing
|
| 132 |
+
|
| 133 |
+
### Quick Test
|
| 134 |
+
|
| 135 |
+
```bash
|
| 136 |
+
python test_app_locally.py
|
| 137 |
+
```
|
| 138 |
+
|
| 139 |
+
### Manual Test
|
| 140 |
+
|
| 141 |
+
```bash
|
| 142 |
+
# 1. Install
|
| 143 |
+
pip install -r requirements.txt
|
| 144 |
+
|
| 145 |
+
# 2. Run
|
| 146 |
+
python app.py
|
| 147 |
+
|
| 148 |
+
# 3. Open browser
|
| 149 |
+
# Go to: http://localhost:7860
|
| 150 |
+
|
| 151 |
+
# 4. Upload image
|
| 152 |
+
|
| 153 |
+
# 5. See results!
|
| 154 |
+
```
|
| 155 |
+
|
| 156 |
+
---
|
| 157 |
+
|
| 158 |
+
## βοΈ Deployment to Hugging Face
|
| 159 |
+
|
| 160 |
+
### Method 1: Web Interface (Easiest)
|
| 161 |
+
|
| 162 |
+
1. **Create Space**:
|
| 163 |
+
- Go to https://huggingface.co/new-space
|
| 164 |
+
- SDK: **Gradio**
|
| 165 |
+
- Name: `cifar100-classifier`
|
| 166 |
+
|
| 167 |
+
2. **Upload Files**:
|
| 168 |
+
- Click "Files" β "Upload files"
|
| 169 |
+
- Upload all 6 core files
|
| 170 |
+
- Commit changes
|
| 171 |
+
|
| 172 |
+
3. **Wait**: 2-3 minutes for build
|
| 173 |
+
|
| 174 |
+
4. **Access**: `https://huggingface.co/spaces/YOUR_USERNAME/cifar100-classifier`
|
| 175 |
+
|
| 176 |
+
### Method 2: Git CLI
|
| 177 |
+
|
| 178 |
+
```bash
|
| 179 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/cifar100-classifier
|
| 180 |
+
cd cifar100-classifier
|
| 181 |
+
|
| 182 |
+
# Copy files from CIFAR100HFS
|
| 183 |
+
|
| 184 |
+
git lfs install
|
| 185 |
+
git lfs track "*.pth"
|
| 186 |
+
git add .
|
| 187 |
+
git commit -m "Deploy CIFAR-100 Gradio app"
|
| 188 |
+
git push
|
| 189 |
+
```
|
| 190 |
+
|
| 191 |
+
---
|
| 192 |
+
|
| 193 |
+
## π¨ Gradio-Specific Features
|
| 194 |
+
|
| 195 |
+
### Advantages
|
| 196 |
+
|
| 197 |
+
1. **Automatic Prediction**: No submit button needed
|
| 198 |
+
2. **Multiple Input Sources**: Upload, webcam, or paste
|
| 199 |
+
3. **Built-in Examples**: Easy to add example images
|
| 200 |
+
4. **Sharing**: One-click sharing with `share=True`
|
| 201 |
+
5. **API**: Automatic REST API generation
|
| 202 |
+
6. **Flagging**: Users can flag interesting results
|
| 203 |
+
|
| 204 |
+
### Using the API
|
| 205 |
+
|
| 206 |
+
Once deployed, you can use it via API:
|
| 207 |
+
|
| 208 |
+
```python
|
| 209 |
+
from gradio_client import Client
|
| 210 |
+
|
| 211 |
+
client = Client("YOUR_USERNAME/cifar100-classifier")
|
| 212 |
+
result = client.predict("path/to/image.jpg")
|
| 213 |
+
print(result)
|
| 214 |
+
```
|
| 215 |
+
|
| 216 |
+
---
|
| 217 |
+
|
| 218 |
+
## π§ Customization
|
| 219 |
+
|
| 220 |
+
### Change Theme
|
| 221 |
+
|
| 222 |
+
Edit `app.py` line 185:
|
| 223 |
+
```python
|
| 224 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 225 |
+
# Change to: gr.themes.Glass(), gr.themes.Monochrome(), etc.
|
| 226 |
+
```
|
| 227 |
+
|
| 228 |
+
### Add Examples
|
| 229 |
+
|
| 230 |
+
Create `examples/` folder with images, then edit `app.py` line 253:
|
| 231 |
+
```python
|
| 232 |
+
gr.Examples(
|
| 233 |
+
examples=["examples/cat.jpg", "examples/car.jpg"],
|
| 234 |
+
inputs=image_input,
|
| 235 |
+
)
|
| 236 |
+
```
|
| 237 |
+
|
| 238 |
+
### Change Port (Local Testing)
|
| 239 |
+
|
| 240 |
+
Edit `app.py` line 277:
|
| 241 |
+
```python
|
| 242 |
+
demo.launch(server_port=7860) # Change to any port
|
| 243 |
+
```
|
| 244 |
+
|
| 245 |
+
### Enable Sharing
|
| 246 |
+
|
| 247 |
+
Edit `app.py` line 275:
|
| 248 |
+
```python
|
| 249 |
+
demo.launch(share=True) # Creates temporary public link
|
| 250 |
+
```
|
| 251 |
+
|
| 252 |
+
---
|
| 253 |
+
|
| 254 |
+
## π Performance
|
| 255 |
+
|
| 256 |
+
### Local Testing
|
| 257 |
+
- **Load Time**: 1-2 seconds
|
| 258 |
+
- **Inference**: 50-200ms (CPU), 10-30ms (GPU)
|
| 259 |
+
- **Memory**: ~500MB
|
| 260 |
+
|
| 261 |
+
### Hugging Face Spaces
|
| 262 |
+
- **First Load**: 3-5 seconds
|
| 263 |
+
- **Inference**: 100-500ms (CPU), 30-100ms (GPU)
|
| 264 |
+
- **Concurrent Users**: Supported (HF handles scaling)
|
| 265 |
+
|
| 266 |
+
---
|
| 267 |
+
|
| 268 |
+
## π Troubleshooting
|
| 269 |
+
|
| 270 |
+
### "Port already in use"
|
| 271 |
+
```bash
|
| 272 |
+
# Change port in app.py or kill existing process
|
| 273 |
+
```
|
| 274 |
+
|
| 275 |
+
### "Gradio not found"
|
| 276 |
+
```bash
|
| 277 |
+
pip install gradio>=4.0.0
|
| 278 |
+
```
|
| 279 |
+
|
| 280 |
+
### "Model predictions wrong"
|
| 281 |
+
- Verify model.py matches training architecture
|
| 282 |
+
- Check normalization values
|
| 283 |
+
|
| 284 |
+
### "Slow on HF Spaces"
|
| 285 |
+
- First load is always slower
|
| 286 |
+
- Consider GPU hardware upgrade
|
| 287 |
+
- Subsequent loads are faster
|
| 288 |
+
|
| 289 |
+
---
|
| 290 |
+
|
| 291 |
+
## π‘ Pro Tips
|
| 292 |
+
|
| 293 |
+
1. **Test Locally First**: Always verify before deploying
|
| 294 |
+
2. **Use Examples**: Add example images for users to try
|
| 295 |
+
3. **Monitor Logs**: Check HF Space logs for issues
|
| 296 |
+
4. **Update README**: Keep model accuracy and info current
|
| 297 |
+
5. **Version Control**: Use Git tags for different versions
|
| 298 |
+
|
| 299 |
+
---
|
| 300 |
+
|
| 301 |
+
## π― Next Steps
|
| 302 |
+
|
| 303 |
+
### For Testing:
|
| 304 |
+
```bash
|
| 305 |
+
python test_app_locally.py
|
| 306 |
+
```
|
| 307 |
+
|
| 308 |
+
### For Deployment:
|
| 309 |
+
1. Create HF Space (Gradio SDK)
|
| 310 |
+
2. Upload 6 core files
|
| 311 |
+
3. Wait for build
|
| 312 |
+
4. Share your app!
|
| 313 |
+
|
| 314 |
+
---
|
| 315 |
+
|
| 316 |
+
## π Support
|
| 317 |
+
|
| 318 |
+
- **Gradio Docs**: https://www.gradio.app/docs
|
| 319 |
+
- **HF Spaces**: https://huggingface.co/docs/hub/spaces
|
| 320 |
+
- **Examples**: https://huggingface.co/spaces (search "gradio")
|
| 321 |
+
|
| 322 |
+
---
|
| 323 |
+
|
| 324 |
+
**π Your Gradio app is ready to deploy! Much simpler than Streamlit! π**
|
| 325 |
+
|
| 326 |
+
*Last updated: October 10, 2025*
|
| 327 |
+
|
INDEX.md
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# π― CIFAR-100 Classifier - Complete Package Index
|
| 2 |
+
|
| 3 |
+
## π Welcome!
|
| 4 |
+
|
| 5 |
+
Your **CIFAR-100 Image Classifier** is ready for deployment to Hugging Face Spaces!
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## π Documentation - Read in This Order
|
| 10 |
+
|
| 11 |
+
| # | File | Purpose | When to Read |
|
| 12 |
+
|---|------|---------|--------------|
|
| 13 |
+
| 1οΈβ£ | **START_HERE.md** | π First-time setup & orientation | **Start here!** |
|
| 14 |
+
| 2οΈβ£ | **QUICKSTART.md** | β‘ Quick reference guide | Need fast overview |
|
| 15 |
+
| 3οΈβ£ | **DEPLOYMENT_GUIDE.md** | π Step-by-step deployment | Ready to deploy |
|
| 16 |
+
| 4οΈβ£ | **FILES_EXPLAINED.md** | π What each file does | Want to understand structure |
|
| 17 |
+
| 5οΈβ£ | **PROJECT_SUMMARY.md** | π Complete project overview | Need full details |
|
| 18 |
+
| 6οΈβ£ | **COMPLETE_SETUP_SUMMARY.txt** | β
Setup checklist | Final verification |
|
| 19 |
+
|
| 20 |
+
---
|
| 21 |
+
|
| 22 |
+
## π― Choose Your Path
|
| 23 |
+
|
| 24 |
+
### π I want to test locally first
|
| 25 |
+
β **Read**: `START_HERE.md`
|
| 26 |
+
β **Run**: `python test_app_locally.py`
|
| 27 |
+
β **Or double-click**: `run_local.bat` (Windows)
|
| 28 |
+
|
| 29 |
+
### βοΈ I want to deploy immediately
|
| 30 |
+
β **Read**: `DEPLOYMENT_GUIDE.md`
|
| 31 |
+
β **Quick**: `QUICKSTART.md` (3-step deployment)
|
| 32 |
+
|
| 33 |
+
### π€ I want to understand the code
|
| 34 |
+
β **Read**: `FILES_EXPLAINED.md`
|
| 35 |
+
β **Review**: `app.py` and `model.py`
|
| 36 |
+
|
| 37 |
+
### π¨ I want to customize the app
|
| 38 |
+
β **Read**: `PROJECT_SUMMARY.md` (Customization section)
|
| 39 |
+
β **Edit**: `app.py` (UI/styling)
|
| 40 |
+
β **Edit**: `README.md` (Space description)
|
| 41 |
+
|
| 42 |
+
---
|
| 43 |
+
|
| 44 |
+
## π¦ What You Get
|
| 45 |
+
|
| 46 |
+
```
|
| 47 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 48 |
+
β CIFAR-100 Image Classifier β
|
| 49 |
+
β Web Application with Streamlit β
|
| 50 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
|
| 51 |
+
β β¨ Features: β
|
| 52 |
+
β β’ Upload images β Get predictions β
|
| 53 |
+
β β’ 100 class classification β
|
| 54 |
+
β β’ Confidence scores & probabilities β
|
| 55 |
+
β β’ Interactive charts β
|
| 56 |
+
β β’ Top-K predictions β
|
| 57 |
+
β β’ Download results β
|
| 58 |
+
β β
|
| 59 |
+
β π€ Model: β
|
| 60 |
+
β β’ ResNet-34 architecture β
|
| 61 |
+
β β’ ~21M parameters β
|
| 62 |
+
β β’ Trained on CIFAR-100 β
|
| 63 |
+
β β’ Production-ready β
|
| 64 |
+
β β
|
| 65 |
+
β π Deployment: β
|
| 66 |
+
β β’ Hugging Face Spaces ready β
|
| 67 |
+
β β’ Streamlit-powered β
|
| 68 |
+
β β’ Git LFS configured β
|
| 69 |
+
β β’ Complete documentation β
|
| 70 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 71 |
+
```
|
| 72 |
+
|
| 73 |
+
---
|
| 74 |
+
|
| 75 |
+
## ποΈ File Organization
|
| 76 |
+
|
| 77 |
+
### π― Core Files (6) - Required for HF Spaces
|
| 78 |
+
```
|
| 79 |
+
app.py β Main application
|
| 80 |
+
model.py β Neural network architecture
|
| 81 |
+
cifar100_model.pth β Trained weights (93 MB)
|
| 82 |
+
requirements.txt β Dependencies
|
| 83 |
+
README.md β HF Space homepage
|
| 84 |
+
.gitattributes β Git LFS config
|
| 85 |
+
```
|
| 86 |
+
|
| 87 |
+
### π οΈ Development Files (4) - For local testing
|
| 88 |
+
```
|
| 89 |
+
test_app_locally.py β Automated testing
|
| 90 |
+
run_local.bat β Windows launcher
|
| 91 |
+
run_local.sh β Linux/Mac launcher
|
| 92 |
+
.gitignore β Git ignore rules
|
| 93 |
+
```
|
| 94 |
+
|
| 95 |
+
### π Documentation Files (7) - Helpful guides
|
| 96 |
+
```
|
| 97 |
+
START_HERE.md β Begin here
|
| 98 |
+
QUICKSTART.md β Fast reference
|
| 99 |
+
DEPLOYMENT_GUIDE.md β Detailed steps
|
| 100 |
+
FILES_EXPLAINED.md β File descriptions
|
| 101 |
+
PROJECT_SUMMARY.md β Complete overview
|
| 102 |
+
COMPLETE_SETUP_SUMMARY.txt β Checklist
|
| 103 |
+
INDEX.md β This file
|
| 104 |
+
```
|
| 105 |
+
|
| 106 |
+
---
|
| 107 |
+
|
| 108 |
+
## β‘ Ultra-Quick Start
|
| 109 |
+
|
| 110 |
+
**5 minutes to deployment:**
|
| 111 |
+
|
| 112 |
+
```bash
|
| 113 |
+
# Step 1: Test locally (30 seconds)
|
| 114 |
+
python test_app_locally.py
|
| 115 |
+
|
| 116 |
+
# Step 2: Create HF Space (1 minute)
|
| 117 |
+
# Go to: https://huggingface.co/new-space
|
| 118 |
+
# Choose: Streamlit SDK
|
| 119 |
+
|
| 120 |
+
# Step 3: Upload files (2 minutes)
|
| 121 |
+
# Drag & drop all 6 core files via web UI
|
| 122 |
+
# OR use git clone and push
|
| 123 |
+
|
| 124 |
+
# Step 4: Wait for build (2 minutes)
|
| 125 |
+
# Check build logs, wait for "Running"
|
| 126 |
+
|
| 127 |
+
# Step 5: Test your deployed app! β
|
| 128 |
+
# Visit your space URL
|
| 129 |
+
```
|
| 130 |
+
|
| 131 |
+
---
|
| 132 |
+
|
| 133 |
+
## π¨ App Preview
|
| 134 |
+
|
| 135 |
+
When users visit your app, they'll see:
|
| 136 |
+
|
| 137 |
+
```
|
| 138 |
+
βββββββββββββββββββββββββββββββββββββββββββββββββββββοΏ½οΏ½οΏ½ββ
|
| 139 |
+
β πΌοΈ CIFAR-100 Image Classifier β
|
| 140 |
+
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
|
| 141 |
+
β β
|
| 142 |
+
β π€ Upload Image β π― Classification Results β
|
| 143 |
+
β β β
|
| 144 |
+
β [Upload Button] β Predicted Class β
|
| 145 |
+
β β βββββββββββββββββββββββββββ β
|
| 146 |
+
β [Your Image Here] β β DOLPHIN β β
|
| 147 |
+
β β β Confidence: 87.45% β β
|
| 148 |
+
β π Size: 800Γ600 β βββββββββββββββββββββββββββ β
|
| 149 |
+
β π¨ Mode: RGB β β
|
| 150 |
+
β β π Top 5 Predictions: β
|
| 151 |
+
β β 1. dolphin 87.45% β
|
| 152 |
+
β β 2. whale 5.23% β
|
| 153 |
+
β β 3. seal 3.12% β
|
| 154 |
+
β β 4. shark 1.87% β
|
| 155 |
+
β β 5. aquarium_fish 0.95% β
|
| 156 |
+
β β β
|
| 157 |
+
β β [Interactive Chart] β
|
| 158 |
+
β β [Download Results] β
|
| 159 |
+
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
| 160 |
+
```
|
| 161 |
+
|
| 162 |
+
---
|
| 163 |
+
|
| 164 |
+
## π― Success Criteria
|
| 165 |
+
|
| 166 |
+
Your deployment is successful when:
|
| 167 |
+
|
| 168 |
+
β
App loads at your Hugging Face URL
|
| 169 |
+
β
Can upload images without errors
|
| 170 |
+
β
Predictions are generated correctly
|
| 171 |
+
β
Confidence scores display (0-100%)
|
| 172 |
+
β
Top predictions shown
|
| 173 |
+
β
Charts render properly
|
| 174 |
+
β
Download button works
|
| 175 |
+
|
| 176 |
+
---
|
| 177 |
+
|
| 178 |
+
## π File Statistics
|
| 179 |
+
|
| 180 |
+
```
|
| 181 |
+
Total Files: 14 files
|
| 182 |
+
Total Size: ~94 MB
|
| 183 |
+
Core Files: 6 (required)
|
| 184 |
+
Test Files: 4 (optional)
|
| 185 |
+
Docs: 7 (helpful)
|
| 186 |
+
|
| 187 |
+
Largest File: cifar100_model.pth (93 MB)
|
| 188 |
+
Code Files: app.py (16 KB) + model.py (7 KB)
|
| 189 |
+
Dependencies: 6 packages (requirements.txt)
|
| 190 |
+
```
|
| 191 |
+
|
| 192 |
+
---
|
| 193 |
+
|
| 194 |
+
## π‘ Pro Tips
|
| 195 |
+
|
| 196 |
+
1. **Always test locally first** - Saves time debugging on HF
|
| 197 |
+
2. **Use Git LFS** - Essential for model files >10MB
|
| 198 |
+
3. **Check logs** - HF provides detailed build/runtime logs
|
| 199 |
+
4. **Start with CPU** - Free tier works great for demos
|
| 200 |
+
5. **Monitor usage** - HF shows analytics for your space
|
| 201 |
+
|
| 202 |
+
---
|
| 203 |
+
|
| 204 |
+
## π Learning Resources
|
| 205 |
+
|
| 206 |
+
- **Streamlit Tutorial**: Learn to customize the UI
|
| 207 |
+
- **HF Spaces Docs**: Understand deployment options
|
| 208 |
+
- **Git LFS Guide**: Master large file handling
|
| 209 |
+
|
| 210 |
+
---
|
| 211 |
+
|
| 212 |
+
## π Ready to Go?
|
| 213 |
+
|
| 214 |
+
### For Testing:
|
| 215 |
+
```bash
|
| 216 |
+
python test_app_locally.py
|
| 217 |
+
```
|
| 218 |
+
|
| 219 |
+
### For Quick Start:
|
| 220 |
+
β Open: `START_HERE.md`
|
| 221 |
+
|
| 222 |
+
### For Deployment:
|
| 223 |
+
β Open: `DEPLOYMENT_GUIDE.md`
|
| 224 |
+
|
| 225 |
+
---
|
| 226 |
+
|
| 227 |
+
## π Need Help?
|
| 228 |
+
|
| 229 |
+
1. Check relevant `.md` file for your question
|
| 230 |
+
2. Read `COMPLETE_SETUP_SUMMARY.txt` for checklist
|
| 231 |
+
3. Review Hugging Face Spaces documentation
|
| 232 |
+
4. Check Streamlit documentation
|
| 233 |
+
|
| 234 |
+
---
|
| 235 |
+
|
| 236 |
+
**π Everything is ready! Time to deploy your AI app! π**
|
| 237 |
+
|
| 238 |
+
*Created: October 10, 2025*
|
| 239 |
+
*Author: Krishnakanth*
|
| 240 |
+
*Project: CIFAR-100 Image Classifier for Hugging Face Spaces*
|
| 241 |
+
|
PROJECT_SUMMARY.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# π¦ CIFAR-100 HuggingFace Spaces - Project Summary
|
| 2 |
+
|
| 3 |
+
## β
Project Status: READY FOR DEPLOYMENT
|
| 4 |
+
|
| 5 |
+
Your CIFAR-100 classifier is now fully set up for deployment to Hugging Face Spaces!
|
| 6 |
+
|
| 7 |
+
## π Project Structure
|
| 8 |
+
|
| 9 |
+
```
|
| 10 |
+
CIFAR100HFS/
|
| 11 |
+
βββ π― Core Files (Required for deployment)
|
| 12 |
+
β βββ app.py # Streamlit application (main)
|
| 13 |
+
β βββ model.py # ResNet-34 architecture
|
| 14 |
+
β βββ cifar100_model.pth # Trained model weights (44 MB)
|
| 15 |
+
β βββ requirements.txt # Python dependencies
|
| 16 |
+
β βββ README.md # Hugging Face Space description
|
| 17 |
+
β βββ .gitattributes # Git LFS configuration
|
| 18 |
+
β
|
| 19 |
+
βββ π οΈ Testing & Development
|
| 20 |
+
β βββ test_app_locally.py # Automated testing script
|
| 21 |
+
β βββ run_local.bat # Windows launcher
|
| 22 |
+
β βββ run_local.sh # Linux/Mac launcher
|
| 23 |
+
β βββ .gitignore # Git ignore rules
|
| 24 |
+
β
|
| 25 |
+
βββ π Documentation
|
| 26 |
+
βββ DEPLOYMENT_GUIDE.md # Detailed deployment steps
|
| 27 |
+
βββ QUICKSTART.md # Quick start instructions
|
| 28 |
+
βββ PROJECT_SUMMARY.md # This file
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
## π― Features Implemented
|
| 32 |
+
|
| 33 |
+
### Core Functionality
|
| 34 |
+
β
Image upload (JPG, PNG, BMP, WEBP)
|
| 35 |
+
β
Real-time classification (100 classes)
|
| 36 |
+
β
Confidence scores with probabilities
|
| 37 |
+
β
Top-K predictions (configurable)
|
| 38 |
+
β
Interactive probability charts
|
| 39 |
+
β
Download results as TXT
|
| 40 |
+
|
| 41 |
+
### UI/UX
|
| 42 |
+
β
Modern, responsive design
|
| 43 |
+
β
Two-column layout
|
| 44 |
+
β
Color-coded confidence levels
|
| 45 |
+
β
Interactive sidebar settings
|
| 46 |
+
β
Professional styling with custom CSS
|
| 47 |
+
β
Mobile-friendly interface
|
| 48 |
+
|
| 49 |
+
### Technical
|
| 50 |
+
β
PyTorch model integration
|
| 51 |
+
β
Efficient image preprocessing
|
| 52 |
+
β
CPU/GPU automatic detection
|
| 53 |
+
β
Model caching for performance
|
| 54 |
+
β
Error handling and user feedback
|
| 55 |
+
|
| 56 |
+
## π€ Model Details
|
| 57 |
+
|
| 58 |
+
- **Architecture**: ResNet-34 with BasicBlock
|
| 59 |
+
- **Parameters**: ~21 Million
|
| 60 |
+
- **Input**: 32Γ32 RGB images
|
| 61 |
+
- **Output**: 100 class probabilities
|
| 62 |
+
- **Normalization**: CIFAR-100 mean/std
|
| 63 |
+
- **Dropout**: 5% for regularization
|
| 64 |
+
|
| 65 |
+
## π Next Steps
|
| 66 |
+
|
| 67 |
+
### Test Locally (RECOMMENDED)
|
| 68 |
+
|
| 69 |
+
**Windows:**
|
| 70 |
+
```bash
|
| 71 |
+
# Option 1: Double-click
|
| 72 |
+
run_local.bat
|
| 73 |
+
|
| 74 |
+
# Option 2: Command line
|
| 75 |
+
python test_app_locally.py
|
| 76 |
+
```
|
| 77 |
+
|
| 78 |
+
**Linux/Mac:**
|
| 79 |
+
```bash
|
| 80 |
+
chmod +x run_local.sh
|
| 81 |
+
./run_local.sh
|
| 82 |
+
```
|
| 83 |
+
|
| 84 |
+
### Deploy to Hugging Face
|
| 85 |
+
|
| 86 |
+
1. **Create Space**:
|
| 87 |
+
- Go to https://huggingface.co/spaces
|
| 88 |
+
- Click "Create new Space"
|
| 89 |
+
- Select "Streamlit" SDK
|
| 90 |
+
|
| 91 |
+
2. **Upload Files**:
|
| 92 |
+
```bash
|
| 93 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME
|
| 94 |
+
cd YOUR_SPACE_NAME
|
| 95 |
+
|
| 96 |
+
# Copy all files from CIFAR100HFS
|
| 97 |
+
|
| 98 |
+
git lfs install
|
| 99 |
+
git lfs track "*.pth"
|
| 100 |
+
git add .
|
| 101 |
+
git commit -m "Initial deployment"
|
| 102 |
+
git push
|
| 103 |
+
```
|
| 104 |
+
|
| 105 |
+
3. **Access Your App**:
|
| 106 |
+
`https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME`
|
| 107 |
+
|
| 108 |
+
## π Expected Performance
|
| 109 |
+
|
| 110 |
+
- **Inference Time**: ~50-200ms per image (CPU)
|
| 111 |
+
- **Inference Time**: ~10-30ms per image (GPU)
|
| 112 |
+
- **Memory Usage**: ~500MB (model + app)
|
| 113 |
+
- **Concurrent Users**: Supports multiple users (HF handles scaling)
|
| 114 |
+
|
| 115 |
+
## π¨ Customization Options
|
| 116 |
+
|
| 117 |
+
### Change Number of Top Predictions
|
| 118 |
+
In `app.py`, modify the slider:
|
| 119 |
+
```python
|
| 120 |
+
top_k = st.slider("Number of top predictions", min_value=3, max_value=20, value=5)
|
| 121 |
+
```
|
| 122 |
+
|
| 123 |
+
### Add Custom Styling
|
| 124 |
+
Edit the CSS in `app.py` (line 37-60)
|
| 125 |
+
|
| 126 |
+
### Add Example Images
|
| 127 |
+
Create an `examples/` folder and add images, then update app.py to load them
|
| 128 |
+
|
| 129 |
+
### Change Model Path
|
| 130 |
+
Update `model_path` in `load_model()` function
|
| 131 |
+
|
| 132 |
+
## π Testing Checklist
|
| 133 |
+
|
| 134 |
+
Before deploying, verify:
|
| 135 |
+
|
| 136 |
+
- [ ] All files are in CIFAR100HFS folder
|
| 137 |
+
- [ ] `cifar100_model.pth` exists and is correct
|
| 138 |
+
- [ ] `requirements.txt` has all dependencies
|
| 139 |
+
- [ ] `python test_app_locally.py` passes all tests
|
| 140 |
+
- [ ] App runs locally with `streamlit run app.py`
|
| 141 |
+
- [ ] Can upload and classify test images
|
| 142 |
+
- [ ] Predictions look reasonable
|
| 143 |
+
- [ ] Download functionality works
|
| 144 |
+
|
| 145 |
+
## π Troubleshooting
|
| 146 |
+
|
| 147 |
+
### Model doesn't load
|
| 148 |
+
- Check if `cifar100_model.pth` is in the correct directory
|
| 149 |
+
- Verify model architecture matches training architecture
|
| 150 |
+
- Check model file size (should be ~44 MB)
|
| 151 |
+
|
| 152 |
+
### Import errors
|
| 153 |
+
- Run: `pip install -r requirements.txt`
|
| 154 |
+
- Ensure Python 3.8+ is installed
|
| 155 |
+
|
| 156 |
+
### Slow predictions
|
| 157 |
+
- First prediction is always slower (model initialization)
|
| 158 |
+
- Subsequent predictions should be fast
|
| 159 |
+
- Consider GPU hardware on Hugging Face
|
| 160 |
+
|
| 161 |
+
### UI issues
|
| 162 |
+
- Clear browser cache
|
| 163 |
+
- Try different browser
|
| 164 |
+
- Check browser console for errors
|
| 165 |
+
|
| 166 |
+
## π Support
|
| 167 |
+
|
| 168 |
+
For issues or questions:
|
| 169 |
+
1. Check `DEPLOYMENT_GUIDE.md` for detailed help
|
| 170 |
+
2. Review Hugging Face Spaces documentation
|
| 171 |
+
3. Check Streamlit documentation
|
| 172 |
+
4. Post in Hugging Face forums
|
| 173 |
+
|
| 174 |
+
## π Success Metrics
|
| 175 |
+
|
| 176 |
+
Your deployment is successful when:
|
| 177 |
+
β
App loads without errors
|
| 178 |
+
β
Can upload images
|
| 179 |
+
β
Predictions are generated
|
| 180 |
+
β
Confidence scores displayed
|
| 181 |
+
β
Charts render correctly
|
| 182 |
+
β
Download button works
|
| 183 |
+
|
| 184 |
+
---
|
| 185 |
+
|
| 186 |
+
**You're all set! Ready to deploy your CIFAR-100 classifier! π**
|
| 187 |
+
|
| 188 |
+
Last updated: October 10, 2025
|
| 189 |
+
|
QUICKSTART.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# π Quick Start Guide
|
| 2 |
+
|
| 3 |
+
## Test Locally (Recommended First)
|
| 4 |
+
|
| 5 |
+
### Option 1: Using the test script
|
| 6 |
+
|
| 7 |
+
```bash
|
| 8 |
+
python test_app_locally.py
|
| 9 |
+
```
|
| 10 |
+
|
| 11 |
+
This will:
|
| 12 |
+
1. β
Check all dependencies
|
| 13 |
+
2. β
Verify model file exists
|
| 14 |
+
3. β
Test model loading
|
| 15 |
+
4. β
Launch Gradio app
|
| 16 |
+
|
| 17 |
+
### Option 2: Direct Gradio run
|
| 18 |
+
|
| 19 |
+
```bash
|
| 20 |
+
python app.py
|
| 21 |
+
```
|
| 22 |
+
|
| 23 |
+
Then open your browser to: `http://localhost:7860`
|
| 24 |
+
|
| 25 |
+
## Deploy to Hugging Face Spaces
|
| 26 |
+
|
| 27 |
+
### Quick Deployment (3 steps)
|
| 28 |
+
|
| 29 |
+
1. **Create Space** on [huggingface.co/spaces](https://huggingface.co/spaces)
|
| 30 |
+
- Choose Gradio SDK
|
| 31 |
+
- Name it (e.g., `cifar100-classifier`)
|
| 32 |
+
|
| 33 |
+
2. **Clone and add files**:
|
| 34 |
+
```bash
|
| 35 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME
|
| 36 |
+
cd YOUR_SPACE_NAME
|
| 37 |
+
|
| 38 |
+
# Copy all files from CIFAR100HFS folder
|
| 39 |
+
# Then:
|
| 40 |
+
git lfs install
|
| 41 |
+
git lfs track "*.pth"
|
| 42 |
+
git add .
|
| 43 |
+
git commit -m "Deploy CIFAR-100 classifier"
|
| 44 |
+
git push
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
3. **Done!** Your app will be live at:
|
| 48 |
+
`https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME`
|
| 49 |
+
|
| 50 |
+
## π Files Overview
|
| 51 |
+
|
| 52 |
+
```
|
| 53 |
+
CIFAR100HFS/
|
| 54 |
+
βββ app.py # Main Streamlit application
|
| 55 |
+
βββ model.py # ResNet-34 architecture
|
| 56 |
+
βββ cifar100_model.pth # Your trained model weights
|
| 57 |
+
βββ requirements.txt # Python dependencies
|
| 58 |
+
βββ README.md # Space description (for HF)
|
| 59 |
+
βββ .gitattributes # Git LFS configuration
|
| 60 |
+
βββ test_app_locally.py # Local testing script
|
| 61 |
+
βββ DEPLOYMENT_GUIDE.md # Detailed deployment steps
|
| 62 |
+
βββ QUICKSTART.md # This file
|
| 63 |
+
```
|
| 64 |
+
|
| 65 |
+
## π― What Your App Does
|
| 66 |
+
|
| 67 |
+
- π€ Upload images (JPG, PNG, BMP, WEBP)
|
| 68 |
+
- π€ AI classifies into 100 categories
|
| 69 |
+
- π Shows top predictions with probabilities
|
| 70 |
+
- π Interactive probability charts
|
| 71 |
+
- πΎ Download results as text
|
| 72 |
+
|
| 73 |
+
## π Common Issues
|
| 74 |
+
|
| 75 |
+
**"Module not found"**
|
| 76 |
+
```bash
|
| 77 |
+
pip install -r requirements.txt
|
| 78 |
+
```
|
| 79 |
+
|
| 80 |
+
**"Model file not found"**
|
| 81 |
+
- Ensure `cifar100_model.pth` is in the same folder as `app.py`
|
| 82 |
+
|
| 83 |
+
**"CUDA out of memory"**
|
| 84 |
+
- The app automatically falls back to CPU if GPU memory is insufficient
|
| 85 |
+
|
| 86 |
+
## π‘ Tips
|
| 87 |
+
|
| 88 |
+
- Test locally before deploying
|
| 89 |
+
- Use Git LFS for model files >10MB
|
| 90 |
+
- Check Hugging Face Space logs if issues occur
|
| 91 |
+
- CPU inference works fine for single images
|
| 92 |
+
|
| 93 |
+
---
|
| 94 |
+
|
| 95 |
+
**Ready to deploy? Follow the steps above! π**
|
| 96 |
+
|
README.md
CHANGED
|
@@ -1,14 +1,160 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version:
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
-
license:
|
| 11 |
-
short_description: Resnet34 Demo
|
| 12 |
---
|
| 13 |
|
| 14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: CIFAR-100 Image Classifier
|
| 3 |
+
emoji: πΌοΈ
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: purple
|
| 6 |
sdk: gradio
|
| 7 |
+
sdk_version: "4.0.0"
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
+
license: mit
|
|
|
|
| 11 |
---
|
| 12 |
|
| 13 |
+
# πΌοΈ CIFAR-100 Image Classifier
|
| 14 |
+
|
| 15 |
+
An interactive deep learning application that classifies images into 100 different categories using a ResNet-34 architecture.
|
| 16 |
+
|
| 17 |
+
## π Features
|
| 18 |
+
|
| 19 |
+
- **π― Accurate Classification**: Classify images into 100 different categories
|
| 20 |
+
- **π Top-10 Predictions**: View multiple predictions with confidence scores
|
| 21 |
+
- **π Real-time Visualization**: Confidence bars and probability distribution
|
| 22 |
+
- **π₯ Fast Inference**: Optimized for quick predictions
|
| 23 |
+
- **π± Mobile Friendly**: Works on any device
|
| 24 |
+
- **π¨ Beautiful UI**: Clean and intuitive Gradio interface
|
| 25 |
+
|
| 26 |
+
## π€ Model Details
|
| 27 |
+
|
| 28 |
+
- **Architecture**: ResNet-34 with BasicBlock
|
| 29 |
+
- **Framework**: PyTorch
|
| 30 |
+
- **Dataset**: CIFAR-100 (60,000 32Γ32 color images)
|
| 31 |
+
- **Input Size**: 32Γ32 RGB images (auto-resized)
|
| 32 |
+
- **Parameters**: ~21 Million
|
| 33 |
+
- **Training Features**:
|
| 34 |
+
- Data augmentation (Albumentations)
|
| 35 |
+
- Dropout regularization (5%)
|
| 36 |
+
- Learning rate scheduling
|
| 37 |
+
- Batch normalization
|
| 38 |
+
|
| 39 |
+
## π 100 Classes
|
| 40 |
+
|
| 41 |
+
The model can classify images into these categories:
|
| 42 |
+
|
| 43 |
+
### πΎ Animals (47 classes)
|
| 44 |
+
bear, beaver, bee, beetle, butterfly, camel, caterpillar, cattle, chimpanzee, cockroach, crab, crocodile, dinosaur, dolphin, elephant, flatfish, fox, hamster, kangaroo, leopard, lion, lizard, lobster, mouse, otter, porcupine, possum, rabbit, raccoon, ray, seal, shark, shrew, skunk, snail, snake, spider, squirrel, tiger, trout, turtle, whale, wolf, worm
|
| 45 |
+
|
| 46 |
+
### π Vehicles (8 classes)
|
| 47 |
+
bicycle, bus, motorcycle, pickup_truck, streetcar, tank, tractor, train
|
| 48 |
+
|
| 49 |
+
### π Household Items (15 classes)
|
| 50 |
+
bed, bottle, bowl, can, chair, clock, couch, cup, keyboard, lamp, plate, table, telephone, television, wardrobe
|
| 51 |
+
|
| 52 |
+
### π³ Nature & Places (10 classes)
|
| 53 |
+
bridge, castle, cloud, forest, house, mountain, plain, road, sea, skyscraper
|
| 54 |
+
|
| 55 |
+
### πΊ Plants & Flowers (9 classes)
|
| 56 |
+
maple_tree, oak_tree, orchid, palm_tree, pine_tree, poppy, rose, sunflower, tulip, willow_tree
|
| 57 |
+
|
| 58 |
+
### π₯ People (5 classes)
|
| 59 |
+
baby, boy, girl, man, woman
|
| 60 |
+
|
| 61 |
+
### π Food & Others (6 classes)
|
| 62 |
+
apple, aquarium_fish, lawn_mower, mushroom, orange, pear, rocket, sweet_pepper
|
| 63 |
+
|
| 64 |
+
## π How to Use
|
| 65 |
+
|
| 66 |
+
1. **Upload Image**: Click the upload area or drag & drop an image
|
| 67 |
+
2. **Automatic Classification**: The model classifies automatically
|
| 68 |
+
3. **View Results**: See the predicted class with confidence score
|
| 69 |
+
4. **Explore Predictions**: Check top-10 predictions with probabilities
|
| 70 |
+
5. **Try Examples**: Use sample images (if available)
|
| 71 |
+
|
| 72 |
+
## π‘ Tips for Best Results
|
| 73 |
+
|
| 74 |
+
- Use clear, well-lit images
|
| 75 |
+
- Center the main object in the frame
|
| 76 |
+
- Avoid heavily filtered or edited images
|
| 77 |
+
- Any image size works (automatically resized)
|
| 78 |
+
- Best results with images similar to CIFAR-100 training data
|
| 79 |
+
|
| 80 |
+
## π οΈ Technical Stack
|
| 81 |
+
|
| 82 |
+
- **Deep Learning**: PyTorch 2.0+
|
| 83 |
+
- **Interface**: Gradio 4.0+
|
| 84 |
+
- **Deployment**: Hugging Face Spaces
|
| 85 |
+
- **Image Processing**: PIL, torchvision
|
| 86 |
+
|
| 87 |
+
## π Model Architecture
|
| 88 |
+
|
| 89 |
+
```
|
| 90 |
+
ResNet-34 Structure:
|
| 91 |
+
ββββββββββββββββββββββββββββββββββββ
|
| 92 |
+
β Input: 32Γ32 RGB Image β
|
| 93 |
+
ββββββββββββββββββββββββββββββββββββ€
|
| 94 |
+
β Conv1: 3Γ3, 64 channels β
|
| 95 |
+
β BatchNorm + ReLU β
|
| 96 |
+
ββββββββββββββββββββββββββββββββββββ€
|
| 97 |
+
β Layer 1: 3 BasicBlocks (64ch) β
|
| 98 |
+
β Layer 2: 4 BasicBlocks (128ch) β
|
| 99 |
+
β Layer 3: 6 BasicBlocks (256ch) β
|
| 100 |
+
β Layer 4: 3 BasicBlocks (512ch) β
|
| 101 |
+
ββββββββββββββββββββββββββββββββββββ€
|
| 102 |
+
β Global Average Pooling β
|
| 103 |
+
β Dropout (5%) β
|
| 104 |
+
β Fully Connected: 512 β 100 β
|
| 105 |
+
β Log Softmax β
|
| 106 |
+
ββββββββββββββββββββββββββββββββββββ€
|
| 107 |
+
β Output: 100 class probabilities β
|
| 108 |
+
ββββββββββββββββββββββββββββββββββββ
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
## π Training Details
|
| 112 |
+
|
| 113 |
+
The model was trained using:
|
| 114 |
+
- **Optimizer**: Adam with weight decay
|
| 115 |
+
- **Learning Rate**: OneCycleLR scheduler
|
| 116 |
+
- **Regularization**: Dropout (5%), Weight Decay (0.0001)
|
| 117 |
+
- **Augmentation**: HorizontalFlip, ShiftScaleRotate, CoarseDropout
|
| 118 |
+
- **Batch Size**: 128-256
|
| 119 |
+
- **Epochs**: 100+
|
| 120 |
+
- **Framework**: PyTorch with Albumentations
|
| 121 |
+
|
| 122 |
+
## π Performance
|
| 123 |
+
|
| 124 |
+
- **Inference Time**: 50-200ms (CPU), 10-30ms (GPU)
|
| 125 |
+
- **Accuracy**: Trained with advanced techniques
|
| 126 |
+
- **Reliability**: Consistent predictions across similar images
|
| 127 |
+
|
| 128 |
+
## π― Use Cases
|
| 129 |
+
|
| 130 |
+
- **Educational**: Learn about image classification
|
| 131 |
+
- **Research**: Test model performance on new images
|
| 132 |
+
- **Fun**: See what the AI thinks about your photos
|
| 133 |
+
- **Prototyping**: Base for custom applications
|
| 134 |
+
|
| 135 |
+
## π¨βπ» Author
|
| 136 |
+
|
| 137 |
+
**Krishnakanth**
|
| 138 |
+
|
| 139 |
+
Developed as part of deep learning experimentation with CIFAR-100 dataset.
|
| 140 |
+
|
| 141 |
+
## π License
|
| 142 |
+
|
| 143 |
+
MIT License - Feel free to use and modify!
|
| 144 |
+
|
| 145 |
+
## π Acknowledgments
|
| 146 |
+
|
| 147 |
+
- **CIFAR-100 Dataset**: Alex Krizhevsky, Vinod Nair, and Geoffrey Hinton
|
| 148 |
+
- **ResNet Architecture**: Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun
|
| 149 |
+
- **Hugging Face**: For the amazing Spaces platform
|
| 150 |
+
- **Gradio**: For the beautiful interface framework
|
| 151 |
+
|
| 152 |
+
## π Links
|
| 153 |
+
|
| 154 |
+
- [CIFAR-100 Dataset Info](https://www.cs.toronto.edu/~kriz/cifar.html)
|
| 155 |
+
- [ResNet Paper](https://arxiv.org/abs/1512.03385)
|
| 156 |
+
- [Gradio Documentation](https://www.gradio.app/docs/)
|
| 157 |
+
|
| 158 |
+
---
|
| 159 |
+
|
| 160 |
+
**Try it now! Upload an image and see the magic of deep learning! β¨**
|
README_GRADIO.txt
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
================================================================================
|
| 2 |
+
π¨ CIFAR-100 CLASSIFIER
|
| 3 |
+
NOW WITH GRADIO!
|
| 4 |
+
================================================================================
|
| 5 |
+
|
| 6 |
+
β
CONVERTED TO GRADIO
|
| 7 |
+
|
| 8 |
+
Your app has been successfully converted from Streamlit to Gradio for better
|
| 9 |
+
Hugging Face Spaces compatibility!
|
| 10 |
+
|
| 11 |
+
================================================================================
|
| 12 |
+
π― WHAT CHANGED
|
| 13 |
+
================================================================================
|
| 14 |
+
|
| 15 |
+
UPDATED FILES:
|
| 16 |
+
β
app.py ................... Now uses Gradio interface
|
| 17 |
+
β
requirements.txt ......... Changed streamlit β gradio
|
| 18 |
+
β
README.md ................ Updated SDK to gradio
|
| 19 |
+
β
run_local.bat ............ Updated port 8501 β 7860
|
| 20 |
+
β
run_local.sh ............. Updated port 8501 β 7860
|
| 21 |
+
β
test_app_locally.py ...... Updated for Gradio
|
| 22 |
+
|
| 23 |
+
UNCHANGED FILES:
|
| 24 |
+
β
model.py ................. Same ResNet-34 architecture
|
| 25 |
+
β
cifar100_model.pth ....... Same trained weights
|
| 26 |
+
β
.gitattributes ........... Same LFS configuration
|
| 27 |
+
|
| 28 |
+
NEW FILES:
|
| 29 |
+
β
GRADIO_DEPLOYMENT.md ..... Gradio-specific guide
|
| 30 |
+
|
| 31 |
+
================================================================================
|
| 32 |
+
π QUICK START (SIMPLER NOW!)
|
| 33 |
+
================================================================================
|
| 34 |
+
|
| 35 |
+
TEST LOCALLY:
|
| 36 |
+
-------------
|
| 37 |
+
Windows:
|
| 38 |
+
β Double-click: run_local.bat
|
| 39 |
+
|
| 40 |
+
Any OS:
|
| 41 |
+
β Run: python test_app_locally.py
|
| 42 |
+
β Or: python app.py
|
| 43 |
+
β Open: http://localhost:7860
|
| 44 |
+
|
| 45 |
+
DEPLOY TO HUGGING FACE:
|
| 46 |
+
------------------------
|
| 47 |
+
1. Go to: https://huggingface.co/new-space
|
| 48 |
+
2. Choose SDK: Gradio
|
| 49 |
+
3. Upload 6 files (drag & drop):
|
| 50 |
+
β’ app.py
|
| 51 |
+
β’ model.py
|
| 52 |
+
β’ cifar100_model.pth
|
| 53 |
+
β’ requirements.txt
|
| 54 |
+
β’ README.md
|
| 55 |
+
β’ .gitattributes
|
| 56 |
+
4. Done! App live in 2-3 minutes
|
| 57 |
+
|
| 58 |
+
================================================================================
|
| 59 |
+
π¨ GRADIO ADVANTAGES
|
| 60 |
+
================================================================================
|
| 61 |
+
|
| 62 |
+
β
EASIER DEPLOYMENT
|
| 63 |
+
β’ Native Hugging Face integration
|
| 64 |
+
β’ Simpler configuration
|
| 65 |
+
β’ Faster build times
|
| 66 |
+
|
| 67 |
+
β
BETTER USER EXPERIENCE
|
| 68 |
+
β’ Automatic prediction on upload
|
| 69 |
+
β’ Multiple upload options (file, webcam, clipboard)
|
| 70 |
+
β’ Cleaner, more intuitive interface
|
| 71 |
+
β’ Built-in example images support
|
| 72 |
+
|
| 73 |
+
β
DEVELOPER FRIENDLY
|
| 74 |
+
β’ Less boilerplate code
|
| 75 |
+
β’ Easier to customize
|
| 76 |
+
β’ Automatic API generation
|
| 77 |
+
β’ Better error handling
|
| 78 |
+
|
| 79 |
+
β
PERFORMANCE
|
| 80 |
+
β’ Faster loading
|
| 81 |
+
β’ Lower memory footprint
|
| 82 |
+
β’ Better mobile support
|
| 83 |
+
|
| 84 |
+
================================================================================
|
| 85 |
+
π± NEW INTERFACE FEATURES
|
| 86 |
+
================================================================================
|
| 87 |
+
|
| 88 |
+
UPLOAD OPTIONS:
|
| 89 |
+
β’ π File upload (drag & drop)
|
| 90 |
+
β’ π· Webcam capture
|
| 91 |
+
β’ π Clipboard paste
|
| 92 |
+
|
| 93 |
+
AUTOMATIC FEATURES:
|
| 94 |
+
β’ β‘ Instant prediction on upload (no button click needed)
|
| 95 |
+
β’ π― Top-10 predictions automatically displayed
|
| 96 |
+
β’ π Confidence bars automatically shown
|
| 97 |
+
β’ π¨ Color-coded results
|
| 98 |
+
|
| 99 |
+
DISPLAY:
|
| 100 |
+
β’ Predicted class in large, bold text
|
| 101 |
+
β’ Confidence percentage with emoji
|
| 102 |
+
β’ Top-10 predictions with probability bars
|
| 103 |
+
β’ Sorted by confidence (highest first)
|
| 104 |
+
|
| 105 |
+
================================================================================
|
| 106 |
+
π§ͺ TESTING YOUR APP
|
| 107 |
+
================================================================================
|
| 108 |
+
|
| 109 |
+
AUTOMATED TEST (Recommended):
|
| 110 |
+
|
| 111 |
+
python test_app_locally.py
|
| 112 |
+
|
| 113 |
+
β
Checks dependencies
|
| 114 |
+
β
Verifies model file
|
| 115 |
+
β
Tests model loading
|
| 116 |
+
β
Offers to launch app
|
| 117 |
+
|
| 118 |
+
MANUAL TEST:
|
| 119 |
+
|
| 120 |
+
1. pip install -r requirements.txt
|
| 121 |
+
2. python app.py
|
| 122 |
+
3. Open http://localhost:7860
|
| 123 |
+
4. Upload test image
|
| 124 |
+
5. Verify predictions!
|
| 125 |
+
|
| 126 |
+
WHAT TO TEST:
|
| 127 |
+
β‘ Image uploads successfully
|
| 128 |
+
β‘ Prediction appears automatically
|
| 129 |
+
β‘ Confidence score shows
|
| 130 |
+
β‘ Top-10 predictions displayed
|
| 131 |
+
β‘ Confidence bars visible
|
| 132 |
+
β‘ Can try multiple images
|
| 133 |
+
β‘ Webcam option works (if available)
|
| 134 |
+
|
| 135 |
+
================================================================================
|
| 136 |
+
βοΈ DEPLOYMENT PROCESS
|
| 137 |
+
================================================================================
|
| 138 |
+
|
| 139 |
+
STEP 1: CREATE SPACE
|
| 140 |
+
--------------------
|
| 141 |
+
Go to: https://huggingface.co/new-space
|
| 142 |
+
|
| 143 |
+
Fill in:
|
| 144 |
+
Space name: cifar100-classifier
|
| 145 |
+
License: MIT
|
| 146 |
+
SDK: Gradio β IMPORTANT!
|
| 147 |
+
SDK version: 4.0.0
|
| 148 |
+
Hardware: CPU (Basic - Free)
|
| 149 |
+
|
| 150 |
+
Click: Create Space
|
| 151 |
+
|
| 152 |
+
STEP 2: UPLOAD FILES
|
| 153 |
+
--------------------
|
| 154 |
+
Method A - Web UI (Easiest):
|
| 155 |
+
1. Click "Files" tab
|
| 156 |
+
2. Click "Add file" β "Upload files"
|
| 157 |
+
3. Drag & drop all 6 core files
|
| 158 |
+
4. Commit changes
|
| 159 |
+
|
| 160 |
+
Method B - Git CLI:
|
| 161 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE
|
| 162 |
+
cd YOUR_SPACE
|
| 163 |
+
|
| 164 |
+
(Copy all files from CIFAR100HFS)
|
| 165 |
+
|
| 166 |
+
git lfs install
|
| 167 |
+
git lfs track "*.pth"
|
| 168 |
+
git add .
|
| 169 |
+
git commit -m "Deploy CIFAR-100 Gradio app"
|
| 170 |
+
git push
|
| 171 |
+
|
| 172 |
+
STEP 3: WAIT FOR BUILD
|
| 173 |
+
----------------------
|
| 174 |
+
β’ Build starts automatically
|
| 175 |
+
β’ Takes 2-3 minutes
|
| 176 |
+
β’ Check "Logs" tab for progress
|
| 177 |
+
β’ Status changes to "Running"
|
| 178 |
+
|
| 179 |
+
STEP 4: TEST YOUR DEPLOYED APP
|
| 180 |
+
-------------------------------
|
| 181 |
+
URL: https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE
|
| 182 |
+
|
| 183 |
+
Test:
|
| 184 |
+
β‘ App loads without errors
|
| 185 |
+
β‘ Can upload images
|
| 186 |
+
β‘ Predictions work
|
| 187 |
+
β‘ Confidence scores display
|
| 188 |
+
|
| 189 |
+
STEP 5: SHARE!
|
| 190 |
+
--------------
|
| 191 |
+
β’ Copy your Space URL
|
| 192 |
+
β’ Share on social media
|
| 193 |
+
β’ Add to your portfolio
|
| 194 |
+
β’ Get feedback from users
|
| 195 |
+
|
| 196 |
+
================================================================================
|
| 197 |
+
π― GRADIO VS STREAMLIT
|
| 198 |
+
================================================================================
|
| 199 |
+
|
| 200 |
+
GRADIO WINS:
|
| 201 |
+
β
Simpler deployment to HF
|
| 202 |
+
β
Automatic prediction
|
| 203 |
+
β
Multiple input options
|
| 204 |
+
β
Built-in API
|
| 205 |
+
β
Faster builds
|
| 206 |
+
β
Better mobile support
|
| 207 |
+
|
| 208 |
+
STREAMLIT ADVANTAGES:
|
| 209 |
+
β’ More layout control
|
| 210 |
+
β’ Custom components
|
| 211 |
+
β’ Better for complex dashboards
|
| 212 |
+
|
| 213 |
+
FOR HUGGING FACE SPACES: Gradio is the better choice! β
|
| 214 |
+
|
| 215 |
+
================================================================================
|
| 216 |
+
π¦ FILES NEEDED FOR DEPLOYMENT
|
| 217 |
+
================================================================================
|
| 218 |
+
|
| 219 |
+
CORE FILES (6):
|
| 220 |
+
1. app.py ..................... Main Gradio application
|
| 221 |
+
2. model.py ................... ResNet-34 architecture
|
| 222 |
+
3. cifar100_model.pth ......... Trained model (93 MB)
|
| 223 |
+
4. requirements.txt ........... Dependencies (with gradio)
|
| 224 |
+
5. README.md .................. Space description (sdk: gradio)
|
| 225 |
+
6. .gitattributes ............. Git LFS config
|
| 226 |
+
|
| 227 |
+
TOTAL SIZE: ~93 MB (mostly the model file)
|
| 228 |
+
|
| 229 |
+
================================================================================
|
| 230 |
+
π¨ CUSTOMIZATION
|
| 231 |
+
================================================================================
|
| 232 |
+
|
| 233 |
+
CHANGE THEME:
|
| 234 |
+
app.py line 185:
|
| 235 |
+
theme=gr.themes.Soft()
|
| 236 |
+
|
| 237 |
+
Options:
|
| 238 |
+
β’ gr.themes.Soft() β Current
|
| 239 |
+
β’ gr.themes.Glass()
|
| 240 |
+
β’ gr.themes.Monochrome()
|
| 241 |
+
β’ gr.themes.Base()
|
| 242 |
+
|
| 243 |
+
CHANGE COLORS:
|
| 244 |
+
app.py line 147-149:
|
| 245 |
+
Update color hex codes for confidence levels
|
| 246 |
+
|
| 247 |
+
ADD EXAMPLES:
|
| 248 |
+
1. Create examples/ folder
|
| 249 |
+
2. Add sample images
|
| 250 |
+
3. Update app.py line 253:
|
| 251 |
+
examples=["examples/image1.jpg", "examples/image2.jpg"]
|
| 252 |
+
|
| 253 |
+
CHANGE NUMBER OF TOP PREDICTIONS:
|
| 254 |
+
app.py line 246:
|
| 255 |
+
num_top_classes=10 # Change to 5, 15, 20, etc.
|
| 256 |
+
|
| 257 |
+
================================================================================
|
| 258 |
+
π‘ GRADIO PRO TIPS
|
| 259 |
+
================================================================================
|
| 260 |
+
|
| 261 |
+
1. AUTO-PREDICT: Gradio predicts automatically on upload (no button needed)
|
| 262 |
+
|
| 263 |
+
2. SHARE LINK: Add share=True to demo.launch() for temporary public URL
|
| 264 |
+
|
| 265 |
+
3. QUEUE: Enable queuing for multiple users:
|
| 266 |
+
demo.queue().launch()
|
| 267 |
+
|
| 268 |
+
4. API ACCESS: Your deployed app automatically has REST API!
|
| 269 |
+
|
| 270 |
+
5. EXAMPLES: Always add example images for better UX
|
| 271 |
+
|
| 272 |
+
6. MOBILE: Test on mobile - Gradio is mobile-optimized
|
| 273 |
+
|
| 274 |
+
7. CACHING: Gradio caches model automatically
|
| 275 |
+
|
| 276 |
+
8. FLAGS: Users can flag interesting predictions for you
|
| 277 |
+
|
| 278 |
+
================================================================================
|
| 279 |
+
π DEPLOYMENT CHECKLIST
|
| 280 |
+
================================================================================
|
| 281 |
+
|
| 282 |
+
PRE-DEPLOYMENT:
|
| 283 |
+
β‘ Tested locally (python app.py)
|
| 284 |
+
β‘ Model loads without errors
|
| 285 |
+
β‘ Predictions work correctly
|
| 286 |
+
β‘ All 6 core files ready
|
| 287 |
+
β‘ requirements.txt updated to gradio
|
| 288 |
+
|
| 289 |
+
HUGGING FACE:
|
| 290 |
+
β‘ Created Space with Gradio SDK
|
| 291 |
+
β‘ Uploaded all 6 files
|
| 292 |
+
β‘ .gitattributes uploaded first
|
| 293 |
+
β‘ cifar100_model.pth tracked with LFS
|
| 294 |
+
|
| 295 |
+
POST-DEPLOYMENT:
|
| 296 |
+
β‘ App builds successfully
|
| 297 |
+
β‘ Tested uploaded image
|
| 298 |
+
β‘ Predictions accurate
|
| 299 |
+
β‘ Shared URL works
|
| 300 |
+
|
| 301 |
+
================================================================================
|
| 302 |
+
π― ADVANTAGES OF THIS SETUP
|
| 303 |
+
================================================================================
|
| 304 |
+
|
| 305 |
+
β
PRODUCTION READY: Complete, polished application
|
| 306 |
+
β
WELL DOCUMENTED: Comprehensive guides included
|
| 307 |
+
β
GRADIO POWERED: Best for HF Spaces
|
| 308 |
+
β
AUTO-PREDICT: No clicking needed
|
| 309 |
+
β
MOBILE FRIENDLY: Works on phones/tablets
|
| 310 |
+
β
FREE TO DEPLOY: Works on HF free tier
|
| 311 |
+
β
EASY TO SHARE: Simple URL sharing
|
| 312 |
+
β
HAS API: Automatic API endpoint
|
| 313 |
+
|
| 314 |
+
================================================================================
|
| 315 |
+
π DOCUMENTATION
|
| 316 |
+
================================================================================
|
| 317 |
+
|
| 318 |
+
START HERE:
|
| 319 |
+
β README_GRADIO.txt ......... This file (Gradio overview)
|
| 320 |
+
β GRADIO_DEPLOYMENT.md ...... Detailed Gradio guide
|
| 321 |
+
β START_HERE.md ............. General orientation
|
| 322 |
+
|
| 323 |
+
QUICK REFERENCE:
|
| 324 |
+
β QUICKSTART.md ............. Fast deployment (updated)
|
| 325 |
+
|
| 326 |
+
DETAILED:
|
| 327 |
+
β DEPLOYMENT_GUIDE.md ....... Step-by-step (updated)
|
| 328 |
+
β FILES_EXPLAINED.md ........ File descriptions
|
| 329 |
+
|
| 330 |
+
================================================================================
|
| 331 |
+
π YOU'RE READY!
|
| 332 |
+
================================================================================
|
| 333 |
+
|
| 334 |
+
Your Gradio app is simpler and better suited for Hugging Face!
|
| 335 |
+
|
| 336 |
+
NEXT STEPS:
|
| 337 |
+
|
| 338 |
+
1. Test locally:
|
| 339 |
+
β python test_app_locally.py
|
| 340 |
+
|
| 341 |
+
2. Deploy to HF:
|
| 342 |
+
β Create Gradio Space
|
| 343 |
+
β Upload 6 files
|
| 344 |
+
β Done!
|
| 345 |
+
|
| 346 |
+
3. Share your app:
|
| 347 |
+
β Get your HF URL
|
| 348 |
+
β Share with the world! π
|
| 349 |
+
|
| 350 |
+
================================================================================
|
| 351 |
+
|
| 352 |
+
Run this now: python app.py
|
| 353 |
+
|
| 354 |
+
Then open: http://localhost:7860
|
| 355 |
+
|
| 356 |
+
================================================================================
|
| 357 |
+
|
| 358 |
+
Questions? Read GRADIO_DEPLOYMENT.md for complete guide!
|
| 359 |
+
|
| 360 |
+
Created: October 10, 2025
|
| 361 |
+
By: Krishnakanth
|
| 362 |
+
Framework: Gradio (updated from Streamlit)
|
| 363 |
+
|
| 364 |
+
================================================================================
|
| 365 |
+
|
START_HERE.md
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# π― START HERE - CIFAR-100 Classifier Deployment
|
| 2 |
+
|
| 3 |
+
## π¦ What You Have
|
| 4 |
+
|
| 5 |
+
Your **CIFAR-100 Image Classifier** is ready for deployment! This is a complete Gradio web application that:
|
| 6 |
+
|
| 7 |
+
β
Classifies images into **100 categories**
|
| 8 |
+
β
Shows **confidence scores** and **probabilities**
|
| 9 |
+
β
Has a **beautiful, interactive UI**
|
| 10 |
+
β
Works on **CPU or GPU**
|
| 11 |
+
β
Ready for **Hugging Face Spaces**
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## π¦ Two Options: Choose Your Path
|
| 16 |
+
|
| 17 |
+
### Option A: π Test Locally First (RECOMMENDED)
|
| 18 |
+
|
| 19 |
+
**Windows Users:**
|
| 20 |
+
1. Double-click `run_local.bat`
|
| 21 |
+
2. Wait for browser to open at `http://localhost:7860`
|
| 22 |
+
3. Upload an image and test the classifier!
|
| 23 |
+
|
| 24 |
+
**Alternative (any OS):**
|
| 25 |
+
```bash
|
| 26 |
+
python app.py
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
### Option B: βοΈ Deploy Directly to Hugging Face
|
| 30 |
+
|
| 31 |
+
Skip to the "Deploy to Hugging Face" section below.
|
| 32 |
+
|
| 33 |
+
---
|
| 34 |
+
|
| 35 |
+
## π§ͺ Testing Your App Locally
|
| 36 |
+
|
| 37 |
+
### Quick Test (Automated)
|
| 38 |
+
|
| 39 |
+
```bash
|
| 40 |
+
python test_app_locally.py
|
| 41 |
+
```
|
| 42 |
+
|
| 43 |
+
This script will:
|
| 44 |
+
1. β
Check all dependencies are installed
|
| 45 |
+
2. β
Verify model file exists (cifar100_model.pth)
|
| 46 |
+
3. β
Test model loading
|
| 47 |
+
4. β
Offer to run the app
|
| 48 |
+
|
| 49 |
+
### Manual Test
|
| 50 |
+
|
| 51 |
+
```bash
|
| 52 |
+
# Install dependencies
|
| 53 |
+
pip install -r requirements.txt
|
| 54 |
+
|
| 55 |
+
# Run the app
|
| 56 |
+
python app.py
|
| 57 |
+
```
|
| 58 |
+
|
| 59 |
+
Then:
|
| 60 |
+
1. Open `http://localhost:7860` in your browser
|
| 61 |
+
2. Upload a test image (any JPG, PNG, etc.)
|
| 62 |
+
3. Verify you see predictions with probabilities
|
| 63 |
+
4. Check top predictions and charts work
|
| 64 |
+
|
| 65 |
+
---
|
| 66 |
+
|
| 67 |
+
## βοΈ Deploy to Hugging Face Spaces
|
| 68 |
+
|
| 69 |
+
### Step-by-Step Deployment
|
| 70 |
+
|
| 71 |
+
#### 1. Create a Hugging Face Space
|
| 72 |
+
|
| 73 |
+
1. Go to [huggingface.co/new-space](https://huggingface.co/new-space)
|
| 74 |
+
2. Fill in:
|
| 75 |
+
- **Owner**: Your username
|
| 76 |
+
- **Space name**: `cifar100-classifier` (or any name you like)
|
| 77 |
+
- **License**: MIT
|
| 78 |
+
- **Select SDK**: **Gradio**
|
| 79 |
+
- **SDK version**: 4.0.0
|
| 80 |
+
- **Hardware**: CPU (Basic - Free) or upgrade for GPU
|
| 81 |
+
3. Click **"Create Space"**
|
| 82 |
+
|
| 83 |
+
#### 2. Upload Files to Your Space
|
| 84 |
+
|
| 85 |
+
**Method 1: Web Interface (Easiest)**
|
| 86 |
+
1. Click "Files" tab in your new space
|
| 87 |
+
2. Click "Add file" β "Upload files"
|
| 88 |
+
3. Upload all files from `CIFAR100HFS` folder:
|
| 89 |
+
- app.py
|
| 90 |
+
- model.py
|
| 91 |
+
- cifar100_model.pth
|
| 92 |
+
- requirements.txt
|
| 93 |
+
- README.md
|
| 94 |
+
- .gitattributes
|
| 95 |
+
4. Click "Commit changes to main"
|
| 96 |
+
|
| 97 |
+
**Method 2: Git CLI (Recommended for large models)**
|
| 98 |
+
```bash
|
| 99 |
+
# Clone your space
|
| 100 |
+
git clone https://huggingface.co/spaces/YOUR_USERNAME/cifar100-classifier
|
| 101 |
+
cd cifar100-classifier
|
| 102 |
+
|
| 103 |
+
# Copy files
|
| 104 |
+
# (Copy all files from CIFAR100HFS to this directory)
|
| 105 |
+
|
| 106 |
+
# Setup Git LFS for large files
|
| 107 |
+
git lfs install
|
| 108 |
+
git lfs track "*.pth"
|
| 109 |
+
|
| 110 |
+
# Add and commit
|
| 111 |
+
git add .
|
| 112 |
+
git commit -m "Deploy CIFAR-100 classifier"
|
| 113 |
+
|
| 114 |
+
# Push to Hugging Face
|
| 115 |
+
git push
|
| 116 |
+
```
|
| 117 |
+
|
| 118 |
+
#### 3. Wait for Build
|
| 119 |
+
|
| 120 |
+
- Your space will automatically build (2-5 minutes)
|
| 121 |
+
- Check the "Logs" tab if there are issues
|
| 122 |
+
- Once built, your app will be live!
|
| 123 |
+
|
| 124 |
+
#### 4. Access Your App
|
| 125 |
+
|
| 126 |
+
Your app will be available at:
|
| 127 |
+
```
|
| 128 |
+
https://huggingface.co/spaces/YOUR_USERNAME/cifar100-classifier
|
| 129 |
+
```
|
| 130 |
+
|
| 131 |
+
---
|
| 132 |
+
|
| 133 |
+
## π What Your Users Will See
|
| 134 |
+
|
| 135 |
+
1. **Landing Page**:
|
| 136 |
+
- Title: "CIFAR-100 Image Classifier"
|
| 137 |
+
- Upload button
|
| 138 |
+
- Settings sidebar
|
| 139 |
+
|
| 140 |
+
2. **After Upload**:
|
| 141 |
+
- Original image displayed
|
| 142 |
+
- **Predicted class** in large text
|
| 143 |
+
- **Confidence percentage** with color coding
|
| 144 |
+
- Top-K predictions table
|
| 145 |
+
- Interactive probability bar chart
|
| 146 |
+
|
| 147 |
+
3. **Advanced Options**:
|
| 148 |
+
- Adjust number of top predictions (slider)
|
| 149 |
+
- View all 100 class probabilities (checkbox)
|
| 150 |
+
- Download results as text file
|
| 151 |
+
|
| 152 |
+
---
|
| 153 |
+
|
| 154 |
+
## π¨ Customization (Optional)
|
| 155 |
+
|
| 156 |
+
### Change App Title
|
| 157 |
+
Edit `app.py` line 34:
|
| 158 |
+
```python
|
| 159 |
+
page_title="Your Custom Title"
|
| 160 |
+
```
|
| 161 |
+
|
| 162 |
+
### Change Color Theme
|
| 163 |
+
Edit `README.md` lines 3-4:
|
| 164 |
+
```yaml
|
| 165 |
+
colorFrom: blue # Change to: red, green, yellow, etc.
|
| 166 |
+
colorTo: purple # Change to: pink, indigo, teal, etc.
|
| 167 |
+
```
|
| 168 |
+
|
| 169 |
+
### Add Your Logo
|
| 170 |
+
Add to sidebar in `app.py`:
|
| 171 |
+
```python
|
| 172 |
+
st.sidebar.image("your_logo.png")
|
| 173 |
+
```
|
| 174 |
+
|
| 175 |
+
---
|
| 176 |
+
|
| 177 |
+
## π Troubleshooting
|
| 178 |
+
|
| 179 |
+
### Local Testing Issues
|
| 180 |
+
|
| 181 |
+
**"ModuleNotFoundError"**
|
| 182 |
+
```bash
|
| 183 |
+
pip install -r requirements.txt
|
| 184 |
+
```
|
| 185 |
+
|
| 186 |
+
**"Model file not found"**
|
| 187 |
+
- Ensure `cifar100_model.pth` is in the same folder as `app.py`
|
| 188 |
+
|
| 189 |
+
**"Port already in use"**
|
| 190 |
+
```bash
|
| 191 |
+
streamlit run app.py --server.port 8502
|
| 192 |
+
```
|
| 193 |
+
|
| 194 |
+
### Hugging Face Deployment Issues
|
| 195 |
+
|
| 196 |
+
**"Build failed"**
|
| 197 |
+
- Check Logs tab in your space
|
| 198 |
+
- Verify `requirements.txt` is correct
|
| 199 |
+
- Ensure all files uploaded successfully
|
| 200 |
+
|
| 201 |
+
**"Model too large"**
|
| 202 |
+
- Model file is 92MB - should work fine
|
| 203 |
+
- Git LFS is tracking it (check `.gitattributes`)
|
| 204 |
+
|
| 205 |
+
**"App crashes on inference"**
|
| 206 |
+
- Check if model architecture matches checkpoint
|
| 207 |
+
- Verify CIFAR-100 classes list is correct
|
| 208 |
+
|
| 209 |
+
---
|
| 210 |
+
|
| 211 |
+
## π Performance Optimization
|
| 212 |
+
|
| 213 |
+
### For Faster Inference
|
| 214 |
+
|
| 215 |
+
1. **Use GPU hardware** on Hugging Face (paid)
|
| 216 |
+
2. **Reduce image size** if needed
|
| 217 |
+
3. **Batch predictions** for multiple images
|
| 218 |
+
|
| 219 |
+
### For Better UX
|
| 220 |
+
|
| 221 |
+
1. Add **loading spinners** (already included)
|
| 222 |
+
2. Add **progress bars** for long operations
|
| 223 |
+
3. **Cache results** to avoid re-computation
|
| 224 |
+
|
| 225 |
+
---
|
| 226 |
+
|
| 227 |
+
## π Learn More
|
| 228 |
+
|
| 229 |
+
- **Streamlit Docs**: [docs.streamlit.io](https://docs.streamlit.io)
|
| 230 |
+
- **Hugging Face Spaces**: [huggingface.co/docs/hub/spaces](https://huggingface.co/docs/hub/spaces)
|
| 231 |
+
- **PyTorch**: [pytorch.org/docs](https://pytorch.org/docs)
|
| 232 |
+
|
| 233 |
+
---
|
| 234 |
+
|
| 235 |
+
## β¨ What's Next?
|
| 236 |
+
|
| 237 |
+
After successful deployment:
|
| 238 |
+
|
| 239 |
+
1. **Share your space** with friends and colleagues
|
| 240 |
+
2. **Collect feedback** from users
|
| 241 |
+
3. **Monitor performance** in HF analytics
|
| 242 |
+
4. **Iterate and improve** based on usage
|
| 243 |
+
5. **Add to your portfolio** or resume!
|
| 244 |
+
|
| 245 |
+
---
|
| 246 |
+
|
| 247 |
+
## π Quick Command Reference
|
| 248 |
+
|
| 249 |
+
```bash
|
| 250 |
+
# Test locally
|
| 251 |
+
python test_app_locally.py
|
| 252 |
+
|
| 253 |
+
# Run app locally
|
| 254 |
+
streamlit run app.py
|
| 255 |
+
|
| 256 |
+
# Deploy to HF (from your space directory)
|
| 257 |
+
git add .
|
| 258 |
+
git commit -m "Update app"
|
| 259 |
+
git push
|
| 260 |
+
|
| 261 |
+
# Check model file size
|
| 262 |
+
# Windows PowerShell:
|
| 263 |
+
(Get-Item cifar100_model.pth).length / 1MB
|
| 264 |
+
```
|
| 265 |
+
|
| 266 |
+
---
|
| 267 |
+
|
| 268 |
+
## π You're Ready!
|
| 269 |
+
|
| 270 |
+
Everything is set up and ready to go. Your next step:
|
| 271 |
+
|
| 272 |
+
**β Run `python test_app_locally.py` to test**
|
| 273 |
+
|
| 274 |
+
**β Or jump straight to deployment following steps above!**
|
| 275 |
+
|
| 276 |
+
Good luck! π
|
| 277 |
+
|
| 278 |
+
---
|
| 279 |
+
|
| 280 |
+
*Created: October 10, 2025*
|
| 281 |
+
*Author: Krishnakanth*
|
| 282 |
+
|
app.py
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
CIFAR-100 Image Classification App
|
| 3 |
+
Deployed on Hugging Face Spaces with Gradio
|
| 4 |
+
|
| 5 |
+
Author: Krishnakanth
|
| 6 |
+
Date: 2025-10-10
|
| 7 |
+
"""
|
| 8 |
+
|
| 9 |
+
import gradio as gr
|
| 10 |
+
import torch
|
| 11 |
+
import torch.nn as nn
|
| 12 |
+
import torch.nn.functional as F
|
| 13 |
+
from PIL import Image
|
| 14 |
+
import numpy as np
|
| 15 |
+
from typing import Dict, Tuple, List
|
| 16 |
+
import torchvision.transforms as transforms
|
| 17 |
+
import plotly.graph_objects as go
|
| 18 |
+
|
| 19 |
+
# Import model architecture
|
| 20 |
+
from model import CIFAR100ResNet34, ModelConfig
|
| 21 |
+
|
| 22 |
+
# CIFAR-100 class names
|
| 23 |
+
CIFAR100_CLASSES = [
|
| 24 |
+
'apple', 'aquarium_fish', 'baby', 'bear', 'beaver', 'bed', 'bee', 'beetle',
|
| 25 |
+
'bicycle', 'bottle', 'bowl', 'boy', 'bridge', 'bus', 'butterfly', 'camel',
|
| 26 |
+
'can', 'castle', 'caterpillar', 'cattle', 'chair', 'chimpanzee', 'clock',
|
| 27 |
+
'cloud', 'cockroach', 'couch', 'crab', 'crocodile', 'cup', 'dinosaur',
|
| 28 |
+
'dolphin', 'elephant', 'flatfish', 'forest', 'fox', 'girl', 'hamster',
|
| 29 |
+
'house', 'kangaroo', 'keyboard', 'lamp', 'lawn_mower', 'leopard', 'lion',
|
| 30 |
+
'lizard', 'lobster', 'man', 'maple_tree', 'motorcycle', 'mountain', 'mouse',
|
| 31 |
+
'mushroom', 'oak_tree', 'orange', 'orchid', 'otter', 'palm_tree', 'pear',
|
| 32 |
+
'pickup_truck', 'pine_tree', 'plain', 'plate', 'poppy', 'porcupine',
|
| 33 |
+
'possum', 'rabbit', 'raccoon', 'ray', 'road', 'rocket', 'rose', 'sea',
|
| 34 |
+
'seal', 'shark', 'shrew', 'skunk', 'skyscraper', 'snail', 'snake',
|
| 35 |
+
'spider', 'squirrel', 'streetcar', 'sunflower', 'sweet_pepper', 'table',
|
| 36 |
+
'tank', 'telephone', 'television', 'tiger', 'tractor', 'train', 'trout',
|
| 37 |
+
'tulip', 'turtle', 'wardrobe', 'whale', 'willow_tree', 'wolf', 'woman', 'worm'
|
| 38 |
+
]
|
| 39 |
+
|
| 40 |
+
# CIFAR-100 normalization values
|
| 41 |
+
CIFAR100_MEAN = (0.5071, 0.4867, 0.4408)
|
| 42 |
+
CIFAR100_STD = (0.2675, 0.2565, 0.2761)
|
| 43 |
+
|
| 44 |
+
# Global variables for model
|
| 45 |
+
model = None
|
| 46 |
+
device = None
|
| 47 |
+
|
| 48 |
+
|
| 49 |
+
def load_model(model_path: str = "cifar100_model.pth"):
|
| 50 |
+
"""Load the trained CIFAR-100 model."""
|
| 51 |
+
global model, device
|
| 52 |
+
|
| 53 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 54 |
+
|
| 55 |
+
# Create model configuration
|
| 56 |
+
config = ModelConfig(
|
| 57 |
+
input_channels=3,
|
| 58 |
+
input_size=(32, 32),
|
| 59 |
+
num_classes=100,
|
| 60 |
+
dropout_rate=0.05
|
| 61 |
+
)
|
| 62 |
+
|
| 63 |
+
# Initialize model
|
| 64 |
+
model = CIFAR100ResNet34(config)
|
| 65 |
+
|
| 66 |
+
# Load trained weights
|
| 67 |
+
try:
|
| 68 |
+
# PyTorch 2.6+ requires weights_only=False for checkpoints with custom classes
|
| 69 |
+
checkpoint = torch.load(model_path, map_location=device, weights_only=False)
|
| 70 |
+
|
| 71 |
+
if 'model_state_dict' in checkpoint:
|
| 72 |
+
model.load_state_dict(checkpoint['model_state_dict'])
|
| 73 |
+
print(f"β
Model loaded with metrics: {checkpoint.get('metrics', {})}")
|
| 74 |
+
else:
|
| 75 |
+
model.load_state_dict(checkpoint)
|
| 76 |
+
|
| 77 |
+
model.to(device)
|
| 78 |
+
model.eval()
|
| 79 |
+
|
| 80 |
+
total_params = sum(p.numel() for p in model.parameters())
|
| 81 |
+
print(f"β
Model loaded successfully on {device}")
|
| 82 |
+
print(f" Total parameters: {total_params:,}")
|
| 83 |
+
|
| 84 |
+
return True
|
| 85 |
+
|
| 86 |
+
except Exception as e:
|
| 87 |
+
print(f"β Error loading model: {str(e)}")
|
| 88 |
+
return False
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
def get_transform():
|
| 92 |
+
"""Get image transformation pipeline."""
|
| 93 |
+
return transforms.Compose([
|
| 94 |
+
transforms.Resize((32, 32)),
|
| 95 |
+
transforms.ToTensor(),
|
| 96 |
+
transforms.Normalize(mean=CIFAR100_MEAN, std=CIFAR100_STD)
|
| 97 |
+
])
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
def preprocess_image(image: Image.Image) -> torch.Tensor:
|
| 101 |
+
"""Preprocess image for model input."""
|
| 102 |
+
# Convert to RGB if necessary
|
| 103 |
+
if image.mode != 'RGB':
|
| 104 |
+
image = image.convert('RGB')
|
| 105 |
+
|
| 106 |
+
# Apply transformations
|
| 107 |
+
transform = get_transform()
|
| 108 |
+
image_tensor = transform(image)
|
| 109 |
+
|
| 110 |
+
# Add batch dimension
|
| 111 |
+
image_tensor = image_tensor.unsqueeze(0)
|
| 112 |
+
|
| 113 |
+
return image_tensor
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
def predict(image: Image.Image) -> Tuple[Dict[str, float], str, str]:
|
| 117 |
+
"""
|
| 118 |
+
Make prediction on image.
|
| 119 |
+
|
| 120 |
+
Returns:
|
| 121 |
+
- Dictionary of top predictions {class: probability}
|
| 122 |
+
- HTML formatted main prediction
|
| 123 |
+
- Plotly chart (not used in Gradio, for reference)
|
| 124 |
+
"""
|
| 125 |
+
if model is None:
|
| 126 |
+
return {}, "β Model not loaded", ""
|
| 127 |
+
|
| 128 |
+
try:
|
| 129 |
+
# Preprocess image
|
| 130 |
+
image_tensor = preprocess_image(image)
|
| 131 |
+
|
| 132 |
+
# Make prediction
|
| 133 |
+
with torch.no_grad():
|
| 134 |
+
image_tensor = image_tensor.to(device)
|
| 135 |
+
|
| 136 |
+
# Get model output (log probabilities)
|
| 137 |
+
output = model(image_tensor)
|
| 138 |
+
|
| 139 |
+
# Convert to probabilities
|
| 140 |
+
probabilities = torch.exp(output)
|
| 141 |
+
|
| 142 |
+
# Get top-10 predictions
|
| 143 |
+
top_probs, top_indices = torch.topk(probabilities, 10, dim=1)
|
| 144 |
+
|
| 145 |
+
top_probs = top_probs[0].cpu().numpy()
|
| 146 |
+
top_indices = top_indices[0].cpu().numpy()
|
| 147 |
+
|
| 148 |
+
# Get predicted class
|
| 149 |
+
predicted_class = CIFAR100_CLASSES[top_indices[0]]
|
| 150 |
+
confidence = top_probs[0]
|
| 151 |
+
|
| 152 |
+
# Create results dictionary for Gradio Label output
|
| 153 |
+
results_dict = {}
|
| 154 |
+
for idx, prob in zip(top_indices, top_probs):
|
| 155 |
+
class_name = CIFAR100_CLASSES[idx].replace('_', ' ').title()
|
| 156 |
+
results_dict[class_name] = float(prob)
|
| 157 |
+
|
| 158 |
+
# Create formatted output
|
| 159 |
+
confidence_pct = confidence * 100
|
| 160 |
+
|
| 161 |
+
if confidence_pct > 70:
|
| 162 |
+
conf_emoji = "β
"
|
| 163 |
+
conf_text = "High Confidence"
|
| 164 |
+
color = "#28a745"
|
| 165 |
+
elif confidence_pct > 40:
|
| 166 |
+
conf_emoji = "β οΈ"
|
| 167 |
+
conf_text = "Medium Confidence"
|
| 168 |
+
color = "#ffc107"
|
| 169 |
+
else:
|
| 170 |
+
conf_emoji = "β"
|
| 171 |
+
conf_text = "Low Confidence"
|
| 172 |
+
color = "#dc3545"
|
| 173 |
+
|
| 174 |
+
main_prediction = f"""
|
| 175 |
+
<div style='padding: 20px; background-color: #f0f2f6; border-radius: 10px; text-align: center;'>
|
| 176 |
+
<h2 style='color: #1f77b4; margin: 10px 0;'>Predicted Class</h2>
|
| 177 |
+
<h1 style='color: #1f77b4; font-size: 2.5em; margin: 15px 0;'>
|
| 178 |
+
{predicted_class.replace('_', ' ').upper()}
|
| 179 |
+
</h1>
|
| 180 |
+
<h2 style='color: {color}; margin: 10px 0;'>
|
| 181 |
+
{conf_emoji} {confidence_pct:.2f}%
|
| 182 |
+
</h2>
|
| 183 |
+
<p style='color: #666; font-size: 1.2em;'>{conf_text}</p>
|
| 184 |
+
</div>
|
| 185 |
+
"""
|
| 186 |
+
|
| 187 |
+
return results_dict, main_prediction, ""
|
| 188 |
+
|
| 189 |
+
except Exception as e:
|
| 190 |
+
error_msg = f"β Error during prediction: {str(e)}"
|
| 191 |
+
return {}, error_msg, ""
|
| 192 |
+
|
| 193 |
+
|
| 194 |
+
def create_interface():
|
| 195 |
+
"""Create Gradio interface."""
|
| 196 |
+
|
| 197 |
+
# Custom CSS
|
| 198 |
+
custom_css = """
|
| 199 |
+
.gradio-container {
|
| 200 |
+
font-family: 'Arial', sans-serif;
|
| 201 |
+
}
|
| 202 |
+
.gr-button-primary {
|
| 203 |
+
background: linear-gradient(90deg, #1f77b4, #9467bd) !important;
|
| 204 |
+
border: none !important;
|
| 205 |
+
}
|
| 206 |
+
footer {
|
| 207 |
+
visibility: hidden;
|
| 208 |
+
}
|
| 209 |
+
"""
|
| 210 |
+
|
| 211 |
+
# Create interface
|
| 212 |
+
with gr.Blocks(css=custom_css, title="CIFAR-100 Classifier", theme=gr.themes.Soft()) as demo:
|
| 213 |
+
|
| 214 |
+
# Header
|
| 215 |
+
gr.Markdown("""
|
| 216 |
+
# πΌοΈ CIFAR-100 Image Classifier
|
| 217 |
+
|
| 218 |
+
Upload an image and the AI will classify it into one of **100 different categories** with confidence scores.
|
| 219 |
+
Built with **PyTorch ResNet-34** architecture.
|
| 220 |
+
""")
|
| 221 |
+
|
| 222 |
+
with gr.Row():
|
| 223 |
+
with gr.Column(scale=1):
|
| 224 |
+
# Input section
|
| 225 |
+
gr.Markdown("## π€ Upload Image")
|
| 226 |
+
|
| 227 |
+
image_input = gr.Image(
|
| 228 |
+
type="pil",
|
| 229 |
+
label="Upload an image",
|
| 230 |
+
sources=["upload", "clipboard", "webcam"],
|
| 231 |
+
height=400
|
| 232 |
+
)
|
| 233 |
+
|
| 234 |
+
predict_btn = gr.Button("π Classify Image", variant="primary", size="lg")
|
| 235 |
+
|
| 236 |
+
# Examples section with two categories
|
| 237 |
+
with gr.Row():
|
| 238 |
+
with gr.Column():
|
| 239 |
+
gr.Markdown("### β
Good Predictions Examples")
|
| 240 |
+
gr.Examples(
|
| 241 |
+
examples=[
|
| 242 |
+
"sample_images/good/apple_s_000028.png",
|
| 243 |
+
"sample_images/good/breakfast_table_s_000178.png",
|
| 244 |
+
"sample_images//good/cichlid_fish_s_000888.png"
|
| 245 |
+
],
|
| 246 |
+
inputs=image_input,
|
| 247 |
+
label="High Confidence Predictions"
|
| 248 |
+
)
|
| 249 |
+
|
| 250 |
+
with gr.Column():
|
| 251 |
+
gr.Markdown("### β οΈ Challenging Predictions Examples")
|
| 252 |
+
gr.Examples(
|
| 253 |
+
examples=[
|
| 254 |
+
"sample_images/bad/crocodile_s_000018.png",
|
| 255 |
+
"sample_images/bad/boy_s_000005.png",
|
| 256 |
+
"sample_images/bad/armchair_s_000853.png"
|
| 257 |
+
],
|
| 258 |
+
inputs=image_input,
|
| 259 |
+
label="Lower Confidence Predictions"
|
| 260 |
+
)
|
| 261 |
+
|
| 262 |
+
gr.Markdown("""
|
| 263 |
+
### π‘ Tips for Best Results
|
| 264 |
+
- Use clear, well-lit images
|
| 265 |
+
- Center the main object
|
| 266 |
+
- Any size works (auto-resized to 32Γ32)
|
| 267 |
+
- Supported: JPG, PNG, BMP, WEBP
|
| 268 |
+
""")
|
| 269 |
+
|
| 270 |
+
with gr.Column(scale=1):
|
| 271 |
+
# Output section
|
| 272 |
+
gr.Markdown("## π― Classification Results")
|
| 273 |
+
|
| 274 |
+
main_output = gr.HTML(label="Main Prediction")
|
| 275 |
+
|
| 276 |
+
gr.Markdown("### π Top 10 Predictions")
|
| 277 |
+
|
| 278 |
+
label_output = gr.Label(
|
| 279 |
+
num_top_classes=10,
|
| 280 |
+
label="Confidence Scores",
|
| 281 |
+
show_label=False
|
| 282 |
+
)
|
| 283 |
+
|
| 284 |
+
# Additional info section
|
| 285 |
+
with gr.Row():
|
| 286 |
+
with gr.Column():
|
| 287 |
+
gr.Markdown("""
|
| 288 |
+
### π€ Model Information
|
| 289 |
+
|
| 290 |
+
- **Architecture**: ResNet-34 with Bottleneck Layers
|
| 291 |
+
- **Parameters**: ~21 Million
|
| 292 |
+
- **Dataset**: CIFAR-100 (60,000 images, 100 classes)
|
| 293 |
+
- **Input Size**: 32Γ32 RGB images
|
| 294 |
+
- **Categories**: Animals, vehicles, household items, nature scenes, and more
|
| 295 |
+
""")
|
| 296 |
+
|
| 297 |
+
with gr.Column():
|
| 298 |
+
gr.Markdown("""
|
| 299 |
+
### π Sample Categories
|
| 300 |
+
|
| 301 |
+
**Animals**: bear, dolphin, elephant, fox, leopard, tiger, whale
|
| 302 |
+
**Vehicles**: bicycle, bus, motorcycle, train, tractor
|
| 303 |
+
**Nature**: cloud, forest, mountain, sea, plain
|
| 304 |
+
**Objects**: chair, clock, lamp, telephone, keyboard
|
| 305 |
+
**Plants**: maple_tree, oak_tree, orchid, rose, sunflower
|
| 306 |
+
|
| 307 |
+
*...and 75 more categories!*
|
| 308 |
+
""")
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
# Footer
|
| 312 |
+
gr.Markdown("""
|
| 313 |
+
---
|
| 314 |
+
<div style='text-align: center; color: #666; padding: 20px;'>
|
| 315 |
+
<p style='font-size: 1.1em;'>Built with β€οΈ using <strong>PyTorch</strong>, <strong>Gradio</strong>, and <strong>Hugging Face Spaces</strong></p>
|
| 316 |
+
<p>Model: ResNet-34 trained on CIFAR-100 dataset</p>
|
| 317 |
+
<p style='font-size: 0.9em; margin-top: 10px;'>Created by Krishnakanth | Β© 2025</p>
|
| 318 |
+
</div>
|
| 319 |
+
""")
|
| 320 |
+
|
| 321 |
+
# Connect button to prediction function
|
| 322 |
+
predict_btn.click(
|
| 323 |
+
fn=predict,
|
| 324 |
+
inputs=image_input,
|
| 325 |
+
outputs=[label_output, main_output, gr.Textbox(visible=False)]
|
| 326 |
+
)
|
| 327 |
+
|
| 328 |
+
# Also trigger on image upload
|
| 329 |
+
image_input.change(
|
| 330 |
+
fn=predict,
|
| 331 |
+
inputs=image_input,
|
| 332 |
+
outputs=[label_output, main_output, gr.Textbox(visible=False)]
|
| 333 |
+
)
|
| 334 |
+
|
| 335 |
+
return demo
|
| 336 |
+
|
| 337 |
+
|
| 338 |
+
def main():
|
| 339 |
+
"""Main function to run the Gradio app."""
|
| 340 |
+
print("="*60)
|
| 341 |
+
print("πΌοΈ CIFAR-100 Image Classifier")
|
| 342 |
+
print("="*60)
|
| 343 |
+
|
| 344 |
+
# Load model
|
| 345 |
+
print("\nπ¦ Loading model...")
|
| 346 |
+
success = load_model("cifar100_model.pth")
|
| 347 |
+
|
| 348 |
+
if not success:
|
| 349 |
+
print("β Failed to load model. Please check if cifar100_model.pth exists.")
|
| 350 |
+
return
|
| 351 |
+
|
| 352 |
+
print("\nπ Creating Gradio interface...")
|
| 353 |
+
|
| 354 |
+
# Create and launch interface
|
| 355 |
+
demo = create_interface()
|
| 356 |
+
|
| 357 |
+
print("\nβ
Interface created successfully!")
|
| 358 |
+
print("="*60)
|
| 359 |
+
|
| 360 |
+
# Launch app
|
| 361 |
+
demo.launch(
|
| 362 |
+
share=False,
|
| 363 |
+
server_name="0.0.0.0",
|
| 364 |
+
server_port=7860,
|
| 365 |
+
show_error=True
|
| 366 |
+
)
|
| 367 |
+
|
| 368 |
+
|
| 369 |
+
if __name__ == "__main__":
|
| 370 |
+
main()
|
cifar100_model.pth
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a0369e30fac129d7b2e2c1b90fdc9a362df92f9d12b3d496a8e59dc98f467c59
|
| 3 |
+
size 92881527
|
gitignore
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Python
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.py[cod]
|
| 4 |
+
*$py.class
|
| 5 |
+
*.so
|
| 6 |
+
.Python
|
| 7 |
+
env/
|
| 8 |
+
venv/
|
| 9 |
+
.venv/
|
| 10 |
+
ENV/
|
| 11 |
+
|
| 12 |
+
# IDEs
|
| 13 |
+
.vscode/
|
| 14 |
+
.idea/
|
| 15 |
+
*.swp
|
| 16 |
+
*.swo
|
| 17 |
+
*~
|
| 18 |
+
|
| 19 |
+
# OS
|
| 20 |
+
.DS_Store
|
| 21 |
+
Thumbs.db
|
| 22 |
+
|
| 23 |
+
# Streamlit
|
| 24 |
+
.streamlit/
|
| 25 |
+
|
| 26 |
+
# Testing
|
| 27 |
+
test_images/
|
| 28 |
+
*.jpg
|
| 29 |
+
*.png
|
| 30 |
+
*.jpeg
|
| 31 |
+
!examples/*.jpg
|
| 32 |
+
!examples/*.png
|
| 33 |
+
|
| 34 |
+
# Logs
|
| 35 |
+
*.log
|
| 36 |
+
logs/
|
| 37 |
+
|
main.py
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
def main():
|
| 2 |
+
print("Hello from cifar100-classifier!")
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
if __name__ == "__main__":
|
| 6 |
+
main()
|
model.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
CIFAR100 Custom ResNet Model Definition
|
| 3 |
+
Matches the architecture used for training cifar100_model.pth
|
| 4 |
+
|
| 5 |
+
Author: Krishnakanth
|
| 6 |
+
Date: 2025-10-10
|
| 7 |
+
"""
|
| 8 |
+
|
| 9 |
+
import torch
|
| 10 |
+
import torch.nn as nn
|
| 11 |
+
import torch.nn.functional as F
|
| 12 |
+
from typing import Tuple
|
| 13 |
+
from dataclasses import dataclass
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
@dataclass
|
| 17 |
+
class ModelConfig:
|
| 18 |
+
"""Configuration for model architecture."""
|
| 19 |
+
input_channels: int = 3
|
| 20 |
+
input_size: Tuple[int, int] = (32, 32)
|
| 21 |
+
num_classes: int = 100
|
| 22 |
+
dropout_rate: float = 0.05
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
class CIFAR100Model(nn.Module):
|
| 26 |
+
"""
|
| 27 |
+
CIFAR100 classification model - Custom ResNet architecture.
|
| 28 |
+
This matches the architecture of your trained model (23M parameters).
|
| 29 |
+
"""
|
| 30 |
+
|
| 31 |
+
def __init__(self, config: ModelConfig):
|
| 32 |
+
super(CIFAR100Model, self).__init__()
|
| 33 |
+
self.config = config
|
| 34 |
+
|
| 35 |
+
# Initial convolution
|
| 36 |
+
self.conv1 = nn.Sequential(
|
| 37 |
+
nn.Conv2d(self.config.input_channels, 64, kernel_size=7, stride=1, padding=4),
|
| 38 |
+
nn.BatchNorm2d(64),
|
| 39 |
+
nn.ReLU(inplace=True)
|
| 40 |
+
)
|
| 41 |
+
|
| 42 |
+
# Residual blocks
|
| 43 |
+
self.res1 = nn.Sequential(self.conv_block(64, 64, activation=True), self.conv_block(64, 64))
|
| 44 |
+
self.res2 = nn.Sequential(self.conv_block(64, 64, activation=True), self.conv_block(64, 64))
|
| 45 |
+
self.res3 = nn.Sequential(self.conv_block(64, 64, activation=True), self.conv_block(64, 64))
|
| 46 |
+
|
| 47 |
+
self.downsample1 = nn.Sequential(self.conv_block(64, 128, pool=True))
|
| 48 |
+
self.res4 = nn.Sequential(
|
| 49 |
+
self.conv_block(64, 128, activation=True, pool=True),
|
| 50 |
+
self.conv_block(128, 128)
|
| 51 |
+
)
|
| 52 |
+
self.res5 = nn.Sequential(self.conv_block(128, 128, activation=True), self.conv_block(128, 128))
|
| 53 |
+
self.res6 = nn.Sequential(self.conv_block(128, 128, activation=True), self.conv_block(128, 128))
|
| 54 |
+
self.res7 = nn.Sequential(self.conv_block(128, 128, activation=True), self.conv_block(128, 128))
|
| 55 |
+
|
| 56 |
+
self.res8 = nn.Sequential(
|
| 57 |
+
self.conv_block(128, 256, activation=True, pool=True),
|
| 58 |
+
self.conv_block(256, 256)
|
| 59 |
+
)
|
| 60 |
+
self.downsample2 = nn.Sequential(self.conv_block(128, 256, pool=True))
|
| 61 |
+
self.res9 = nn.Sequential(self.conv_block(256, 256, activation=True), self.conv_block(256, 256))
|
| 62 |
+
self.res10 = nn.Sequential(self.conv_block(256, 256, activation=True), self.conv_block(256, 256))
|
| 63 |
+
self.res11 = nn.Sequential(self.conv_block(256, 256, activation=True), self.conv_block(256, 256))
|
| 64 |
+
self.res12 = nn.Sequential(self.conv_block(256, 256, activation=True), self.conv_block(256, 256))
|
| 65 |
+
self.res13 = nn.Sequential(self.conv_block(256, 256, activation=True), self.conv_block(256, 256))
|
| 66 |
+
|
| 67 |
+
self.res14 = nn.Sequential(
|
| 68 |
+
self.conv_block(256, 512, activation=True, pool=True),
|
| 69 |
+
self.conv_block(512, 512)
|
| 70 |
+
)
|
| 71 |
+
self.downsample3 = nn.Sequential(self.conv_block(256, 512, pool=True))
|
| 72 |
+
self.res15 = nn.Sequential(self.conv_block(512, 512, activation=True), self.conv_block(512, 512))
|
| 73 |
+
self.res16 = nn.Sequential(
|
| 74 |
+
self.conv_block(512, 512, activation=True),
|
| 75 |
+
self.conv_block(512, 512, activation=True)
|
| 76 |
+
)
|
| 77 |
+
|
| 78 |
+
# Classifier
|
| 79 |
+
self.classifier = nn.Sequential(
|
| 80 |
+
nn.AdaptiveMaxPool2d((1, 1)),
|
| 81 |
+
nn.Flatten(),
|
| 82 |
+
nn.Linear(512, 1000) # Original has 1000, we'll fix this
|
| 83 |
+
)
|
| 84 |
+
|
| 85 |
+
self.apply(self.init_weights)
|
| 86 |
+
|
| 87 |
+
def conv_block(self, in_channels, out_channels, activation=True, pool=False):
|
| 88 |
+
"""Create a convolutional block."""
|
| 89 |
+
layers = [
|
| 90 |
+
nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1),
|
| 91 |
+
nn.BatchNorm2d(out_channels)
|
| 92 |
+
]
|
| 93 |
+
if activation:
|
| 94 |
+
layers.append(nn.ReLU(inplace=True))
|
| 95 |
+
if pool:
|
| 96 |
+
layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
|
| 97 |
+
return nn.Sequential(*layers)
|
| 98 |
+
|
| 99 |
+
def init_weights(self, m):
|
| 100 |
+
"""Initialize weights."""
|
| 101 |
+
if isinstance(m, nn.Conv2d):
|
| 102 |
+
nn.init.kaiming_normal_(m.weight, mode='fan_in', nonlinearity='relu')
|
| 103 |
+
|
| 104 |
+
def forward(self, xb):
|
| 105 |
+
out = self.conv1(xb)
|
| 106 |
+
out = self.res1(out) + out
|
| 107 |
+
out = self.res2(out) + out
|
| 108 |
+
out = self.res3(out) + out
|
| 109 |
+
out = self.downsample1(out) + self.res4(out)
|
| 110 |
+
out = self.res5(out) + out
|
| 111 |
+
out = self.res6(out) + out
|
| 112 |
+
out = self.res7(out) + out
|
| 113 |
+
out = self.downsample2(out) + self.res8(out)
|
| 114 |
+
out = self.res9(out) + out
|
| 115 |
+
out = self.res10(out) + out
|
| 116 |
+
out = self.res11(out) + out
|
| 117 |
+
out = self.res12(out) + out
|
| 118 |
+
out = self.res13(out) + out
|
| 119 |
+
out = self.downsample3(out) + self.res14(out)
|
| 120 |
+
out = self.res15(out) + out
|
| 121 |
+
out = self.res16(out) + out
|
| 122 |
+
out = self.classifier(out)
|
| 123 |
+
|
| 124 |
+
# Get first 100 outputs (since classifier outputs 1000)
|
| 125 |
+
return F.log_softmax(out[:, :100], dim=-1)
|
| 126 |
+
|
| 127 |
+
|
| 128 |
+
# Aliases for compatibility
|
| 129 |
+
CIFAR100ResNet34 = CIFAR100Model
|
| 130 |
+
CIFAR100ResNet18 = CIFAR100Model
|
pyproject.toml
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[project]
|
| 2 |
+
name = "cifar100-classifier"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
description = "Add your description here"
|
| 5 |
+
readme = "README.md"
|
| 6 |
+
requires-python = ">=3.11"
|
| 7 |
+
dependencies = [
|
| 8 |
+
"aiofiles>=25.1.0",
|
| 9 |
+
"fastapi>=0.118.3",
|
| 10 |
+
"gradio-client>=1.13.3",
|
| 11 |
+
"groovy>=0.1.2",
|
| 12 |
+
"orjson>=3.11.3",
|
| 13 |
+
"pydub>=0.25.1",
|
| 14 |
+
"python-multipart>=0.0.20",
|
| 15 |
+
"safehttpx>=0.1.6",
|
| 16 |
+
]
|
requirements.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
torch>=2.0.0
|
| 2 |
+
torchvision>=0.15.0
|
| 3 |
+
gradio>=4.0.0
|
| 4 |
+
Pillow>=9.5.0
|
| 5 |
+
numpy>=1.24.0
|
| 6 |
+
plotly>=5.17.0
|
run_local.bat
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@echo off
|
| 2 |
+
REM Quick launcher for Windows - Gradio Version
|
| 3 |
+
REM Double-click this file to run the app locally
|
| 4 |
+
|
| 5 |
+
echo ============================================================
|
| 6 |
+
echo CIFAR-100 Classifier - Local Testing (Gradio)
|
| 7 |
+
echo ============================================================
|
| 8 |
+
echo.
|
| 9 |
+
|
| 10 |
+
REM Check if in correct directory
|
| 11 |
+
if not exist app.py (
|
| 12 |
+
echo ERROR: app.py not found!
|
| 13 |
+
echo Please run this script from the CIFAR100HFS directory
|
| 14 |
+
pause
|
| 15 |
+
exit /b 1
|
| 16 |
+
)
|
| 17 |
+
|
| 18 |
+
REM Check if model exists
|
| 19 |
+
if not exist cifar100_model.pth (
|
| 20 |
+
echo ERROR: cifar100_model.pth not found!
|
| 21 |
+
echo Please ensure the model file is in this directory
|
| 22 |
+
pause
|
| 23 |
+
exit /b 1
|
| 24 |
+
)
|
| 25 |
+
|
| 26 |
+
echo Starting Gradio app...
|
| 27 |
+
echo.
|
| 28 |
+
echo Opening browser at: http://localhost:7860
|
| 29 |
+
echo.
|
| 30 |
+
echo Press Ctrl+C to stop the server
|
| 31 |
+
echo ============================================================
|
| 32 |
+
echo.
|
| 33 |
+
|
| 34 |
+
python app.py
|
| 35 |
+
|
| 36 |
+
pause
|
run_local.sh
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# Quick launcher for Linux/Mac - Gradio Version
|
| 3 |
+
# Run: chmod +x run_local.sh && ./run_local.sh
|
| 4 |
+
|
| 5 |
+
echo "============================================================"
|
| 6 |
+
echo "CIFAR-100 Classifier - Local Testing (Gradio)"
|
| 7 |
+
echo "============================================================"
|
| 8 |
+
echo ""
|
| 9 |
+
|
| 10 |
+
# Check if in correct directory
|
| 11 |
+
if [ ! -f "app.py" ]; then
|
| 12 |
+
echo "β ERROR: app.py not found!"
|
| 13 |
+
echo "Please run this script from the CIFAR100HFS directory"
|
| 14 |
+
exit 1
|
| 15 |
+
fi
|
| 16 |
+
|
| 17 |
+
# Check if model exists
|
| 18 |
+
if [ ! -f "cifar100_model.pth" ]; then
|
| 19 |
+
echo "β ERROR: cifar100_model.pth not found!"
|
| 20 |
+
echo "Please ensure the model file is in this directory"
|
| 21 |
+
exit 1
|
| 22 |
+
fi
|
| 23 |
+
|
| 24 |
+
echo "β
Starting Gradio app..."
|
| 25 |
+
echo ""
|
| 26 |
+
echo "π Opening browser at: http://localhost:7860"
|
| 27 |
+
echo ""
|
| 28 |
+
echo "β οΈ Press Ctrl+C to stop the server"
|
| 29 |
+
echo "============================================================"
|
| 30 |
+
echo ""
|
| 31 |
+
|
| 32 |
+
python app.py
|
test_app_locally.py
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Local Testing Script for CIFAR-100 Gradio App
|
| 3 |
+
Run this to test your app locally before deploying to Hugging Face
|
| 4 |
+
|
| 5 |
+
Usage:
|
| 6 |
+
python test_app_locally.py
|
| 7 |
+
|
| 8 |
+
Then open: http://localhost:7860
|
| 9 |
+
"""
|
| 10 |
+
|
| 11 |
+
import subprocess
|
| 12 |
+
import sys
|
| 13 |
+
import os
|
| 14 |
+
|
| 15 |
+
def test_imports():
|
| 16 |
+
"""Test if all required packages are installed."""
|
| 17 |
+
print("="*60)
|
| 18 |
+
print("Testing imports...")
|
| 19 |
+
print("="*60)
|
| 20 |
+
|
| 21 |
+
required_packages = {
|
| 22 |
+
'torch': 'PyTorch',
|
| 23 |
+
'torchvision': 'TorchVision',
|
| 24 |
+
'gradio': 'Gradio',
|
| 25 |
+
'PIL': 'Pillow',
|
| 26 |
+
'numpy': 'NumPy',
|
| 27 |
+
'plotly': 'Plotly'
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
missing = []
|
| 31 |
+
|
| 32 |
+
for package, name in required_packages.items():
|
| 33 |
+
try:
|
| 34 |
+
__import__(package)
|
| 35 |
+
print(f"β
{name} installed")
|
| 36 |
+
except ImportError:
|
| 37 |
+
print(f"β {name} NOT installed")
|
| 38 |
+
missing.append(name)
|
| 39 |
+
|
| 40 |
+
if missing:
|
| 41 |
+
print(f"\nβ Missing packages: {', '.join(missing)}")
|
| 42 |
+
print("\nInstall with:")
|
| 43 |
+
print("pip install -r requirements.txt")
|
| 44 |
+
return False
|
| 45 |
+
|
| 46 |
+
print("\nβ
All packages installed!")
|
| 47 |
+
return True
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
def test_model_file():
|
| 51 |
+
"""Test if model file exists."""
|
| 52 |
+
print("\n" + "="*60)
|
| 53 |
+
print("Testing model file...")
|
| 54 |
+
print("="*60)
|
| 55 |
+
|
| 56 |
+
model_path = "cifar100_model.pth"
|
| 57 |
+
|
| 58 |
+
if os.path.exists(model_path):
|
| 59 |
+
size_mb = os.path.getsize(model_path) / (1024 * 1024)
|
| 60 |
+
print(f"β
Model file found: {model_path}")
|
| 61 |
+
print(f" Size: {size_mb:.2f} MB")
|
| 62 |
+
return True
|
| 63 |
+
else:
|
| 64 |
+
print(f"β Model file NOT found: {model_path}")
|
| 65 |
+
print("\nPlease ensure 'cifar100_model.pth' is in the current directory")
|
| 66 |
+
return False
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def test_model_loading():
|
| 70 |
+
"""Test if model loads correctly."""
|
| 71 |
+
print("\n" + "="*60)
|
| 72 |
+
print("Testing model loading...")
|
| 73 |
+
print("="*60)
|
| 74 |
+
|
| 75 |
+
try:
|
| 76 |
+
import torch
|
| 77 |
+
from model import CIFAR100ResNet34, ModelConfig
|
| 78 |
+
|
| 79 |
+
config = ModelConfig(
|
| 80 |
+
input_channels=3,
|
| 81 |
+
input_size=(32, 32),
|
| 82 |
+
num_classes=100,
|
| 83 |
+
dropout_rate=0.05
|
| 84 |
+
)
|
| 85 |
+
|
| 86 |
+
model = CIFAR100ResNet34(config)
|
| 87 |
+
|
| 88 |
+
# Try loading checkpoint
|
| 89 |
+
checkpoint = torch.load("cifar100_model.pth", map_location='cpu')
|
| 90 |
+
|
| 91 |
+
if 'model_state_dict' in checkpoint:
|
| 92 |
+
model.load_state_dict(checkpoint['model_state_dict'])
|
| 93 |
+
else:
|
| 94 |
+
model.load_state_dict(checkpoint)
|
| 95 |
+
|
| 96 |
+
model.eval()
|
| 97 |
+
|
| 98 |
+
# Test forward pass
|
| 99 |
+
dummy_input = torch.randn(1, 3, 32, 32)
|
| 100 |
+
output = model(dummy_input)
|
| 101 |
+
|
| 102 |
+
print(f"β
Model loaded successfully!")
|
| 103 |
+
print(f" Output shape: {output.shape}")
|
| 104 |
+
print(f" Expected: torch.Size([1, 100])")
|
| 105 |
+
|
| 106 |
+
if output.shape == torch.Size([1, 100]):
|
| 107 |
+
print("β
Output shape correct!")
|
| 108 |
+
return True
|
| 109 |
+
else:
|
| 110 |
+
print("β Output shape mismatch!")
|
| 111 |
+
return False
|
| 112 |
+
|
| 113 |
+
except Exception as e:
|
| 114 |
+
print(f"β Model loading failed: {str(e)}")
|
| 115 |
+
import traceback
|
| 116 |
+
traceback.print_exc()
|
| 117 |
+
return False
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
def run_gradio():
|
| 121 |
+
"""Run Gradio app locally."""
|
| 122 |
+
print("\n" + "="*60)
|
| 123 |
+
print("Starting Gradio app...")
|
| 124 |
+
print("="*60)
|
| 125 |
+
print("\nπ Opening app in browser at: http://localhost:7860")
|
| 126 |
+
print("\nβ οΈ Press Ctrl+C to stop the server\n")
|
| 127 |
+
|
| 128 |
+
try:
|
| 129 |
+
subprocess.run([sys.executable, "app.py"])
|
| 130 |
+
except KeyboardInterrupt:
|
| 131 |
+
print("\n\nπ Gradio server stopped")
|
| 132 |
+
|
| 133 |
+
|
| 134 |
+
def main():
|
| 135 |
+
"""Main testing workflow."""
|
| 136 |
+
print("\n" + "="*60)
|
| 137 |
+
print("π§ͺ CIFAR-100 GRADIO APP - LOCAL TESTING")
|
| 138 |
+
print("="*60)
|
| 139 |
+
|
| 140 |
+
# Run tests
|
| 141 |
+
imports_ok = test_imports()
|
| 142 |
+
model_file_ok = test_model_file()
|
| 143 |
+
model_load_ok = test_model_loading() if imports_ok and model_file_ok else False
|
| 144 |
+
|
| 145 |
+
# Summary
|
| 146 |
+
print("\n" + "="*60)
|
| 147 |
+
print("TEST SUMMARY")
|
| 148 |
+
print("="*60)
|
| 149 |
+
print(f"{'β
' if imports_ok else 'β'} Package imports")
|
| 150 |
+
print(f"{'β
' if model_file_ok else 'β'} Model file exists")
|
| 151 |
+
print(f"{'β
' if model_load_ok else 'β'} Model loads correctly")
|
| 152 |
+
|
| 153 |
+
if imports_ok and model_file_ok and model_load_ok:
|
| 154 |
+
print("\n" + "="*60)
|
| 155 |
+
print("β
ALL TESTS PASSED!")
|
| 156 |
+
print("="*60)
|
| 157 |
+
|
| 158 |
+
response = input("\nπ Run Gradio app locally? (y/n): ")
|
| 159 |
+
if response.lower() == 'y':
|
| 160 |
+
run_gradio()
|
| 161 |
+
else:
|
| 162 |
+
print("\n" + "="*60)
|
| 163 |
+
print("β SOME TESTS FAILED")
|
| 164 |
+
print("="*60)
|
| 165 |
+
print("\nPlease fix the issues above before running the app.")
|
| 166 |
+
|
| 167 |
+
if not imports_ok:
|
| 168 |
+
print("\nπ‘ To fix missing packages:")
|
| 169 |
+
print(" pip install -r requirements.txt")
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
if __name__ == "__main__":
|
| 173 |
+
main()
|
uv.lock
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|