Exemplo n.º 1
0
    def run_streams(self):
        def push_to_bus(bus):
            while True:
                if len(self.list_to_push) > 0:
                    send_list = self.list_to_push.pop()
                    bus.push('/pack_batches', [send_list])
                else:
                    time.sleep(0.01)

        iter_batch = self.iter_batch()
        periods = []
        push_thread1 = Thread(target=push_to_bus, args=(bus, ))
        push_thread2 = Thread(target=push_to_bus, args=(bus2, ))
        push_thread1.start()
        push_thread2.start()
        while True:
            start = time.time()
            ts, batch_data = next(iter_batch)
            self.list_to_push.insert(0, (ts, batch_data))
            end = time.time()
            period = end - start
            periods.append(period)
            if len(periods) > 1000:
                avg_period = sum(periods) / len(periods)
                periods = []
                log.info('reader FPS = {}, queue = {} '.format(
                    (1 / avg_period), len(self.list_to_push)))
Exemplo n.º 2
0
 def __init__(self, streams=None, timeout=1, fps=25, file_time=60):
     self.videos_dir = config.find('videos_path')
     self.standby = cv2.imread(
         os.path.join(sys.path[0],
                      *config.find('standby').split('/')))
     self.timeout = timedelta(milliseconds=timeout)
     self.file_time = config.find('video_duration') or file_time
     self.fps = config.find('framerate') or fps
     self.ext = config.find('ext') or 'avi'
     self.ts_start = None
     self.caps_list = []
     self.list_to_push = []
     self.lock = Lock()
     for stream in config.find('streams') or streams:
         log.info('reader Processing stream {}'.format(stream))
         cap = {}
         cap['stream'] = stream
         cap['cap'] = cv2.VideoCapture(stream, cv2.CAP_GSTREAMER)
         cap['cap'].set(3, 300)
         cap['cap'].set(4, 300)
         cap['width'] = 300
         cap['height'] = 300
         cap['standby'] = cv2.resize(self.standby,
                                     (cap['width'], cap['height']))
         cap['time_off'] = None
         cap['writer'] = None
         self.caps_list.append(cap)
Exemplo n.º 3
0
 def receive_batch(self, ts, batch_data):
     start = time.time()
     log.debug("infer Received processing batch data")
     all_persons = 0
     infer_time = []
     for i in range(len(batch_data)):
         camera_id = i
         frame = batch_data[i]['frame']
         filename = batch_data[i]['file_name']
         frame_number = batch_data[i]['index_number']
         faces_rect = None
         pedestrian_rect = None
         faces_features = None
         nearest = None
         if batch_data[i]['ret']:
             start_infer = time.time()
             initial, faces_rect, faces_features = frame_handler.infer_frame(frame)
             initial_pedestrian, pedestrian_rect, *_ = pedestrian_frame_handler.infer_frame(frame) # NEW
             end_infer = time.time()
             infer_time.append(end_infer - start_infer)
         if faces_rect:
             init_height, init_width = initial
             now = datetime.now()
             all_persons += len(faces_rect)
             if (now - ts) < self.alert_actual:
                 #log.info('set: {} path: {}'.format(features_set.p.get_ids_list(), features_set.output_path))
                 nearest = features_set.find_nearest(faces_features)
             for j in range(len(faces_rect)):
                 l, t, r, b = faces_rect[j]
                 if nearest is not None:
                     label = nearest[0][j]
                     distance = nearest[1][j]
                     self.alert_send(now, ts, camera_id, label, distance, l, t, r, b,
                                     filename, frame_number, frame)
         # NEW
         if pedestrian_rect:
             init_ped_w, init_ped_h = initial_pedestrian
             for j in range(len(pedestrian_rect)):
                 lp, tp, rp, bp = pedestrian_rect[j]
                 self.storage_save(camera_id, ts, lp, tp, rp, bp, filename, frame_number,
                                   init_ped_h, init_ped_w)
         continue
     end = time.time()
     self.periods.append(end - start)
     if len(self.periods) > 1000:
         avg_period = sum(self.periods) / len(self.periods)
         self.periods = []
         log.info("infer Output persons : {}, ts: {}".format(all_persons, ts))
         log.info('infer cycle total FPS = {}, infer FPS = {}'.format(1/avg_period, 1/sum(infer_time)))
