def detect(self, image):
        if image in self._detect_cache:
            message = "Detection cache hit: %(image)d -> %(result)s" % \
                    {'image':id(image), 'result':self._detect_cache[image]}
            LOGGER.debug(message)
            if isinstance(self._detect_cache[image], FeatureNotFoundException):
                message = str(self._detect_cache[image])
                raise FeatureNotFoundException(message,
                        cause=self._detect_cache[image])
            return self._detect_cache[image]
        try:
            self._image = image
            self._detect_plural()
            self._exit_if_none_detected()
            self._unpack_first()
            self._extract_image()
            self._calculate_center()
            self._detect_cache[image] = self._single
            return self._detect_cache[image]
        except FeatureNotFoundException as exception:
            self._detect_cache[image] = exception
            raise