birder 0.4.1__py3-none-any.whl → 0.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. birder/common/training_cli.py +6 -1
  2. birder/common/training_utils.py +69 -12
  3. birder/net/_vit_configs.py +5 -0
  4. birder/net/cait.py +3 -3
  5. birder/net/coat.py +3 -3
  6. birder/net/deit.py +1 -1
  7. birder/net/deit3.py +1 -1
  8. birder/net/detection/__init__.py +2 -0
  9. birder/net/detection/deformable_detr.py +12 -12
  10. birder/net/detection/detr.py +7 -7
  11. birder/net/detection/lw_detr.py +1181 -0
  12. birder/net/detection/plain_detr.py +7 -5
  13. birder/net/detection/retinanet.py +1 -1
  14. birder/net/detection/rt_detr_v1.py +10 -10
  15. birder/net/detection/rt_detr_v2.py +47 -64
  16. birder/net/detection/ssdlite.py +2 -2
  17. birder/net/edgevit.py +3 -3
  18. birder/net/efficientvit_msft.py +1 -1
  19. birder/net/flexivit.py +1 -1
  20. birder/net/hieradet.py +2 -2
  21. birder/net/mnasnet.py +2 -2
  22. birder/net/resnext.py +2 -2
  23. birder/net/rope_deit3.py +1 -1
  24. birder/net/rope_flexivit.py +1 -1
  25. birder/net/rope_vit.py +1 -1
  26. birder/net/simple_vit.py +1 -1
  27. birder/net/vit.py +21 -3
  28. birder/net/vit_parallel.py +1 -1
  29. birder/net/vit_sam.py +62 -16
  30. birder/scripts/train.py +12 -8
  31. birder/scripts/train_capi.py +13 -10
  32. birder/scripts/train_detection.py +2 -1
  33. birder/scripts/train_kd.py +12 -8
  34. birder/version.py +1 -1
  35. {birder-0.4.1.dist-info → birder-0.4.2.dist-info}/METADATA +3 -3
  36. {birder-0.4.1.dist-info → birder-0.4.2.dist-info}/RECORD +40 -39
  37. {birder-0.4.1.dist-info → birder-0.4.2.dist-info}/WHEEL +1 -1
  38. {birder-0.4.1.dist-info → birder-0.4.2.dist-info}/entry_points.txt +0 -0
  39. {birder-0.4.1.dist-info → birder-0.4.2.dist-info}/licenses/LICENSE +0 -0
  40. {birder-0.4.1.dist-info → birder-0.4.2.dist-info}/top_level.txt +0 -0
birder/net/vit_sam.py CHANGED
@@ -29,7 +29,9 @@ from birder.net._vit_configs import BASE
29
29
  from birder.net._vit_configs import HUGE
30
30
  from birder.net._vit_configs import LARGE
31
31
  from birder.net._vit_configs import MEDIUM
32
+ from birder.net._vit_configs import SMALL
32
33
  from birder.net.base import DetectorBackbone
34
+ from birder.net.base import normalize_out_indices
33
35
  from birder.net.vit import EncoderBlock as MAEDecoderBlock
34
36
 
35
37
 
@@ -72,7 +74,7 @@ def get_rel_pos(q_size: int, k_size: int, rel_pos: torch.Tensor) -> torch.Tensor
72
74
 
73
75
  # Interpolate rel pos if needed
74
76
  if rel_pos.shape[0] != max_rel_dist:
75
- # Adjust size is a one off interpolation, should prevent us from getting here
77
+ # Only reached in dynamic-size mode (rel-pos table resized on the fly)
76
78
  rel_pos_resized = F.interpolate(
77
79
  rel_pos.reshape(1, rel_pos.shape[0], -1).permute(0, 2, 1), size=max_rel_dist, mode="linear"
78
80
  )
@@ -242,6 +244,7 @@ class EncoderBlock(nn.Module):
242
244
  class ViT_SAM(DetectorBackbone):
243
245
  block_group_regex = r"body\.(\d+)"
244
246
 
247
+ # pylint: disable=too-many-locals
245
248
  def __init__(
246
249
  self,
247
250
  input_channels: int,
@@ -266,6 +269,7 @@ class ViT_SAM(DetectorBackbone):
266
269
  window_size: int = self.config["window_size"]
267
270
  global_attn_indexes: list[int] = self.config["global_attn_indexes"]
268
271
  neck_channels: Optional[int] = self.config.get("neck_channels", None)
272
+ out_indices: Optional[list[int]] = self.config.get("out_indices", None)
269
273
  drop_path_rate: float = self.config["drop_path_rate"]
270
274
 
271
275
  if norm_layer_type == "LayerNorm":
@@ -292,6 +296,7 @@ class ViT_SAM(DetectorBackbone):
292
296
  self.hidden_dim = hidden_dim
293
297
  self.global_attn_indexes = global_attn_indexes
294
298
  self.num_special_tokens = 0
299
+ self.out_indices = normalize_out_indices(out_indices, num_layers)
295
300
  dpr = [x.item() for x in torch.linspace(0, drop_path_rate, num_layers)] # Stochastic depth decay rule
296
301
 
297
302
  self.patch_embed = PatchEmbed(
@@ -356,8 +361,10 @@ class ViT_SAM(DetectorBackbone):
356
361
  nn.Flatten(1),
357
362
  )
358
363
 
359
- self.return_stages = ["neck"] # Actually meaningless, but for completeness
360
- self.return_channels = [neck_channels]
364
+ num_return_stages = len(self.out_indices) if self.out_indices is not None else 1
365
+ self.return_stages = [f"stage{stage_idx + 1}" for stage_idx in range(num_return_stages)]
366
+ self.return_channels = [hidden_dim] * num_return_stages
367
+ self.return_channels[-1] = neck_channels
361
368
  self.embedding_size = neck_channels
362
369
  self.classifier = self.create_classifier()
363
370
 
@@ -372,13 +379,54 @@ class ViT_SAM(DetectorBackbone):
372
379
  activation_layer=nn.GELU,
373
380
  )
374
381
 
