diff --git a/ultralytics/cfg/models/v8/yolov8.yaml b/ultralytics/cfg/models/v8/yolov8.yaml
index 2255450..b545008 100644
--- a/ultralytics/cfg/models/v8/yolov8.yaml
+++ b/ultralytics/cfg/models/v8/yolov8.yaml
@@ -3,6 +3,7 @@
 
 # Parameters
 nc: 80  # number of classes
+ch: 2 # number pf channels
 scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
   # [depth, width, max_channels]
   n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
diff --git a/ultralytics/data/augment.py b/ultralytics/data/augment.py
index 3136adb..f7e2e0b 100644
--- a/ultralytics/data/augment.py
+++ b/ultralytics/data/augment.py
@@ -762,8 +762,8 @@ class Format:
 def v8_transforms(dataset, imgsz, hyp, stretch=False):
     """Convert images to a size suitable for YOLOv8 training."""
     pre_transform = Compose([
-        Mosaic(dataset, imgsz=imgsz, p=hyp.mosaic),
-        CopyPaste(p=hyp.copy_paste),
+        # Mosaic(dataset, imgsz=imgsz, p=hyp.mosaic),
+        # CopyPaste(p=hyp.copy_paste),
         RandomPerspective(
             degrees=hyp.degrees,
             translate=hyp.translate,
@@ -783,9 +783,9 @@ def v8_transforms(dataset, imgsz, hyp, stretch=False):
 
     return Compose([
         pre_transform,
-        MixUp(dataset, pre_transform=pre_transform, p=hyp.mixup),
-        Albumentations(p=1.0),
-        RandomHSV(hgain=hyp.hsv_h, sgain=hyp.hsv_s, vgain=hyp.hsv_v),
+        # MixUp(dataset, pre_transform=pre_transform, p=hyp.mixup),
+        # Albumentations(p=1.0),
+        # RandomHSV(hgain=hyp.hsv_h, sgain=hyp.hsv_s, vgain=hyp.hsv_v),
         RandomFlip(direction='vertical', p=hyp.flipud),
         RandomFlip(direction='horizontal', p=hyp.fliplr, flip_idx=flip_idx)])  # transforms
 
diff --git a/ultralytics/data/base.py b/ultralytics/data/base.py
index 429533d..f798995 100644
--- a/ultralytics/data/base.py
+++ b/ultralytics/data/base.py
@@ -10,6 +10,7 @@ from pathlib import Path
 from typing import Optional
 
 import cv2
+import h5py
 import numpy as np
 import psutil
 from torch.utils.data import Dataset
@@ -69,7 +70,7 @@ class BaseDataset(Dataset):
         self.prefix = prefix
         self.fraction = fraction
         self.im_files = self.get_img_files(self.img_path)
-        self.labels = self.get_labels()
+        self.labels = self.get_events_labels()
         self.update_labels(include_class=classes)  # single_cls and include_class
         self.ni = len(self.labels)  # number of images
         self.rect = rect
@@ -88,7 +89,7 @@ class BaseDataset(Dataset):
         if cache == 'ram' and not self.check_cache_ram():
             cache = False
         self.ims, self.im_hw0, self.im_hw = [None] * self.ni, [None] * self.ni, [None] * self.ni
-        self.npy_files = [Path(f).with_suffix('.npy') for f in self.im_files]
+        # self.npy_files = [Path(f).with_suffix('.npy') for f in self.im_files]
         if cache:
             self.cache_images(cache)
 
@@ -112,13 +113,13 @@ class BaseDataset(Dataset):
                         # F += [p.parent / x.lstrip(os.sep) for x in t]  # local to global path (pathlib)
                 else:
                     raise FileNotFoundError(f'{self.prefix}{p} does not exist')
-            im_files = sorted(x.replace('/', os.sep) for x in f if x.split('.')[-1].lower() in IMG_FORMATS)
+            im_files = sorted(x.replace('/', os.sep) for x in f if x.split('.')[-1].lower() == "h5")
             # self.img_files = sorted([x for x in f if x.suffix[1:].lower() in IMG_FORMATS])  # pathlib
             assert im_files, f'{self.prefix}No images found in {img_path}'
         except Exception as e:
             raise FileNotFoundError(f'{self.prefix}Error loading data from {img_path}\n{HELP_URL}') from e
-        if self.fraction < 1:
-            im_files = im_files[:round(len(im_files) * self.fraction)]
+        # if self.fraction < 1:
+        #     im_files = im_files[:round(len(im_files) * self.fraction)]
         return im_files
 
     def update_labels(self, include_class: Optional[list]):
@@ -141,36 +142,39 @@ class BaseDataset(Dataset):
                 self.labels[i]['cls'][:, 0] = 0
 
     def load_image(self, i, rect_mode=True):
-        """Loads 1 image from dataset index 'i', returns (im, resized hw)."""
-        im, f, fn = self.ims[i], self.im_files[i], self.npy_files[i]
-        if im is None:  # not cached in RAM
-            if fn.exists():  # load npy
-                im = np.load(fn)
-            else:  # read image
-                im = cv2.imread(f)  # BGR
-                if im is None:
-                    raise FileNotFoundError(f'Image Not Found {f}')
-            h0, w0 = im.shape[:2]  # orig hw
-            if rect_mode:  # resize long side to imgsz while maintaining aspect ratio
-                r = self.imgsz / max(h0, w0)  # ratio
-                if r != 1:  # if sizes are not equal
-                    w, h = (min(math.ceil(w0 * r), self.imgsz), min(math.ceil(h0 * r), self.imgsz))
-                    im = cv2.resize(im, (w, h), interpolation=cv2.INTER_LINEAR)
-            elif not (h0 == w0 == self.imgsz):  # resize by stretching image to square imgsz
-                im = cv2.resize(im, (self.imgsz, self.imgsz), interpolation=cv2.INTER_LINEAR)
+        # """Loads 1 image from dataset index 'i', returns (im, resized hw)."""
+        # im, f, fn = self.ims[i], self.im_files[i], self.npy_files[i]
+        # if im is None:  # not cached in RAM
+        #     if fn.exists():  # load npy
+        #         im = np.load(fn)
+        #     else:  # read image
+        #         im = cv2.imread(f)  # BGR
+        #         if im is None:
+        #             raise FileNotFoundError(f'Image Not Found {f}')
+        file_idx, frame_idx = self.labels[i]["im_file"]
+        ev_frame_identifier = self.im_files[file_idx] + "_frame_" + str(frame_idx)
+        with h5py.File(self.im_files[file_idx], "r") as h5_file:
+            im = h5_file["data"][frame_idx * 2].transpose(1, 2, 0)
+        h0, w0 = im.shape[:2]  # orig hw
+        if rect_mode:  # resize long side to imgsz while maintaining aspect ratio
+            r = self.imgsz / max(h0, w0)  # ratio
+            if r != 1:  # if sizes are not equal
+                w, h = (min(math.ceil(w0 * r), self.imgsz), min(math.ceil(h0 * r), self.imgsz))
+                im = cv2.resize(im, (w, h), interpolation=cv2.INTER_LINEAR)
+        elif not (h0 == w0 == self.imgsz):  # resize by stretching image to square imgsz
+            im = cv2.resize(im, (self.imgsz, self.imgsz), interpolation=cv2.INTER_LINEAR)
 
-            # Add to buffer if training with augmentations
-            if self.augment:
-                self.ims[i], self.im_hw0[i], self.im_hw[i] = im, (h0, w0), im.shape[:2]  # im, hw_original, hw_resized
-                self.buffer.append(i)
-                if len(self.buffer) >= self.max_buffer_length:
-                    j = self.buffer.pop(0)
-                    self.ims[j], self.im_hw0[j], self.im_hw[j] = None, None, None
-
-            return im, (h0, w0), im.shape[:2]
+        # Add to buffer if training with augmentations
+        if self.augment:
+            self.ims[i], self.im_hw0[i], self.im_hw[i] = im, (h0, w0), im.shape[:2]  # im, hw_original, hw_resized
+            self.buffer.append(i)
+            if len(self.buffer) >= self.max_buffer_length:
+                j = self.buffer.pop(0)
+                self.ims[j], self.im_hw0[j], self.im_hw[j] = None, None, None
 
-        return self.ims[i], self.im_hw0[i], self.im_hw[i]
+        return im, (h0, w0), im.shape[:2], ev_frame_identifier
 
+        # return self.ims[i], self.im_hw0[i], self.im_hw[i]
     def cache_images(self, cache):
         """Cache images to memory or disk."""
         b, gb = 0, 1 << 30  # bytes of cached images, bytes per gigabytes
@@ -219,7 +223,7 @@ class BaseDataset(Dataset):
         s = np.array([x.pop('shape') for x in self.labels])  # hw
         ar = s[:, 0] / s[:, 1]  # aspect ratio
         irect = ar.argsort()
-        self.im_files = [self.im_files[i] for i in irect]
+        # self.im_files = [self.im_files[i] for i in irect]
         self.labels = [self.labels[i] for i in irect]
         ar = ar[irect]
 
@@ -244,7 +248,7 @@ class BaseDataset(Dataset):
         """Get and return label information from the dataset."""
         label = deepcopy(self.labels[index])  # requires deepcopy() https://github.com/ultralytics/ultralytics/pull/1948
         label.pop('shape', None)  # shape is for rect, remove it
-        label['img'], label['ori_shape'], label['resized_shape'] = self.load_image(index)
+        label['img'], label['ori_shape'], label['resized_shape'], label['im_file'] = self.load_image(index)
         label['ratio_pad'] = (label['resized_shape'][0] / label['ori_shape'][0],
                               label['resized_shape'][1] / label['ori_shape'][1])  # for evaluation
         if self.rect:
diff --git a/ultralytics/data/dataset.py b/ultralytics/data/dataset.py
index 65fe141..c770cf5 100644
--- a/ultralytics/data/dataset.py
+++ b/ultralytics/data/dataset.py
@@ -5,6 +5,7 @@ from multiprocessing.pool import ThreadPool
 from pathlib import Path
 
 import cv2
+import h5py
 import numpy as np
 import torch
 import torchvision
@@ -131,6 +132,35 @@ class YOLODataset(BaseDataset):
             LOGGER.warning(f'WARNING ⚠️ No labels found in {cache_path}, training may not work correctly. {HELP_URL}')
         return labels
 
+    def get_events_labels(self):
+        self.label_files = [x.rsplit('.', 1)[0] + '_bbox.npy' for x in self.im_files]
+        all_labels = []
+        for file_idx in range(len(self.im_files)):
+            with h5py.File(self.im_files[file_idx], "r") as h5_file:
+                num_frames, _, height, width = h5_file["data"].shape
+            labels = np.load(self.label_files[file_idx])
+            x_normalized, y_normalized, w_normalized, h_normalized = labels['x'] / width, labels['y'] / height, labels['w'] / width, labels['h'] / height
+            x_centered_normalized = x_normalized + w_normalized / 2
+            y_centered_normalized = y_normalized + h_normalized / 2
+            bboxes_normalized = np.stack((x_centered_normalized, y_centered_normalized, w_normalized, h_normalized), axis=1)
+            classes = labels["class_id"]
+            timestamps = labels['ts']    
+            for frame_idx in range(num_frames):
+                box_idxs = np.nonzero(timestamps == (frame_idx+1) * 1e5)[0]
+                if len(box_idxs) > 0:
+                    all_labels.append(
+                        dict(
+                            im_file=[file_idx, frame_idx],
+                            shape=(height, width),
+                            cls=classes[box_idxs, np.newaxis],  # n, 1
+                            bboxes=bboxes_normalized[box_idxs, :],  # n, 4
+                            segments=[],
+                            keypoints=None,
+                            normalized=True,
+                            bbox_format='xywh'))
+        return all_labels
+
+
     def build_transforms(self, hyp=None):
         """Builds and appends transforms to the list."""
         if self.augment:
diff --git a/ultralytics/engine/predictor.py b/ultralytics/engine/predictor.py
index 7a832b7..40df857 100644
--- a/ultralytics/engine/predictor.py
+++ b/ultralytics/engine/predictor.py
@@ -234,7 +234,7 @@ class BasePredictor:
 
         # Warmup model
         if not self.done_warmup:
-            self.model.warmup(imgsz=(1 if self.model.pt or self.model.triton else self.dataset.bs, 3, *self.imgsz))
+            self.model.warmup(imgsz=(1 if self.model.pt or self.model.triton else self.dataset.bs, 2, *self.imgsz))
             self.done_warmup = True
 
         self.seen, self.windows, self.batch, profilers = 0, [], None, (ops.Profile(), ops.Profile(), ops.Profile())
diff --git a/ultralytics/engine/results.py b/ultralytics/engine/results.py
index 85c5406..9c9745e 100644
--- a/ultralytics/engine/results.py
+++ b/ultralytics/engine/results.py
@@ -14,7 +14,7 @@ import torch
 
 from ultralytics.data.augment import LetterBox
 from ultralytics.utils import LOGGER, SimpleClass, ops
-from ultralytics.utils.plotting import Annotator, colors, save_one_box
+from ultralytics.utils.plotting import Annotator, colors, save_one_box, viz_histo_binarized
 
 
 class BaseTensor(SimpleClass):
@@ -211,7 +211,7 @@ class Results(SimpleClass):
         pred_masks, show_masks = self.masks, masks
         pred_probs, show_probs = self.probs, probs
         annotator = Annotator(
-            deepcopy(self.orig_img if img is None else img),
+            deepcopy(viz_histo_binarized(self.orig_img.transpose(2, 0, 1)) if img is None else viz_histo_binarized(img.transpose(2, 0, 1))),
             line_width,
             font_size,
             font,
diff --git a/ultralytics/engine/validator.py b/ultralytics/engine/validator.py
index 9730c9b..71cf19f 100644
--- a/ultralytics/engine/validator.py
+++ b/ultralytics/engine/validator.py
@@ -150,7 +150,7 @@ class BaseValidator:
             self.dataloader = self.dataloader or self.get_dataloader(self.data.get(self.args.split), self.args.batch)
 
             model.eval()
-            model.warmup(imgsz=(1 if pt else self.args.batch, 3, imgsz, imgsz))  # warmup
+            model.warmup(imgsz=(1 if pt else self.args.batch, 2, imgsz, imgsz))  # warmup
 
         dt = Profile(), Profile(), Profile(), Profile()
         bar = TQDM(self.dataloader, desc=self.get_desc(), total=len(self.dataloader))
diff --git a/ultralytics/utils/plotting.py b/ultralytics/utils/plotting.py
index bfd2aaa..765b42f 100644
--- a/ultralytics/utils/plotting.py
+++ b/ultralytics/utils/plotting.py
@@ -17,6 +17,9 @@ from ultralytics.utils import LOGGER, TryExcept, ops, plt_settings, threaded
 from .checks import check_font, check_version, is_ascii
 from .files import increment_path
 
+BG_COLOR = np.array([30, 37, 52], dtype=np.uint8)
+POS_COLOR = np.array([216, 223, 236], dtype=np.uint8)
+NEG_COLOR = np.array([64, 126, 201], dtype=np.uint8)
 
 class Colors:
     """
@@ -362,6 +365,24 @@ def save_one_box(xyxy, im, file=Path('im.jpg'), gain=1.02, pad=10, square=False,
     return crop
 
 
+def viz_histo_binarized(im):
+    """
+    Visualize binarized histogram of events
+
+    Args:
+        im (np.ndarray): Array of shape (2,H,W)
+
+    Returns:
+        output_array (np.ndarray): Array of shape (H,W,3)
+    """
+    img = np.full(im.shape[-2:] + (3,), BG_COLOR, dtype=np.uint8)
+    y, x = np.where(im[0] > 0)
+    img[y, x, :] = POS_COLOR
+    y, x = np.where(im[1] > 0)
+    img[y, x, :] = NEG_COLOR
+    return img
+
+
 @threaded
 def plot_images(images,
                 batch_idx,
@@ -401,7 +422,7 @@ def plot_images(images,
         if i == max_subplots:  # if last batch has fewer images than we expect
             break
         x, y = int(w * (i // ns)), int(h * (i % ns))  # block origin
-        im = im.transpose(1, 2, 0)
+        im = viz_histo_binarized(im.copy())
         mosaic[y:y + h, x:x + w, :] = im
 
     # Resize (optional)