Exemplo n.º 4
0
 def write_videos(self, cap_id, ts, frame_dict):
     cap = self.caps_list[cap_id]
     if frame_dict['index_number'] == 0:
         self.ts_start = ts
         file = os.path.join(self.videos_dir, frame_dict['file_name'])
         log.info('reader Starting write video for '
                  'stream: {} filename: {}...'.format(cap_id, file))
         cap['writer'] = cv2.VideoWriter(
             file,  #cv2.CAP_INTEL_MFX,
             cv2.VideoWriter_fourcc('H', '2', '6', '4'),
             self.fps,
             (self.caps_list[cap_id]['width'],
              self.caps_list[cap_id]['height']))
     cap['writer'].write(frame_dict['frame'])
     if frame_dict['index_number'] == (self.fps * self.file_time):
         cap['writer'].release()
         log.info(
             'reader Finished write video for stream: {}.'.format(cap_id))
Exemplo n.º 5
0
import sys
from component.reader import ReaderStreams
from component.ping import ping
from scope import log

if __name__ == '__main__':
    log.info('system APPLICATION STARTING...')
    try:
        ping.add_stage('reader', send=True)
        reader = ReaderStreams()
        log.info('system APPLICATION STARTED')
        reader.run_streams()
    except Exception as e:
        log.exception(e)
        log.critical('system APPLICATION CLOSED WITH ERROR {}'.format(e))
        sys.exit(1)
    log.info('system APPLICATION FINISHED')
Exemplo n.º 6
0
    def receive_alert(self, ts, camera, label, distance, left, top, right,
                      bottom, filename, frame_number, frame):
        now = datetime.now()
        prev_alert = self.prev_alerts.get(label)
        if prev_alert is not None:
            if (ts - prev_alert) >= self.alert_inertia:
                self.prev_alerts.pop(label, None)
            else:
                self.prev_alerts[label] = now

        prev_alert = self.prev_alerts.get(label)
        if prev_alert is None:
            photo_files, is_tester = executor.execute_query(
                queries, 'select_filename_by_id', label=label)[0]
            if is_tester:
                bot = 'whitelist'
            else:
                bot = 'blacklist'

            frame = self._image_prepared(frame, (left, top, right, bottom))
            if photo_files:
                origin_filename = photo_files
                origin_path = os.path.join(self.photos_dir, origin_filename)
                origin = self._image_prepared(origin_path)
            else:
                origin_filename = 'None'
                origin = None

            log.info(
                'alerter Sending alert message for label {}...'.format(label))
            messenger.subscribers = [
                sub[0] for sub in executor.execute_query(
                    queries, 'select_telegram_subscribers_unmute', bot=bot)
            ]
            send_alert = messenger.send_mailing(bot,
                                                label,
                                                int(distance * 100),
                                                camera,
                                                ts,
                                                frame=frame,
                                                origin=origin)
            try:
                while True:
                    res, user_id = next(send_alert)
                    if res == 403:
                        executor.execute_query(queries,
                                               'telegram_subscriber_mute',
                                               user_id=user_id,
                                               commit=True)
            except StopIteration:
                log.info(
                    'alerter Sent alert message for label {} to messenger'.
                    format(label))

            executor.execute_query(queries,
                                   'insert_alerts_table',
                                   camera_id=camera,
                                   ts=ts,
                                   l=left,
                                   t=top,
                                   r=right,
                                   b=bottom,
                                   label=label,
                                   distance=distance,
                                   frame_number=frame_number,
                                   filename=filename,
                                   origin=origin_filename,
                                   is_tester=is_tester,
                                   commit=True)
            log.info(
                'alerter Sent alert for label {} to database'.format(label))
            self.prev_alerts[label] = now
