Esempio n. 1
0
    def predict(self, input):
        try:
            req = Request(input)
            response = Response(req)

            for module in self.get_modules():
                log.debug(f"Processing request for module: {module}")
                response = module.process(response)
                log.debug(
                    f"response.to_dict(): {json.dumps(response.to_dict(), indent=2)}"
                )

            if req.bin_encoding:
                return response.to_bytes()
            else:
                return jsonify(response.to_dict())
        except Exception:
            log.exception(f"Error processing request {input}")
        return jsonify({"error": "Could not process this request"})
Esempio n. 2
0
    def __init__(self,
                 response=None,
                 med_ret=None,
                 server_name='FrameDrawer',
                 version='1.0.0',
                 module_id_map=None,
                 pushing_folder=DEFAULT_DUMP_FOLDER,
                 s3_bucket=None,
                 s3_key=None):
        super().__init__(server_name=server_name,
                         version=version,
                         module_id_map=module_id_map)
        #log.setLevel('DEBUG')
        self.response = None
        if isinstance(response, Response):
            self.response = response
        elif isinstance(response, dict):
            self.response = Response(response)
        else:
            log.debug("No response")

        self.med_ret = med_ret
        if med_ret is None:
            if self.response is not None:
                self.med_ret = MediaRetriever(self.response.url)

        if s3_bucket and not s3_key:
            raise ValueError("s3 bucket defined but s3 key not defined")
        if s3_key and not s3_bucket:
            raise ValueError("s3 key defined but s3 bucket not defined")
        if not pushing_folder and not s3_key:
            raise ValueError(
                "pushing_folder and s3 key not defined, we cannot set where to dump."
            )
        if pushing_folder:
            self.pushing_folder = pushing_folder
        else:
            self.pushing_folder = DEFAULT_DUMP_FOLDER

        self.s3_bucket = s3_bucket
        self.s3_key = s3_key
Esempio n. 3
0
        def process():
            """Entry point for starting an HTTP server
            """
            log.info("Pulling request")
            try:
                message = request.get_json(force=True)
                req = Request(message)
                response = Response(req)

                for module in self.modules:
                    log.info(f"Processing request for module: {module}")
                    response = module.process(response)
                    log.debug(
                        f"response.to_dict(): {json.dumps(response.to_dict(), indent=2)}"
                    )

                if req.bin_encoding:
                    return response.to_bytes()
                else:
                    return jsonify(response.to_dict())
            except Exception as e:
                log.error(e)
                log.error(traceback.print_exc())
                log.error(f"Error processing request {message}")
Esempio n. 4
0
    def __init__(self,
                 response=None,
                 med_ret=None,
                 server_name='FrameDrawer',
                 version='1.0.0',
                 module_id_map=None,
                 pushing_folder=DEFAULT_DUMP_FOLDER,
                 s3_bucket=None,
                 s3_key=None):
        super().__init__(server_name=server_name,
                         version=version,
                         module_id_map=module_id_map)

        if isinstance(response, dict):
            response = Response(response)

        self.response = response

        if not isinstance(self.response, Response):
            log.debug("No response set")
            self.response = None

        self.med_ret = med_ret
        if med_ret is None and self.response is not None:
            self.med_ret = MediaRetriever(self.response.url)

        if s3_bucket and not s3_key:
            raise ValueError("s3 bucket defined but s3_key not defined")

        if s3_key and not s3_key:
            raise ValueError("s3_key defined but s3 bucket not defined")

        if not pushing_folder and not s3_key:
            raise ValueError("pushing_folder and s3_key not defined, "
                             "we cannot set where to dump.")

        self.local_dir = pushing_folder
        self.s3_bucket = s3_bucket
        self.s3_key_prefix = s3_key
Esempio n. 5
0
    def _process_request(self, request):
        """Send request_message through all the modules

        Args:
            request (Request): incoming request

        Returns:
            Response: outgoing response message
        """
        if not isinstance(request, Request):
            raise ValueError(f"request is of type {type(request)}, not Request")
        log.debug(f"Processing: {request}")
        log.info(f"Processing url: {request.get('url')}")

        response = Response(request, self.schema_registry_url)

        for module in self.modules:
            log.info(f"Processing request for module: {module}")
            response = module.process(response)
            log.debug(f"response.to_dict(): {json.dumps(response.to_dict(), indent=2)}")

        return response
