From 5c1be99552f9a664d21db7a0d4d4e3f6bb09ab25 Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 25 Oct 2023 17:57:49 +0800 Subject: [PATCH] Bump docs --- Writerside/d.tree | 5 +- docs/HelpTOC.json | 2 +- docs/Map.jhm | 2 +- docs/getting-started.html | 18 ++--- docs/load-dataset.html | 31 ++++++++ docs/overview.html | 2 +- docs/preprocessing-extract-segments.html | 94 +++++++++++++++++++++++ docs/preprocessing-morphology.html | 15 ++++ docs/preprocessing-scale.html | 15 ++++ webHelpD2-all.zip | Bin 0 -> 33679 bytes 10 files changed, 170 insertions(+), 14 deletions(-) create mode 100644 docs/load-dataset.html create mode 100644 docs/preprocessing-extract-segments.html create mode 100644 docs/preprocessing-morphology.html create mode 100644 docs/preprocessing-scale.html create mode 100644 webHelpD2-all.zip diff --git a/Writerside/d.tree b/Writerside/d.tree index 3b1d2149..711500b2 100644 --- a/Writerside/d.tree +++ b/Writerside/d.tree @@ -10,7 +10,8 @@ - - + + + \ No newline at end of file diff --git a/docs/HelpTOC.json b/docs/HelpTOC.json index cf714597..5564d1c0 100644 --- a/docs/HelpTOC.json +++ b/docs/HelpTOC.json @@ -1 +1 @@ -{"entities":{"pages":{"Overview":{"id":"Overview","title":"Overview","url":"overview.html","level":0,"tabIndex":0},"Getting-Started":{"id":"Getting-Started","title":"Getting Started","url":"getting-started.html","level":0,"tabIndex":1}}},"topLevelIds":["Overview","Getting-Started"]} \ No newline at end of file +{"entities":{"pages":{"Overview":{"id":"Overview","title":"Overview","url":"overview.html","level":0,"tabIndex":0},"Getting-Started":{"id":"Getting-Started","title":"Getting Started","url":"getting-started.html","level":0,"tabIndex":1},"load.dataset":{"id":"load.dataset","title":"load.dataset","url":"load-dataset.html","level":0,"tabIndex":2},"preprocessing.scale":{"id":"preprocessing.scale","title":"preprocessing.scale","url":"preprocessing-scale.html","level":0,"tabIndex":3},"preprocessing.extract_segments":{"id":"preprocessing.extract_segments","title":"preprocessing.extract_segments","url":"preprocessing-extract-segments.html","level":0,"tabIndex":4},"preprocessing.morphology":{"id":"preprocessing.morphology","title":"preprocessing.morphology","url":"preprocessing-morphology.html","level":0,"tabIndex":5}}},"topLevelIds":["Overview","Getting-Started","load.dataset","preprocessing.scale","preprocessing.extract_segments","preprocessing.morphology"]} \ No newline at end of file diff --git a/docs/Map.jhm b/docs/Map.jhm index a0b29f95..d5ac1aa1 100644 --- a/docs/Map.jhm +++ b/docs/Map.jhm @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/docs/getting-started.html b/docs/getting-started.html index 2d8d1e29..f1aaf4b0 100644 --- a/docs/getting-started.html +++ b/docs/getting-started.html @@ -1,20 +1,20 @@ - Getting Started | Documentation

Documentation 0.0.4 Help

Getting Started