382
+ def _get_pos_embed(self, H: int, W: int) -> torch.Tensor:
383
+ if self.dynamic_size is False:
384
+ return self.pos_embedding
385
+
386
+ if H == self.size[0] and W == self.size[1]:
387
+ return self.pos_embedding
388
+
389
+ base_h = H // self.patch_size
390
+ base_w = W // self.patch_size
391
+ orig_dtype = self.pos_embedding.dtype
392
+ pos_embedding = self.pos_embedding.float()
393
+ pos_embedding = pos_embedding.permute(0, 3, 1, 2)
394
+ pos_embedding = F.interpolate(pos_embedding, size=(base_h, base_w), mode="bicubic", antialias=True)
395
+ pos_embedding = pos_embedding.permute(0, 2, 3, 1)
396
+
397
+ return pos_embedding.to(orig_dtype)
398
+
399
+ def set_causal_attention(self, is_causal: bool = True) -> None:
400
+ for b in self.body:
401
+ b.set_causal_attention(is_causal)
402
+
375
403
  def detection_features(self, x: torch.Tensor) -> dict[str, torch.Tensor]:
404
+ H, W = x.shape[-2:]
376
405
  x = self.patch_embed(x)
377
- x = x + self.pos_embedding
406
+ x = x + self._get_pos_embed(H, W)
378
407
 
379
- x = self.body(x)
380
- x = self.neck(x.permute(0, 3, 1, 2))
381
- return {self.return_stages[0]: x}
408
+ if self.out_indices is None:
409
+ x = self.body(x)
410
+ x = self.neck(x.permute(0, 3, 1, 2))
411
+ return {self.return_stages[0]: x}
412
+
413
+ out_indices_set = set(self.out_indices)
414
+ last_out_idx = max(out_indices_set)
415
+ out: dict[str, torch.Tensor] = {}
416
+ stage_idx = 0
417
+ for idx, blk in enumerate(self.body):
418
+ x = blk(x)
419
+ if idx not in out_indices_set:
420
+ continue
421
+
422
+ stage_x = x.permute(0, 3, 1, 2)
423
+ if idx == last_out_idx:
424
+ stage_x = self.neck(stage_x)
425
+
426
+ out[self.return_stages[stage_idx]] = stage_x
427
+ stage_idx += 1
428
+
429
+ return out
382
430
 
383
431
  def freeze_stages(self, up_to_stage: int) -> None:
384
432
  for param in self.patch_embed.parameters():
@@ -393,13 +441,10 @@ class ViT_SAM(DetectorBackbone):
393
441
  for param in module.parameters():
394
442
  param.requires_grad_(False)
395
443
 
396
- def set_causal_attention(self, is_causal: bool = True) -> None:
397
- for b in self.body:
398
- b.set_causal_attention(is_causal)
399
-
400
444
  def forward_features(self, x: torch.Tensor) -> torch.Tensor:
445
+ H, W = x.shape[-2:]
401
446
  x = self.patch_embed(x)
402
- x = x + self.pos_embedding
447
+ x = x + self._get_pos_embed(H, W)
403
448
 
404
449
  x = self.body(x)
405
450
  x = self.neck(x.permute(0, 3, 1, 2))
@@ -410,9 +455,6 @@ class ViT_SAM(DetectorBackbone):
410
455
  x = self.forward_features(x)
411
456
  return self.features(x)
412
457
 
413
- def set_dynamic_size(self, dynamic_size: bool = True) -> None:
414
- assert dynamic_size is False, "Dynamic size not supported for this network"
415
-
416
458
  def adjust_size(self, new_size: tuple[int, int]) -> None:
417
459
  if new_size == self.size:
418
460
  return
@@ -530,6 +572,11 @@ class ViT_SAM(DetectorBackbone):
530
572
 
531
573
 
532
574
  # ViTDet (no neck)
575
+ registry.register_model_config(
576
+ "vit_det_s16",
577
+ ViT_SAM,
578
+ config={"patch_size": 16, **SMALL, "window_size": 14, "global_attn_indexes": [2, 5, 8, 11]},
579
+ )
533
580
  registry.register_model_config(
534
581
  "vit_det_m16_rms",
535
582
  ViT_SAM,
@@ -541,7 +588,6 @@ registry.register_model_config(
541
588
  "global_attn_indexes": [2, 5, 8, 11],
542
589
  },
543
590
  )
544
-
545
591
  registry.register_model_config(
546
592
  "vit_det_b16",
547
593
  ViT_SAM,
birder/scripts/train.py CHANGED
@@ -581,10 +581,12 @@ def train(args: argparse.Namespace) -> None:
581
581
  if targets.ndim == 2:
582
582
  targets = targets.argmax(dim=1)
583
583
 
584
- train_accuracy.update(training_utils.accuracy(targets, outputs.detach()))
585
- if train_topk is not None:
586
- topk_val = training_utils.topk_accuracy(targets, outputs.detach(), topk=(top_k,))[0]
587
- train_topk.update(topk_val)
584
+ if train_topk is None:
585
+ train_accuracy.update(training_utils.accuracy(targets, outputs.detach()))
586
+ else:
587
+ topk_values = training_utils.topk_accuracy(targets, outputs.detach(), topk=(1, top_k))
588
+ train_accuracy.update(topk_values[0])
589
+ train_topk.update(topk_values[1])
588
590
 
589
591
  # Write statistics
590
592
  if (i % args.log_interval == 0 and i > 0) or i == last_batch_idx:
@@ -682,10 +684,12 @@ def train(args: argparse.Namespace) -> None:
682
684
 
683
685
  # Statistics
684
686
  running_val_loss.update(val_loss.detach())
685
- val_accuracy.update(training_utils.accuracy(targets, outputs), n=outputs.size(0))
686
- if val_topk is not None:
687
- topk_val = training_utils.topk_accuracy(targets, outputs, topk=(top_k,))[0]
688
- val_topk.update(topk_val, n=outputs.size(0))
687
+ if val_topk is None:
688
+ val_accuracy.update(training_utils.accuracy(targets, outputs), n=outputs.size(0))
689
+ else:
690
+ topk_values = training_utils.topk_accuracy(targets, outputs, topk=(1, top_k))
691
+ val_accuracy.update(topk_values[0], n=outputs.size(0))
692
+ val_topk.update(topk_values[1], n=outputs.size(0))
689
693
 
690
694
  # Update progress bar
691
695
  progress.update(n=batch_size * args.world_size)
@@ -63,15 +63,21 @@ logger = logging.getLogger(__name__)
63
63
 
64
64
 
65
65
  class TrainCollator:
66
- def __init__(self, mask_generator: Callable[[int], tuple[list[torch.Tensor], list[torch.Tensor]]]) -> None:
66
+ def __init__(
67
+ self, mask_generator: Callable[[int], tuple[list[torch.Tensor], list[torch.Tensor]]], n_predict: int
68
+ ) -> None:
67
69
  self.mask_generator = mask_generator
70
+ self.n_predict = n_predict
68
71
 
69
- def __call__(self, batch: Any) -> tuple[torch.Tensor, torch.Tensor]:
72
+ def __call__(self, batch: Any) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]:
70
73
  B = len(batch)
