99from PIL import Image
1010from tqdm .contrib .concurrent import process_map
1111from sklearn .model_selection import train_test_split
12+ from typing import Dict , Any
1213
1314
1415abraia = 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+
0 commit comments