#### NOTE
This is a **Hugging Face dataset**. For large datasets, ensure `huggingface_hub>=1.1.3` to avoid rate limits. Learn more in the <a href="https://docs.voxel51.com/integrations/huggingface.html#loading-datasets-from-the-hub" target="_blank">Hugging Face integration docs</a>.

<a href="https://huggingface.co/datasets/Voxel51/GrowliFlower" target="_blank">![Hugging Face](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Dataset-yellow)</a>

# Dataset Card for GrowliFlower

This is a [FiftyOne](https://github.com/voxel51/fiftyone) dataset with 24,866 samples (across 23,875 groups, group slices `pre` and `post`).

![image/png](https://huggingface.co/datasets/Voxel51/GrowliFlower/resolve/main/growliflower.gif)

## Installation

If you haven’t already, install FiftyOne:

```bash
pip install -U fiftyone
```

## Usage

```python
import fiftyone as fo
from fiftyone.utils.huggingface import load_from_hub

# Load the dataset
# Note: other available arguments include 'max_samples', etc
dataset = fo.load_from_hub("Voxel51/GrowliFlower")

# Launch the App
session = fo.launch_app(dataset)
```

## Dataset Details

### Dataset Description

GrowliFlower is a georeferenced, image-based UAV time-series dataset of two monitored cauliflower fields near Cologne, Germany (Field 1, 2020, 0.39 ha; Field 2, 2021, 0.60 ha), captured with a 47.4 MP Sony A7rIII RGB camera and a MicaSense 5-channel multispectral camera. This FiftyOne dataset consolidates three of the source release’s task-specific subsets into one grouped dataset: pixel-accurate plant/leaf/stem instance segmentations on independent image patches, phenotyped-plant growth time series with real measured traits (height, diameter, BBCH growth stage, harvest status), and defoliation plant time series with a paired pre/post leaf-removal capture that exposes the cauliflower head.

- **Curated by:** Jana Kierdorf, Laura Verena Junker-Frohn, Mike Delaney, Mariele Donoso Olave, Andreas Burkart, Hannah Jaenicke, Onno Muller, Uwe Rascher, and Ribana Roscher (University of Bonn, Forschungszentrum Jülich, JB Hyperspectral Devices GmbH)
- **Funded by:** European Agriculture Fund for Rural Development, with contribution from North-Rhine Westphalia (17-02.12.01 - 10/16 – EP-0004617925-19-001); Deutsche Forschungsgemeinschaft (DFG, German Research Foundation) under Germany’s Excellence Strategy – EXC 2070 – 390732324
- **Shared by:** This FiftyOne-formatted version was curated and published by Harpreet Sahota
- **Language(s):** en
- **License:** [More Information Needed] — no license is stated in the PhenoRoam catalog record, the shipped README, or the source paper. Confirm terms with the corresponding author (Jana Kierdorf, jkierdorf@uni-bonn.de) before redistribution.

### Dataset Sources

- **Repository:** [PhenoRoam catalog record](https://phenoroam.phenorob.de/geonetwork/srv/eng/catalog.search#/metadata/cb328232-31f5-4b84-a929-8e1ee551d66a)
- **Paper:** [GrowliFlower: An image time series dataset for GROWth analysis of cauLIFLOWER](https://arxiv.org/abs/2204.00294) (arXiv:2204.00294)
- **Demo:** [More Information Needed]

## Uses

### Direct Use

- Training and evaluating instance segmentation, object detection, and stem-keypoint detection models on cauliflower plant/leaf imagery (`segmentation` task samples)
- Growth-curve and phenotype-trait regression: predicting height, diameter, developmental stage, or head diameter from imagery, using the `reference` task samples and their joined `in_situ_*` fields
- Studying the correlation between external plant appearance (leaves/canopy) and the internal cauliflower head, using the `defoliation` task’s paired `pre`/`post` group slices
- Tracking a single plant’s growth trajectory over time via its `plant_id` field, for both the `reference` and `defoliation` tasks

### Out-of-Scope Use

- This FiftyOne dataset does **not** include `GrowliFlowerT` (the source release’s third time-series subset — 158,412 unlabeled random-plant crops with no in-situ measurements), nor the raw RGB/multispectral orthomosaics (`GrowliFlowerO`/`GrowliFlowerM`) themselves — those remain multi-gigabyte GeoTIFFs unsuited to direct per-sample FiftyOne import. Whole-field mapping or orthomosaic-level analysis is out of scope for this version.
- Given the unresolved license status, this dataset should not be used for commercial redistribution without confirming terms with the original authors first.

## Dataset Structure

This is a **grouped** FiftyOne dataset (`media_type="group"`): 24,866 samples across 23,875 groups, with group slices `pre` (23,889 samples, default) and `post` (977 samples). Every group represents one plant at one acquisition date; a group has only a `pre` slice on ordinary dates, and gains a second `post` slice only on a defoliation plant’s actual defoliation date (leaves removed to expose the cauliflower head). Segmentation patches have no natural pairing with anything else, so each forms its own singleton `pre`-only group.

The dataset combines three tasks from the original release, distinguished by the `task` field:

| `task` value   |   Samples | Source subset   | Description                                                                                            |
|----------------|-----------|-----------------|--------------------------------------------------------------------------------------------------------|
| `segmentation` |     2,198 | `GrowliFlowerL` | Independent 448x368 sliding-window patches (Field 1, 2020 only) with pixel-accurate instance masks     |
| `reference`    |     9,377 | `GrowliFlowerR` | Crops of 740 phenotyped plants across up to 15 acquisition dates each, with real measured traits       |
| `defoliation`  |    13,291 | `GrowliFlowerD` | Crops of defoliated plants: a pre-defoliation time series per plant, plus one post-defoliation capture |

Splits are stored as sample tags (`train`: 15,142, `val`: 5,052, `test`: 4,672), following each source subset’s own proposed, spatially-disjoint split assignment.

Four saved views are included for quick access to each task:

| View                    |   Samples | Description                                                                |
|-------------------------|-----------|----------------------------------------------------------------------------|
| `segmentation`          |     2,198 | All `segmentation` task samples                                            |
| `reference_growth`      |     9,377 | All `reference` task samples                                               |
| `defoliation_pairs`     |    13,291 | All `defoliation` task samples, across both `pre` and `post` slices        |
| `defoliation_post_only` |       977 | Just the `post` group slice, for pairing against each group’s `pre` sample |

### Fields

| Field                   | FiftyOne type                          | Description                                                                                                                                                                     |
|-------------------------|----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `filepath`              | `StringField`                          | Absolute path to the cropped JPEG image on disk for this sample                                                                                                                 |
| `tags`                  | `ListField(StringField)`               | Split assignment (`train`/`val`/`test`) from the source subset’s proposed spatially-disjoint split                                                                              |
| `metadata`              | `EmbeddedDocumentField(ImageMetadata)` | Standard FiftyOne image metadata (width, height, size_bytes, mime_type, num_channels)                                                                                           |
| `group`                 | `EmbeddedDocumentField(Group)`         | Groups one plant’s captures at one acquisition date together; see Dataset Structure above                                                                                       |
| `task`                  | `StringField`                          | Which task this sample supports: `segmentation`, `reference`, or `defoliation`                                                                                                  |
| `field`                 | `StringField`                          | Which monitored field: `Field1` (2020) or `Field2` (2021)                                                                                                                       |
| `acquisition_date`      | `StringField`                          | Calendar date (YYYY-MM-DD) the source orthomosaic was captured, or the segmentation patch was extracted                                                                         |
| `patch_id`              | `StringField`                          | Sliding-window tile index (`segmentation` only) — arbitrary, not linked to any tracked plant                                                                                    |
| `has_plants`            | `BooleanField`                         | Whether a `segmentation` patch has any annotated plant instance (~10% deliberately show bare soil)                                                                              |
| `plant_instances`       | `Detections`                           | Per-plant instance masks (`segmentation` only), decoded from the source `maskPlants` PNGs; each detection carries an `is_void` attribute for plants cut off at the patch border |
| `leaf_instances`        | `Detections`                           | Per-leaf instance masks (`segmentation` only), decoded from `maskLeaves`; void plants are fully excluded from this mask by the original annotators                              |
| `stem_keypoints`        | `Keypoints`                            | One point per non-void plant’s stem position (`segmentation` only), decoded from `maskStems`                                                                                    |
| `void_mask`             | `Segmentation`                         | Binary mask of plants cut off at the patch border (`segmentation` only), decoded from `maskVoid`                                                                                |
| `plant_id`              | `StringField`                          | Stable identifier for one tracked plant (`reference`/`defoliation` only), constant across every date it was photographed                                                        |
| `phase`                 | `StringField`                          | `pre` (default) or `post` (defoliation-day, after leaf removal)                                                                                                                 |
| `day_after_planting`    | `IntField`                             | Days between this plant’s planting date and this sample’s acquisition date                                                                                                      |
| `planting_date`         | `StringField`                          | Calendar date (YYYY-MM-DD) this plant was planted                                                                                                                               |
| `coverage_frac`         | `FloatField`                           | Fraction of non-zero (valid) pixels in the crop; low values flag a documented orthomosaic data gap for that date                                                                |
| `plot`                  | `IntField`                             | Reference plot number (`reference` only): 1-4 for Field 1, 1-5 for Field 2                                                                                                      |
| `harvest_timepoint`     | `StringField`                          | Harvest-window index for this reference plant (`reference` only), from the source coordinate file                                                                               |
| `in_situ_height`        | `StringField`                          | Manually measured plant height (`reference` only)                                                                                                                               |
| `in_situ_diameter`      | `StringField`                          | Manually measured plant diameter (`reference` only)                                                                                                                             |
| `in_situ_bbch_stage`    | `StringField`                          | Phenological development stage, BBCH/Feller 1995 scale (`reference` only)                                                                                                       |
| `in_situ_head_diameter` | `StringField`                          | Manually measured cauliflower head/curd diameter (`reference` only)                                                                                                             |
| `in_situ_harvested`     | `StringField`                          | Harvest marker once the plant was harvested (`reference` only); null before harvest                                                                                             |
| `in_situ_comment`       | `StringField`                          | Free-text field observation (`reference` only), using abbreviations documented in the source `abbreviation` sheet                                                               |
| `day_group`             | `IntField`                             | Defoliation-day group index (`defoliation` only): day1-day2 for Field 1, day1-day6 for Field 2                                                                                  |
| `defoliation_date`      | `StringField`                          | Calendar date (YYYY-MM-DD) this plant was defoliated (`defoliation` only)                                                                                                       |

All six `in_situ_*` fields are stored as strings rather than numbers: the source spreadsheet mixes clean numeric values with free-text/range entries in the same column (e.g. a diameter recorded as `"10 (10)"`), and casting to a numeric type would silently corrupt or drop those entries.

`dataset.info["source"]` records the provenance string:  *“Consolidated from GrowliFlowerL, GrowliFlowerR, and GrowliFlowerD subsets of GrowliFlower ([PhenoRoam catalog record](https://phenoroam.phenorob.de/geonetwork/srv/eng/catalog.search#/metadata/cb328232-31f5-4b84-a929-8e1ee551d66a), arXiv:2204.00294).”*

### Parsing decisions

- **Segmentation labels** (`plant_instances`/`leaf_instances`/`stem_keypoints`/`void_mask`) were decoded from indexed-color PNG instance masks by finding each unique non-zero index, taking its bounding box and boolean sub-mask (for `Detections`), or its pixel centroid (for the single-point `Keypoints` on stems).
- **Crop windows for `reference`/`defoliation` samples** are always derived from each plant’s global UTM coordinate via the orthomosaic’s own affine transform (`rasterio.transform.rowcol`), never from the source release’s local per-date pixel-coordinate files — one of those files (`GrowliFlowerD`/Field 1) contains corrupted pixel values (up to ~9.7M px on a ~46K-px-wide image), so a single uniform, UTM-based method was used everywhere instead of special-casing that file.
- **Some source orthomosaics are `uint16`, not `uint8`**, with real values spanning well past a 12-bit range — a plain downcast produces wraparound noise. A per-orthomosaic (not per-patch) 1st/99th-percentile contrast stretch is applied before cropping, so contrast stays consistent across every patch cut from the same source image.
- **In-situ phenotype measurements** are joined onto `reference` samples by (plot, row, position, acquisition date), parsed from the source Excel workbooks by header name rather than column position, since Field 1 and Field 2 use different column orders and even different column names for the same trait (e.g. `Ø Head` vs `Ø Flower`).
- **`defoliation` samples are not a simple 2-shot pre/post pair**: each defoliated plant actually has a full pre-defoliation time series (many acquisition dates) plus one additional post-defoliation capture. This is why grouping is keyed by `(plant_id, acquisition_date)` rather than by `plant_id` alone — every date gets its own group, and only the true defoliation date’s group has both a `pre` and a `post` slice.
- Crops with `coverage_frac` well below 1.0 (4.1% of `reference`/`defoliation` samples) were **kept, not dropped**, since they correspond to a real, paper-documented data gap in specific Field 1 orthomosaics rather than a processing error.

## Dataset Creation

### Curation Rationale

The source dataset was created to foster machine learning approaches for analyzing crop growth and development and deriving phenotypic traits relevant to agricultural automation — cauliflower in particular, because its harvestable product (the head) is fully obscured by leaves until harvest, making yield and quality estimation from external imagery a genuinely hard, unsolved problem. This FiftyOne-formatted version further consolidates the source release’s segmentation and time-series subsets into one dataset so both can be explored and cross-referenced (e.g. training a segmentation model on one task and evaluating growth-trait extraction on another) from a single FiftyOne session.

### Source Data

#### Data Collection and Processing

RGB imagery was captured with a Sony A7rIII (47.4 MP, Zeiss/Batis 25mm lens) and multispectral imagery with a MicaSense 5-channel camera (475/560/668/717/840 nm bands), flown by UAV over both fields roughly weekly across the full growing season, from planting to harvest. Georeferenced ground control points (21 in Field 1, 44 in Field 2) were used to align and export the images as RGB and multispectral orthomosaics via Agisoft Metashape Professional, in WGS84 / UTM 32N. Individual plant coordinates were derived from the orthomosaics and used, together with manually recorded in-situ measurements, to build the source release’s task-specific subsets. For this FiftyOne version, patches were cropped from the RGB orthomosaics at each plant’s UTM coordinate (490x490 px for Field 1, 256x256 px for Field 2), and the source subset’s own instance-segmentation labels and in-situ measurement spreadsheets were parsed and attached as described above.

#### Who are the source data producers?

UAV image acquisition and in-situ measurements were carried out by the paper’s authors (University of Bonn, Forschungszentrum Jülich, JB Hyperspectral Devices GmbH) on a commercial cauliflower field near Cologne, Germany, in cooperation with the farmer Markus Schwarz.

### Annotations

#### Annotation process

Pixel-wise plant, leaf, void, and stem instance annotations (`segmentation` task) were manually labeled by the dataset authors. In-situ phenotypic measurements (`reference` task’s `in_situ_*` fields) — plant height, diameter, BBCH developmental stage, head diameter, and harvest status — were recorded manually in the field at each measured acquisition date.

#### Who are the annotators?

The paper’s authors and their field team at the University of Bonn / Forschungszentrum Jülich.

#### Personal and Sensitive Information

None. The dataset consists exclusively of aerial agricultural imagery and plant phenotype measurements; it contains no personal or sensitive information.

## Citation

**BibTeX:**

```bibtex
@article{kierdorf2022growliflower,
  title={GrowliFlower: An image time series dataset for GROWth analysis of cauLIFLOWER},
  author={Kierdorf, Jana and Junker-Frohn, Laura Verena and Delaney, Mike and Olave, Mariele Donoso and Burkart, Andreas and Jaenicke, Hannah and Muller, Onno and Rascher, Uwe and Roscher, Ribana},
  journal={arXiv preprint arXiv:2204.00294},
  year={2022}
}
```

**APA:**

Kierdorf, J., Junker-Frohn, L. V., Delaney, M., Olave, M. D., Burkart, A., Jaenicke, H., Muller, O., Rascher, U., & Roscher, R. (2022). GrowliFlower: An image time series dataset for GROWth analysis of cauLIFLOWER. *arXiv preprint arXiv:2204.00294*.

## More Information

This FiftyOne dataset consolidates 3 of the source release’s 4 machine-learning-oriented subsets (`GrowliFlowerL`, `GrowliFlowerR`, `GrowliFlowerD`); `GrowliFlowerT` was not included. The raw RGB and multispectral orthomosaics (`GrowliFlowerO`, `GrowliFlowerM`) are not included as samples either, since they are multi-gigabyte whole-field GeoTIFFs used only as the crop source. A full reconnaissance report — including the corrupted-coordinate-file, inconsistent-orthomosaic-dtype, and in-situ-spreadsheet-layout findings summarized above — is available in `DATASET_INSPECTION.md` alongside the source download.

## Dataset Card Authors

[Harpreet Sahota]()