71
74
  collated_batch = torch.utils.data.default_collate(batch)
72
75
  masks = self.mask_generator(B)
73
76
 
74
- return (collated_batch, masks)
77
+ ids_keep = masking.get_ids_keep(masks)
78
+ predict_indices = masking.get_random_masked_indices(masks, self.n_predict)
79
+
80
+ return (collated_batch, ids_keep, predict_indices)
75
81
 
76
82
 
77
83
  # pylint: disable=too-many-locals,too-many-branches,too-many-statements
@@ -183,7 +189,7 @@ def train(args: argparse.Namespace) -> None:
183
189
  )
184
190
  n_masked = int(seq_len * args.mask_ratio)
185
191
  n_predict = int(n_masked * args.kept_mask_ratio)
186
- mask_collator = TrainCollator(mask_generator)
192
+ mask_collator = TrainCollator(mask_generator, n_predict)
187
193
  training_transform = training_utils.get_training_transform(args)
188
194
  if args.use_fake_data is True:
189
195
  logger.warning("Using fake data")
@@ -491,17 +497,14 @@ def train(args: argparse.Namespace) -> None:
491
497
  else:
492
498
  batch_iter = enumerate(training_loader)
493
499
 
494
- for i, ((_, images, _), masks) in batch_iter:
500
+ for i, ((_, images, _), ids_keep, predict_indices) in batch_iter:
495
501
  global_iter = ((epoch - 1) * epoch_num_batches) + i
496
502
  images = images.to(device, dtype=model_dtype, non_blocking=True)
497
- masks = masks.to(device, dtype=model_dtype, non_blocking=True)
503
+ ids_keep = ids_keep.to(device, non_blocking=True)
504
+ predict_indices = predict_indices.to(device, non_blocking=True)
498
505
 
499
506
  optimizer_update = (i == last_batch_idx) or ((i + 1) % grad_accum_steps == 0)
500
507
 
501
- # Mask handling
502
- ids_keep = masking.get_ids_keep(masks)
503
- predict_indices = masking.get_random_masked_indices(masks, n_predict)
504
-
505
508
  # Forward, backward and optimize
506
509
  with torch.amp.autocast("cuda", enabled=args.amp, dtype=amp_dtype):
507
510
  selected_assignments, clustering_loss = teacher(images, None, predict_indices)
@@ -373,6 +373,7 @@ def train(args: argparse.Namespace) -> None:
373
373
  custom_keys_weight_decay=custom_keys_weight_decay,
374
374
  custom_layer_weight_decay=args.custom_layer_wd,
375
375
  layer_decay=args.layer_decay,
376
+ backbone_layer_decay=args.backbone_layer_decay,
376
377
  layer_decay_min_scale=args.layer_decay_min_scale,
377
378
  layer_decay_no_opt_scale=args.layer_decay_no_opt_scale,
378
379
  bias_lr=args.bias_lr,
@@ -948,7 +949,7 @@ def get_args_parser() -> argparse.ArgumentParser:
948
949
  help="treat all objects as a single class (binary detection: object vs background)",
949
950
  )
950
951
  training_cli.add_optimization_args(parser, default_batch_size=16)
951
- training_cli.add_lr_wd_args(parser, backbone_lr=True)
952
+ training_cli.add_lr_wd_args(parser, backbone_lr=True, backbone_layer_decay=True)
952
953
  training_cli.add_lr_scheduler_args(parser)
953
954
  training_cli.add_training_schedule_args(parser)
954
955
  training_cli.add_ema_args(parser, default_ema_steps=1, default_ema_decay=0.9998)
@@ -708,10 +708,12 @@ def train(args: argparse.Namespace) -> None:
708
708
  if targets.ndim == 2:
709
709
  targets = targets.argmax(dim=1)
710
710
 
711
- train_accuracy.update(training_utils.accuracy(targets, outputs.detach()))
712
- if train_topk is not None:
713
- topk_val = training_utils.topk_accuracy(targets, outputs.detach(), topk=(top_k,))[0]
714
- train_topk.update(topk_val)
711
+ if train_topk is None:
712
+ train_accuracy.update(training_utils.accuracy(targets, outputs.detach()))
713
+ else:
714
+ topk_values = training_utils.topk_accuracy(targets, outputs.detach(), topk=(1, top_k))
715
+ train_accuracy.update(topk_values[0])
716
+ train_topk.update(topk_values[1])
715
717
 
716
718
  # Write statistics
717
719
  if (i % args.log_interval == 0 and i > 0) or i == last_batch_idx:
@@ -804,10 +806,12 @@ def train(args: argparse.Namespace) -> None:
804
806
 
805
807
  # Statistics
806
808
  running_val_loss.update(val_loss.detach())
807
- val_accuracy.update(training_utils.accuracy(targets, outputs), n=outputs.size(0))
808
- if val_topk is not None:
809
- topk_val = training_utils.topk_accuracy(targets, outputs, topk=(top_k,))[0]
810
- val_topk.update(topk_val, n=outputs.size(0))
809
+ if val_topk is None:
810
+ val_accuracy.update(training_utils.accuracy(targets, outputs), n=outputs.size(0))
811
+ else:
812
+ topk_values = training_utils.topk_accuracy(targets, outputs, topk=(1, top_k))
813
+ val_accuracy.update(topk_values[0], n=outputs.size(0))
814
+ val_topk.update(topk_values[1], n=outputs.size(0))
811
815
 
812
816
  # Update progress bar
813
817
  progress.update(n=batch_size * args.world_size)
birder/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "v0.4.1"
1
+ __version__ = "v0.4.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: birder
3
- Version: 0.4.1
3
+ Version: 0.4.2
4
4
  Summary: An open-source computer vision framework for wildlife image analysis, featuring state-of-the-art models for species classification and detection.
