code: def _shared_eval(self, batch, loss_log_key):
      (xb, yb), records = batch
  
      self.train()
      preds = self(xb, yb)
      loss = self.compute_loss(preds, yb)
  
      self.eval()
      raw_preds = self(xb)
      preds = self.convert_raw_predictions(
          batch=batch, raw_preds=raw_preds, records=records
      )
      self.accumulate_metrics(preds=preds)
  
      self.log(f"{loss_log_key}_loss", loss)
  
imports: from icevision.imports import *
  from icevision.utils import *
  from icevision.metrics import *
  from icevision.engines.lightning.lightning_model_adapter import LightningModelAdapter
  from icevision.models.torchvision.loss_fn import loss_fn
  from icevision.core.record_components import InstanceMasksRecordComponent, BBoxesRecordComponent
  from icevision.core.mask import MaskArray
  from icevision.core.bbox import BBox
label_desc: Use image node_id 7 for calling the RCNNModelAdapter obj's underlying member method code with example usage: obj._shared_eval(batch, loss_log_key) without return types