Installing the Dev. Environment

  1. Ensure that you have the right version of Python. The required Python version can be seen in pyproject.toml

    + Getting Started | Documentation

    Documentation 0.0.4 Help

    Getting Started

    Installing the Dev. Environment

    1. Ensure that you have the right version of Python. The required Python version can be seen in pyproject.toml

      [tool.poetry.dependencies] python = "..." -
    2. Start by cloning our repository.

      +
    3. Start by cloning our repository.

      git clone https://github.com/Forest-Recovery-Digital-Companion/FRDC-ML.git -
    4. Then, create a Python Virtual Env pyvenv

      python -m venv venv/
      python3 -m venv venv/
    5. Install Poetry Then check if it's installed with

      poetry --version
    6. Activate the virtual environment

      +
    7. Then, create a Python Virtual Env pyvenv

      python -m venv venv/
      python3 -m venv venv/
    8. Install Poetry Then check if it's installed with

      poetry --version
    9. Activate the virtual environment

      cd venv/Scripts activate cd ../.. -
      +
      source venv/bin/activate -
    10. Install the dependencies. You should be in the same directory as pyproject.toml

      +
  2. Install the dependencies. You should be in the same directory as pyproject.toml

    poetry install --with dev -
  3. Install Pre-Commit Hooks

    +
  4. Install Pre-Commit Hooks

    pre-commit install -

Setting Up Google Cloud

  1. We use Google Cloud to store our datasets. To set up Google Cloud, install the Google Cloud CLI

  2. Then, authenticate your account.

    gcloud auth login
  3. Finally, set up Application Default Credentials (ADC).

    gcloud auth application-default login
  4. To make sure everything is working, run the tests.

Pre-commit Hooks

  • +

Setting Up Google Cloud

  1. We use Google Cloud to store our datasets. To set up Google Cloud, install the Google Cloud CLI

  2. Then, authenticate your account.

    gcloud auth login
  3. Finally, set up Application Default Credentials (ADC).

    gcloud auth application-default login
  4. To make sure everything is working, run the tests.

Pre-commit Hooks

  • pre-commit install -

Running the Tests

  1. Run the tests to make sure everything is working

    +

Running the Tests

  1. Run the tests to make sure everything is working

    pytest -
  2. In case of errors:

    google.auth.exceptions.DefaultCredentialsError

    If you get this error, it means that you haven't authenticated your Google Cloud account. See Setting Up Google Cloud

    ModuleNotFoundError

    If you get this error, it means that you haven't installed the dependencies. See Installing the Dev. Environment

Our Repository Structure

Before starting development, take a look at our repository structure. This will help you understand where to put your code.

Core Dependencies
Resources
Pipeline
Tests
Repo Dependencies
Dataset Loaders
Preprocessing Fn.
Train Deps
Model Architectures
Datasets ...
Model Training Pipeline
FRDC
src/frdc/
rsc/
pipeline/
tests/
pyproject.toml,poetry.lock
./load/
./preprocess/
./train/
./models/
./dataset_name/
./model_tests/
src/frdc/

Source Code for our package. These are the unit components of our pipeline.

rsc/

Resources. These are usually cached datasets

pipeline/

Pipeline code. These are the full ML tests of our pipeline.

tests/

PyTest tests. These are unit tests & integration tests.

Unit, Integration, and Pipeline Tests

We have 3 types of tests:

  • Unit Tests are usually small, single function tests.

  • Integration Tests are larger tests that tests a mock pipeline.

  • Pipeline Tests are the true production pipeline tests that will generate a model.

Where Should I contribute?

Changing a small component

If you're changing a small component, such as a argument for preprocessing, a new model architecture, or a new configuration for a dataset, take a look at the src/frdc/ directory.

Adding a test

By adding a new component, you'll need to add a new test. Take a look at the tests/ directory.

Changing the pipeline

If you're a ML Researcher, you'll probably be changing the pipeline. Take a look at the pipeline/ directory.

Adding a dependency

If you're adding a new dependency, use poetry add PACKAGE and commit the changes to pyproject.toml and poetry.lock.