5
5
  Author: Ofer Hasson
6
6
  License-Expression: Apache-2.0
@@ -26,7 +26,7 @@ License-File: LICENSE
26
26
  Requires-Dist: matplotlib>=3.9.0
27
27
  Requires-Dist: numpy>=2.2.0
28
28
  Requires-Dist: onnx>=1.18.0
29
- Requires-Dist: onnxscript~=0.5.7
29
+ Requires-Dist: onnxscript~=0.6.0
30
30
  Requires-Dist: Pillow>=12.0.0
31
31
  Requires-Dist: polars>=1.31.0
32
32
  Requires-Dist: pyarrow>=20.0.0
@@ -48,7 +48,7 @@ Requires-Dist: black~=26.1.0; extra == "dev"
48
48
  Requires-Dist: build~=1.4.0; extra == "dev"
49
49
  Requires-Dist: bumpver~=2025.1131; extra == "dev"
50
50
  Requires-Dist: captum~=0.7.0; extra == "dev"
51
- Requires-Dist: coverage~=7.13.1; extra == "dev"
51
+ Requires-Dist: coverage~=7.13.2; extra == "dev"
52
52
  Requires-Dist: debugpy; extra == "dev"
53
53
  Requires-Dist: flake8-pep585~=0.1.7; extra == "dev"
54
54
  Requires-Dist: flake8~=7.3.0; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  birder/__init__.py,sha256=qmAq9DNEsHDtvTTXJhp8Vzfrtc6ZR_TUjwjeyDW6VWc,869
2
2
  birder/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- birder/version.py,sha256=FyV6PQkiLDhwnTdAyvL5lOoA5FjP-pfJYkkmQC-1g6A,23
3
+ birder/version.py,sha256=wir5g_QJ8Sj0VUgLyN6W--ATekZrCeDUAMMxqByjCgk,23
4
4
  birder/adversarial/__init__.py,sha256=PBdshTpEvO-aYZtD9kjkOF7Zor5t-P2V0wBwPhFr8_o,308
5
5
  birder/adversarial/base.py,sha256=CjUftBQjZTjDP-DW-Hgv5a81qOMPvf4V-pn0ZTsvwJU,3170
6
6
  birder/adversarial/deepfool.py,sha256=Om7C2OFk_uF7QcO4AO0pgjId-N0mIsU9HitpiWxk45o,6305
@@ -12,8 +12,8 @@ birder/common/cli.py,sha256=lOkAnp0L2YA8hAQk0orjluOHxEEK-CDJoRpeFKdyvWI,5427
12
12
  birder/common/fs_ops.py,sha256=Jshd7UdUSmQ7EJUaFm3ThlOKuSROm0qNC6Elt-DRc1Y,43410
13
13
  birder/common/lib.py,sha256=5w2YnQSvV-6b_k3j8U7XnY-_YzgTVEXkGGDg84mg6TQ,5907
14
14
  birder/common/masking.py,sha256=lsW1s5zm89A4LCQoVtq_7zc6Kg0A4j629wXnvpG12hs,14060
15
- birder/common/training_cli.py,sha256=rJEDAlu1q0OG1IyxdNvlN7PTtXy6NvXpzTcQjE1Qoxk,31850
16
- birder/common/training_utils.py,sha256=8TCG4fiwzLBzcMcGe7IhgezqSun0AaL9HswE1A6I3VY,50065
15
+ birder/common/training_cli.py,sha256=REv_U3FUqgRVl9f5y1ghqTwCt3DGjyzfRGIVkCo3ZPk,32050
16
+ birder/common/training_utils.py,sha256=3c3HP47WlQ9Oiq6rsgLrs6NqCfbgwSaFC69e6eqs-6U,53261
17
17
  birder/conf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  birder/conf/settings.py,sha256=tfrE4mo_gGqtIfXm243tOZy69goYK5KA-VSBMhmw_WQ,1996
19
19
  birder/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -76,13 +76,13 @@ birder/model_registry/manifest.py,sha256=6gKayTBmnBm45fDTXTxZMmXnowS7VNaHq3fZSFq
76
76
  birder/model_registry/model_registry.py,sha256=myzRE4NMHqsVkokUO17FacJadHKKGxgjVIzFYAwqilk,9815
77
77
  birder/net/__init__.py,sha256=s2hWVFw_NcGHsvdsvqphtMkEzSGBgr1tSXPurAU0Zlw,6804
78
78
  birder/net/_rope_vit_configs.py,sha256=-mXwIwYTXAE0Umndjn1m4rdvaAGI9sq1Yh7tKF1kDn8,14018
79
- birder/net/_vit_configs.py,sha256=2dL7gj8pS9v2SXoEeR_1dlVPu4x5ZPQOUmoU6-718XA,14501
79
+ birder/net/_vit_configs.py,sha256=6so9JKLDbec-kFZknNoNJ16pXqii2XkfflRykDgE0Ro,14663
80
80
  birder/net/alexnet.py,sha256=y1_KOnJyJWCQURin5DMu4wdJo3XGSzllBDwaariOW_c,2227
81
81
  birder/net/base.py,sha256=oUTtsg2T6P2gQq2JR8pp9AXImS1TlPCqIMmuSr8o66U,11234
82
82
  birder/net/biformer.py,sha256=ZGUGGGoZRSGAb7LwZ4VYyGPYJR1jkKGMnLEJVt29LUc,18978
83
- birder/net/cait.py,sha256=YABUTUROx3GkOMYBXeFgG83DgOgVw_WaoppLxarZqik,11289
83
+ birder/net/cait.py,sha256=7K1y8R16Y61DWic8YygCA0Fv10G6EDEtnNik2LWKdJ8,11268
84
84
  birder/net/cas_vit.py,sha256=BWewoedWGU_Hdp5mSqX1Zu3e_fNvbzPeKw8C8llT4eU,12165
85
- birder/net/coat.py,sha256=iQleCPw2XVtQR9rYx83hW6aBDyO-xf1MTkwW5SNAGUw,25302
85
+ birder/net/coat.py,sha256=allIZJ6ggYETYgzgbTuIXRB9VcI1tiIlgjjKHIE2PxY,25281
86
86
  birder/net/conv2former.py,sha256=2JBlsH6qy4Zj0wYyemSdXW1nBCd_nFQqiLLfOK1kJLo,10129
