isLinXu commited on
Commit
0683257
·
1 Parent(s): bb59176
Files changed (2) hide show
  1. app.py +802 -0
  2. requirements.txt +19 -0
app.py ADDED
@@ -0,0 +1,802 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ os.system("git clone https://github.com/IDEA-Research/detrex.git")
3
+ # os.system("python -m pip install git+https://github.com/facebookresearch/[email protected]#egg=detectron2")
4
+ os.system("python -m pip install git+https://github.com/IDEA-Research/[email protected]#egg=detrex")
5
+ os.system("git submodule sync")
6
+ os.system("git submodule update --init")
7
+ # os.system("cd detrex && pip install -e .")
8
+ # os.system("pip install fairscale")
9
+
10
+ import argparse
11
+ import glob
12
+ import multiprocessing as mp
13
+ import numpy as np
14
+ import os
15
+ import sys
16
+ import tempfile
17
+ import time
18
+ import warnings
19
+ import cv2
20
+ import torch
21
+ import tqdm
22
+ import gradio as gr
23
+
24
+ # from demo.predictors import VisualizationDemo
25
+ from detectron2.checkpoint import DetectionCheckpointer
26
+ from detectron2.config import LazyConfig, instantiate
27
+ from detectron2.data.detection_utils import read_image
28
+ from detectron2.utils.logger import setup_logger
29
+
30
+ import warnings
31
+
32
+ warnings.filterwarnings("ignore")
33
+
34
+ import atexit
35
+ import bisect
36
+ from copy import copy
37
+ import multiprocessing as mp
38
+ from collections import deque
39
+ import cv2
40
+ import torch
41
+
42
+ import detectron2.data.transforms as T
43
+ from detectron2.data import MetadataCatalog
44
+ from detectron2.structures import Instances
45
+ from detectron2.utils.video_visualizer import VideoVisualizer
46
+ from detectron2.utils.visualizer import ColorMode, Visualizer
47
+
48
+
49
+ def filter_predictions_with_confidence(predictions, confidence_threshold=0.5):
50
+ if "instances" in predictions:
51
+ preds = predictions["instances"]
52
+ keep_idxs = preds.scores > confidence_threshold
53
+ predictions = copy(predictions) # don't modify the original
54
+ predictions["instances"] = preds[keep_idxs]
55
+ return predictions
56
+
57
+
58
+ class VisualizationDemo(object):
59
+ def __init__(
60
+ self,
61
+ model,
62
+ min_size_test=800,
63
+ max_size_test=1333,
64
+ img_format="RGB",
65
+ metadata_dataset="coco_2017_val",
66
+ instance_mode=ColorMode.IMAGE,
67
+ parallel=False,
68
+ ):
69
+ """
70
+ Args:
71
+ cfg (CfgNode):
72
+ instance_mode (ColorMode):
73
+ parallel (bool): whether to run the model in different processes from visualization.
74
+ Useful since the visualization logic can be slow.
75
+ """
76
+ self.metadata = MetadataCatalog.get(
77
+ metadata_dataset if metadata_dataset is not None else "__unused"
78
+ )
79
+ self.cpu_device = torch.device("cpu")
80
+ self.instance_mode = instance_mode
81
+
82
+ self.parallel = parallel
83
+ if parallel:
84
+ num_gpu = torch.cuda.device_count()
85
+ self.predictor = AsyncPredictor(
86
+ model=model,
87
+ min_size_test=min_size_test,
88
+ max_size_test=max_size_test,
89
+ img_format=img_format,
90
+ metadata_dataset=metadata_dataset,
91
+ num_gpus=num_gpu,
92
+ )
93
+ else:
94
+ self.predictor = DefaultPredictor(
95
+ model=model,
96
+ min_size_test=min_size_test,
97
+ max_size_test=max_size_test,
98
+ img_format=img_format,
99
+ metadata_dataset=metadata_dataset,
100
+ )
101
+
102
+ def run_on_image(self, image, threshold=0.5):
103
+ """
104
+ Args:
105
+ image (np.ndarray): an image of shape (H, W, C) (in BGR order).
106
+ This is the format used by OpenCV.
107
+
108
+ Returns:
109
+ predictions (dict): the output of the model.
110
+ vis_output (VisImage): the visualized image output.
111
+ """
112
+ vis_output = None
113
+ predictions = self.predictor(image)
114
+ predictions = filter_predictions_with_confidence(predictions, threshold)
115
+ # Convert image from OpenCV BGR format to Matplotlib RGB format.
116
+ image = image[:, :, ::-1]
117
+ visualizer = Visualizer(image, self.metadata, instance_mode=self.instance_mode)
118
+ if "panoptic_seg" in predictions:
119
+ panoptic_seg, segments_info = predictions["panoptic_seg"]
120
+ vis_output = visualizer.draw_panoptic_seg_predictions(
121
+ panoptic_seg.to(self.cpu_device), segments_info
122
+ )
123
+ else:
124
+ if "sem_seg" in predictions:
125
+ vis_output = visualizer.draw_sem_seg(
126
+ predictions["sem_seg"].argmax(dim=0).to(self.cpu_device)
127
+ )
128
+ if "instances" in predictions:
129
+ instances = predictions["instances"].to(self.cpu_device)
130
+ vis_output = visualizer.draw_instance_predictions(predictions=instances)
131
+
132
+ return predictions, vis_output
133
+
134
+ def _frame_from_video(self, video):
135
+ while video.isOpened():
136
+ success, frame = video.read()
137
+ if success:
138
+ yield frame
139
+ else:
140
+ break
141
+
142
+ def run_on_video(self, video, threshold=0.5):
143
+ """
144
+ Visualizes predictions on frames of the input video.
145
+
146
+ Args:
147
+ video (cv2.VideoCapture): a :class:`VideoCapture` object, whose source can be
148
+ either a webcam or a video file.
149
+
150
+ Yields:
151
+ ndarray: BGR visualizations of each video frame.
152
+ """
153
+ video_visualizer = VideoVisualizer(self.metadata, self.instance_mode)
154
+
155
+ def process_predictions(frame, predictions, threshold):
156
+ predictions = filter_predictions_with_confidence(predictions, threshold)
157
+ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
158
+ if "panoptic_seg" in predictions:
159
+ panoptic_seg, segments_info = predictions["panoptic_seg"]
160
+ vis_frame = video_visualizer.draw_panoptic_seg_predictions(
161
+ frame, panoptic_seg.to(self.cpu_device), segments_info
162
+ )
163
+ elif "instances" in predictions:
164
+ predictions = predictions["instances"].to(self.cpu_device)
165
+ vis_frame = video_visualizer.draw_instance_predictions(frame, predictions)
166
+ elif "sem_seg" in predictions:
167
+ vis_frame = video_visualizer.draw_sem_seg(
168
+ frame, predictions["sem_seg"].argmax(dim=0).to(self.cpu_device)
169
+ )
170
+
171
+ # Converts Matplotlib RGB format to OpenCV BGR format
172
+ vis_frame = cv2.cvtColor(vis_frame.get_image(), cv2.COLOR_RGB2BGR)
173
+ return vis_frame
174
+
175
+ frame_gen = self._frame_from_video(video)
176
+ if self.parallel:
177
+ buffer_size = self.predictor.default_buffer_size
178
+
179
+ frame_data = deque()
180
+
181
+ for cnt, frame in enumerate(frame_gen):
182
+ frame_data.append(frame)
183
+ self.predictor.put(frame)
184
+
185
+ if cnt >= buffer_size:
186
+ frame = frame_data.popleft()
187
+ predictions = self.predictor.get()
188
+ yield process_predictions(frame, predictions, threshold)
189
+
190
+ while len(frame_data):
191
+ frame = frame_data.popleft()
192
+ predictions = self.predictor.get()
193
+ yield process_predictions(frame, predictions, threshold)
194
+ else:
195
+ for frame in frame_gen:
196
+ yield process_predictions(frame, self.predictor(frame), threshold)
197
+
198
+
199
+ class DefaultPredictor:
200
+ def __init__(
201
+ self,
202
+ model,
203
+ min_size_test=800,
204
+ max_size_test=1333,
205
+ img_format="RGB",
206
+ metadata_dataset="coco_2017_val",
207
+ ):
208
+ self.model = model
209
+ # self.model.eval()
210
+ self.metadata = MetadataCatalog.get(metadata_dataset)
211
+
212
+ # checkpointer = DetectionCheckpointer(self.model)
213
+ # checkpointer.load(init_checkpoint)
214
+
215
+ self.aug = T.ResizeShortestEdge([min_size_test, min_size_test], max_size_test)
216
+
217
+ self.input_format = img_format
218
+ assert self.input_format in ["RGB", "BGR"], self.input_format
219
+
220
+ def __call__(self, original_image):
221
+ """
222
+ Args:
223
+ original_image (np.ndarray): an image of shape (H, W, C) (in BGR order).
224
+
225
+ Returns:
226
+ predictions (dict):
227
+ the output of the model for one image only.
228
+ See :doc:`/tutorials/models` for details about the format.
229
+ """
230
+ with torch.no_grad(): # https://github.com/sphinx-doc/sphinx/issues/4258
231
+ # Apply pre-processing to image.
232
+ if self.input_format == "RGB":
233
+ # whether the model expects BGR inputs or RGB
234
+ original_image = original_image[:, :, ::-1]
235
+ height, width = original_image.shape[:2]
236
+ image = self.aug.get_transform(original_image).apply_image(original_image)
237
+ image = torch.as_tensor(image.astype("float32").transpose(2, 0, 1))
238
+
239
+ inputs = {"image": image, "height": height, "width": width}
240
+ predictions = self.model([inputs])[0]
241
+ return predictions
242
+
243
+
244
+ class AsyncPredictor:
245
+ """
246
+ A predictor that runs the model asynchronously, possibly on >1 GPUs.
247
+ Because rendering the visualization takes considerably amount of time,
248
+ this helps improve throughput a little bit when rendering videos.
249
+ """
250
+
251
+ class _StopToken:
252
+ pass
253
+
254
+ class _PredictWorker(mp.Process):
255
+ def __init__(
256
+ self,
257
+ model,
258
+ task_queue,
259
+ result_queue,
260
+ min_size_test=800,
261
+ max_size_test=1333,
262
+ img_format="RGB",
263
+ metadata_dataset="coco_2017_val",
264
+ ):
265
+ self.model = model
266
+ self.min_size_test = min_size_test
267
+ self.max_size_test = max_size_test
268
+ self.img_format = img_format
269
+ self.metadata_dataset = metadata_dataset
270
+ self.task_queue = task_queue
271
+ self.result_queue = result_queue
272
+ super().__init__()
273
+
274
+ def run(self):
275
+ predictor = DefaultPredictor(
276
+ model=self.model,
277
+ min_size_test=self.min_size_test,
278
+ max_size_test=self.max_size_test,
279
+ img_format=self.img_format,
280
+ metadata_dataset=self.metadata_dataset,
281
+ )
282
+
283
+ while True:
284
+ task = self.task_queue.get()
285
+ if isinstance(task, AsyncPredictor._StopToken):
286
+ break
287
+ idx, data = task
288
+ result = predictor(data)
289
+ self.result_queue.put((idx, result))
290
+
291
+ def __init__(self, cfg, num_gpus: int = 1):
292
+ """
293
+ Args:
294
+ cfg (CfgNode):
295
+ num_gpus (int): if 0, will run on CPU
296
+ """
297
+ num_workers = max(num_gpus, 1)
298
+ self.task_queue = mp.Queue(maxsize=num_workers * 3)
299
+ self.result_queue = mp.Queue(maxsize=num_workers * 3)
300
+ self.procs = []
301
+ for gpuid in range(max(num_gpus, 1)):
302
+ cfg = cfg.clone()
303
+ cfg.defrost()
304
+ cfg.MODEL.DEVICE = "cuda:{}".format(gpuid) if num_gpus > 0 else "cpu"
305
+ self.procs.append(
306
+ AsyncPredictor._PredictWorker(cfg, self.task_queue, self.result_queue)
307
+ )
308
+
309
+ self.put_idx = 0
310
+ self.get_idx = 0
311
+ self.result_rank = []
312
+ self.result_data = []
313
+
314
+ for p in self.procs:
315
+ p.start()
316
+ atexit.register(self.shutdown)
317
+
318
+ def put(self, image):
319
+ self.put_idx += 1
320
+ self.task_queue.put((self.put_idx, image))
321
+
322
+ def get(self):
323
+ self.get_idx += 1 # the index needed for this request
324
+ if len(self.result_rank) and self.result_rank[0] == self.get_idx:
325
+ res = self.result_data[0]
326
+ del self.result_data[0], self.result_rank[0]
327
+ return res
328
+
329
+ while True:
330
+ # make sure the results are returned in the correct order
331
+ idx, res = self.result_queue.get()
332
+ if idx == self.get_idx:
333
+ return res
334
+ insert = bisect.bisect(self.result_rank, idx)
335
+ self.result_rank.insert(insert, idx)
336
+ self.result_data.insert(insert, res)
337
+
338
+ def __len__(self):
339
+ return self.put_idx - self.get_idx
340
+
341
+ def __call__(self, image):
342
+ self.put(image)
343
+ return self.get()
344
+
345
+ def shutdown(self):
346
+ for _ in self.procs:
347
+ self.task_queue.put(AsyncPredictor._StopToken())
348
+
349
+ @property
350
+ def default_buffer_size(self):
351
+ return len(self.procs) * 5
352
+
353
+
354
+ detrex_model_list = {
355
+ # DETR
356
+ "detr/detr_r50_300ep": {
357
+ "configs": "projects/detr/configs/detr_r50_300ep.py",
358
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/converted_detr_r50_500ep.pth"
359
+ },
360
+ "detr/detr_r50_dc5_300ep": {
361
+ "configs": "projects/detr/configs/detr_r50_dc5_300ep.py",
362
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_detr_r50_dc5.pth"
363
+ },
364
+ "detr/detr_r101_300ep.py": {
365
+ "configs": "projects/detr/configs/detr_r101_300ep.py",
366
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/converted_detr_r101_500ep.pth"
367
+ },
368
+ "detr/detr_r101_dc5_300ep.py": {
369
+ "configs": "projects/detr/configs/detr_r101_dc5_300ep.py",
370
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_detr_r101_dc5.pth"
371
+ },
372
+ # Deformable-DETR
373
+ "deformable_detr/deformable_detr_r50_with_box_refinement_50ep": {
374
+ "configs": "projects/deformable_detr/configs/deformable_detr_r50_with_box_refinement_50ep.py",
375
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/deformable_detr_with_box_refinement_50ep_new.pth"
376
+ },
377
+ "deformable_detr/deformable_detr_r50_two_stage_50ep": {
378
+ "configs": "projects/deformable_detr/configs/deformable_detr_r50_two_stage_50ep.py",
379
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/deformable_detr_r50_two_stage_50ep_new.pth"
380
+ },
381
+ # Anchor-DETR
382
+ "anchor_detr/anchor_detr_r50_50ep":{
383
+ "configs":"projects/anchor_detr/configs/anchor_detr_r50_50ep.py",
384
+ "ckpts":"https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/anchor_detr_r50_50ep.pth"
385
+ },
386
+ "anchor_detr/anchor_detr_r50_50ep_(converted)":{
387
+ "configs":"projects/anchor_detr/configs/anchor_detr_r50_50ep.py",
388
+ "ckpts":"https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_anchor_detr_r50_50ep.pth"
389
+ },
390
+ "anchor_detr/anchor_detr_r50_dc5_50ep":{
391
+ "configs":"projects/anchor_detr/configs/anchor_detr_r50_dc5_50ep.py",
392
+ "ckpts":"https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_anchor_detr_r50_dc5_50ep.pth"
393
+ },
394
+ "anchor_detr/anchor_detr_r101_50ep":{
395
+ "configs":"projects/anchor_detr/configs/anchor_detr_r101_dc5_50ep.py",
396
+ "ckpts":"https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_anchor_detr_r101_dc5_50ep.pth"
397
+ },
398
+ "anchor_detr/anchor_detr_r101_dc5_50ep":{
399
+ "configs":"projects/anchor_detr/configs/anchor_detr_r101_dc5_50ep.py",
400
+ "ckpts":"https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_anchor_detr_r101_50ep.pth"
401
+ },
402
+ # Conditional-DETR
403
+ "conditional_detr/conditional_detr_r50_50ep":{
404
+ "configs":"projects/conditional_detr/configs/conditional_detr_r50_50ep.py",
405
+ "ckpts":"https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/conditional_detr_r50_50ep.pth"
406
+ },
407
+ "conditional_detr/conditional_detr_r50_50ep_(converted)":{
408
+ "configs":"",
409
+ "ckpts":""
410
+ },
411
+ "conditional_detr/conditional_detr_r101_50ep":{
412
+ "configs":"projects/conditional_detr/configs/conditional_detr_r101_50ep.py",
413
+ "ckpts":"https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/converted_conditional_detr_r101_50ep.pth"
414
+ },
415
+ "conditional_detr/conditional_detr_r101_dc5_50ep": {
416
+ "configs": "projects/conditional_detr/configs/conditional_detr_r101_dc5_50ep.py",
417
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_conditional_detr_r101_dc5.pth"
418
+ },
419
+ # DAB-DETR
420
+ "dab_detr/dab_detr_r50_50ep": {
421
+ "configs": "projects/dab_detr/configs/dab_detr_r50_50ep.py",
422
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/dab_detr_r50_50ep.pth"
423
+ },
424
+ "dab_detr/dab_detr_r50_3patterns_50ep": {
425
+ "configs": "projects/dab_detr/configs/dab_detr_r50_3patterns_50ep.py",
426
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_dab_detr_r50_3patterns.pth"
427
+ },
428
+ "dab_detr/dab_detr_r50_dc5_50ep": {
429
+ "configs": "projects/dab_detr/configs/dab_detr_r50_dc5_50ep.py",
430
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_dab_detr_r50_dc5.pth"
431
+ },
432
+ "dab_detr/dab_detr_r50_dc5_3patterns_50ep": {
433
+ "configs": "projects/dab_detr/configs/dab_detr_r50_3patterns_50ep.py",
434
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_dab_detr_r50_dc5_3patterns.pth"
435
+ },
436
+ "dab_detr/dab_detr_r101_50ep": {
437
+ "configs": "projects/dab_detr/configs/dab_detr_r101_50ep.py",
438
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/dab_detr_r101_50ep.pth"
439
+ },
440
+ "dab_detr/dab_detr_r50_dc5_3patterns_50ep_(converted)": {
441
+ "configs": "projects/dab_detr/configs/dab_detr_r50_dc5_3patterns_50ep.py",
442
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_detr_r101_dc5.pth"
443
+ },
444
+ "dab_detr/dab_detr_swin_t_in1k_50ep": {
445
+ "configs": "projects/dab_detr/configs/dab_detr_swin_t_in1k_50ep.py",
446
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/dab_detr_swin_t_in1k_50ep.pth"
447
+ },
448
+ "dab_detr/dab_deformable_detr_r50_50ep": {
449
+ "configs": "projects/dab_detr/configs/dab_deformable_detr_r50_50ep.py",
450
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/dab_deformable_detr_r50_50ep_49AP.pth"
451
+ },
452
+ "dab_detr/dab_deformable_detr_r50_two_stage_50ep": {
453
+ "configs": "projects/dab_detr/configs/dab_deformable_detr_r50_two_stage_50ep.py",
454
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/dab_deformable_detr_r50_two_stage_49_7AP.pth"
455
+ },
456
+ # DN-DETR
457
+ "dn_detr/dn_detr_r50_50ep": {
458
+ "configs": "projects/dn_detr/configs/dn_detr_r50_50ep.py",
459
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.0/dn_detr_r50_50ep.pth"
460
+ },
461
+ "dn_detr/dn_detr_r50_dc5_50ep": {
462
+ "configs": "projects/dn_detr/configs/dn_detr_r50_dc5_50ep.py",
463
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_dn_detr_r50_dc5.pth"
464
+ },
465
+ # DINO
466
+ "dino/dino-resnet/dino_r50_5scale_12ep": {
467
+ "configs": "projects/dino/configs/dino-resnet/dino_r50_5scale_12ep.py",
468
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_r50_5scale_12ep.pth"
469
+ },
470
+ "dino/dino-resnet/dino_r50_4scale_12ep_300dn": {
471
+ "configs": "projects/dino/configs/dino-resnet/dino_r50_4scale_12ep_300dn.py",
472
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/dino_r50_4scale_12ep_300dn.pth"
473
+ },
474
+ "dino/dino-resnet/dino_r50_4scale_24ep": {
475
+ "configs": "projects/dino/configs/dino-resnet/dino_r50_4scale_24ep.py",
476
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_r50_4scale_24ep.pth"
477
+ },
478
+ "dino/dino-resnet/dino_r101_4scale_12ep_": {
479
+ "configs": "projects/dino/configs/dino-resnet/dino_r101_4scale_12ep.py",
480
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_r101_4scale_12ep.pth"
481
+ },
482
+ # Pretrained DINO with Swin-Transformer Backbone
483
+ "dino/dino-swin/dino_swin_tiny_224_4scale_12ep": {
484
+ "configs": "projects/dino/configs/dino-swin/dino_swin_tiny_224_4scale_12ep.py",
485
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_swin_tiny_224_4scale_12ep.pth"
486
+ },
487
+ "dino/dino-swin/dino_swin_tiny_224_22kto1k_finetune_4scale_12ep": {
488
+ "configs": "projects/dino/configs/dino-swin/dino_swin_tiny_224_4scale_12ep.py",
489
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_swin_tiny_224_22kto1k_finetune_4scale_12ep.pth"
490
+ },
491
+ "dino/dino-swin/dino_swin_small_224_4scale_12ep": {
492
+ "configs": "projects/dino/configs/dino-swin/dino_swin_tiny_224_4scale_12ep.py",
493
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_swin_small_224_4scale_12ep.pth"
494
+ },
495
+ "dino/dino-swin/dino_swin_base_384_4scale_12ep": {
496
+ "configs": "projects/dino/configs/dino-swin/dino_swin_base_384_4scale_12ep.py",
497
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_swin_base_384_4scale_12ep.pth"
498
+ },
499
+ "dino/dino-swin/dino_swin_large_224_4scale_12ep": {
500
+ "configs": "projects/dino/configs/dino-swin/dino_swin_large_224_4scale_12ep.py",
501
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_swin_large_224_4scale_12ep.pth"
502
+ },
503
+ "dino/dino-swin/dino_swin_large_384_4scale_12ep": {
504
+ "configs": "projects/dino/configs/dino-swin/dino_swin_large_384_4scale_12ep.py",
505
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.1.1/dino_swin_large_4scale_12ep.pth"
506
+ },
507
+ "dino/dino-swin/dino_swin_large_384_5scale_12ep": {
508
+ "configs": "projects/dino/configs/dino-swin/dino_swin_large_384_5scale_12ep.py",
509
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_swin_large_384_5scale_12ep.pth"
510
+ },
511
+ "dino/dino-swin/dino_swin_large_384_4scale_36ep": {
512
+ "configs": "projects/dino/configs/dino-swin/dino_swin_large_384_4scale_36ep.py",
513
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/dino_swin_large_384_4scale_36ep.pth"
514
+ },
515
+ "dino/dino-swin/dino_swin_large_384_5scale_36ep": {
516
+ "configs": "projects/dino/configs/dino-swin/dino_swin_large_384_5scale_36ep.py",
517
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_swin_large_384_5scale_36ep.pth"
518
+ },
519
+ # Pretrained DINO with FocalNet Backbone
520
+ "dino/dino-swin/dino_focalnet_large_lrf_384_4scale_12ep": {
521
+ "configs": "projects/dino/configs/dino-focal/dino_focalnet_large_lrf_384_4scale_12ep.py",
522
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_focal_large_lrf_384_4scale_12ep.pth"
523
+ },
524
+ "dino/dino-swin/dino_focalnet_large_lrf_384_fl4_4scale_12ep": {
525
+ "configs": "projects/dino/configs/dino-focal/dino_focalnet_large_lrf_384_fl4_4scale_12ep.py",
526
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_focal_large_lrf_384_4scale_12ep.pth"
527
+ },
528
+ "dino/dino-swin/dino_focalnet_large_lrf_384_fl4_5scale_12ep": {
529
+ "configs": "projects/dino/configs/dino-focal/dino_focalnet_large_lrf_384_fl4_5scale_12ep.py",
530
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_focalnet_large_lrf_384_fl4_5scale_12ep.pth"
531
+ },
532
+ # Pretrained DINO with ViTDet Backbone
533
+ "dino/dino-vitdet/dino_vitdet_base_4scale_12ep": {
534
+ "configs": "projects/dino/configs/dino-vitdet/dino_vitdet_base_4scale_12ep.py",
535
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_vitdet_4scale_12ep.pth"
536
+ },
537
+ "dino/dino-vitdet/dino_vitdet_base_4scale_50ep": {
538
+ "configs": "projects/dino/configs/dino-vitdet/dino_vitdet_base_4scale_50ep.py",
539
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_vitdet_base_4scale_50ep.pth"
540
+ },
541
+ "dino/dino-vitdet/dino_vitdet_large_4scale_12ep": {
542
+ "configs": "projects/dino/configs/dino-vitdet/dino_vitdet_large_4scale_12ep.py",
543
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_vitdet_large_4scale_12ep.pth"
544
+ },
545
+ "dino/dino-vitdet/dino_vitdet_large_4scale_50ep": {
546
+ "configs": "projects/dino/configs/dino-vitdet/dino_vitdet_large_4scale_50ep.py",
547
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.1/dino_vitdet_large_4scale_50ep.pth"
548
+ },
549
+ # H-Deformable-DETR
550
+ "h_deformable_detr/h_deformable_detr_r50_two_stage_12ep": {
551
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_r50_two_stage_12ep.py",
552
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.4.0/h_deformable_detr_r50_two_stage_12ep_modified_train_net.pth"
553
+ },
554
+ "h_deformable_detr/h_deformable_detr_r50_two_stage_12ep(converted)": {
555
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_r50_two_stage_12ep.py",
556
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/r50_hybrid_branch_lambda1_group6_t1500_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_12eps.pth"
557
+ },
558
+ "h_deformable_detr/h_deformable_detr_r50_two_stage_36ep": {
559
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_r50_two_stage_36ep.py",
560
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/r50_hybrid_branch_lambda1_group6_t1500_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_36eps.pth"
561
+ },
562
+ "h_deformable_detr/h_deformable_detr_swin_tiny_two_stage_12ep": {
563
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_swin_tiny_two_stage_12ep.py",
564
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/swin_tiny_hybrid_branch_lambda1_group6_t1500_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_12eps.pth"
565
+ },
566
+ "h_deformable_detr/h_deformable_detr_swin_tiny_two_stage_36ep": {
567
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_swin_tiny_two_stage_36ep.py",
568
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/swin_tiny_hybrid_branch_lambda1_group6_t1500_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_36eps.pth"
569
+ },
570
+ "h_deformable_detr/h_deformable_detr_swin_large_two_stage_12ep": {
571
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_swin_large_two_stage_12ep.py",
572
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/swin_large_hybrid_branch_lambda1_group6_t1500_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_12eps.pth"
573
+ },
574
+ "h_deformable_detr/h_deformable_detr_swin_large_two_stage_36ep": {
575
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_swin_large_two_stage_36ep.py",
576
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/drop_path0.5_swin_large_hybrid_branch_lambda1_group6_t1500_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_36eps.pth"
577
+ },
578
+ "h_deformable_detr/h_deformable_detr_swin_large_two_stage_12ep_900queries": {
579
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_swin_large_two_stage_12ep_900queries.py",
580
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/swin_large_hybrid_branch_lambda1_group6_t1500_n900_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_12eps.pth"
581
+ },
582
+ "h_deformable_detr/h_deformable_detr_swin_large_two_stage_36ep_900queries": {
583
+ "configs": "projects/h_deformable_detr/configs/h_deformable_detr_swin_large_two_stage_36ep_900queries.py",
584
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.2.0/drop_path0.5_swin_large_hybrid_branch_lambda1_group6_t1500_n900_dp0_mqs_lft_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage_36eps.pth"
585
+ },
586
+ # DETA
587
+ "deta/improved_deformable_detr_baseline_50ep": {
588
+ "configs": "projects/deta/configs/improved_deformable_detr_baseline_50ep.py",
589
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_deta_improved_deformable_baseline.pth"
590
+ },
591
+ "deta/deta_r50_5scale_12ep_bs8": {
592
+ "configs": "projects/deta/configs/deta_r50_5scale_12ep_bs8.py",
593
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.4.0/deta_r50_5scale_12ep_bs8.pth"
594
+ },
595
+ "deta/deta_r50_5scale_12ep": {
596
+ "configs": "projects/deta/configs/deta_r50_5scale_12ep.py",
597
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.4.0/deta_r50_5scale_12ep_hacked_trainer.pth"
598
+ },
599
+ "deta/deta_r50_5scale_no_frozen_backbone": {
600
+ "configs": "projects/deta/configs/deta_r50_5scale_no_frozen_backbone.py",
601
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.4.0/deta_r50_5scale_12ep_no_freeze_backbone.pth"
602
+ },
603
+ "deta/deta_r50_5scale_12ep(converted)": {
604
+ "configs": "projects/deta/configs/deta_r50_5scale_12ep.py",
605
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_deta_r50_5scale_12ep.pth"
606
+ },
607
+ "deta/DETA-Swin-Large-finetune (converted)": {
608
+ "configs": "projects/deta/configs/deta_r50_5scale_12ep.py",
609
+ "ckpts": "https://github.com/IDEA-Research/detrex-storage/releases/download/v0.3.0/converted_deta_swin_o365_finetune.pth"
610
+ },
611
+ }
612
+
613
+
614
+ def setup(args):
615
+ cfg = LazyConfig.load(args.config_file)
616
+ cfg = LazyConfig.apply_overrides(cfg, args.opts)
617
+ return cfg
618
+
619
+
620
+ def get_parser():
621
+ parser = argparse.ArgumentParser(description="detrex demo for visualizing customized inputs")
622
+ parser.add_argument(
623
+ "--config-file",
624
+ default="projects/dino/configs/dino_r50_4scale_12ep.py",
625
+ metavar="FILE",
626
+ help="path to config file",
627
+ )
628
+ parser.add_argument("--webcam", action="store_true", help="Take inputs from webcam.")
629
+ parser.add_argument("--video-input", help="Path to video file.")
630
+ parser.add_argument(
631
+ "--input",
632
+ nargs="+",
633
+ help="A list of space separated input images; "
634
+ "or a single glob pattern such as 'directory/*.jpg'",
635
+ )
636
+ parser.add_argument(
637
+ "--output",
638
+ help="A file or directory to save output visualizations. "
639
+ "If not given, will show output in an OpenCV window.",
640
+ )
641
+ parser.add_argument(
642
+ "--min_size_test",
643
+ type=int,
644
+ default=800,
645
+ help="Size of the smallest side of the image during testing. Set to zero to disable resize in testing.",
646
+ )
647
+ parser.add_argument(
648
+ "--max_size_test",
649
+ type=float,
650
+ default=1333,
651
+ help="Maximum size of the side of the image during testing.",
652
+ )
653
+ parser.add_argument(
654
+ "--img_format",
655
+ type=str,
656
+ default="RGB",
657
+ help="The format of the loading images.",
658
+ )
659
+ parser.add_argument(
660
+ "--metadata_dataset",
661
+ type=str,
662
+ default="coco_2017_val",
663
+ help="The metadata infomation to be used. Default to COCO val metadata.",
664
+ )
665
+ parser.add_argument(
666
+ "--confidence-threshold",
667
+ type=float,
668
+ default=0.5,
669
+ help="Minimum score for instance predictions to be shown",
670
+ )
671
+ parser.add_argument(
672
+ "--opts",
673
+ help="Modify config options using the command-line",
674
+ default=None,
675
+ nargs=argparse.REMAINDER,
676
+ )
677
+ return parser
678
+
679
+
680
+ def test_opencv_video_format(codec, file_ext):
681
+ with tempfile.TemporaryDirectory(prefix="video_format_test") as dir:
682
+ filename = os.path.join(dir, "test_file" + file_ext)
683
+ writer = cv2.VideoWriter(
684
+ filename=filename,
685
+ fourcc=cv2.VideoWriter_fourcc(*codec),
686
+ fps=float(30),
687
+ frameSize=(10, 10),
688
+ isColor=True,
689
+ )
690
+ [writer.write(np.zeros((10, 10, 3), np.uint8)) for _ in range(30)]
691
+ writer.release()
692
+ if os.path.isfile(filename):
693
+ return True
694
+ return False
695
+
696
+
697
+ def download_ckpts_and_image(ckpts):
698
+ print("ckpts:", ckpts)
699
+ torch.hub.download_url_to_file(ckpts, "dino_deitsmall16_pretrain.pth")
700
+
701
+ def run_detection(input_file, output_file, model_name, input_confidence, device):
702
+
703
+ configs = detrex_model_list[model_name]["configs"]
704
+ ckpts = detrex_model_list[model_name]["ckpts"]
705
+
706
+ mp.set_start_method("spawn", force=True)
707
+ args = get_parser().parse_args([
708
+ "--config-file", configs,
709
+ "--input", input_file,
710
+ "--output", output_file,
711
+ "--confidence-threshold", str(input_confidence),
712
+ "--opts", "train.init_checkpoint=" + ckpts
713
+ ])
714
+ setup_logger(name="fvcore")
715
+ logger = setup_logger()
716
+ logger.info("Arguments: " + str(args))
717
+
718
+ cfg = setup(args)
719
+ cfg.model.device = device
720
+ cfg.train.device = device
721
+ model = instantiate(cfg.model)
722
+ model.to(cfg.train.device)
723
+ checkpointer = DetectionCheckpointer(model)
724
+ checkpointer.load(cfg.train.init_checkpoint)
725
+
726
+ model.eval()
727
+
728
+ demo = VisualizationDemo(
729
+ model=model,
730
+ min_size_test=args.min_size_test,
731
+ max_size_test=args.max_size_test,
732
+ img_format=args.img_format,
733
+ metadata_dataset=args.metadata_dataset,
734
+ )
735
+
736
+ if args.input:
737
+ if len(args.input) == 1:
738
+ args.input = glob.glob(os.path.expanduser(args.input[0]))
739
+ assert args.input, "The input path(s) was not found"
740
+ for path in tqdm.tqdm(args.input, disable=not args.output):
741
+ # use PIL, to be consistent with evaluation
742
+ img = read_image(path, format="BGR")
743
+ start_time = time.time()
744
+ predictions, visualized_output = demo.run_on_image(img, args.confidence_threshold)
745
+ logger.info(
746
+ "{}: {} in {:.2f}s".format(
747
+ path,
748
+ "detected {} instances".format(len(predictions["instances"]))
749
+ if "instances" in predictions
750
+ else "finished",
751
+ time.time() - start_time,
752
+ )
753
+ )
754
+
755
+ if args.output:
756
+ if os.path.isdir(args.output):
757
+ assert os.path.isdir(args.output), args.output
758
+ out_filename = os.path.join(args.output, os.path.basename(path))
759
+ else:
760
+ assert len(args.input) == 1, "Please specify a directory with args.output"
761
+ out_filename = args.output
762
+ visualized_output.save(out_filename)
763
+
764
+ def download_test_img():
765
+ import shutil
766
+ torch.hub.download_url_to_file(
767
+ 'https://github.com/isLinXu/issues/files/12658779/projects.zip',
768
+ 'projects.zip')
769
+ # Images
770
+ torch.hub.download_url_to_file(
771
+ 'https://user-images.githubusercontent.com/59380685/268517006-d8d4d3b3-964a-4f4d-8458-18c7eb75a4f2.jpg',
772
+ '000000502136.jpg')
773
+ shutil.unpack_archive('projects.zip', './', 'zip')
774
+
775
+ def detect_image(input_image, model_name, input_confidence, device):
776
+ input_dir = "input.jpg"
777
+ input_image.save(input_dir)
778
+ output_image = "output.jpg"
779
+ run_detection(input_dir, output_image, model_name, input_confidence, device)
780
+ return output_image
781
+
782
+
783
+ if __name__ == '__main__':
784
+ input_image = gr.inputs.Image(type='pil', label="Input Image")
785
+ input_model_name = gr.inputs.Dropdown(list(detrex_model_list.keys()), label="Model Name", default="dab_detr/dab_detr_r50_50ep")
786
+ input_confidence = gr.inputs.Slider(minimum=0.0, maximum=1.0, step=0.01, default=0.25, label="Confidence Threshold")
787
+ input_device = gr.inputs.Radio(["cpu", "cuda"], label="Device", default="cpu")
788
+ output_image = gr.outputs.Image(type='pil', label="Output Image")
789
+ download_test_img()
790
+ examples = [["000000502136.jpg", "dab_detr/dab_detr_r50_50ep", 0.25, "cpu"]]
791
+ title = "🦖detrex: Benchmarking Detection Transformers web demo"
792
+ description = "<div align='center'><img src='https://raw.githubusercontent.com/IDEA-Research/detrex/main/assets/logo_2.png' width='250''/><div>" \
793
+ "<p style='text-align: center'><a href='https://github.com/IDEA-Research/detrex'>detrex</a> detrex detrex 是一个开源工具箱,提供最先进的基于 Transformer 的检测算法。它建立在Detectron2之上,其模块设计部分借鉴了MMDetection和DETR。非常感谢他们组织良好的代码。主分支适用于Pytorch 1.10+或更高版本(我们推荐Pytorch 1.12)。" \
794
+ "detrex is a research platform for DETR-based object detection, segmentation, pose estimation and other visual recognition tasks.</p>"
795
+ article = "<p style='text-align: center'><a href='https://github.com/IDEA-Research/detrex'>detrex</a></p>" \
796
+ "<p style='text-align: center'><a href='https://github.com/isLinXu'>gradio build by gatilin</a></a></p>"
797
+
798
+ image_interface = gr.Interface(detect_image,
799
+ inputs=[input_image, input_model_name, input_confidence, input_device],
800
+ outputs=output_image,examples=examples,
801
+ title=title, article=article, description=description)
802
+ image_interface.launch()
requirements.txt ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ git+https://github.com/facebookresearch/[email protected]#egg=detectron2
2
+ ultralytics~=8.0.169
3
+ wget~=3.2
4
+ opencv-python~=4.6.0.66
5
+ numpy~=1.23.0
6
+ pillow~=9.4.0
7
+ gradio~=3.42.0
8
+ pyyaml~=6.0
9
+ wandb~=0.13.11
10
+ tqdm~=4.65.0
11
+ matplotlib~=3.7.1
12
+ pandas~=2.0.0
13
+ seaborn~=0.12.2
14
+ requests~=2.31.0
15
+ psutil~=5.9.4
16
+ thop~=0.1.1-2209072238
17
+ timm~=0.9.2
18
+ super-gradients~=3.2.0
19
+ openmim