Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
697fa4e
update
FadelMamar Aug 17, 2023
b2b77bc
requirements
FadelMamar Sep 14, 2023
d04f80f
update
FadelMamar Sep 15, 2023
0c90ae6
creating
FadelMamar Sep 15, 2023
44387a0
update
FadelMamar Sep 15, 2023
64df513
Merge branch 'main' of github.com:FadelMamar/HerdNet
FadelMamar Sep 15, 2023
0a41f54
update
FadelMamar Nov 14, 2023
1af957a
update
FadelMamar Nov 14, 2023
5a70a41
ignoring yolov8 weights
FadelMamar Nov 14, 2023
3679b65
ingoiring *.pt weights
FadelMamar Nov 14, 2023
8d97277
update training info
FadelMamar Nov 18, 2023
c03501f
adding ultralytics
FadelMamar Nov 18, 2023
4bc4bd4
deleting uneeded cells
FadelMamar Nov 18, 2023
b311181
notebook for training
FadelMamar Nov 18, 2023
91abffa
training script
FadelMamar Nov 18, 2023
a170adf
adding training cfg
FadelMamar Nov 19, 2023
5f5d5cf
minimal update
FadelMamar Nov 19, 2023
5b91ba6
update
FadelMamar Nov 19, 2023
d56c205
update
FadelMamar Nov 20, 2023
7429311
saving savmap bboxes
FadelMamar Nov 20, 2023
2099509
update
FadelMamar Nov 20, 2023
81ad842
Merge branch 'main' of https://github.com/FadelMamar/HerdNet into main
FadelMamar Nov 20, 2023
6d6a7ba
preparing savmap data for yolo
FadelMamar Nov 20, 2023
a55aeca
data_config file for yolo
FadelMamar Nov 20, 2023
e3aaaee
adding geopandas
FadelMamar Nov 20, 2023
0c9b488
update
FadelMamar Nov 20, 2023
88a1155
update
FadelMamar Nov 29, 2023
4ecd18a
Merge branch 'main' of https://github.com/FadelMamar/HerdNet into main
FadelMamar Nov 29, 2023
19b7e79
adding AWS boto3 auth
FadelMamar Dec 1, 2023
2c381b1
label studio ml backend
FadelMamar Dec 1, 2023
e990e8d
update
FadelMamar Dec 1, 2023
60385ad
ReadMe Ml backend
FadelMamar Dec 1, 2023
aa451fe
update
FadelMamar Dec 1, 2023
85d4cc4
updating
FadelMamar Feb 8, 2024
d60dbe6
adding bash scripts
FadelMamar Feb 12, 2024
0681e67
adding batch scripts
FadelMamar Apr 3, 2024
1dca497
adding pattern matching
FadelMamar Apr 7, 2024
bada6e3
adding sahi
FadelMamar Apr 7, 2024
c33d097
launching sevices through conda envs
FadelMamar Apr 7, 2024
16b2ee5
adding pre-annotation section
FadelMamar Apr 9, 2024
6fd9a43
adapting backend model
FadelMamar Apr 9, 2024
6cdeefa
torch with cuda
FadelMamar Apr 9, 2024
ebf68c2
commenting lines
FadelMamar Apr 11, 2024
6abfbe5
adding parameters
FadelMamar Apr 12, 2024
e0d9c12
ignoring annotation templates
FadelMamar Apr 12, 2024
424dfc4
correcting mistake
FadelMamar Apr 24, 2024
6d2cef6
adding code to remove overlaps
FadelMamar May 5, 2024
54e45e5
adding -overlapfactor argument
FadelMamar May 26, 2024
d697695
update with new tiling script -overlapfactor
FadelMamar May 26, 2024
fe57f34
unneeded
FadelMamar Nov 16, 2024
91a88ec
fixing batch issue
FadelMamar Mar 12, 2025
f3a6ead
fixing bug
FadelMamar Mar 12, 2025
828fd00
fixing for batch
FadelMamar Mar 12, 2025
513b8fb
ruff linting
FadelMamar Mar 12, 2025
0a10abb
improving batch validation
FadelMamar Mar 13, 2025
b146fb3
unneeded files
FadelMamar Mar 13, 2025
81e40d3
update training tutorial
FadelMamar Mar 13, 2025
6585142
Merge branch 'Dev'
FadelMamar Mar 14, 2025
4d1bb84
adding images_paths to oveeride root_dir in FolderDataset
FadelMamar Mar 14, 2025
1909533
discarding os.path.basename
FadelMamar Mar 14, 2025
1d6a6a1
Merge branch 'Dev'
FadelMamar Mar 14, 2025
769e353
Merge branch 'main' of github.com:FadelMamar/HerdNet
FadelMamar Mar 14, 2025
6a4ffd9
Update batch_utils.py
FadelMamar Mar 19, 2025
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
14 changes: 12 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,19 @@ handling/
tests/
scripts/
*.code-workspace

