рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдВ

рдЙрдиреНрдирдд рдЕрдиреБрдХреВрд▓рди

рджреЛрдиреЛрдВ Ultralytics YOLO рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдФрд░ Python рдЗрдВрдЯрд░рдлреЗрд╕ рдмреЗрд╕ рдЗрдВрдЬрди рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ рдкрд░ рдмрд╕ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрддрддрд╛ рд╣реИред рдЖрдЗрдП рдЯреНрд░реЗрдирд░ рдЗрдВрдЬрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред



рд╕рддрд░реНрдХрддрд╛: рдорд╛рд╣рд┐рд░ Ultralytics YOLOv8: рдЙрдиреНрдирдд рдЕрдиреБрдХреВрд▓рди

рдмреЗрд╕рдЯреНрд░реЗрдирд░

рдмреЗрд╕рдЯреНрд░реЗрдирд░ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджрд┐рдирдЪрд░реНрдпрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдореЙрдбрд▓ рдФрд░ рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

  • get_model(cfg, weights) - рд╡рд╣ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдмрдирд╛рддрд╛ рд╣реИ
  • get_dataloader() - рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ BaseTrainer рд╣рд╡рд╛рд▓рд╛

рдбрд┐рдЯреЗрдХреНрд╢рдирдЯреНрд░реЗрдирд░

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ YOLOv8 DetectionTrainer рдФрд░ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВред

from ultralytics.models.yolo.detect import DetectionTrainer

trainer = DetectionTrainer(overrides={...})
trainer.train()
trained_model = trainer.best  # get best model

рдбрд┐рдЯреЗрдХреНрд╢рдирдЯреНрд░реЗрдирд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛

рдЖрдЗрдП рдЯреНрд░реЗрдирд░ рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВ рдХрд╕реНрдЯрдо рдбрд┐рдЯреЗрдХреНрд╢рди рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕реАрдзреЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ get_model рдкреНрд░рдХрд╛рд░реНрдпрд╛рддреНрдордХрддрд╛:

from ultralytics.models.yolo.detect import DetectionTrainer


class CustomTrainer(DetectionTrainer):
    def get_model(self, cfg, weights):
        """Loads a custom detection model given configuration and weight files."""
        ...


trainer = CustomTrainer(overrides={...})
trainer.train()

рдЕрдм рдЖрдк рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЯреНрд░реЗрдирд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ loss function.
  • рдЖрдЧреЗ рдХрд╣рдирд╛ callback рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИ Google рд╣рд░ 10 рдХреЗ рдмрд╛рдж рдбреНрд░рд╛рдЗрд╡ рдХрд░реЗрдВ epochs рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
from ultralytics.models.yolo.detect import DetectionTrainer
from ultralytics.nn.tasks import DetectionModel


class MyCustomModel(DetectionModel):
    def init_criterion(self):
        """Initializes the loss function and adds a callback for uploading the model to Google Drive every 10 epochs."""
        ...


class CustomTrainer(DetectionTrainer):
    def get_model(self, cfg, weights):
        """Returns a customized detection model instance configured with specified config and weights."""
        return MyCustomModel(...)


# callback to upload model weights
def log_model(trainer):
    """Logs the path of the last model weight used by the trainer."""
    last_weight_path = trainer.last
    print(last_weight_path)


trainer = CustomTrainer(overrides={...})
trainer.add_callback("on_train_epoch_end", log_model)  # Adds to existing callback
trainer.train()

рдХреЙрд▓рдмреИрдХ рдЯреНрд░рд┐рдЧрд░рд┐рдВрдЧ рдШрдЯрдирд╛рдУрдВ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХреЙрд▓рдмреИрдХ рдЧрд╛рдЗрдб рдХреЛ рдЪреЗрдХрдЖрдЙрдЯ рдХрд░реЗрдВ

рдЕрдиреНрдп рдЗрдВрдЬрди рдШрдЯрдХ

рдРрд╕реЗ рдЕрдиреНрдп рдШрдЯрдХ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕реА рддрд░рд╣ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ Validators рдФрд░ Predictors. рдЗрди рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВред

рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди

рдореИрдВ рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реВрдВ Ultralytics YOLOv8 рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЯреЗрдХреНрд╢рдирдЯреНрд░реЗрдирд░?

рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Ultralytics YOLOv8 DetectionTrainer рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдореЙрдбрд▓ рдФрд░ рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ DetectionTrainer рдФрд░ рдлрд┐рд░ рддрд░реАрдХреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреИрд╕реЗ get_model рдЕрдкрдиреА рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

