diff --git a/.github/workflows/validate-zenodo.yaml b/.github/workflows/validate-zenodo.yaml new file mode 100644 index 0000000..cf65844 --- /dev/null +++ b/.github/workflows/validate-zenodo.yaml @@ -0,0 +1,23 @@ +name: Check zenodo metadata + +on: + push: + paths: + - '.zenodo.json' + - '.github/workflows/validate-zenodo.yaml' + +jobs: + check-zenodo-metadata: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: '24' + - name: Install dependencies + run: npm install zenodraft@0.14.1 + - name: Check .zenodo.json file + run: | + npx zenodraft metadata validate .zenodo.json diff --git a/.zenodo.json b/.zenodo.json new file mode 100644 index 0000000..3885d3e --- /dev/null +++ b/.zenodo.json @@ -0,0 +1,127 @@ +{ + "creators": [ + { + "name": "Liu, Fangxun", + "affiliation": "The Ohio State University", + "orcid": "0009-0008-8508-2776" + }, + { + "name": "Rayeed, S M", + "affiliation": "Rensselaer Polytechnic Institute" + }, + { + "name": "Stevens, Samuel", + "affiliation": "The Ohio State University" + }, + { + "name": "East, Alyson", + "affiliation": "The University of Maine" + }, + { + "name": "Chiang, Cheng Hsuan", + "affiliation": "The Ohio State University" + }, + { + "name": "Lee, Colin", + "affiliation": "The Ohio State University" + }, + { + "name": "Yi, Daniel", + "affiliation": "The Ohio State University" + }, + { + "name": "Yang, Junke", + "affiliation": "The Ohio State University" + }, + { + "name": "Naik, Tejas", + "affiliation": "The Ohio State University" + }, + { + "name": "Wang, Ziyi", + "affiliation": "The Ohio State University" + }, + { + "name": "Kilrain, Connor", + "affiliation": "The Ohio State University" + }, + { + "name": "Buckwalter, Elijah H.", + "affiliation": "The Ohio State University" + }, + { + "name": "Hou, Jiacheng", + "affiliation": "The Ohio State University" + }, + { + "name": "Bueno, Saul Ibaven", + "affiliation": "The Ohio State University" + }, + { + "name": "Wang, Shuheng", + "affiliation": "The Ohio State University" + }, + { + "name": "Ma, Xinyue", + "affiliation": "The Ohio State University" + }, + { + "name": "Liu, Yifan", + "affiliation": "The Ohio State University" + }, + { + "name": "Tao, Zhiyuan", + "affiliation": "The Ohio State University" + }, + { + "name": "Zhang, Ziheng", + "affiliation": "The Ohio State University" + }, + { + "name": "Sokol, Eric", + "affiliation": "National Ecological Observatory Network (NEON), Battelle" + }, + { + "name": "Belitz, Michael", + "affiliation": "Michigan State University" + }, + { + "name": "Record, Sydne", + "affiliation": "The University of Maine" + }, + { + "name": "Stewart, Charles V.", + "affiliation": "Rensselaer Polytechnic Institute" + }, + { + "name": "Chao, Wei-Lun", + "affiliation": "The Ohio State University" + } + ], + "description": "Pipeline for processing large-scale tray images of pinned beetles: detect specimens, optionally sort and crop with metadata matching, and produce fine-grained morphological segmentation (5-class or 9-class). It uses an open-vocabulary detector (Grounding DINO), a vision-language model (LLaVA-NeXT) for verification, and fine-tuned Mask2Former for transformer-based part segmentation and downstream morphological analysis.", + "keywords": [ + "deep learning", + "computer vision", + "image processing", + "object detection", + "image segmentation", + "entomology", + "imageomics" + ], + "license": { + "id": "MIT" + }, + "publication_date": "2026-07-07", + "title": "BeetleFlow: An Integrative Deep Learning Pipeline for Beetle Image Processing", + "version": "1.0.0", + "grants": [ + { + "id": "021nxhr62::2118240" + } + ], + "references": [ + "East, A., Belitz, M., Cotton, L., Dominguez, J., Betancourt, I., Rayeed, S. M., Liu, F., Carlyn, D., Kilrain, C., Wu, J., Earl, C., Lapp, H., Perry, K. I., Stewart, C., Thompson, M. J., Campolongo, E. G., Chao, W.-L., Sokol, E. R., & Record, S. (2026). Beetles as Sentinel Taxa: Predicting drought conditions from NEON specimen imagery (Revision 5026be7). Hugging Face. https://doi.org/10.57967/hf/8716", + "National Ecological Observatory Network. (2025). Ground beetles sampled from pitfall traps (DP1.10022.001). https://doi.org/10.48443/CD21-Q875", + "National Ecological Observatory Network. (2025). NEON Field Site Metadata. Retrieved June 25, 2025, from https://www.neonscience.org/field-sites/exports/NEON_Field_Site_Metadata_20250625" + ] +} diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..6e9e3ea --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,145 @@ +cff-version: 1.2.0 +message: "If you find this software helpful in your research, please cite both the software and our paper." + +title: "BeetleFlow: An Integrative Deep Learning Pipeline for Beetle Image Processing" +abstract: >- + Pipeline for processing large-scale tray images of pinned beetles: detect specimens, + optionally sort and crop with metadata matching, and produce fine-grained morphological + segmentation (5-class or 9-class). It uses an open-vocabulary detector (Grounding DINO), + a vision-language model (LLaVA-NeXT) for verification, and fine-tuned Mask2Former + for transformer-based part segmentation and downstream morphological analysis. + +type: software +repository-code: "https://github.com/Imageomics/BeetleFlow" +license: MIT + +date-released: 2026-07-07 +version: 1.0.0 +identifiers: + - description: "The GitHub release URL of tag 1.0.0." + type: url + value: "https://github.com/Imageomics/BeetleFlow/releases/tag/1.0.0" + +authors: + - family-names: Liu + given-names: Fangxun + orcid: "https://orcid.org/0009-0008-8508-2776" + - family-names: Rayeed + given-names: "S M" + - family-names: Stevens + given-names: Samuel + - family-names: East + given-names: Alyson + - family-names: Chiang + given-names: "Cheng Hsuan" + - family-names: Lee + given-names: Colin + - family-names: Yi + given-names: Daniel + - family-names: Yang + given-names: Junke + - family-names: Naik + given-names: Tejas + - family-names: Wang + given-names: Ziyi + - family-names: Kilrain + given-names: Connor + - family-names: Buckwalter + given-names: "Elijah H." + - family-names: Hou + given-names: Jiacheng + - family-names: Bueno + given-names: "Saul Ibaven" + - family-names: Wang + given-names: Shuheng + - family-names: Ma + given-names: Xinyue + - family-names: Liu + given-names: Yifan + - family-names: Tao + given-names: Zhiyuan + - family-names: Zhang + given-names: Ziheng + - family-names: Sokol + given-names: Eric + - family-names: Belitz + given-names: Michael + - family-names: Record + given-names: Sydne + - family-names: Stewart + given-names: "Charles V." + - family-names: Chao + given-names: "Wei-Lun" + +keywords: + - deep learning + - computer vision + - image processing + - object detection + - image segmentation + - entomology + - imageomics + +preferred-citation: + type: conference-paper + title: "BeetleFlow: An Integrative Deep Learning Pipeline for Beetle Image Processing" + authors: + - family-names: Liu + given-names: Fangxun + orcid: "https://orcid.org/0009-0008-8508-2776" + - family-names: Rayeed + given-names: "S M" + - family-names: Stevens + given-names: Samuel + - family-names: East + given-names: Alyson + - family-names: Chiang + given-names: "Cheng Hsuan" + - family-names: Lee + given-names: Colin + - family-names: Yi + given-names: Daniel + - family-names: Yang + given-names: Junke + - family-names: Naik + given-names: Tejas + - family-names: Wang + given-names: Ziyi + - family-names: Kilrain + given-names: Connor + - family-names: Buckwalter + given-names: "Elijah H." + - family-names: Hou + given-names: Jiacheng + - family-names: Bueno + given-names: "Saul Ibaven" + - family-names: Wang + given-names: Shuheng + - family-names: Ma + given-names: Xinyue + - family-names: Liu + given-names: Yifan + - family-names: Tao + given-names: Zhiyuan + - family-names: Zhang + given-names: Ziheng + - family-names: Sokol + given-names: Eric + - family-names: Belitz + given-names: Michael + - family-names: Record + given-names: Sydne + - family-names: Stewart + given-names: "Charles V." + - family-names: Chao + given-names: "Wei-Lun" + keywords: + - deep learning + - computer vision + - image processing + - object detection + - image segmentation + - entomology + - imageomics + collection-title: "NeurIPS 2025 Workshop for Imageomics: Discovering Biological Knowledge from Images Using AI" + year: 2025 diff --git a/README.md b/README.md index 688e0fb..e37ca70 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ - [ ] Add installation guide ## 📊 Dataset -Beetle part segmentation dataset is available [here](data/) (both 5-class and 9-class). +Dataset for beetle part segmentation is available [here](data/) (both 5-class and 9-class). ## 🧑‍💻 Usage @@ -46,6 +46,8 @@ Though the code in this repository is shared under an [MIT License](https://gith ## Acknowledgments +This work was in part conceived at [Funcapalooza](https://github.com/Imageomics/FuncaPalooza-2025). + This work uses data from the [Beetles as Sentinel Taxa: Predicting drought conditions from NEON specimen imagery dataset](https://huggingface.co/datasets/imageomics/sentinel-beetles). If you make use of the data, please be sure to cite the original source: BibTeX: @@ -55,10 +57,10 @@ BibTeX: S M Rayeed and Fangxun Liu and David Carlyn and Connor Kilrain and Jiaman Wu and Chandra Earl and Hilmar Lapp and Kayla I. Perry and Charles Stewart and Matthew J. Thompson and Elizabeth G. Campolongo and Wei-Lun Chao and Eric R. Sokol and Sydne Record}, - title = {Beetles as Sentinel Taxa: Predicting drought conditions from {NEON} specimen imagery}, - year = {2025}, + title = {Beetles as Sentinel Taxa: Predicting drought conditions from {NEON} specimen imagery (Revision 5026be7)}, + year = {2026}, url = {https://huggingface.co/datasets/imageomics/sentinel-beetles}, - doi = {}, + doi = {10.57967/hf/8716}, publisher = {Hugging Face} } ``` diff --git a/requirements_detection.txt b/requirements_detection.txt new file mode 100644 index 0000000..353c1f2 --- /dev/null +++ b/requirements_detection.txt @@ -0,0 +1,21 @@ +python>=3.9 +numpy>=1.26 +pandas>=2.2 +torch>=2.4 +torchvision>=0.19 +accelerate>=0.24 +transformers>=4.40.0 +huggingface-hub>=0.34 +tokenizers>=0.21 +safetensors>=0.5 +Pillow>=10.3 +opencv-python>=4.8 +matplotlib>=3.7 +bitsandbytes>=0.43.0 +scipy>=1.11 +tqdm>=4.66 +PyYAML>=6.0 +requests>=2.32 +packaging>=24.1 +typing_extensions>=4.12 +pycocotools>=2.0.7 diff --git a/requirements_segmentation.txt b/requirements_segmentation.txt new file mode 100644 index 0000000..dc09bee --- /dev/null +++ b/requirements_segmentation.txt @@ -0,0 +1,123 @@ +absl-py==2.3.1 +aiohappyeyeballs==2.6.1 +aiohttp==3.12.15 +aiosignal==1.4.0 +albucore==0.0.24 +albumentations==2.0.8 +annotated-types==0.7.0 +antlr4-python3-runtime==4.9.3 +appdirs==1.4.4 +async-timeout==5.0.1 +attrs==25.3.0 +black==25.1.0 +certifi==2025.8.3 +charset-normalizer==3.4.3 +cityscapesScripts==2.2.4 +click==8.2.1 +cloudpickle==3.1.1 +coloredlogs==15.0.1 +contourpy==1.3.2 +cycler==0.12.1 +Cython==3.1.2 +datasets==4.0.0 +detectron2==0.6 +dill==0.3.8 +evaluate==0.4.5 +filelock==3.13.1 +fonttools==4.59.0 +frozenlist==1.7.0 +fsspec==2024.6.1 +fvcore==0.1.5.post20221221 +grpcio==1.74.0 +h5py==3.14.0 +hf-xet==1.1.7 +huggingface-hub==0.34.4 +humanfriendly==10.0 +hydra-core==1.3.2 +idna==3.10 +imageio==2.37.0 +iopath==0.1.9 +Jinja2==3.1.4 +kiwisolver==1.4.9 +lazy_loader==0.4 +Markdown==3.8.2 +MarkupSafe==2.1.5 +matplotlib==3.10.5 +mpmath==1.3.0 +multidict==6.6.4 +multiprocess==0.70.16 +MultiScaleDeformableAttention==1.0 +mypy_extensions==1.1.0 +networkx==3.3 +numpy==2.1.2 +nvidia-cublas-cu12==12.6.4.1 +nvidia-cuda-cupti-cu12==12.6.80 +nvidia-cuda-nvrtc-cu12==12.6.77 +nvidia-cuda-runtime-cu12==12.6.77 +nvidia-cudnn-cu12==9.10.2.21 +nvidia-cufft-cu12==11.3.0.4 +nvidia-cufile-cu12==1.11.1.6 +nvidia-curand-cu12==10.3.7.77 +nvidia-cusolver-cu12==11.7.1.2 +nvidia-cusparse-cu12==12.5.4.2 +nvidia-cusparselt-cu12==0.7.1 +nvidia-nccl-cu12==2.27.3 +nvidia-nvjitlink-cu12==12.6.85 +nvidia-nvtx-cu12==12.6.77 +omegaconf==2.3.0 +opencv-python==4.12.0.88 +opencv-python-headless==4.12.0.88 +packaging==25.0 +pandas==2.3.1 +panopticapi==0.1 +pathspec==0.12.1 +pillow==11.0.0 +pip==25.1 +platformdirs==4.3.8 +portalocker==3.2.0 +propcache==0.3.2 +protobuf==6.31.1 +pyarrow==21.0.0 +pycocotools==2.0.10 +pydantic==2.11.7 +pydantic_core==2.33.2 +pyparsing==3.2.3 +pyquaternion==0.9.9 +python-dateutil==2.9.0.post0 +pytz==2025.2 +PyYAML==6.0.2 +regex==2025.7.34 +requests==2.32.4 +safetensors==0.6.2 +scikit-image==0.25.2 +scipy==1.15.3 +setuptools==78.1.1 +shapely==2.1.1 +simsimd==6.5.0 +six==1.17.0 +stringzilla==3.12.6 +submitit==1.5.3 +sympy==1.13.3 +tabulate==0.9.0 +tensorboard==2.20.0 +tensorboard-data-server==0.7.2 +termcolor==3.1.0 +tifffile==2025.5.10 +timm==1.0.19 +tokenizers==0.21.4 +tomli==2.2.1 +torch==2.8.0+cu126 +torchvision==0.23.0+cu126 +tqdm==4.67.1 +transformers==4.55.2 +triton==3.4.0 +typing==3.7.4.3 +typing_extensions==4.12.2 +typing-inspection==0.4.1 +tzdata==2025.2 +urllib3==2.5.0 +Werkzeug==3.1.3 +wheel==0.45.1 +xxhash==3.5.0 +yacs==0.1.8 +yarl==1.20.1