Skip to content

Commit dccebf4

Browse files
committed
Refactor ModelTrainer from training
1 parent 7a654b0 commit dccebf4

2 files changed

Lines changed: 25 additions & 23 deletions

File tree

abraia/training/__init__.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -80,32 +80,34 @@ def save_config(dataset, classes):
8080
with open(path, 'w') as f:
8181
f.write(yaml_content)
8282

83+
84+
def prepare_dataset(dataset, force = False):
85+
if force or not os.path.exists(dataset.project):
86+
train, val, test = dataset.split()
87+
data_annotations = {'train': train, 'val': val, 'test': test}
88+
for x in ['train', 'val', 'test']:
89+
save_data(data_annotations[x], f"{dataset.project}/{x}", dataset.classes, dataset.task)
90+
save_config(dataset.project, dataset.classes)
91+
8392

8493
class ModelTrainer:
8594
"""High-level trainer orchestrator using models and dataset utilities."""
86-
def __init__(self, task: str, imgsz: int = None):
87-
imgsz = imgsz or (224 if task == 'classify' else 640)
95+
def __init__(self, project: str, task: str, classes: list, imgsz: int = None):
96+
self.project = project
8897
self.task = task
98+
self.classes = classes
99+
imgsz = imgsz or (224 if task == 'classify' else 640)
89100
if task == 'classify':
90101
self.model = classify.Model()
91102
else:
92103
self.model = detect.Model(task, imgsz=imgsz)
93-
94-
def prepare_dataset(self, project: str, classes, force: bool = False):
95-
if force or not os.path.exists(project):
96-
dataset = load_dataset(project)
97-
train, val, test = dataset.split()
98-
data_annotations = {'train': train, 'val': val, 'test': test}
99-
for x in ['train', 'val', 'test']:
100-
save_data(data_annotations[x], f"{project}/{x}", classes, self.task)
101-
save_config(project, classes)
102-
103-
def train(self, dataset: str, epochs: int = None, batch: int = 32) -> None:
104+
105+
def train(self, epochs: int = None, batch: int = 32) -> None:
104106
epochs = epochs or (30 if self.task == 'classify' else 300)
105107
if self.task == 'classify':
106-
self.model.train(dataset, epochs=epochs)
108+
self.model.train(self.project, epochs=epochs)
107109
else:
108-
self.model.train(dataset, epochs=epochs, batch=batch)
110+
self.model.train(self.project, epochs=epochs, batch=batch)
109111

110112
def test(self, split: str = 'val') -> Dict[str, Any]:
111113
if self.task == 'classify':
@@ -114,8 +116,8 @@ def test(self, split: str = 'val') -> Dict[str, Any]:
114116
else:
115117
return self.model.test(split=split)
116118

117-
def save(self, dataset: str, classes, device='cpu') -> None:
118-
self.model.save(dataset, classes, device=device)
119+
def save(self, device='cpu') -> None:
120+
self.model.save(self.project, self.classes, device=device)
119121

120122
def run(self, img):
121123
return self.model.run(img)

scripts/abraia

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -297,15 +297,15 @@ def annotate(project, label='', segment=False):
297297
@click.argument('epochs', type=int, required=False)
298298
def train(project, epochs=None):
299299
"""Train a model on the specified dataset."""
300-
from abraia.training import load_dataset, ModelTrainer
301-
dataset = load_dataset(project)
302-
training_session = ModelTrainer(dataset.task)
300+
from abraia.training import load_dataset, prepare_dataset, ModelTrainer
303301
click.echo('Loading dataset...')
304-
training_session.prepare_dataset(project, dataset.classes)
302+
dataset = load_dataset(project)
303+
prepare_dataset(dataset)
305304
click.echo('Training model...')
306-
training_session.train(project, epochs)
305+
training_session = ModelTrainer(project, dataset.task, dataset.classes)
306+
training_session.train(epochs)
307307
click.echo('Saving model...')
308-
training_session.save(project, dataset.classes)
308+
training_session.save()
309309

310310

311311
@cli_datasets.command()

0 commit comments

Comments
 (0)