Exemplo n.º 7
0
from flask import Flask, redirect
from scope import config, log, executor, queries
import math
import cv2
import os

log.info('reporter Initializing Flask...')
app = Flask(__name__)
log.info('reporter Flask initialized')

URI = config.find('reporter/uri', '/')
VIDEOS_PATH = config.find('reader/videos_path')
IMAGE_PATH = config.find('reporter/image_path')


@app.route("/reporter/get_direction/<track_id>")
def get_direction(track_id):
    try:
        select_track = 'select_tracks_reporter'
        track = executor.execute_query(queries,
                                       select_track,
                                       track_id=track_id,
                                       commit=True)
        if track:
            l0_f, t0_f, r0_f, b0_f, ts0, filename0, frame0, l1_f, t1_f, r1_f, b1_f, ts1, filename1, frame1, length, camera_id = track.pop(
            )
        else:
            return 'TRACK WITH THIS ID={} DOES NOT EXIST'.format(track_id)
        image_file = '{path}/{track_id}.jpg'.format(path=IMAGE_PATH,
                                                    track_id=track_id)
        f0 = '{path}/{filename0}'.format(path=VIDEOS_PATH, filename0=filename0)
Exemplo n.º 8
0
    def process_frames(self):
        log.info('Tracker starting processing frames')
        while True:
            now = datetime.datetime.now()
            if now - self._prev_time >= self.download_interval:
                self.frames = self.executor.execute_query(
                    queries,
                    self._select_from_frames,
                    limit=self.select_limit,
                    commit=True)
                self.preload_tracks(now)
                self.preload_ids = self.tracker.get_all_track_ids()
                self._prev_time = now
            if self.frames:
                oldest_frame_ts = self.frames[-1][1]  # FIX THIS
                processed = 0
                total_frames = len(self.frames)
                while self.frames:
                    camera_id, ts, l, t, r, b, filename, frame_num = self.frames.pop(
                        0)
                    self.tracker.add_track(l, t, r, b, ts, filename, frame_num,
                                           camera_id)
                    processed += 1
                log.info('Tracker processed {} out of {} total frames'.format(
                    processed, total_frames))
                self.executor.execute_query(queries,
                                            self._update_frames_status,
                                            oldest=oldest_frame_ts,
                                            commit=True)
                log.info('Tracker frames table updated')

                for track_id in self.preload_ids:
                    track = self.tracker.get_track(track_id)
                    l1, t1, r1, b1, ts1, filename1, frame1 = track['last']
                    length = track['length']
                    self.executor.execute_query(queries,
                                                self._update_tracks,
                                                track_id=str(track_id),
                                                l1=l1,
                                                t1=t1,
                                                r1=r1,
                                                b1=b1,
                                                ts1=ts1,
                                                filename1=filename1,
                                                frame1=frame1,
                                                len=length,
                                                commit=True)

                new_ids = self.tracker.get_all_track_ids() - self.preload_ids
                for track_id in new_ids:
                    track = self.tracker.get_track(track_id)
                    l0, t0, r0, b0, ts0, filename0, frame0 = track['first']
                    l1, t1, r1, b1, ts1, filename1, frame1 = track['last']
                    length = track['length']
                    camera_id = track['camera_id']
                    self.executor.execute_query(queries,
                                                self._insert_into_tracks,
                                                track_id=str(track_id),
                                                l0=l0,
                                                t0=t0,
                                                r0=r0,
                                                b0=b0,
                                                ts0=ts0,
                                                filename0=filename0,
                                                frame0=frame0,
                                                l1=l1,
                                                t1=t1,
                                                r1=r1,
                                                b1=b1,
                                                ts1=ts1,
                                                filename1=filename1,
                                                frame1=frame1,
                                                len=length,
                                                camera_id=str(camera_id),
                                                commit=True)

                log.info('Tracker inserted {} tracks into table'.format(
                    len(new_ids)))
                self.tracker.empty_storage()
                self.frames = []
                log.info('Tracker full cycle finished')
            time.sleep(1)