87
87
  birder/net/convmixer.py,sha256=2y3yDj5OGZGEBVF5Mgm9GuVab9BptHJX5M-8C0a-1nc,3515
88
88
  birder/net/convnext_v1.py,sha256=4b1FV3KoX2xV4kd_VW0AiYzh4kAqGcxkoNEwaZQZZ2Q,9247
@@ -94,12 +94,12 @@ birder/net/cspnet.py,sha256=0i3UO6f8PQlzBen0BJfdf1vhT2VjIvVrfRbZmUn6O7M,15465
94
94
  birder/net/cswin_transformer.py,sha256=nNf6C94Gxr_Hu0w1_W9paWkMfW1K2YfOCPtsxxSEasA,15152
95
95
  birder/net/darknet.py,sha256=oYbDi_HemdOzmwhLHKSQefEQ7fJmAdcoHqD2Rs1SAN8,4354
96
96
  birder/net/davit.py,sha256=qurj-baUX_oahKk0lQUhRIFU3EbpMGJEdaPIpivgwVg,16079
97
- birder/net/deit.py,sha256=9dN9rsQDxdCg59MtqhParXR_dmiR4ZBn5y-GSDxSb9I,10618
98
- birder/net/deit3.py,sha256=VwG4pHCskQoea5sTZMNVJ4pfx24mydnY8MylmdYA84w,18496
97
+ birder/net/deit.py,sha256=bxl4A4J28ThuUrfBmOZothJiAh73Py3CtWVPplYIZcs,10631
98
+ birder/net/deit3.py,sha256=WQk76_5dOrkz0wr-pC3a4Dy-x-2EYQ5E7YAOTUNqB48,18509
99
99
  birder/net/densenet.py,sha256=9hSloWLMZiaZtrithIEiSg_EfOtOLQPHbBctVSW6pBY,5972
100
100
  birder/net/dpn.py,sha256=OCIYOS30USJk-7L9geHD4kKQWS1stWXgh4atoX8KmDw,6685
101
101
  birder/net/edgenext.py,sha256=tEV3UkNOSSBmB_oE7x97EOWCvS_llwvPKG52p0Wkyr4,13799
102
- birder/net/edgevit.py,sha256=mduKFcvqT0WVJV6VHSxG2Rme5kTtPqJ6uH-RB5kDnQU,13138
102
+ birder/net/edgevit.py,sha256=aaT5o6BL6bo5O8E_cCkMrqwSJ5eOQSaN1YGtiuz2QLo,13117
103
103
  birder/net/efficientformer_v1.py,sha256=Ya37V2DRIugYR8tVYPyxI0P2JWnHVmlZGExQiabMPd8,14291
104
104
  birder/net/efficientformer_v2.py,sha256=Z4qKYyFCE4IxIVOfEgyFSrP-4lKTV8EulAUeBdP_dUo,24881
105
105
  birder/net/efficientnet_lite.py,sha256=v6vTuG7p1Jit6fFfhieigxG_006V5zwpkDgf8oSpCF0,10991
@@ -107,10 +107,10 @@ birder/net/efficientnet_v1.py,sha256=xnmA0xJdE_1SCtHIeI3Y6Pb8qUmuVCmyWuN-bAg4LB0
107
107
  birder/net/efficientnet_v2.py,sha256=GTnWN5OVTT7HfNLAR2bSpeQ-tRb_GiMkyIFlkobOPYQ,13538
108
108
  birder/net/efficientvim.py,sha256=VlH6CHl3lz6JnwQidbLgzvsbIvwjmqT-VfQmVfFifXE,16858
109
109
  birder/net/efficientvit_mit.py,sha256=t4QyU9Q6hM29EClkaKni3U4vQDviIus4arySgTyQWeA,24345
110
- birder/net/efficientvit_msft.py,sha256=clajA5UJbAXWv9lEyHLNINOg0GiZNeJDis18gGVpuds,20144
110
+ birder/net/efficientvit_msft.py,sha256=Nz_5D4LlHKZH70QUYFdPwsSASGcFVO1TPybtKMwqHu0,20138
111
111
  birder/net/fasternet.py,sha256=jEmAX8mvi939ocxk7XXKd5iatI1bgOee3vzR3YSfNvA,9019
112
112
  birder/net/fastvit.py,sha256=hr0m6b-IwrMN9BMbVmjxyR4kYiir64PCViV7YAM-PcU,38039
113
- birder/net/flexivit.py,sha256=fHwEoUr6BGMUtfkjGJxqpuyVwn7GLJYTTRi0Xa3diwE,24946
113
+ birder/net/flexivit.py,sha256=LW-7iWpP1K8FaNju6vl7qNWhAeBhFqrnJ2O9_gSqolM,24959
114
114
  birder/net/focalnet.py,sha256=tIo8wvzv2LJhWzuRqXIkI6poRZZ3y-hJrXheT9zJzOo,20246
115
115
  birder/net/gc_vit.py,sha256=ea0sVCYH3w5yUIaWU31lrkiYD8xcK6CbjPkozXOPws4,23849
116
116
  birder/net/ghostnet_v1.py,sha256=P0dnO20evTd0-E7jvhb9RBRKOe5UgSygYfkmaYwoIP4,9048
@@ -119,7 +119,7 @@ birder/net/groupmixformer.py,sha256=DphJPX6nOavoQtMceNFAtlaA5iLd8v3qmRQDqSXOTOA,
119
119
  birder/net/hgnet_v1.py,sha256=fvQJdHMJnzWDJlD1XEuFSqSEkTZbZNJOFF65c893Yrg,14538
120
120
  birder/net/hgnet_v2.py,sha256=MUuJNEU2InsxeqFEp_xDljiH5ik27dx86mpsyZ-5gZc,10970
121
121
  birder/net/hiera.py,sha256=DhUFC6qRuUia2-Z7TrBMFt1jNcLM3IBlNGgUo9k5UeQ,28062
122
- birder/net/hieradet.py,sha256=2pFPsAhcNxCW-aZN4e7J9eCiv7NpgCUTenP0wTSYKts,20279
122
+ birder/net/hieradet.py,sha256=tJHdWX-_F-EmnObWLLgLidw7D4iAYd1uOskqCRWt2_w,20281
123
123
  birder/net/hornet.py,sha256=E8F9Uljq71UtznHRTDrnYCBjhPVWjVHS6-Y3fT8Nfos,13907
