Source code for E200.E200_Image_Iter

import os
on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if not on_rtd:
    import numpy as _np
from .E200_load_images import E200_load_images
from .get_matlab import is_facet_srv
import logging
from .classes import E200_Image
logger = logging.getLogger(__name__)


# ======================================
# Image iterator
# ======================================
[docs]class E200_Image_Iter(object): """ Iterable object for use in embedding in :code:`for` loops to prevent running out of memory. Loads available images from *img_dataset* (type :class:`E200.Drill` containing camera data). If *UID* is present, only loads matching UIDs. Loads *numperset* images at a time. *(Note: Can and should be used directly!)* """ def __init__(self, img_dataset, UID=None, numperset=None): # ====================================== # Check platform (only facet-srvs have # major memory issues) # ====================================== if numperset is None: if is_facet_srv(): numperset = 50 else: numperset = 500 # ====================================== # Initialize requested iterator # ====================================== self._numperset = numperset self._imgstr = img_dataset self._uids = UID self._uids_orig = UID def __iter__(self): # ====================================== # Initialize this loop # ====================================== self._subind = 0 if self._uids is None: self._uids = self._imgstr.UID self._load_next_batch() return self def __next__(self): if self._imgs_ind >= self._num_uids_load: self._load_next_batch() img = _np.array([self._images.images[self._imgs_ind]]) dat = _np.array([self._images.dat[self._imgs_ind]]) uid = _np.array([self._images.uid[self._imgs_ind]]) imgbg = self._images.image_backgrounds time = _np.array([self._images.timestamps[self._imgs_ind]]) out = E200_Image(images=img, dat=dat, uid=uid, image_backgrounds=imgbg, timestamps=time) self._imgs_ind = self._imgs_ind + 1 return out def _load_next_batch(self): # ====================================== # Load only up to the next batch avail. # uids to prevent memory overflow # ====================================== num_uids_left = _np.size(self._uids) logger.debug('Number of UIDs left: {}'.format(num_uids_left)) if num_uids_left == 0: raise StopIteration if self._numperset == -1: uids = self._uids else: uid_ind = _np.min([num_uids_left, self._numperset]) uids = self._uids[0:uid_ind] self._num_uids_load = _np.size(uids) self._images = E200_load_images(self._imgstr, UID=uids) self._imgs_ind = 0 self._uids = _np.delete(self._uids, slice(0, self._num_uids_load)) return