Skip to content

Commit edad721

Browse files
committed
Add predict command to cli dataset
1 parent 36d8d1a commit edad721

15 files changed

Lines changed: 312 additions & 241 deletions

abraia/editing/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from .upscale import Upscaler, SwinIR
66
from .smartcrop import Smartcrop
77
from .inpaint import LAMA
8-
from .sam import SAM
8+
from ..inference.sam import SAM
99

1010
from ..inference import PlateDetector
1111
from ..inference.faces import FaceRecognizer

abraia/inference/detect.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import os
22
import cv2
33
import math
4+
import json
45
import numpy as np
56
import onnxruntime as ort
67

78
from .ops import non_maximum_suppression, normalize, mask_to_polygon, softmax
89
from ..utils import download_file, load_json, get_color, get_providers
10+
from .sam import SAM
911

1012

1113
def resize(img, size):
@@ -116,3 +118,14 @@ def run(self, img, conf_threshold=0.35, iou_threshold=0.7, approx=0.001):
116118
return process_output(outputs, img_size, self.input_shape, self.config['classes'], conf_threshold, iou_threshold, approx)
117119
outputs = self.session.run(None, {self.input_name: preprocess(img)})
118120
return postprocess(outputs, self.config['classes'])
121+
122+
123+
def segment_objects(frame, results):
124+
sam = SAM()
125+
sam.encode(frame)
126+
for result in results:
127+
x, y, w, h = result['box']
128+
mask = sam.predict(frame, prompt=json.dumps([{"type": "rectangle", "data": [x, y, x+w, y+h]}]))
129+
result['polygon'] = mask_to_polygon(mask[y:y+h, x:x+w], (x, y))
130+
# result['mask'] = mask[y:y+h, x:x+w]
131+
return results

abraia/training/__init__.py

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from PIL import Image
1010
from tqdm.contrib.concurrent import process_map
1111
from sklearn.model_selection import train_test_split
12+
from typing import Dict, Any
1213

1314

1415
abraia = Abraia()
@@ -31,6 +32,7 @@ def load_annotations(project):
3132
annotations = abraia.load_json(f"{project}/annotations.json")
3233
for annotation in annotations:
3334
annotation['path'] = f"{project}/{annotation['filename']}"
35+
annotation['url'] = url_path(f"{abraia.userid}/{annotation['path']}")
3436
return annotations
3537

3638

@@ -154,35 +156,41 @@ def split_dataset(annotations):
154156
return train, val, test
155157

156158

157-
def create_dataset(project, task, classes):
158-
if not os.path.exists(project):
159-
annotations = load_annotations(project)
160-
train, val, test = split_dataset(annotations)
161-
data_annotations = {'train': train, 'val': val, 'test': test}
162-
#TODO: Download files in one single step
163-
for x in ['train', 'val', 'test']:
164-
save_data(data_annotations[x], f"{project}/{x}", classes, task)
165-
save_config(project, classes)
166-
167-
168-
def train_model(project, task, classes, epochs, batch=32, imgsz=640):
169-
if task == 'classify':
170-
training_session = classify.Model()
171-
dataloaders, classes = training_session.create_dataset(project)
172-
model = training_session.train(project, epochs=epochs)
173-
# training.classify.visualize_data(dataloaders['train'])
174-
#training.classify.visualize_model(model, dataloaders['val'])
175-
else:
176-
training_session = detect.Model(task, imgsz=imgsz)
177-
def print_train_end(trainer):
178-
print('# End training')
179-
print('Metrics:', trainer.metrics)
180-
#training_session.model.add_callback('on_train_start', print_train_start)
181-
#training_session.model.add_callback('on_train_epoch_start', print_train_epoch)
182-
training_session.model.add_callback('on_train_end', print_train_end)
183-
metrics = training_session.train(project, epochs=epochs, batch=batch)
184-
print("Train metrics")
185-
print(training_session.test('val'))
186-
#TODO: Save metrics with model
187-
training_session.metrics = training_session.test('test')
188-
return training_session
159+
class ModelTrainer:
160+
"""High-level trainer orchestrator using models and dataset utilities."""
161+
def __init__(self, task: str, imgsz: int = 640):
162+
self.task = task
163+
if task == 'classify':
164+
self.model = classify.Model()
165+
else:
166+
self.model = detect.Model(task, imgsz=imgsz)
167+
168+
def prepare_dataset(self, project: str, classes, force: bool = False):
169+
if force or not os.path.exists(project):
170+
annotations = load_annotations(project)
171+
train, val, test = split_dataset(annotations)
172+
data_annotations = {'train': train, 'val': val, 'test': test}
173+
#TODO: Download files in one single step
174+
for x in ['train', 'val', 'test']:
175+
save_data(data_annotations[x], f"{project}/{x}", classes, self.task)
176+
save_config(project, classes)
177+
178+
def train(self, dataset: str, epochs: int, batch: int = 32, **kwargs) -> None:
179+
if self.task == 'classify':
180+
self.model.train(dataset, epochs=epochs)
181+
else:
182+
self.model.train(dataset, epochs=epochs, batch=batch)
183+
184+
def test(self, split: str = 'val') -> Dict[str, Any]:
185+
if self.task == 'classify':
186+
# classify.Model currently has no .test
187+
return {}
188+
else:
189+
return self.model.test(split=split)
190+
191+
def save(self, dataset: str, classes, device='cpu') -> None:
192+
self.model.save(dataset, classes, device=device)
193+
194+
def run(self, img):
195+
return self.model.run(img)
196+

