| 124 | |
| 125 | |
| 126 | class AsyncVis: |
| 127 | class _VisWorker(mp.Process): |
| 128 | def __init__(self, video_vis, task_queue, result_queue): |
| 129 | """ |
| 130 | Visualization Worker for AsyncVis. |
| 131 | Args: |
| 132 | video_vis (VideoVisualizer object): object with tools for visualization. |
| 133 | task_queue (mp.Queue): a shared queue for incoming task for visualization. |
| 134 | result_queue (mp.Queue): a shared queue for visualized results. |
| 135 | """ |
| 136 | self.video_vis = video_vis |
| 137 | self.task_queue = task_queue |
| 138 | self.result_queue = result_queue |
| 139 | super().__init__() |
| 140 | |
| 141 | def run(self): |
| 142 | """ |
| 143 | Run visualization asynchronously. |
| 144 | """ |
| 145 | while True: |
| 146 | task = self.task_queue.get() |
| 147 | if isinstance(task, _StopToken): |
| 148 | break |
| 149 | |
| 150 | frames = draw_predictions(task, self.video_vis) |
| 151 | task.frames = np.array(frames) |
| 152 | self.result_queue.put(task) |
| 153 | |
| 154 | def __init__(self, video_vis, n_workers=None): |
| 155 | """ |
| 156 | Args: |
| 157 | cfg (CfgNode): configs. Details can be found in |
| 158 | slowfast/config/defaults.py |
| 159 | n_workers (Optional[int]): number of CPUs for running video visualizer. |
| 160 | If not given, use all CPUs. |
| 161 | """ |
| 162 | |
| 163 | num_workers = mp.cpu_count() if n_workers is None else n_workers |
| 164 | |
| 165 | self.task_queue = mp.Queue() |
| 166 | self.result_queue = mp.Queue() |
| 167 | self.get_indices_ls = [] |
| 168 | self.procs = [] |
| 169 | self.result_data = {} |
| 170 | self.put_id = -1 |
| 171 | for _ in range(max(num_workers, 1)): |
| 172 | self.procs.append( |
| 173 | AsyncVis._VisWorker( |
| 174 | video_vis, self.task_queue, self.result_queue |
| 175 | ) |
| 176 | ) |
| 177 | |
| 178 | for p in self.procs: |
| 179 | p.start() |
| 180 | |
| 181 | atexit.register(self.shutdown) |
| 182 | |
| 183 | def put(self, task): |
nothing calls this directly
no outgoing calls
no test coverage detected