data/
*.JPG
configs/train/*
configs/test/*
!configs/*/faster_rcnn.yaml
!configs/*/dla34.yaml
!configs/*/herdnet.yaml
!configs/*/herdnet.yaml
wandb
runs
*pt
nohup.out
yolo-runs
tmp
cache.db
template_annotations.json
template_preannotations.json
34 changes: 33 additions & 1 deletion animaloc/data/batch_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,38 @@ def collate_fn(batch):
batched_images = cat_list(images)
return batched_images , targets

def val_collate_fn(self, batch: tuple) -> tuple[torch.Tensor, dict]:
"""collate_fn used to create the validation dataloader

Args:
batch (tuple): (img:torch.Tensor, targets:dict)

Returns:
tuple: (image, target)
"""

batched = dict(points=[], labels=[])
batch_img = torch.stack([p[0] for p in batch])
targets = [p[1] for p in batch]
keys = targets[0].keys()

# get non_empty samples indidces -> set difference
non_empty_idx = [i for i, a in enumerate(targets) if len(a["labels"]) > 0]
targets_empty = [
targets[i] for i in list(set(range(len(batch))) - set(non_empty_idx))
]
targets = [targets[i] for i in non_empty_idx]

# Creating batch
for k in keys:
batched[k] = [] # initialize to be empty list
if k == "points" or k=='labels':
batched[k] = [a[k].cpu().tolist() for a in targets]
if len(targets_empty) > 0:
batched[k] = batched[k] + [[]] * len(targets_empty)
return batch_img, batched


def to_xywh(bbox):
''' Bbox from [x_min,y_min,x_max,y_max] to [x,y,width,height] '''
width = bbox[2] - bbox[0]
Expand Down Expand Up @@ -83,4 +115,4 @@ def show_batch(sample_batched, denormalize=True):
ax.add_patch(rect)

ax.set_title(f'Batch of {batch_size} images')
ax.axis('off')
ax.axis('off')
15 changes: 11 additions & 4 deletions animaloc/datasets/folder.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

from typing import Optional, List, Any, Dict

from ..data.types import BoundingBox
from ..data.utils import group_by_image

from .register import DATASETS
Expand Down Expand Up @@ -57,7 +56,8 @@ def __init__(
csv_file: str,
root_dir: str,
albu_transforms: Optional[list] = None,
end_transforms: Optional[list] = None
end_transforms: Optional[list] = None,
images_paths:list[str]=None
) -> None:
'''
Args:
Expand All @@ -71,12 +71,19 @@ def __init__(
tensor and expected target as input and returns a transformed
version. These will be applied after albu_transforms. Defaults
to None.
images_paths (list, optional): list of images to be considered. Overrides root_dir
'''

super(FolderDataset, self).__init__(csv_file, root_dir, albu_transforms, end_transforms)

self.folder_images = [i for i in os.listdir(self.root_dir)
if i.endswith(('.JPG','.jpg','.JPEG','.jpeg'))]
if images_paths is None:
self.folder_images = [i for i in os.listdir(self.root_dir)
if i.endswith(('.JPG','.jpg','.JPEG','.jpeg'))]
else:
print("Overriding root_dir in FolderDataset, using images_paths")
self.folder_images = [i for i in images_paths
if i.endswith(('.JPG','.jpg','.JPEG','.jpeg'))]


self._img_names = self.folder_images
self.anno_keys = self.data.columns
Expand Down
39 changes: 30 additions & 9 deletions animaloc/eval/evaluators.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,17 @@ def evaluate(self, returns: str = 'recall', wandb_flag: bool = False, viz: bool
Returns:
float
'''

def batch_metrics(metric:Metrics,batchsize:int,output:dict)->None:
if batchsize>=1:
for i in range(batchsize):
gt = {k:v[i] for k,v in output['gt'].items()}
preds = {k:v[i] for k,v in output['preds'].items()}
counts = output['est_count'][i]
output_i = dict(gt = gt, preds = preds, est_count = counts)
metric.feed(**output_i)
else:
raise NotImplementedError

self.model.eval()

Expand All @@ -201,8 +212,12 @@ def evaluate(self, returns: str = 'recall', wandb_flag: bool = False, viz: bool
wandb.log({'validation_vizuals': fig})

output = self.prepare_feeding(targets, output)

batchsize = images.shape[0]

iter_metrics.feed(**output)
batch_metrics(iter_metrics,batchsize,output)
# iter_metrics.feed(**output)

iter_metrics.aggregate()
if log_meters:
logger.add_meter('n', sum(iter_metrics.tp) + sum(iter_metrics.fn))
Expand All @@ -226,7 +241,8 @@ def evaluate(self, returns: str = 'recall', wandb_flag: bool = False, viz: bool

iter_metrics.flush()

self.metrics.feed(**output)
batch_metrics(self.metrics,batchsize,output)
# self.metrics.feed(**output)

self._stored_metrics = self.metrics.copy()

Expand Down Expand Up @@ -346,8 +362,12 @@ def post_stitcher(self, output: torch.Tensor) -> Any:

def prepare_feeding(self, targets: Dict[str, torch.Tensor], output: List[torch.Tensor]) -> dict:

gt_coords = [p[::-1] for p in targets['points'].squeeze(0).tolist()]
gt_labels = targets['labels'].squeeze(0).tolist()
try: # batchsize==1
gt_coords = [p[::-1] for p in targets['points'].cpu().tolist()]
gt_labels = targets['labels'].cpu().tolist()
except Exception: # batchsize>1
gt_coords = [p[::-1] for p in targets['points']]
gt_labels = targets['labels']

gt = dict(
loc = gt_coords,
Expand All @@ -362,13 +382,14 @@ def prepare_feeding(self, targets: Dict[str, torch.Tensor], output: List[torch.T
counts, locs, labels, scores, dscores = lmds(output)

preds = dict(
loc = locs[0],
labels = labels[0],
scores = scores[0],
dscores = dscores[0]
loc = locs,
labels = labels,
scores = scores,
dscores = dscores
)

return dict(gt = gt, preds = preds, est_count = counts[0])

return dict(gt = gt, preds = preds, est_count = counts)

@EVALUATORS.register()
class DensityMapEvaluator(Evaluator):
Expand Down
1 change: 0 additions & 1 deletion animaloc/models/dla.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

import math
from os.path import join
from posixpath import basename

import torch
from torch import nn
Expand Down
2 changes: 1 addition & 1 deletion animaloc/models/faster_rcnn.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def forward(
if targets is not None:
for t in targets:
floating_point_types = (torch.float, torch.double, torch.half)
if not t["boxes"].dtype in floating_point_types:
if t["boxes"].dtype not in floating_point_types:
raise TypeError(f"target boxes must of float type, instead got {t['boxes'].dtype}")
if not t["labels"].dtype == torch.int64:
raise TypeError("target labels must of int64 type, instead got {t['labels'].dtype}")
Expand Down
1 change: 0 additions & 1 deletion animaloc/models/herdnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import torch.nn as nn
import numpy as np
import torchvision.transforms as T

from typing import Optional

Expand Down
3 changes: 0 additions & 3 deletions animaloc/train/trainers.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,13 @@
import wandb
import matplotlib

import matplotlib.pyplot as plt
matplotlib.use('Agg')
from torchvision.transforms import ToPILImage

from typing import List, Optional, Union, Callable, Any

from ..utils.torchvision_utils import SmoothedValue, reduce_dict
from ..utils.logger import CustomLogger
from ..eval.evaluators import Evaluator
from ..data.transforms import UnNormalize
from .adaloss import Adaloss

from ..utils.registry import Registry
Expand Down
2 changes: 1 addition & 1 deletion animaloc/vizual/objects.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import PIL

from PIL import Image, ImageDraw, ImageFont
from PIL import ImageDraw, ImageFont

__all__ = ['draw_points', 'draw_boxes', 'draw_text']

Expand Down
3 changes: 0 additions & 3 deletions animaloc/vizual/plots.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,11 @@
__version__ = "0.2.0"


import torch
import matplotlib.pyplot as plt
import random
import itertools

from typing import Optional
from torchvision.transforms import ToPILImage
from ..data.transforms import UnNormalize, GaussianMap

__all__ = ['PlotPrecisionRecall']

Expand Down
19 changes: 19 additions & 0 deletions my_ml_backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM python:3.8-slim

RUN apt-get update && \
apt-get upgrade -y && \
apt-get install -y git

ENV PYTHONUNBUFFERED=True \
PORT=9090 \
WORKERS=2 \
THREADS=4

WORKDIR /app
COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . ./

CMD exec gunicorn --preload --bind :$PORT --workers $WORKERS --threads $THREADS --timeout 0 _wsgi:app
16 changes: 16 additions & 0 deletions my_ml_backend/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Quickstart

1. Build and start Machine Learning backend on `http://localhost:9090`

```bash
docker-compose up
```

2. Validate that backend is running

```bash
$ curl http://localhost:9090/health
{"status":"UP"}
```

3. Connect to the backend from Label Studio: go to your project `Settings -> Machine Learning -> Add Model` and specify `http://localhost:9090` as a URL.
Loading