124
124
  birder/net/iformer.py,sha256=CsWI23qnBl0CIIagwiDle-i-4_XWAh0uICIlGrJfs6I,17925
125
125
  birder/net/inception_next.py,sha256=PXVPeJszHZ7fJ2eOa3s1ChxpcOGSUjjnHi7qZ5WaZxE,10829
@@ -133,7 +133,7 @@ birder/net/lit_v1_tiny.py,sha256=FHndzM1lwMyWVjWINbb91ZB7hc_VgyaOlk2EUAFtZD8,118
133
133
  birder/net/lit_v2.py,sha256=E7PiTSdJHXfpbosHT37rh2fQUGwr_Uzru0c1FLOJS8M,13940
134
134
  birder/net/maxvit.py,sha256=w6BkzMfOESE9C9OOF2X1IQMbaODGHe5je9QQsju8S34,29762
135
135
  birder/net/metaformer.py,sha256=mia7kdlmyFRXhcTQjHKKdNoIzRWr1xh69N-mJPKk4Zg,30412
136
- birder/net/mnasnet.py,sha256=uGjkWmr57-QeKhd33S4Ko_fCMXMC2LgGg6aqTNHOQ4M,9902
136
+ birder/net/mnasnet.py,sha256=PH7YpOy1Va93oPickYwv4PN3NRr54gRLy-wfTTSbCGw,9889
137
137
  birder/net/mobilenet_v1.py,sha256=gbqBkKvCadZAngvTP3psh1bN6zjmP3aQFfCkG3oB5qU,5325
138
138
  birder/net/mobilenet_v2.py,sha256=cDTRkALF07OSc3xYUKqNsfrHnUqJTor0yQ_Hqtf3LJg,7698
139
139
  birder/net/mobilenet_v3.py,sha256=YyWsbmMjGQ9Nwp5NkMdPB3ns3BwRTEdbHuQT3kkt5rw,13678
@@ -160,14 +160,14 @@ birder/net/resmlp.py,sha256=NVrTRCP4q_mWhbJOywX5f_lqNhqKvhwiloUEoBZZDGc,4687
160
160
  birder/net/resnest.py,sha256=_ql3dcLkqkhT91E-9-M0SiGty9uknwfns3uy4KZ3GkE,10104
161
161
  birder/net/resnet_v1.py,sha256=TIv8TjywneOFsYxJQhLrwCgnOTS1V-y_-pu2qjU4tu8,14546
162
162
  birder/net/resnet_v2.py,sha256=0QnKggNzpIwhAdI4gLej04VjuJGNVwcW9rPrIdtbnfM,9286
163
- birder/net/resnext.py,sha256=mdDfUe0YxiDiRn8qhvR324DaMjFmefoT-LO4Rc7HZ6k,10265
164
- birder/net/rope_deit3.py,sha256=asj7W0BvTkiHC1GIk3bb-suh_whA3hwUa7WVTQzssrw,22386
165
- birder/net/rope_flexivit.py,sha256=mTtIL6X0yJwX9iR-Fgf9rgsHoR0vB_4hAzflyoA9OHI,27413
166
- birder/net/rope_vit.py,sha256=iRQ_TVSe8qCXTlnUJx0dFyQ9Z6A3CneHRBnlTU9R6n4,43280
163
+ birder/net/resnext.py,sha256=ENa3pWL2mh_zYgk3OIYCBQiFltQLim27MfFRI2BBBNs,10252
164
+ birder/net/rope_deit3.py,sha256=txncunQ9XdKyfwgfDsNs0AigeF4P4y66xEHXuOkrIUo,22399
165
+ birder/net/rope_flexivit.py,sha256=YpBOjuvFImPU5uCna-Cl1KpWMtXs-xMBKsjJ93wdU_4,27426
166
+ birder/net/rope_vit.py,sha256=PCgmwIxJrrq5ctIwKF9MRtADKxSIb2ZncKi0EQY21zA,43293
167
167
  birder/net/sequencer2d.py,sha256=WcPlqawg6oQ9gg6h-WJmM25uxnDXA1wsfvJP53UUj60,7416
168
168
  birder/net/shufflenet_v1.py,sha256=BAJH4fb8R9CeqHqAcczPF94H9ipjsyPPl2Da_cbzir0,8129
169
169
  birder/net/shufflenet_v2.py,sha256=HNF33OmFlLgPN-VilZ9-JF78NJ60MiV2GlSwV8myv7c,6822
170
- birder/net/simple_vit.py,sha256=Uh9SiRnM7MgJM5oJbPB8yP9KGmgtOiLqVVV3mDq9GxI,11006
170
+ birder/net/simple_vit.py,sha256=PadSMtNnMJdhB0hHaXSrHkXTR92sBvGrg0tFMQko1Rg,11019
171
171
  birder/net/smt.py,sha256=wIY-RtKP6W_3WlAl-C0N_boybRJ4ZMxTSCXWDnS40-c,16198
172
172
  birder/net/squeezenet.py,sha256=bUhtqQd9V43vKEcUJG03JkxxCX7iBS_QHFjz497MQP4,3505
173
173
  birder/net/squeezenext.py,sha256=2nDG9E02UNlaquKgT-U6JgdyaRd_Hlwbesk81iIfbWc,6026
@@ -181,28 +181,29 @@ birder/net/uniformer.py,sha256=FYDzOAu4IvRiTVR6DQ1anooRQKiQTxyKFIIrzKAhsMc,12674
181
181
  birder/net/van.py,sha256=IAymYsIEK3zzST4KS6iU689b29Gm8TCwLFV2BjPyM0g,10671
182
182
  birder/net/vgg.py,sha256=-iTVoBXat_6jo8gnpA3Jk4yEBdMKLVbY4iMe_KJ-0Fw,3226
183
183
  birder/net/vgg_reduced.py,sha256=1NmjS4KSMvSEU3U090gf82bvWkyYDssEglaXNauCw4A,3356
