π [Fix] display on DDP mode
Browse files- yolo/tools/data_loader.py +1 -1
- yolo/tools/solver.py +1 -2
- yolo/utils/logger.py +2 -1
- yolo/utils/logging_utils.py +18 -11
yolo/tools/data_loader.py
CHANGED
@@ -46,7 +46,7 @@ class YoloDataset(Dataset):
|
|
46 |
Returns:
|
47 |
dict: The loaded data from the cache for the specified phase.
|
48 |
"""
|
49 |
-
cache_path = dataset_path / f"{phase_name}.
|
50 |
|
51 |
if not cache_path.exists():
|
52 |
logger.info(f":factory: Generating {phase_name} cache")
|
|
|
46 |
Returns:
|
47 |
dict: The loaded data from the cache for the specified phase.
|
48 |
"""
|
49 |
+
cache_path = dataset_path / f"{phase_name}.cache1"
|
50 |
|
51 |
if not cache_path.exists():
|
52 |
logger.info(f":factory: Generating {phase_name} cache")
|
yolo/tools/solver.py
CHANGED
@@ -59,10 +59,10 @@ class ValidateModel(BaseModel):
|
|
59 |
def on_validation_epoch_end(self):
|
60 |
epoch_metrics = self.metric.compute()
|
61 |
del epoch_metrics["classes"]
|
|
|
62 |
self.log_dict(
|
63 |
{"PyCOCO/AP @ .5:.95": epoch_metrics["map"], "PyCOCO/AP @ .5": epoch_metrics["map_50"]}, rank_zero_only=True
|
64 |
)
|
65 |
-
self.log_dict(epoch_metrics, prog_bar=True, logger=True, on_epoch=True, rank_zero_only=True)
|
66 |
self.metric.reset()
|
67 |
|
68 |
|
@@ -92,7 +92,6 @@ class TrainModel(ValidateModel):
|
|
92 |
self.log_dict(
|
93 |
loss_item,
|
94 |
prog_bar=True,
|
95 |
-
logger=True,
|
96 |
on_epoch=True,
|
97 |
batch_size=batch_size,
|
98 |
rank_zero_only=True,
|
|
|
59 |
def on_validation_epoch_end(self):
|
60 |
epoch_metrics = self.metric.compute()
|
61 |
del epoch_metrics["classes"]
|
62 |
+
self.log_dict(epoch_metrics, prog_bar=True, rank_zero_only=True)
|
63 |
self.log_dict(
|
64 |
{"PyCOCO/AP @ .5:.95": epoch_metrics["map"], "PyCOCO/AP @ .5": epoch_metrics["map_50"]}, rank_zero_only=True
|
65 |
)
|
|
|
66 |
self.metric.reset()
|
67 |
|
68 |
|
|
|
92 |
self.log_dict(
|
93 |
loss_item,
|
94 |
prog_bar=True,
|
|
|
95 |
on_epoch=True,
|
96 |
batch_size=batch_size,
|
97 |
rank_zero_only=True,
|
yolo/utils/logger.py
CHANGED
@@ -1,10 +1,11 @@
|
|
1 |
import logging
|
2 |
|
|
|
3 |
from rich.console import Console
|
4 |
from rich.logging import RichHandler
|
5 |
|
6 |
logger = logging.getLogger("yolo")
|
7 |
logger.setLevel(logging.DEBUG)
|
8 |
logger.propagate = False
|
9 |
-
if not logger.hasHandlers():
|
10 |
logger.addHandler(RichHandler(console=Console(), show_level=True, show_path=True, show_time=True, markup=True))
|
|
|
1 |
import logging
|
2 |
|
3 |
+
from lightning.pytorch.utilities.rank_zero import rank_zero_only
|
4 |
from rich.console import Console
|
5 |
from rich.logging import RichHandler
|
6 |
|
7 |
logger = logging.getLogger("yolo")
|
8 |
logger.setLevel(logging.DEBUG)
|
9 |
logger.propagate = False
|
10 |
+
if rank_zero_only.rank == 0 and not logger.hasHandlers():
|
11 |
logger.addHandler(RichHandler(console=Console(), show_level=True, show_path=True, show_time=True, markup=True))
|
yolo/utils/logging_utils.py
CHANGED
@@ -223,21 +223,27 @@ class ImageLogger(Callback):
|
|
223 |
logger.log_image("Prediction", images, step=step, boxes=[log_bbox(pred_boxes)])
|
224 |
|
225 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
226 |
def setup(cfg: Config):
|
227 |
-
seed_everything(cfg.lucky_number)
|
228 |
if hasattr(cfg, "quite"):
|
229 |
logger.removeHandler("YOLO_logger")
|
230 |
return
|
231 |
|
232 |
-
|
233 |
-
|
234 |
-
return f":high_voltage: {super().format(record)}"
|
235 |
-
|
236 |
-
rich_handler = RichHandler(markup=True)
|
237 |
-
rich_handler.setFormatter(EmojiFormatter("%(message)s"))
|
238 |
-
lightning_logger = logging.getLogger("lightning.pytorch")
|
239 |
-
lightning_logger.handlers.clear()
|
240 |
-
lightning_logger.addHandler(rich_handler)
|
241 |
|
242 |
def custom_wandb_log(string="", level=int, newline=True, repeat=True, prefix=True, silent=False):
|
243 |
if silent:
|
@@ -288,6 +294,7 @@ def log_model_structure(model: Union[ModuleList, YOLOLayer, YOLO]):
|
|
288 |
console.print(table)
|
289 |
|
290 |
|
|
|
291 |
def validate_log_directory(cfg: Config, exp_name: str) -> Path:
|
292 |
base_path = Path(cfg.out_path, cfg.task.task)
|
293 |
save_path = base_path / exp_name
|
@@ -305,7 +312,7 @@ def validate_log_directory(cfg: Config, exp_name: str) -> Path:
|
|
305 |
)
|
306 |
|
307 |
save_path.mkdir(parents=True, exist_ok=True)
|
308 |
-
logger.info(f"π Created log folder: [blue b u]
|
309 |
logger.addHandler(FileHandler(save_path / "output.log"))
|
310 |
return save_path
|
311 |
|
|
|
223 |
logger.log_image("Prediction", images, step=step, boxes=[log_bbox(pred_boxes)])
|
224 |
|
225 |
|
226 |
+
def setup_logger(logger_name):
|
227 |
+
class EmojiFormatter(logging.Formatter):
|
228 |
+
def format(self, record, emoji=":high_voltage:"):
|
229 |
+
return f"{emoji} {super().format(record)}"
|
230 |
+
|
231 |
+
rich_handler = RichHandler(markup=True)
|
232 |
+
rich_handler.setFormatter(EmojiFormatter("%(message)s"))
|
233 |
+
rich_logger = logging.getLogger(logger_name)
|
234 |
+
if rich_logger:
|
235 |
+
rich_logger.handlers.clear()
|
236 |
+
rich_logger.addHandler(rich_handler)
|
237 |
+
|
238 |
+
|
239 |
def setup(cfg: Config):
|
240 |
+
# seed_everything(cfg.lucky_number)
|
241 |
if hasattr(cfg, "quite"):
|
242 |
logger.removeHandler("YOLO_logger")
|
243 |
return
|
244 |
|
245 |
+
setup_logger("lightning.fabric")
|
246 |
+
setup_logger("lightning.pytorch")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
|
248 |
def custom_wandb_log(string="", level=int, newline=True, repeat=True, prefix=True, silent=False):
|
249 |
if silent:
|
|
|
294 |
console.print(table)
|
295 |
|
296 |
|
297 |
+
@rank_zero_only
|
298 |
def validate_log_directory(cfg: Config, exp_name: str) -> Path:
|
299 |
base_path = Path(cfg.out_path, cfg.task.task)
|
300 |
save_path = base_path / exp_name
|
|
|
312 |
)
|
313 |
|
314 |
save_path.mkdir(parents=True, exist_ok=True)
|
315 |
+
logger.info(f"π Created log folder: [blue b u]{save_path}[/]")
|
316 |
logger.addHandler(FileHandler(save_path / "output.log"))
|
317 |
return save_path
|
318 |
|