abraia/training/classify.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def __getitem__(self, idx):
7272

7373

7474
def create_model(class_names, pretrained=True):
75-
model = models.resnet18(pretrained=pretrained)
75+
model = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1 if pretrained else None)
7676
for param in model.parameters():
7777
param.requires_grad = False
7878
num_ftrs = model.fc.in_features
@@ -230,7 +230,10 @@ def train(self, dataset, epochs=25):
230230
model_conv = create_model(classes)
231231
self.classes = classes
232232
self.model = train_model(model_conv, dataloaders, num_epochs=epochs)
233-
return self.model
233+
#dataloaders, classes = training_session.create_dataset(project)
234+
#training_session.train(project, epochs=epochs)
235+
# training.classify.visualize_data(dataloaders['train'])
236+
#training.classify.visualize_model(model, dataloaders['val'])
234237

235238
def save(self, dataset, classes, device='cpu'):
236239
self.model.to(device)

abraia/training/detect.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,16 @@ def __init__(self, task, model_type='yolov8n', imgsz=640):
3535
self.task = task
3636
self.imgsz = imgsz
3737

38+
# def print_train_end(trainer):
39+
# print('# End training')
40+
# print('Metrics:', trainer.metrics)
41+
# #training_session.model.add_callback('on_train_start', print_train_start)
42+
# #training_session.model.add_callback('on_train_epoch_start', print_train_epoch)
43+
# training_session.model.add_callback('on_train_end', print_train_end)
44+
3845
def train(self, dataset, epochs=100, batch=32):
3946
data = f"{dataset}" if self.task == 'classify' else f"{dataset}/data.yaml"
4047
results = self.model.train(data=data, batch=batch, epochs=epochs, imgsz=self.imgsz)
41-
# TODO: Merge with test and add parse metrics
42-
metrics = self.model.val(data=data)
43-
# self.metrics = self.test(split='val')
44-
return metrics
4548

4649
def test(self, split='val'):
4750
out = io.StringIO()
3.12 MB
Binary file not shown.
7.59 MB
Binary file not shown.
6.82 MB
Binary file not shown.

demos/apples_detector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from abraia.inference import Model, Tracker
55
from abraia.utils.draw import render_results, draw_overlay_mask, get_color, hex_to_rgb
66
from abraia.inference.ops import count_objects
7-
from abraia.editing.sam import SAM
7+
from abraia.editing import SAM
88

99

1010
model_uri = 'multiple/models/yolov8n.onnx'

0 commit comments

Comments
 (0)