184
- birder/net/vit.py,sha256=jeuxRrN4iT5Ue0ukO4Sx5mxrLGCnC9-k4WBuyS11Mnk,39229
185
- birder/net/vit_parallel.py,sha256=N-QGz7v_MeuX8FNjpnyl_ha9qD5F3X5G94lPdwPgWRc,23672
186
- birder/net/vit_sam.py,sha256=AckImaaux5cbw08ZvtEY1XJa9UEHCxSPA4ju3dUilXU,21157
184
+ birder/net/vit.py,sha256=8C9wKcin0llrZTtArz2IiQBd5TqM2aj4No_u3fBel64,39971
185
+ birder/net/vit_parallel.py,sha256=GzGCs0_OFjZEuViJMqK6LBRNX6-PWMjWh8vwdNjkIr8,23685
186
+ birder/net/vit_sam.py,sha256=NMsUaiSyfahGQvMiMb-nFKwLlCHSr8gGPoKaHarNTMM,22930
187
187
  birder/net/vovnet_v1.py,sha256=4Wgm1mALHpTJlhcrczKPVPkzDh3RNTGTty1FLzRK1EM,7685
188
188
  birder/net/vovnet_v2.py,sha256=8kuLm3bURn_I3j0m9YmiJI4TohuWyB-UBlefWIa694g,9714
189
189
  birder/net/wide_resnet.py,sha256=d6yn-Fb67zCGLMhQLV09gik5Otah6nCDronm4betcPA,5972
190
190
  birder/net/xception.py,sha256=58rncfGZ2U3-aGZjBABhPenRBZl8cvttrtSc0iGMVck,6913
191
191
  birder/net/xcit.py,sha256=0WH7Zex1dVpUbAZ7aiwyhhTNDiJd33KtFZGzno3cEQk,19747
192
- birder/net/detection/__init__.py,sha256=2kusDH9kBe645DNwUQE59ArQZxphhYeIrhWWyLPTPUU,1105
192
+ birder/net/detection/__init__.py,sha256=gkPYjk8x2L095DHRJPogYNCrzhIzoZaNwh6_AMPWZFE,1169
193
193
  birder/net/detection/_yolo_anchors.py,sha256=mbSWosbgfvw6KJ4AcfXV7LoRgTuYgX3yg4VH2zajLD0,6911
194
194
  birder/net/detection/base.py,sha256=tHyXyGggKPjUaDiKnftYe6fNjZBK2TokenvgMVYhLf8,26248
195
- birder/net/detection/deformable_detr.py,sha256=mcBT2h-SzA1n7nq0X4i10PGD08lYmL_rqagK4LLF61E,34646
196
- birder/net/detection/detr.py,sha256=Fa8EVTH-lWrJgW-Y0Dc6UOmuPqyJqOsg0uMbO_Z_t6M,20670
195
+ birder/net/detection/deformable_detr.py,sha256=lE8VZiONTYaDKlc-OU2PQbs9w49XUHJ4C1NnfBwkyMM,34616
196
+ birder/net/detection/detr.py,sha256=76AlLiljL9oFkNrJ3ZblxOkD5tAC7oGzwGFmqhuThYE,20680
197
197
  birder/net/detection/efficientdet.py,sha256=1IrqoWbL6AX3g0jcdKqe010VHeD6GWEmEp9qmLxnNSE,29038
198
198
  birder/net/detection/faster_rcnn.py,sha256=JOI4nlg5ss5_nvhklBhg7EBZu7e40zxmd-9i2avVCqg,34338
199
199
  birder/net/detection/fcos.py,sha256=Qhe5y5ito4UZ9TtquWaVyslKWmv4xy56dKGRECkRf18,21867
200
- birder/net/detection/plain_detr.py,sha256=SQ_0vWcegHNaB0PDsO4cZq7LLcMgC4wRHE0v_DgEzpc,32857
201
- birder/net/detection/retinanet.py,sha256=PjkEpoKiAN6IkLleHaIFFQyOQbOFMXZEpn9lM-C8eeM,19076
202
- birder/net/detection/rt_detr_v1.py,sha256=C0cONbzEtToVm0dQl2IeKBkWrL0CTxCQr7EELdsGiaA,46544
203
- birder/net/detection/rt_detr_v2.py,sha256=3bU25aQgD-XcsTdgQx0TE6RfpU7N9RfZMdiSkk6oqB8,46355
200
+ birder/net/detection/lw_detr.py,sha256=sA0Uj6B-CYokt9yhufRf3Ks24yUWtcGi7L4IbruY2fk,50516
201
+ birder/net/detection/plain_detr.py,sha256=8DgpyYXX8P_s4gwPBhzkTYXwZZ5IBlRiDNqYcU-8Dd0,32916
202
+ birder/net/detection/retinanet.py,sha256=uTUPOmvHOJ9R_I4NRqUr92AMZIeb-3TP_3ZkNFNyHqs,19070
203
+ birder/net/detection/rt_detr_v1.py,sha256=-LU3ZdQuRled6Q2LWTk4hy4kKyu8sTMnHGk9TBkID48,46444
204
+ birder/net/detection/rt_detr_v2.py,sha256=f0Mqvo_se0dXypfm-3OYQYoPRPDHm4o8hJvE-tCSwHA,45502
204
205
  birder/net/detection/ssd.py,sha256=SxTU151Fn8DmylFkqVp3_6F29BvZkQHejDDti3A554A,20339
205
- birder/net/detection/ssdlite.py,sha256=pv2ychUWUu-UWxVs6_RXMdjEiIPfkBoscschCGNDXXI,7241
206
+ birder/net/detection/ssdlite.py,sha256=0LwDiiS20xNjkiLvEyyW-cBm32py6fdsIBqPDxkvsKc,7225
206
207
  birder/net/detection/vitdet.py,sha256=bpyX0W_q0tBqxQ7hptHnn8Fm5y0DkXvRQQBiRcm-9RE,4424
207
208
  birder/net/detection/yolo_v2.py,sha256=WpA5ZOtbzAFsUqPQDplXAJxMmDpVVGnBO7KTvzaEgrs,19949
208
209
  birder/net/detection/yolo_v3.py,sha256=INTX3ciZ678PighKN6sNp8Xs3iWZT4aXYcP4ANjS8mo,27777
@@ -250,20 +251,20 @@ birder/scripts/benchmark.py,sha256=BNxrZDSs9bf7xH0AManKPJk9RTGmCqiUP95jBYx8wUw,1
250
251
  birder/scripts/evaluate.py,sha256=CbCWK2TR19bEdH0wPO3iCbS0EjZWxfsBAJ42hDD6fKI,6791
