Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: CI

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
test:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: "3.12"

- name: Install uv
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.local/bin" >> $GITHUB_PATH

- name: Verify uv installation
run: uv --version

- name: Install dependencies
run: |
uv sync --extra dev --extra research

- name: Test CLI commands
run: |
uv run ami-dataset --help
uv run ami-classification --help

- name: Run test suite
run: |
# Placeholder for running the full test suite
# TODO: Add proper test command once test infrastructure is ready
uv run pytest tests/ -v || echo "Tests not yet configured"

- name: Verify imports
run: |
uv run python -c "import torch; import numpy; import pandas; print('Core dependencies imported successfully')"

- name: Verify optional dependencies (research)
run: |
uv run python -c "import awscli; import absl; print('Research dependencies imported successfully')"
40 changes: 28 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,46 @@ Software, algorithms and research related to the Automated Monitoring of Insects

## Setup

Poetry is used to manage the dependencies common to all scripts and sub-projects. Some sub-projects may manage their own dependencies if necessary.
[uv](https://github.com/astral-sh/uv) is used to manage the dependencies common to all scripts and sub-projects. uv is a fast, modern Python package manager.

1. Install [Poetry](https://python-poetry.org/docs/#installation)
1. Install [uv](https://docs.astral.sh/uv/getting-started/installation/)
```bash
# On macOS and Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# On Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```
2. Clone this repository
2. Create a `.env` or copy `.env.example` and update the values
3. Run `poetry install` in the root of the repository
4. Install pre-commit hooks `poetry run pre-commit install`
3. Create a `.env` or copy `.env.example` and update the values
4. Install dependencies in the root of the repository:
```bash
uv sync
```
5. Install pre-commit hooks:
```bash
uv run pre-commit install
```

### [Optional] Conda + uv
An optional way to setup the environment is to use [Conda](https://conda.io/projects/conda/en/latest/index.html) for creating and managing the Python environment, while using [uv](https://docs.astral.sh/uv/) for managing the packages and dependencies.

### [Optional] Conda + Poetry
An optional way to setup the environment is to use [Conda](https://conda.io/projects/conda/en/latest/index.html) for creating and managing the environment, while using [Poetry](https://python-poetry.org/) for managing the packages and dependencies. Run the following steps to setup:
1. [Install Conda](https://docs.anaconda.com/free/miniconda/)
2. Create conda environment using the `environment.yml`: `conda env create -f environment.yml`
3. Activate the conda environment: `conda activate ami-ml`
4. Install packages in the root of the repository using Poetry: `poetry install`
4. Install packages in the root of the repository using uv: `uv sync`

## Usage

Activate the virtual environment before running scripts

```bash
poetry shell
source .venv/bin/activate # On Linux/macOS
# or
.venv\Scripts\activate # On Windows
```

Example for running a script (in the poetry shell):
Example for running a script (in the activated environment):

```bash
python src/localization/inference_localization.py \
Expand All @@ -53,8 +69,8 @@ python src/localization/inference_localization.py \
--model_type fasterrcnn_mobilenet_v3_large_fpn
```

Alternatively, one can run the scripts without activating poetry's shell:
Alternatively, one can run scripts without activating the environment:

```bash
poetry run python <script>
uv run python <script>
```
107 changes: 54 additions & 53 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,67 +1,68 @@
[tool.poetry]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "ami-ml"
version = "0.1.0"
description = "Software & research related to the automated monitoring of insects"
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.10"
authors = [
"Aditya Jain <aditya.jain@mila.quebec>",
"Michael Bunsen <michael.bunsen@mila.quebec>",
"Fagner Cunha <fagner.cunha@icomp.ufam.edu.br>",
"Léonard Pasi <leonardpasi@gmail.com>",
{name = "Aditya Jain", email = "aditya.jain@mila.quebec"},
{name = "Michael Bunsen", email = "michael.bunsen@mila.quebec"},
{name = "Fagner Cunha", email = "fagner.cunha@icomp.ufam.edu.br"},
{name = "Léonard Pasi", email = "leonardpasi@gmail.com"},
]
license = "MIT"
readme = "README.md"
packages = [{ include = "src" }]

[tool.poetry.dependencies]
python = "^3.9"
click = "^8.1.6"
numpy = "^1.25.1"
torch = "^2.0,!=2.0.1"
tqdm = "^4.65.0"
segment-anything = "^1.0"
torchvision = "^0.15.1,!=0.15.2"
torchmetrics = "^0.11.4"
pillow = "^10.0.0"
matplotlib = "^3.7.2"
python-dwca-reader = "^0.15.1"
pandas = "^2.1.0"
scikit-learn = "^1.3.0"
webdataset = "^0.2.48"
timm = "^0.9.8"
typer = "^0.12.3"
python-dotenv = "^1.0.1"
wandb = "^0.17.5"
pygbif = "^0.6.5"
opencv-python = "^4.11.0.86"

[tool.poetry.group.research]
optional = true

[tool.poetry.group.research.dependencies]
awscli = "^1.33.44"
awscli-plugin-endpoint = "^0.4"
absl-py = "^2.1.0"
dependencies = [
"click>=8.1.6",
"numpy>=1.25.1",
"torch>=2.0,!=2.0.1",
"tqdm>=4.65.0",
"segment-anything>=1.0",
"torchvision>=0.15.1,!=0.15.2",
"torchmetrics>=0.11.4",
"pillow>=10.0.0",
"matplotlib>=3.7.2",
"python-dwca-reader>=0.15.1",
"pandas>=2.1.0",
"scikit-learn>=1.3.0",
"webdataset>=0.2.48",
"timm>=0.9.8",
"typer>=0.12.3",
"python-dotenv>=1.0.1",
"wandb>=0.17.5",
"pygbif>=0.6.5",
"opencv-python>=4.11.0.86",
]

[tool.poetry.group.dev.dependencies]
pre-commit = "^3.3.3"
black = "^23.7.0"
flake8 = "^6.0.0"
Flake8-pyproject = "^1.2.3"
isort = "^5.12.0"
mypy = "^1.4.1"
ipdb = "^0.13.13"
python-devtools = "^2"
ipykernel = "^6.29.4"
pytest = "^8.1.1"
[project.optional-dependencies]
research = [
"awscli>=1.33.44",
"awscli-plugin-endpoint>=0.4",
"absl-py>=2.1.0",
]
dev = [
"pre-commit>=3.3.3",
"black>=23.7.0",
"flake8>=6.0.0",
"Flake8-pyproject>=1.2.3",
"isort>=5.12.0",
"mypy>=1.4.1",
"ipdb>=0.13.13",
"python-devtools>=2",
"ipykernel>=6.29.4",
"pytest>=8.1.1",
]

[tool.poetry.scripts]
[project.scripts]
ami-dataset = "src.dataset_tools.cli:cli"
ami-classification = "src.classification.cli:cli"


[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[tool.hatch.build.targets.wheel]
packages = ["src"]

[tool.flake8]
max-line-length = 88
Expand Down
Loading