Esempio n. 6
0
class FrameDrawer(PropertiesModule):
    def __init__(self,
                 response=None,
                 med_ret=None,
                 server_name='FrameDrawer',
                 version='1.0.0',
                 module_id_map=None,
                 pushing_folder=DEFAULT_DUMP_FOLDER,
                 s3_bucket=None,
                 s3_key=None):
        super().__init__(server_name=server_name,
                         version=version,
                         module_id_map=module_id_map)
        #log.setLevel('DEBUG')
        self.response = None
        if isinstance(response, Response):
            self.response = response
        elif isinstance(response, dict):
            self.response = Response(response)
        else:
            log.debug("No response")

        self.med_ret = med_ret
        if med_ret is None:
            if self.response is not None:
                self.med_ret = MediaRetriever(self.response.url)

        if s3_bucket and not s3_key:
            raise ValueError("s3 bucket defined but s3 key not defined")
        if s3_key and not s3_bucket:
            raise ValueError("s3 key defined but s3 bucket not defined")
        if not pushing_folder and not s3_key:
            raise ValueError(
                "pushing_folder and s3 key not defined, we cannot set where to dump."
            )
        if pushing_folder:
            self.pushing_folder = pushing_folder
        else:
            self.pushing_folder = DEFAULT_DUMP_FOLDER

        self.s3_bucket = s3_bucket
        self.s3_key = s3_key

    def process_properties(self,
                           dump_video=True,
                           dump_images=False,
                           tstamps_Of_Interest=None):
        self.last_tstamp = 0.0
        assert (self.response)
        self.med_ret = MediaRetriever(self.response.url)

        self.w, self.h = self.med_ret.get_w_h()
        media_id = os.path.basename(self.response.url).rsplit(".", 1)[0]
        self.media_id = "".join(
            [e for e in media_id if e.isalnum() or e in ["/", "."]])
        self.content_type_map = {}

        # if there is no flag in the request of not request_api we'll get None.
        self.dump_video = None
        self.dump_images = None
        try:
            self.dump_video = self.request.get("dump_video")
            self.dump_images = self.request.get("dump_images")
        except Exception:
            log.error(
                "Unable to get flags from request dump_video or dump_images")
            pass

        if self.dump_video is None:
            self.dump_video = dump_video
        if self.dump_images is None:
            self.dump_images = dump_images
        if self.dump_video is False and self.dump_images is False:
            log.warning(
                "Not dumping anything--you might want to dump something.")
            return

        dump_folder = self.pushing_folder + '/' + self.media_id + '/'
        self.dumping_folder_url = dump_folder
        if dump_folder:
            if not os.path.exists(dump_folder):
                os.makedirs(dump_folder)

        if self.dump_video:
            filename = dump_folder + '/video.mp4'
            fps = 1
            frameSize = self.med_ret.shape
            frameSize = (self.w, self.h)
            fourcc = cv2.VideoWriter_fourcc(*'H264')
            log.info("filename: " + filename)
            log.info("fourcc: " + str(fourcc))
            log.info("type(fourcc): " + str(type(fourcc)))
            log.info("fps: " + str(fps))
            log.info("type(fps): " + str(type(fps)))
            log.info("frameSize: " + str(frameSize))
            log.info("type(frameSize): " + str(type(frameSize)))
            vid = cv2.VideoWriter(filename, fourcc, fps, frameSize)
            self.content_type_map[os.path.basename(filename)] = 'video/mp4'
        face = cv2.FONT_HERSHEY_SIMPLEX
        scale = 0.65
        thickness = 2

        # we get the image_annotation tstamps
        tstamps = self.response.get_timestamps()
        tstamp_frame_anns = self.response.get_timestamps_from_frames_ann()
        log.debug('tstamps: ' + str(tstamps))
        log.debug('tstamps_dets: ' + str(tstamp_frame_anns))

        # we get the frame iterator
        frames_iterator = []
        if tstamps_Of_Interest:
            if type(tstamps_Of_Interest) is list:
                for t in tstamps_Of_Interest:
                    frame = self.med_ret.get_frame(tstamp=t)
                    frames_iterator.append((frame, t))
        elif tstamps_Of_Interest is None:
            try:
                frames_iterator = self.med_ret.get_frames_iterator(
                    sample_rate=1.0)
            except Exception:
                log.error(traceback.format_exc())
                raise Exception("Error loading media")

        for i, (img, tstamp) in enumerate(frames_iterator):
            self.last_tstamp = tstamp
            if img is None:
                log.warning("Invalid frame")
                continue
            if tstamp is None:
                log.warning("Invalid tstamp")
                continue
            # log.info('tstamp: ' + str(tstamp))
            if tstamp in tstamp_frame_anns:
                log.debug("drawing frame for tstamp: " + str(tstamp))
                # we get image_ann for that time_stamps
                regions = self.response.get_regions_from_tstamp(tstamp)
                # log.info(json.dumps(image_ann, indent=2))
                for region in regions:
                    rand_color = get_rand_bgr()
                    p0, p1 = p0p1_from_bbox_contour(region['contour'], self.w,
                                                    self.h)
                    anchor_point = [p0[0] + 3, p1[1] - 3]
                    if abs(p1[1] - self.h) < 30:
                        anchor_point = [p0[0] + 3, int(p1[1] / 2) - 3]
                    img = cv2.rectangle(img, p0, p1, rand_color, thickness)
                    prop_strs = get_props_from_region(region)
                    for i, prop in enumerate(prop_strs):
                        img = cv2.putText(
                            img, prop,
                            (anchor_point[0], anchor_point[1] + i * 25), face,
                            1.0, rand_color, thickness)
            elif tstamp in tstamps:
                log.debug("Making frame gray")
                gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                img = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
            else:
                log.debug("No processed frame")
                continue
            # Include the timestamp
            img = cv2.putText(img, str(tstamp), (20, 20), face, scale,
                              [255, 255, 255], thickness)
            if self.dump_video:
                # we add the frame
                log.debug("Adding frame")
                vid.write(img)
            if self.dump_images:
                # we dump the frame
                outfn = "{}/{}.jpg".format(dump_folder, tstamp)
                log.debug("Writing to file: {}".format(outfn))
                cv2.imwrite(outfn, img)
                self.content_type_map[os.path.basename(outfn)] = 'image/jpeg'

        if self.dump_video:
            vid.release()
        if self.s3_bucket:
            try:
                self.upload_files(dump_folder)
            except Exception:
                log.error(traceback.format_exc())
        if self.pushing_folder == DEFAULT_DUMP_FOLDER:
            log.info('Removing files in ' + dump_folder)
            shutil.rmtree(dump_folder)

        props = []
        if self.dump_images:
            props.append(
                Property(
                    server=self.name,
                    ver=self.version,
                    value=self.dumping_folder_url,
                    property_type="dumped_images",
                    property_id=1,
                ))
        if self.dump_video:
            dumped_video_url = self.dumping_folder_url + '/video.mp4'
            dumped_video_url = dumped_video_url.replace('//', '/')
            dumped_video_url = dumped_video_url.replace('https:/', 'https://')
            props.append(
                Property(
                    server=self.name,
                    ver=self.version,
                    value=dumped_video_url,
                    property_type="dumped_video",
                    property_id=2,
                ))
        media_summary = VideoAnn(t1=0.0, t2=self.last_tstamp, props=props)
        self.response.append_media_summary(media_summary)

    def upload_files(self, path):
        log.info("Uploading files")
        session = boto3.Session()
        s3 = session.resource('s3')
        bucket = s3.Bucket(self.s3_bucket)
        key_root = self.s3_key + '/' + self.media_id + '/'
        # https://<bucket-name>.s3.amazonaws.com/<key>
        self.dumping_folder_url = 'https://s3.amazonaws.com/' + self.s3_bucket + '/' + key_root

        for subdir, dirs, files in os.walk(path):
            for file in files:
                full_path = os.path.join(subdir, file)
                with open(full_path, 'rb') as data:
                    rel_path = os.path.basename(full_path)
                    key = key_root + rel_path
                    log.info('Pushing ' + full_path + ' to ' +
                             self.dumping_folder_url)
                    try:
                        content_type = self.content_type_map[os.path.basename(
                            full_path)]
                    except Exception:
                        content_type = None  #file is not intended to be uploaded, it was not generated in this execution.
                    if content_type:
                        bucket.put_object(Key=key,
                                          Body=data,
                                          ContentType=content_type)