Machine Learning Engineer II in the Blueberry Breeding and Genomics Lab at the University of Florida (IFAS). I build computer vision pipelines for field phenotyping from rover images: plant segmentation, berry and flower detection, and the evaluation that decides when a model's output is good enough for breeders to use.
Before UF I was the founding engineer at Cult.trade, a blockchain startup, and before that a software engineer at the National Informatics Centre in India.
Ten pull requests merged into Roboflow projects in September 2026, plus one fix a maintainer merged through their own PR with me as co-author.
rf-detr, real-time detection and segmentation
- #1504 Gradient accumulation divided the loss twice, so with N accumulation steps the optimizer received 1/N of the mean gradient.
- #1506
run_test=Truehung after multi-GPU (DDP) training because only the main rank entered the test loop. - #1508 Multi-GPU validation and test metrics counted the samples
DistributedSamplerrepeats to pad each rank. - #1510
last.ckptand interval checkpoints were skipped on epochs without validation, so a crash between validations could lose several epochs of training. - #1511 TensorRT export now builds dynamic-batch engines (batch 1 to N) through an optimization profile.
- #1532 Validation and test mAP scored detections inside COCO crowd regions as false positives, so
evaluate()gave the pretrained Nano 48.0 mAP on val2017 instead of the 48.4 that pycocotools reports. - #1534
checkpoint_best_total.pthdropped the model config, sofrom_checkpoint()rebuilt the model with defaults, such as the wrong input resolution, around the trained weights. - #1537 Keypoint models clipped gradients before
GradScalerunscaled them under fp16, which shrank the clipping threshold by the loss scale. Merged through #1549 with me as co-author. - #1538
amp_dtype="auto"picked emulated bf16 on GPUs without native support, so training on a T4 ran about 2x slower than in fp16.
supervision, computer vision utilities
- #2612
ConfusionMatrixcan now score instance masks, not only boxes. - #2614
pillow_to_cv2converts every Pillow mode (1-bit, 16-bit, CMYK, LA) to 8-bit BGR or grayscale instead of passing raw values through.
Open:
- braindecode #1181
reset_headleft the saved config on the old head, sosave_pretrainedfollowed byfrom_pretrainedfailed for 18 EEG model classes. - QwenLM/Qwen3-TTS #370 masks padded keys in the 25 Hz speech tokenizer's manual attention path.
- BlueberryPlant-Segmentation: three-stage pipeline for rover images. SAM 3 isolates the center plant, 81 architecture traits are computed from each mask, and YOLO26 with SAHI tiling detects immature berries, mature berries, and flowers.
- Blueberry_Detection: code for Image-Based Estimation of Blueberry Yield Incorporating External Validation and Canopy Architecture Under Field Conditions. I am a co-author.
- ThripsDetection: scores chilli thrips injury on young plants from rover photos, with plant crops, 512 px tiling, and a labeling tool for annotators.
- blueberrylab-cell-counter: cell counts for brightfield microscopy with Cellpose-SAM, plus calibrated estimates for dense clusters.
Most lab code, including model training, lives in private repositories.
At Cult.trade (2023 to 2025) I built a reputation-gated token launchpad. Wallet reputation scores from on-chain credit history and social signals ranked more than 50,000 traders and decided who could join token launches. I also built the live WebSocket price and trade streams and moved about 500 GB of trade history from Oracle to AWS RDS PostgreSQL.
At the National Informatics Centre (2022 to 2023) I built multilingual voice navigation for a government portal with Dialogflow and Google Cloud Speech, in eight Indian languages.
Python, PyTorch, OpenCV, Ultralytics YOLO, SAM, Hugging Face Transformers, TensorRT, SQL, DuckDB, PostgreSQL, TypeScript, React, Docker, AWS.