from ultralytics.models.yolo.detect import DetectionTrainer


class CustomTrainer(DetectionTrainer):
    def get_model(self, cfg, weights):
        """Loads a custom detection model given configuration and weight files."""
        ...


trainer = CustomTrainer(overrides={...})
trainer.train()
trained_model = trainer.best  # get best model

рдЖрдЧреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЬреИрд╕реЗ рдмрджрд▓рдирд╛ loss function рдпрд╛ рдПрдХ рдЬреЛрдбрд╝рдирд╛ callback, рдЖрдк рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреЙрд▓рдмреИрдХ рдЧрд╛рдЗрдб.

рдореЗрдВ BaseTrainer рдХреЗ рдкреНрд░рдореБрдЦ рдШрдЯрдХ рдХреНрдпрд╛ рд╣реИрдВ Ultralytics YOLOv8?

рд╡рд╣реА BaseTrainer рдореЗрдВ Ultralytics YOLOv8 рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдиреАрдВрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдореБрдЦ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • get_model(cfg, weights) рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
  • get_dataloader() рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЕрдиреБрдХреВрд▓рди рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ BaseTrainer рд╣рд╡рд╛рд▓рд╛.

рдореИрдВ рдХреЙрд▓рдмреИрдХ рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ Ultralytics YOLOv8 рдбрд┐рдЯреЗрдХреНрд╢рди рдЯреНрд░реЗрдирд░?

рдЖрдк рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ Ultralytics YOLOv8 DetectionTrainer. рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдпреБрдЧ рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рд╡реЗрдЯ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

from ultralytics.models.yolo.detect import DetectionTrainer


# callback to upload model weights
def log_model(trainer):
    """Logs the path of the last model weight used by the trainer."""
    last_weight_path = trainer.last
    print(last_weight_path)


trainer = DetectionTrainer(overrides={...})
trainer.add_callback("on_train_epoch_end", log_model)  # Adds to existing callbacks
trainer.train()

рдХреЙрд▓рдмреИрдХ рдШрдЯрдирд╛рдУрдВ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХреЙрд▓рдмреИрдХ рдЧрд╛рдЗрдб рдХреЛ рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рдХреНрдпреЛрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП Ultralytics YOLOv8 рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП?

Ultralytics YOLOv8 рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЗрдВрдЬрди рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ рдкрд░ рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЕрдореВрд░реНрддрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдмрдирд╛рддрд╛ рд╣реИред рдкреНрд░рдореБрдЦ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА: рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдФрд░ рджреЛрдиреЛрдВ Python рдЗрдВрдЯрд░рдлреЗрд╕ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред
  • рдкреНрд░рджрд░реНрд╢рди: рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╡рд╕реНрддреБ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐ рдПрдЖрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рддред
  • рдЕрдиреБрдХреВрд▓рди: рдХрд╕реНрдЯрдо рдореЙрдбрд▓, рд╣рд╛рдирд┐ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдбреЗрдЯрд╛рд▓реЛрдбрд░ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдпред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ YOLOv8рдкрд░ рдЬрд╛рдХрд░ рдХреНрд╖рдорддрд╛рдУрдВ Ultralytics YOLO.

рдХреНрдпрд╛ рдореИрдВ Ultralytics YOLOv8 рдЧреИрд░-рдорд╛рдирдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдбрд┐рдЯреЗрдХреНрд╢рдирдЯреНрд░реЗрдирд░?

рд╣рд╛рдБ Ultralytics YOLOv8 DetectionTrainer рдЕрддреНрдпрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИ рдФрд░ рдЧреИрд░-рдорд╛рдирдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ DetectionTrainer, рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбрд▓ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

from ultralytics.models.yolo.detect import DetectionTrainer


class CustomDetectionTrainer(DetectionTrainer):
    def get_model(self, cfg, weights):
        """Loads a custom detection model."""
        ...


trainer = CustomDetectionTrainer(overrides={...})
trainer.train()

рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, DetectionTrainer рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВред



рдмрдирд╛рдпрд╛ рдЧрдпрд╛ 2023-11-12, рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ 2024-07-04
рд▓реЗрдЦрдХ: рдЧреНрд▓реЗрди-рдЬреЛрдЪрд░ (7), рд░рд┐рдЬрд╡рд╛рди рдореБрдирд╡реНрд╡рд░ (1), рдЖрдпреБрд╖рдПрдХреНрд╕рд▓ (1), рд▓рд╛рдлрд┐рдВрдЧ-рдХреНрдпреВ (1)

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