GradCAMPlusPlus_SkinLesion / CONTRIBUTING.md
wyctorfogos's picture
update: Changes for production
3ce0f15
|
Raw
History Blame Contribute Delete
7.91 kB
# Contributing Guide
Thank you for your interest in contributing to the Multimodal Skin Lesion Explainability project! This guide will help you get started.
## Code of Conduct
Please follow [HuggingFace's Code of Conduct](https://huggingface.co/code-of-conduct) in all interactions.
## Getting Started
### 1. Fork & Clone
```bash
# Fork the repository at HuggingFace or GitHub
git clone https://huggingface.co/spaces/<your-username>/<your-fork>
cd GradCAMPlusPlus_SkinLesion
```
### 2. Set Up Environment
```bash
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies with dev tools
pip install -r requirements.txt
pip install black flake8 pytest # Optional: for code style
```
### 3. Verify Installation
```bash
python app.py # Should launch Gradio without errors
```
## Development Workflow
### Making Changes
1. **Create a feature branch**
```bash
git checkout -b feature/your-feature-name
```
2. **Make your changes**
- Follow existing code style
- Add type hints to new functions
- Include docstrings for complex logic
3. **Test locally**
```bash
python app.py
# Test the UI thoroughly before pushing
```
4. **Format code** (optional but recommended)
```bash
black src/ app.py
flake8 src/ app.py
```
5. **Commit with clear messages**
```bash
git add .
git commit -m "feat: add new feature description"
```
6. **Push and create Pull Request**
```bash
git push origin feature/your-feature-name
```
## Types of Contributions
### 🐛 Bug Reports
**Found an issue?** Check [Issues](../../issues) first, then report with:
- Describe the bug clearly
- Steps to reproduce
- Expected vs. actual behavior
- Screenshots if relevant
- Environment details (OS, Python version, GPU/CPU)
### ✨ Feature Requests
**Have an idea?** Create an issue with:
- Clear description of the feature
- Why it's useful
- Suggested implementation (if you have one)
- Examples of similar solutions
### 📚 Documentation
**Improve docs?** Edit:
- `README.md` - Main documentation
- `DEPLOYMENT.md` - Deployment guide
- Code docstrings - Inline documentation
- Create tutorials or examples
### 🔧 Code Improvements
#### Areas for Contribution:
- **Model Improvements**: Optimize attention mechanisms, add new architectures
- **UI/UX**: Enhance Gradio interface, add new visualizations
- **Performance**: Reduce inference time, optimize memory usage
- **Testing**: Add test cases, improve code coverage
- **Documentation**: Add docstrings, improve clarity
#### Code Standards:
```python
# Type hints required
from typing import Optional, Tuple, List
def process_metadata(values: dict, enabled_groups: List[str]) -> str:
"""
Process metadata values and generate CSV format.
Args:
values: Dictionary of patient/lesion fields
enabled_groups: List of active metadata groups
Returns:
CSV-formatted string
Raises:
ValueError: If required fields are missing
"""
# Implementation...
```
## Project Structure Reference
```
src/
├── main.py # Gradio UI - Safe to modify
├── models/
│ ├── inference.py # Model loading - Core logic
│ ├── model_loader.py # PyTorch model setup
│ ├── cam.py # GradCAM++ implementation
│ ├── preprocessing.py # Image/metadata processing
│ ├── metadata_*.py # Metadata handling
│ └── ... # Attention mechanism files
utils/
├── transforms.py # Image transformations
└── load_local_variables.py # Configuration loading
data/
├── weights/TO_BE_USED/ # Model files (do not commit large files)
└── preprocess_data/ # Encoders, scalers
```
## Areas to Avoid (Breaking Changes)
- **Do not modify**: Input/output format of `run_inference()` without coordination
- **Do not change**: Metadata CSV schema without updating documentation
- **Do not remove**: Core model classes without providing migration path
- **Do not alter**: Pre-trained model weights (they're frozen)
## Testing
### Manual Testing
```bash
# Run the app locally
python app.py
# Test scenarios:
1. Upload test image (try different formats)
2. Toggle metadata groups
3. Test all model options
4. Verify heatmap generation
5. Check metadata CSV output
```
### Automated Testing (Optional)
```bash
# Create tests/test_inference.py
import pytest
from src.models.inference import get_available_model_choices
def test_model_loading():
choices = get_available_model_choices()
assert len(choices) > 0, "No models available"
assert all(isinstance(c, tuple) for c in choices)
# Run tests
pytest tests/
```
## Deployment Considerations
Before submitting PR with changes:
- [ ] Changes work locally with `python app.py`
- [ ] No new dependencies added without updating `requirements.txt`
- [ ] No hardcoded local paths
- [ ] All imports are available in requirements
- [ ] Code produces no warnings when run
## GPU/Performance Notes
- Models are cached after first load - don't reload unnecessarily
- Use `torch.no_grad()` for inference (already implemented)
- Profile code for bottlenecks: `python -m cProfile app.py`
## Documentation Standards
### For New Features
1. Update `README.md` with feature description
2. Add docstrings to functions
3. Include usage examples in docstrings
4. Update relevant guide (DEPLOYMENT.md, etc.)
### Example Docstring
```python
def generate_heatmap(image_tensor: torch.Tensor, metadata_tensor: torch.Tensor) -> np.ndarray:
"""
Generate GradCAM++ heatmap for given inputs.
This method computes class-weighted gradients and generates attention maps.
The output can be overlaid on the original image for visualization.
Args:
image_tensor: Preprocessed image (1, 3, H, W)
metadata_tensor: Encoded metadata (1, 20)
Returns:
Normalized heatmap (H, W) with values in [0, 1]
Example:
>>> image = torch.randn(1, 3, 224, 224)
>>> metadata = torch.randn(1, 20)
>>> heatmap = generate_heatmap(image, metadata)
>>> assert heatmap.shape == (224, 224)
"""
```
## Commit Message Style
Follow conventional commits:
```
feat: add new attention mechanism
fix: resolve heatmap generation bug
docs: update README with new feature
style: format code with black
refactor: optimize inference pipeline
test: add unit tests for metadata builder
chore: update dependencies
```
## Getting Help
- **Questions**: Post in [Discussions](../../discussions)
- **Documentation**: Check README.md and DEPLOYMENT.md
- **Issues**: Search existing issues first
- **Code Review**: Tag maintainers in your PR
## Recognition
Contributors will be:
- Listed in project README
- Credited in git commits
- Thanked in release notes
- Considered for maintainer roles (for significant contributions)
## Legal
- By contributing, you agree your work may be used under the MIT License
- Ensure you have rights to any code you submit
- Respect intellectual property and attribution
## Review Process
1. **Automated Checks**: CI/CD runs automatically
- Code format check
- Import validation
- Model loading verification
2. **Manual Review**: Maintainers review for:
- Code quality and style
- Alignment with project goals
- Documentation completeness
- Performance impact
3. **Merge**: Once approved, changes are merged to main
## Questions?
- Check existing [Issues](../../issues)
- Read [DEPLOYMENT.md](DEPLOYMENT.md) for deployment questions
- Open a [Discussion](../../discussions) for questions
---
**Thank you for contributing!** 🙏
Together we make skin lesion analysis more transparent and interpretable.
**Last Updated**: March 2026