Last modified: 23 October 2023
\ No newline at end of file +
  • In case of errors:

    google.auth.exceptions.DefaultCredentialsError

    If you get this error, it means that you haven't authenticated your Google Cloud account. See Setting Up Google Cloud

    ModuleNotFoundError

    If you get this error, it means that you haven't installed the dependencies. See Installing the Dev. Environment

  • Our Repository Structure

    Before starting development, take a look at our repository structure. This will help you understand where to put your code.

    Core Dependencies
    Resources
    Pipeline
    Tests
    Repo Dependencies
    Dataset Loaders
    Preprocessing Fn.
    Train Deps
    Model Architectures
    Datasets ...
    Model Training Pipeline
    FRDC
    src/frdc/
    rsc/
    pipeline/
    tests/
    pyproject.toml,poetry.lock
    ./load/
    ./preprocess/
    ./train/
    ./models/
    ./dataset_name/
    ./model_tests/
    src/frdc/

    Source Code for our package. These are the unit components of our pipeline.

    rsc/

    Resources. These are usually cached datasets

    pipeline/

    Pipeline code. These are the full ML tests of our pipeline.

    tests/

    PyTest tests. These are unit tests & integration tests.

    Unit, Integration, and Pipeline Tests

    We have 3 types of tests:

    • Unit Tests are usually small, single function tests.

    • Integration Tests are larger tests that tests a mock pipeline.

    • Pipeline Tests are the true production pipeline tests that will generate a model.

    Where Should I contribute?

    Changing a small component

    If you're changing a small component, such as a argument for preprocessing, a new model architecture, or a new configuration for a dataset, take a look at the src/frdc/ directory.

    Adding a test

    By adding a new component, you'll need to add a new test. Take a look at the tests/ directory.

    Changing the pipeline

    If you're a ML Researcher, you'll probably be changing the pipeline. Take a look at the pipeline/ directory.

    Adding a dependency

    If you're adding a new dependency, use poetry add PACKAGE and commit the changes to pyproject.toml and poetry.lock.

    Last modified: 25 October 2023
    \ No newline at end of file diff --git a/docs/load-dataset.html b/docs/load-dataset.html new file mode 100644 index 00000000..bf3dc731 --- /dev/null +++ b/docs/load-dataset.html @@ -0,0 +1,31 @@ + load.dataset | Documentation

    Documentation 0.0.4 Help

    load.dataset

    Classes

    FRDCDownloader

    This facilitates authentication and downloading from GCS.

    FRDCDataset

    This uses the Downloader to download and load the dataset. It also implements useful helper functions to load FRDC-specific datasets, such as loading our images and labels.

    Usage

    An example loading our Chestnut Nature Park dataset. We retrieve the

    • hyperspectral bands

    • order of the bands

    • bounding boxes

    • labels

    +from frdc.load import FRDCDataset + +ds = FRDCDataset(site='chestnut_nature_park', + date='20201218', + version=None, ) +ar, order = ds.get_ar_bands() +bounds, labels = ds.get_bounds_and_labels() +

    Custom Authentication & Downloads

    If you need granular control over

    • where the files are downloaded

    • the credentials used

    • the project used

    • the bucket used

    Then pass in a FRDCDownloader object to FRDCDataset.

    +from frdc.load import FRDCDownloader, FRDCDataset + +dl = FRDCDownloader(credentials=..., + local_dataset_root_dir=..., + project_id=..., + bucket_name=...) +ds = FRDCDataset(site='chestnut_nature_park', + date='20201218', + version=None, + dl=dl) +ar, order = ds.get_ar_bands() +bounds, labels = ds.get_bounds_and_labels() +

    If you have a file not easily downloadable by FRDCDataset, you can use FRDCDownloader to download it.

    +from frdc.load import FRDCDownloader + +dl = FRDCDownloader(credentials=..., + local_dataset_root_dir=..., + project_id=..., + bucket_name=...) + +dl.download_file(path_glob="path/to/gcs/file") +

    API

    FRDCDataset

    FRDCDataset(site, date, version, dl)

    Initializes the dataset downloader.


    This doesn't immediately download the dataset, but only when you call the get_* functions.


    The site, date, version must match the dataset path on GCS. For example if the dataset is at gs://frdc-scan/my-site/date/90deg/map,

    • site: 'my-site'

    • date: '20201218'

    • version: '90deg/map'

    get_ar_bands()

    Gets the NDArray bands (H x W x C) and channel order as tuple[np.ndarray, list[str]].


    This downloads (if missing) and retrieves the stacked NDArray bands. This wraps around get_ar_bands_as_dict(), thus if you want more control over how the bands are loaded, use that instead.

    get_ar_bands_as_dict()

    Gets the NDArray bands (H x W) as a dict[str, np.ndarray].


    This downloads (if missing) and retrieves the individual NDArray bands as a dictionary. The keys are the band names, and the values are the NDArray bands.

    get_bounds_and_labels()

    Gets the bounding boxes and labels as tuple[list[Rect], list[str]].


    This downloads (if missing) and retrieves the bounding boxes and labels as a tuple. The first element is a list of bounding boxes, and the second element is a list of labels.


    FRDCDownloader

    list_gcs_datasets(anchor)

    Lists all GCS datasets in the bucket as DataFrame


    This works by checking which folders have a specific file, which we call the anchor.

    download_file(path_glob, local_exists_ok)

    Downloads a file from GCS.


    This takes in a path glob, a string containing wildcards, and downloads exactly 1 file. If it matches 0 or more than 1 file, it will raise an error.


    If local_exists_ok is True, it will not download the file if it already exists locally. However, if it's False, it will download the file only if the hashes don't match.

    Last modified: 25 October 2023
    \ No newline at end of file diff --git a/docs/overview.html b/docs/overview.html index aa465425..e5c0bf72 100644 --- a/docs/overview.html +++ b/docs/overview.html @@ -1 +1 @@ - Overview | Documentation

    Documentation 0.0.4 Help

    Overview

    Forest Recovery Digital Companion (FRDC) is a ML-assisted companion for ecologists to automatically classify surveyed trees via an Unmanned Aerial Vehicle (UAV).

    This package, FRDC-ML is the Machine Learning backbone of this project, a centralized repository of tools and model architectures to be used in the FRDC pipeline.

    Get started here

    Other Projects

    FRDC-UI

    The User Interface Repository for FRDC, a WebApp GUI for ecologists to adjust annotations.

    Last modified: 23 October 2023
    \ No newline at end of file + Overview | Documentation

    Documentation 0.0.4 Help

    Overview

    Forest Recovery Digital Companion (FRDC) is a ML-assisted companion for ecologists to automatically classify surveyed trees via an Unmanned Aerial Vehicle (UAV).

    This package, FRDC-ML is the Machine Learning backbone of this project, a centralized repository of tools and model architectures to be used in the FRDC pipeline.

    Get started here

    Other Projects

    FRDC-UI

    The User Interface Repository for FRDC, a WebApp GUI for ecologists to adjust annotations.

    Last modified: 25 October 2023
    \ No newline at end of file diff --git a/docs/preprocessing-extract-segments.html b/docs/preprocessing-extract-segments.html new file mode 100644 index 00000000..24a7d73a --- /dev/null +++ b/docs/preprocessing-extract-segments.html @@ -0,0 +1,94 @@ + preprocessing.extract_segments | Documentation

    Documentation 0.0.4 Help

    preprocessing.extract_segments

    Functions

    extract_segments_from_labels

    Extracts segments from a label classification.

    extract_segments_from_bounds

    Extracts segments from Rect bounds.

    remove_small_segments_from_labels

    Removes small segments from a label classification.

    Extract with Boundaries

    A boundary is a Rect object that represents the minimum bounding box of a segment, with x0, y0, x1, y1 coordinates.

    It simply slices the original image to the bounding box. The origin is the top left corner of the image.

    ++-----------------+ +-----------+ +| Original | | Segmented | +| Image | | Image | ++-----+-----+-----+ +-----+-----+ +| 1 | 2 | 3 | | 2 | 3 | ++-----+-----+-----+ +-----+-----+ +| 4 | 5 | 6 | -----------> | 5 | 6 | ++-----+-----+-----+ 1, 2, 0, 2 +-----+-----+ +| 7 | 8 | 9 | x0 y0 x1 y1 | 8 | 9 | ++-----+-----+-----+ +-----+-----+ +
    ++-----------------+ +-----------------+ +| Original | | Segmented | +| Image | | Image | ++-----+-----+-----+ +-----+-----+-----+ +| 1 | 2 | 3 | | 0 | 2 | 3 | ++-----+-----+-----+ +-----+-----+-----+ +| 4 | 5 | 6 | -----------> | 0 | 5 | 6 | ++-----+-----+-----+ 1, 2, 0, 2 +-----+-----+-----+ +| 7 | 8 | 9 | x0 y0 x1 y1 | 0 | 8 | 9 | ++-----+-----+-----+ +-----+-----+-----+ +

    Extract with Labels

    A label classification is a np.ndarray where each pixel is mapped to a segment. The segments are mapped to a unique integer. In our project, the 0th label is the background.

    For example, a label classification of 3 segments will look like this:

    ++-----------------+ +-----------------+ +| Label | | Original | +| Classification | | Image | ++-----+-----+-----+ +-----+-----+-----+ +| 1 | 2 | 0 | | 1 | 2 | 3 | ++-----+-----+-----+ +-----+-----+-----+ +| 1 | 2 | 2 | | 4 | 5 | 6 | ++-----+-----+-----+ +-----+-----+-----+ +| 1 | 1 | 0 | | 7 | 8 | 9 | ++-----+-----+-----+ +-----+-----+-----+ +

    The extraction will take the minimum bounding box of each segment and return a list of segments.

    For example, the label 1 and 2 extracted images will be

    ++-----------+ +-----------+ +| Extracted | | Extracted | +| Segment 1 | | Segment 2 | ++-----+-----+ +-----+-----+ +| 1 | 0 | | 2 | 0 | ++-----+-----+ +-----+-----+ +| 4 | 0 | | 5 | 6 | ++-----+-----+ +-----+-----+ +| 7 | 8 | ++-----+-----+ +
    ++-----------------+ +-----------------+ +| Extracted | | Extracted | +| Segment 1 | | Segment 2 | ++-----+-----+-----+ +-----+-----+-----+ +| 1 | 0 | 0 | | 0 | 2 | 0 | ++-----+-----+-----+ +-----+-----+-----+ +| 4 | 0 | 0 | | 0 | 5 | 6 | ++-----+-----+-----+ +-----+-----+-----+ +| 7 | 8 | 0 | | 0 | 0 | 0 | ++-----+-----+-----+ +-----+-----+-----+ +

    Usage

    • If cropped is False, the segments are padded with 0s to the original image size. While this can ensure shape consistency, it can consume more memory for large images.

    • If cropped is True, the segments are cropped to the minimum bounding box. This can save memory, but the shape of the segments will be inconsistent.

    Extract from Bounds and Labels

    Extract segments from bounds and labels.

    +import numpy as np +from frdc.load import FRDCDataset +from frdc.preprocess.extract_segments import extract_segments_from_bounds + +ds = FRDCDataset(site='chestnut_nature_park', + date='20201218', + version=None, ) +ar, order = ds.get_ar_bands() +bounds, labels = ds.get_bounds_and_labels() + +segments: list[np.ndarray] = extract_segments_from_bounds(ar, bounds) +

    Extract from Auto-Segmentation

    Extract segments from a label classification.

    +from skimage.morphology import remove_small_objects, remove_small_holes +import numpy as np + +from frdc.load import FRDCDataset +from frdc.preprocess.morphology import ( + threshold_binary_mask, binary_watershed +) +from frdc.preprocess.scale import scale_0_1_per_band +from frdc.preprocess.extract_segments import ( + extract_segments_from_labels, remove_small_segments_from_labels +) + +ds = FRDCDataset(site='chestnut_nature_park', + date='20201218', + version=None, ) +ar, order = ds.get_ar_bands() +ar = scale_0_1_per_band(ar) +ar_mask = threshold_binary_mask(ar, -1, 90 / 256) +ar_mask = remove_small_objects(ar_mask, min_size=100, connectivity=2) +ar_mask = remove_small_holes(ar_mask, area_threshold=100, connectivity=2) +ar_labels = binary_watershed(ar_mask) +ar_labels = remove_small_segments_from_labels(ar_labels, + min_height=10, min_width=10) + +segments: list[np.ndarray] = extract_segments_from_labels(ar, ar_labels) +

    API

    extract_segments_from_labels(ar, ar_labels, cropped)

    Extracts segments from a label classification.


    ar_labels is a label classification as a np.ndarray

    extract_segments_from_bounds(ar, bounds, cropped)

    Extracts segments from Rect bounds.


    bounds is a list of Rect bounds.

    remove_small_segments_from_labels(ar_labels, min_height, min_width)

    Removes small segments from a label classification.


    Last modified: 25 October 2023
    \ No newline at end of file diff --git a/docs/preprocessing-morphology.html b/docs/preprocessing-morphology.html new file mode 100644 index 00000000..b3da6f18 --- /dev/null +++ b/docs/preprocessing-morphology.html @@ -0,0 +1,15 @@ + preprocessing.morphology | Documentation

    Documentation 0.0.4 Help

    preprocessing.morphology

    Functions

    threshold_binary_mask

    Thresholds a selected NDArray bands to yield a binary mask.

    binary_watershed

    Performs watershed on a binary mask to yield a mapped label classification

    Usage

    Perform auto-segmentation on a dataset to yield a label classification.

    +from frdc.load import FRDCDataset +from frdc.preprocess.morphology import ( + threshold_binary_mask, binary_watershed +) + +ds = FRDCDataset(site='chestnut_nature_park', + date='20201218', + version=None, ) +ar, order = ds.get_ar_bands() +mask = threshold_binary_mask(ar, order.index('NIR'), 90 / 256) +ar_label = binary_watershed(mask) +

    API

    threshold_binary_mask(ar, band_idx, threshold_value)

    Thresholds a selected NDArray bands to yield a binary mask as np.ndarray


    This is equivalent to

    +ar[..., band_idx] > threshold_value +
    binary_watershed(ar_mask, peaks_footprint, watershed_compactness)

    Performs watershed on a binary mask to yield a mapped label classification as a np.ndarray


    • peaks_footprint is the footprint of skimage.feature.peak_local_max

    • watershed_compactness is the compactness of skimage.morphology.watershed

    Last modified: 25 October 2023
    \ No newline at end of file diff --git a/docs/preprocessing-scale.html b/docs/preprocessing-scale.html new file mode 100644 index 00000000..2b23cf38 --- /dev/null +++ b/docs/preprocessing-scale.html @@ -0,0 +1,15 @@ + preprocessing.scale | Documentation

    Documentation 0.0.4 Help

    preprocessing.scale

    Functions

    scale_0_1_per_band

    Scales the NDArray bands to [0, 1] per band.

    scale_normal_per_band

    Scales the NDArray bands to zero mean unit variance per band.

    scale_static_per_band

    Scales the NDArray bands by a predefined configuration.

    Usage

    +from frdc.load import FRDCDataset +from frdc.preprocess.scale import ( + scale_0_1_per_band, scale_normal_per_band, scale_static_per_band +) +from frdc.conf import BAND_MAX_CONFIG + +ds = FRDCDataset(site='chestnut_nature_park', + date='20201218', + version=None, ) +ar, order = ds.get_ar_bands() +ar_01 = scale_0_1_per_band(ar) +ar_norm = scale_normal_per_band(ar) +ar_static = scale_static_per_band(ar, order, BAND_MAX_CONFIG) +

    API

    scale_0_1_per_band(ar)

    Scales the NDArray bands to [0, 1] per band.


    scale_normal_per_band(ar)

    Scales the NDArray bands to zero mean unit variance per band.


    scale_static_per_band(ar, order, config)

    Scales the NDArray bands by a predefined configuration.


    The config is of dict[str, tuple[int, int]] where the key is the band name, and the value is a tuple of (min, max). Take a look at frdc.conf.BAND_MAX_CONFIG for an example.

    Last modified: 25 October 2023
    \ No newline at end of file diff --git a/webHelpD2-all.zip b/webHelpD2-all.zip new file mode 100644 index 0000000000000000000000000000000000000000..0b62c6ae9ca8cb2af9b5c9ed6692cabc4482283e GIT binary patch literal 33679 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 literal 0 HcmV?d00001