251
252
  birder/scripts/predict.py,sha256=ryaWcy8xVN16MnLxf2fgxSMa6Wyb7CHi76HgVMCGoA4,30314
252
253
  birder/scripts/predict_detection.py,sha256=n3-EJ3Lyg1cLOAgEEj1uyfqHGJRJlkMKKU28WY3i7Ts,17563
253
- birder/scripts/train.py,sha256=gvR89QDW78QzFUOY-yhCWVp4sOW4NHAKB3bT8f3wOrs,38140
254
+ birder/scripts/train.py,sha256=u46D7MDApmTg9GR0g4ANAbMWiEbO6MDwvzq5WwtZysY,38325
254
255
  birder/scripts/train_barlow_twins.py,sha256=pUIAoS4ZbVnL7nuA-uQFHfxwnuJrZtM1xe0RC-C8uRs,23240
255
256
  birder/scripts/train_byol.py,sha256=cD3ItGOSmF2-EvVzt7qHNO95wk0YVWusN05wnXPs18k,24207
256
- birder/scripts/train_capi.py,sha256=Af7CyyUVRDWnroEAPN1zpPq9ZWv_qrXZ8911iJBmU70,32124
257
+ birder/scripts/train_capi.py,sha256=agED-24MMOCsgtlebG8KEl05l17WFDadLFCPLbgWCQA,32286
257
258
  birder/scripts/train_data2vec.py,sha256=6UC3TDcnelz2R2sJcdiBsRv_rLtAs0rs79Am1EqgLuM,24651
258
259
  birder/scripts/train_data2vec2.py,sha256=OnagbpMyr4YHW6Cuo5I7oW2bY-877MlUs0w5PxZ9z_k,25812
259
- birder/scripts/train_detection.py,sha256=dEAxfS8ewQOK_j6gt-GazA88mOePTNUV2qBvd3A_ae8,41556
260
+ birder/scripts/train_detection.py,sha256=Jv4oUH-zfEpLtH7ysnLuK3_i8p1rdlVpxALI6vDi9Cw,41639
260
261
  birder/scripts/train_dino_v1.py,sha256=atZjI_51RX0rWWO7ptKfduti3CF5F-6SNpPRhVdKOzM,32189
261
262
  birder/scripts/train_dino_v2.py,sha256=7V3SuyMpcQvLyeBQmriNFCguG2w3aYSRQq9z7pBr6eM,48251
262
263
  birder/scripts/train_dino_v2_dist.py,sha256=eOr52W4rROpQScPrg03LhTuAAXRrCCaHzIvHmCsPoD8,49635
263
264
  birder/scripts/train_franca.py,sha256=-OcEjPzOYWEVeFfGr4Dl1_Cee7hFNeBWzKctrHJ9VJc,43736
264
265
  birder/scripts/train_i_jepa.py,sha256=_C3N32gFFTF512eQgGsZ8tqSsz1vsCauot5bPq9aqrE,28127
265
266
  birder/scripts/train_ibot.py,sha256=Pw-LZs2_-PWJj9iyidgdNdbCGj3QoIrQmlLDLctlkS8,33635
266
- birder/scripts/train_kd.py,sha256=DmNZkWIdB1OuZqUYqII0XZX-ZDJn4I14A-LMln-bL9U,44476
267
+ birder/scripts/train_kd.py,sha256=1_ynCs0vDln57Om3YLw4txlExrYOLWQ7I5uojSPVyqA,44661
267
268
  birder/scripts/train_mim.py,sha256=Hu63BxHjGoOUgPPNElSuCdNT2-QYOoE0wWrR3E3fPxs,24251
268
269
  birder/scripts/train_mmcr.py,sha256=laXYFvHTNwB1r--4elKG__7_IOkIQQkrZYzY6PrZsnA,24230
269
270
  birder/scripts/train_rotnet.py,sha256=Td7WDkPmooP2TaedcDp1mIvQzRQHQmwA0TQN1wh2Zy4,24474
@@ -292,9 +293,9 @@ birder/tools/stats.py,sha256=TapTDidm4Vhtb_q9Wm_v7V9VHchC0qaOmtPtLuoLaAk,8375
292
293
  birder/tools/verify_coco.py,sha256=lMCc9X-P-odMEN6GkNpV_TDY7grze11RkPMs-Z_Uy-4,3717
293
294
  birder/tools/verify_directory.py,sha256=KbA97CX2HrwdL97HoKmSO8o3vFdP19TT7zHkulMp8L4,3284
294
295
  birder/tools/voc_to_coco.py,sha256=ktCviq1Bu9un27mWWPzsr5RolrOpwbFNID5EubY2C1k,5249
295
- birder-0.4.1.dist-info/licenses/LICENSE,sha256=tQ5GIY23TCjwH64fidwWBp8JdK2QbPVl1UePNd-5m5U,11341
296
- birder-0.4.1.dist-info/METADATA,sha256=gdJ2ADaW_-Qd8Pn_D1pvWHkXMcc41pYueN2FJpvvEjM,12696
297
- birder-0.4.1.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
298
- birder-0.4.1.dist-info/entry_points.txt,sha256=nikWKO1k2GISDo1hsv2T-37NCwD4dtb3PXRwPkOZ86w,128
299
- birder-0.4.1.dist-info/top_level.txt,sha256=ZRzmYwYDWwwOKFYgW4k0vUysaazrAJDLnpIjVH6cwtY,7
300
- birder-0.4.1.dist-info/RECORD,,
296
+ birder-0.4.2.dist-info/licenses/LICENSE,sha256=tQ5GIY23TCjwH64fidwWBp8JdK2QbPVl1UePNd-5m5U,11341
297
+ birder-0.4.2.dist-info/METADATA,sha256=IrahFdkSe2V4zwqbT6ZmKNTuG18vBbtlTKuoDJqbvp4,12696
298
+ birder-0.4.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
299
+ birder-0.4.2.dist-info/entry_points.txt,sha256=nikWKO1k2GISDo1hsv2T-37NCwD4dtb3PXRwPkOZ86w,128
300
+ birder-0.4.2.dist-info/top_level.txt,sha256=ZRzmYwYDWwwOKFYgW4k0vUysaazrAJDLnpIjVH6cwtY,7
301
+ birder-0.4.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5