tkclam commited on
Commit
3c8bfc4
·
verified ·
1 Parent(s): a613af6

Keep only the current octacam and hexaview detectors, and show their input

Browse files
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ assets/octacam.jpg filter=lfs diff=lfs merge=lfs -text
37
+ assets/hexaview.jpg filter=lfs diff=lfs merge=lfs -text
260927_mvt_dinov3b_384_octacam_fly38/README.md DELETED
@@ -1,29 +0,0 @@
1
- # `mvt_dinov3b_384_octacam_fly38` -- the octacam detector, round 11
2
-
3
- A deeperfly 2 detector (`deeperfly-detector-1`, family `mvt`): a multiview transformer on a DINOv3 ViT-B/16 that predicts all 38 points of the `fly38` skeleton in every view of the octacam rig, computing the views of a frame together. It supersedes `260904_mvt_dinov3s_384_gray_fly38` on this rig.
4
-
5
- Exported 2026-09-28 from `octacam/runs/mvt_dinov3/round11/r11_ship_s0`, trained 2026-09-27: round 8's recipe unchanged (warm-started from a pseudo-labeled ViT-B, lr 1e-4, 5,000 steps, a distillation stream on unlabeled frames), retrained on the labels of 2026-09-27.
6
-
7
- | | |
8
- |---|---|
9
- | file | `mvt_dinov3b_384_octacam_fly38.pth`, 383,792,459 bytes |
10
- | sha256 | `6898ccc26d454d26792cc5a125053cc3ffe15c8295c0182eae33c4da6d921f19` |
11
- | skeleton | `fly38` -- `fly38.toml` beside this file |
12
- | backbone | `vit_base_patch16_dinov3.lvd1689m` (timm) |
13
- | input | 384x768 per view: a 2:1 window around the animal |
14
- | trained on | 56 octacam recordings, 4,488 items (`report.json`); no holdout |
15
- | recipe | `config.toml` beside this file |
16
-
17
- ## What it scores
18
-
19
- No held-out number of its own: a shipping model trains on every label. On the deeperfly repository's `examples/octacam/` clip (200 frames of `scape_260417_IN07B001_Fly4_006`), the example run config's bundle adjustment takes an orbit guess from 172 px to 1.9 px median reprojection, and the pictorial 3D then reprojects at 1.49 px median. That is agreement across the eight views, not an error against labels.
20
-
21
- ## Using it
22
-
23
- ```toml
24
- [pose2d]
25
- weights = ["/mnt/upramdya/data/TL/deeperfly-models/260927_mvt_dinov3b_384_octacam_fly38/mvt_dinov3b_384_octacam_fly38.pth"]
26
- candidates = 5 # the peaks [pose3d] method = "pictorial" chooses among
27
- ```
28
-
29
- Copying this directory to the machine that runs it and naming the local path is the better habit. Verify a copy with `sha256sum -c SHA256SUMS`.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260927_mvt_dinov3b_384_octacam_fly38/SHA256SUMS DELETED
@@ -1,4 +0,0 @@
1
- af81f78994be135442be6cc47cb09ff98f450915c2619b5dc95705b94baaf54f ./config.toml
2
- 56f9a33ea5c286bda06e599602e7b7adaefb7ba29a74a2516548b7cbb7776e52 ./fly38.toml
3
- 6898ccc26d454d26792cc5a125053cc3ffe15c8295c0182eae33c4da6d921f19 ./mvt_dinov3b_384_octacam_fly38.pth
4
- fbfefcbaa0eeee661467eacf14277190472610dd17f7eaae3030259960d25f97 ./report.json
 
 
 
 
 
260927_mvt_dinov3b_384_octacam_fly38/config.toml DELETED
@@ -1,94 +0,0 @@
1
- # r11_ship_s0: round 11's corpus ship -- r8_ship_s0's recipe unchanged (warm DINOv3
2
- # ViT-B from `tier1/vitb_stage2_pseudo`, lr 1e-4, 5k-step cosine, fill 0.5, the
3
- # distillation stream from `tier1/c6_vitb_warm_5k`), retrained on the labels of
4
- # 2026-09-27 by the code of main 796ae43. round11/ sits at round8/'s depth, so every
5
- # relative path is the same; only `out` moves.
6
-
7
- format_version = 3
8
-
9
- [data]
10
- kind = "project"
11
- projects = ["../../../recordings/*"]
12
- cache = "../../../cache"
13
-
14
- [data.crops]
15
- tightness = [0.75, 2.2] # per-sample 2:1 crop around the animal, log-uniform;
16
- jitter = 0.1 # < 1 leaves points outside on purpose
17
- eval_tightness = 1.25
18
- full_p = 0.1 # letterboxed whole frame (an inference without any crop)
19
-
20
- [data.fill]
21
- weight = 0.5
22
- max_residual_px = 10.0
23
-
24
- [model]
25
- input_hw = [384, 768]
26
- family = "mvt"
27
- backbone = "vit_base_patch16_dinov3.lvd1689m"
28
- pretrained = true
29
- attn_scopes = "llllllllglgl"
30
- margin = 64
31
- reach = 2
32
- drop_path = 0.0
33
- token_mask = 0.0
34
- token_pad = 2 # 32 px of the 64 px margin in the token grid (1.26x tokens)
35
- init_from = "/home/tlam/deeperfly-projects/octacam/runs/mvt_dinov3/tier1/vitb_stage2_pseudo/model.pth"
36
-
37
- [augment]
38
- degrees = 12.0
39
- scale = [1.0, 1.0] # the crop sampler supplies scale and shift
40
- aspect = [0.85, 1.18]
41
- translate = [0.0, 0.0]
42
- flip_p = 0.5
43
- brightness = 0.3
44
- contrast = 0.3
45
- gamma = [0.7, 1.4]
46
- blur_sigma = [0.5, 1.5]
47
- noise_std = 0.03
48
- photometric_p = 0.5
49
-
50
- [train]
51
- grad_checkpoint = true
52
- steps = 5000
53
- images_per_batch = 24
54
- grad_clip = 1.0
55
- amp = true
56
- ema_decay = 0.999
57
- view_drop_p = 0.3
58
- view_min = 1
59
- log_every = 100
60
- seed = 0
61
- out = "../../../runs/mvt_dinov3/round11/r11_ship_s0"
62
-
63
- [train.optimizer]
64
- lr = 1e-4
65
- weight_decay = 0.05
66
- warmup_steps = 500
67
-
68
- [train.loss]
69
- sigma = 2.0
70
- field_weight = 1.0
71
- coord_weight = 0.0
72
- tri_weight = 0.02
73
- tri_huber = 0.05
74
- tri_max_world = 0.5
75
-
76
- [train.eval]
77
- every = 0
78
-
79
- [compute]
80
- workers = 8
81
-
82
- [unlabeled]
83
- teacher = "/home/tlam/deeperfly-projects/octacam/runs/mvt_dinov3/tier1/c6_vitb_warm_5k/model.pth" # held-out-clean warm ViT-B, 4.71 px
84
- n_per_project = 200
85
- transductive = false
86
- agree_px = 6.0
87
- min_views = 3
88
- conf_min = 0.3
89
- weight = 0.5
90
- mask_ratios = []
91
- masked_weight = 1.0
92
- unmasked_weight = 0.5
93
- crop_tightness = [0.75, 1.6]
94
- cache = "../../../cache/unlabeled"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260927_mvt_dinov3b_384_octacam_fly38/fly38.toml DELETED
@@ -1,129 +0,0 @@
1
- # fly38 -- the 38 tracked points of a tethered Drosophila: six 5-point legs, two
2
- # antennae, the neck, and a 5-point dorsal-midline abdomen chain (the tergite stripes).
3
- #
4
- # A skeleton is points, edges and point_symmetries -- the same decomposition as SLEAP
5
- # and DeepLabCut -- plus an optional palette (point_colors / edge_colors). The palette
6
- # is decoration, not identity: it draws the points but is kept out of the digest, so
7
- # recoloring never reports a different skeleton.
8
-
9
- [skeleton]
10
- name = "fly38"
11
-
12
- # The points IN ORDER: channel i of the detector is points[i]. This is the contract
13
- # with the weights.
14
- points = [
15
- "lf_thorax_coxa", "lf_coxa_trochanter", "lf_femur_tibia", "lf_tibia_tarsus", "lf_pretarsus",
16
- "lm_thorax_coxa", "lm_coxa_trochanter", "lm_femur_tibia", "lm_tibia_tarsus", "lm_pretarsus",
17
- "lh_thorax_coxa", "lh_coxa_trochanter", "lh_femur_tibia", "lh_tibia_tarsus", "lh_pretarsus",
18
- "l_antenna",
19
- "rf_thorax_coxa", "rf_coxa_trochanter", "rf_femur_tibia", "rf_tibia_tarsus", "rf_pretarsus",
20
- "rm_thorax_coxa", "rm_coxa_trochanter", "rm_femur_tibia", "rm_tibia_tarsus", "rm_pretarsus",
21
- "rh_thorax_coxa", "rh_coxa_trochanter", "rh_femur_tibia", "rh_tibia_tarsus", "rh_pretarsus",
22
- "r_antenna",
23
- "neck",
24
- "abdomen0", "abdomen1", "abdomen2", "abdomen3", "abdomen4",
25
- ]
26
-
27
- # The edges, as pairs of points. The antennae and neck appear in no edge -- tracked
28
- # points with no bone.
29
- edges = [
30
- ["lf_thorax_coxa", "lf_coxa_trochanter"], ["lf_coxa_trochanter", "lf_femur_tibia"],
31
- ["lf_femur_tibia", "lf_tibia_tarsus"], ["lf_tibia_tarsus", "lf_pretarsus"],
32
- ["lm_thorax_coxa", "lm_coxa_trochanter"], ["lm_coxa_trochanter", "lm_femur_tibia"],
33
- ["lm_femur_tibia", "lm_tibia_tarsus"], ["lm_tibia_tarsus", "lm_pretarsus"],
34
- ["lh_thorax_coxa", "lh_coxa_trochanter"], ["lh_coxa_trochanter", "lh_femur_tibia"],
35
- ["lh_femur_tibia", "lh_tibia_tarsus"], ["lh_tibia_tarsus", "lh_pretarsus"],
36
- ["rf_thorax_coxa", "rf_coxa_trochanter"], ["rf_coxa_trochanter", "rf_femur_tibia"],
37
- ["rf_femur_tibia", "rf_tibia_tarsus"], ["rf_tibia_tarsus", "rf_pretarsus"],
38
- ["rm_thorax_coxa", "rm_coxa_trochanter"], ["rm_coxa_trochanter", "rm_femur_tibia"],
39
- ["rm_femur_tibia", "rm_tibia_tarsus"], ["rm_tibia_tarsus", "rm_pretarsus"],
40
- ["rh_thorax_coxa", "rh_coxa_trochanter"], ["rh_coxa_trochanter", "rh_femur_tibia"],
41
- ["rh_femur_tibia", "rh_tibia_tarsus"], ["rh_tibia_tarsus", "rh_pretarsus"],
42
- ["abdomen0", "abdomen1"], ["abdomen1", "abdomen2"], ["abdomen2", "abdomen3"], ["abdomen3", "abdomen4"],
43
- ]
44
-
45
- # What each point becomes under a left/right flip. Write each pair once; anything absent
46
- # is on the midline and maps to itself (hence no neck, no abdomen). The loader checks
47
- # the implied mirror against `edges`: applying it must give the edge set back, so a
48
- # wrong side or two joints of one leg exchanged is named rather than trained on silently.
49
- point_symmetries = [
50
- ["lf_thorax_coxa", "rf_thorax_coxa"],
51
- ["lf_coxa_trochanter", "rf_coxa_trochanter"],
52
- ["lf_femur_tibia", "rf_femur_tibia"],
53
- ["lf_tibia_tarsus", "rf_tibia_tarsus"],
54
- ["lf_pretarsus", "rf_pretarsus"],
55
- ["lm_thorax_coxa", "rm_thorax_coxa"],
56
- ["lm_coxa_trochanter", "rm_coxa_trochanter"],
57
- ["lm_femur_tibia", "rm_femur_tibia"],
58
- ["lm_tibia_tarsus", "rm_tibia_tarsus"],
59
- ["lm_pretarsus", "rm_pretarsus"],
60
- ["lh_thorax_coxa", "rh_thorax_coxa"],
61
- ["lh_coxa_trochanter", "rh_coxa_trochanter"],
62
- ["lh_femur_tibia", "rh_femur_tibia"],
63
- ["lh_tibia_tarsus", "rh_tibia_tarsus"],
64
- ["lh_pretarsus", "rh_pretarsus"],
65
- ["l_antenna", "r_antenna"],
66
- ]
67
-
68
- # The palette. One #rrggbb per point; a key is a point name or a `*` pattern (an exact
69
- # name beats a pattern). Optional and may be partial -- an unnamed point takes tab10 by
70
- # index. The scheme is anatomical, so it reads at a glance: left = blue, right = red,
71
- # front -> hind lightening within a side; the midline neck and abdomen green. Edges take
72
- # the average of their endpoints, so every leg bone comes out its own limb's color.
73
- [skeleton.point_colors]
74
- "lf_*" = "#0f7399"
75
- "lm_*" = "#1a8daf"
76
- "lh_*" = "#75becb"
77
- l_antenna = "#0a4f6b"
78
- "rf_*" = "#ba1e31"
79
- "rm_*" = "#c9564f"
80
- "rh_*" = "#d58579"
81
- r_antenna = "#8c1525"
82
- neck = "#15a315"
83
- "abdomen*" = "#61e47b"
84
-
85
- # A canonical neutral posture (NeuroMechFly's rest pose), one [x, y, z] per point
86
- # in millimeters, with the body center of mass at the origin (x anterior, y the
87
- # left-right axis, z dorsal). It is NOT part of the skeleton's identity (out of the
88
- # digest); it draws the skeleton in 3D and SEEDS labeling: projected through a
89
- # recording's calibration it drops a rough draggable instance into each view when
90
- # nothing else (a prior labeled frame, another view) is available to seed from.
91
- [skeleton.default_pose]
92
- lf_thorax_coxa = [ 0.42966, 0.17200, 0.25226]
93
- lf_coxa_trochanter = [ 0.31028, 0.06883, -0.07688]
94
- lf_femur_tibia = [ 0.85227, 0.42043, 0.20537]
95
- lf_tibia_tarsus = [ 1.05606, 0.65936, -0.20658]
96
- lf_pretarsus = [ 1.45133, 1.02885, -0.58856]
97
- lm_thorax_coxa = [ 0.03366, 0.12500, 0.00026]
98
- lm_coxa_trochanter = [ 0.00831, 0.09367, -0.17620]
99
- lm_femur_tibia = [ 0.11746, 0.70120, 0.30719]
100
- lm_tibia_tarsus = [ 0.23055, 0.96680, -0.29411]
101
- lm_pretarsus = [ 0.38484, 1.49119, -0.73358]
102
- lh_thorax_coxa = [-0.19334, 0.08700, -0.01474]
103
- lh_coxa_trochanter = [-0.27402, 0.09655, -0.19640]
104
- lh_femur_tibia = [-0.64760, 0.63110, 0.32665]
105
- lh_tibia_tarsus = [-0.96496, 0.77982, -0.26073]
106
- lh_pretarsus = [-1.40791, 1.03885, -0.86325]
107
- l_antenna = [ 1.04836, 0.08600, 0.56596]
108
- rf_thorax_coxa = [ 0.42966, -0.17200, 0.25226]
109
- rf_coxa_trochanter = [ 0.31028, -0.06883, -0.07688]
110
- rf_femur_tibia = [ 0.85227, -0.42043, 0.20537]
111
- rf_tibia_tarsus = [ 1.05606, -0.65936, -0.20658]
112
- rf_pretarsus = [ 1.45133, -1.02885, -0.58856]
113
- rm_thorax_coxa = [ 0.03366, -0.12500, 0.00026]
114
- rm_coxa_trochanter = [ 0.00831, -0.09367, -0.17620]
115
- rm_femur_tibia = [ 0.11746, -0.70120, 0.30719]
116
- rm_tibia_tarsus = [ 0.23055, -0.96680, -0.29411]
117
- rm_pretarsus = [ 0.38484, -1.49119, -0.73358]
118
- rh_thorax_coxa = [-0.19334, -0.08700, -0.01474]
119
- rh_coxa_trochanter = [-0.27402, -0.09655, -0.19640]
120
- rh_femur_tibia = [-0.64760, -0.63110, 0.32665]
121
- rh_tibia_tarsus = [-0.96496, -0.77982, -0.26073]
122
- rh_pretarsus = [-1.40791, -1.03885, -0.86325]
123
- r_antenna = [ 1.04836, -0.08600, 0.56596]
124
- neck = [ 0.61936, 0.00000, 0.48296]
125
- abdomen0 = [-0.71698, 0.00000, 0.71444]
126
- abdomen1 = [-0.91268, 0.00000, 0.66169]
127
- abdomen2 = [-1.10060, 0.00000, 0.61850]
128
- abdomen3 = [-1.27163, 0.00000, 0.56551]
129
- abdomen4 = [-1.48737, 0.00000, 0.46364]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260927_mvt_dinov3b_384_octacam_fly38/report.json DELETED
@@ -1,154 +0,0 @@
1
- {
2
- "projects": {
3
- "9A9_251119_Fly3_003": "/home/tlam/deeperfly-projects/octacam/recordings/9A9_251119_Fly3_003/deeperfly",
4
- "AN07B017_260414_Fly4_003": "/home/tlam/deeperfly-projects/octacam/recordings/AN07B017_260414_Fly4_003/deeperfly",
5
- "AN07B017_260414_Fly4_004": "/home/tlam/deeperfly-projects/octacam/recordings/AN07B017_260414_Fly4_004/deeperfly",
6
- "AN07B017_260414_Fly4_005": "/home/tlam/deeperfly-projects/octacam/recordings/AN07B017_260414_Fly4_005/deeperfly",
7
- "AN19B004_260316_Fly2_003": "/home/tlam/deeperfly-projects/octacam/recordings/AN19B004_260316_Fly2_003/deeperfly",
8
- "ANXXX049_251125_Fly1_003": "/home/tlam/deeperfly-projects/octacam/recordings/ANXXX049_251125_Fly1_003/deeperfly",
9
- "FW_260325_dna01a5_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260325_dna01a5_Fly1_001_label/deeperfly",
10
- "FW_260327_g25_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260327_g25_Fly1_001_label/deeperfly",
11
- "FW_260327_g25_Fly2_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260327_g25_Fly2_001_label/deeperfly",
12
- "FW_260327_g25_Fly3_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260327_g25_Fly3_001_label/deeperfly",
13
- "FW_260327_g25_Fly5_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260327_g25_Fly5_001_label/deeperfly",
14
- "FW_260416_CS_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260416_CS_Fly1_001_label/deeperfly",
15
- "FW_260418_cs_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260418_cs_Fly1_001_label/deeperfly",
16
- "FW_260418_cs_Fly2_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260418_cs_Fly2_001_label/deeperfly",
17
- "FW_260418_g25i_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260418_g25i_Fly1_001_label/deeperfly",
18
- "FW_260418_g25i_Fly2_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260418_g25i_Fly2_001_label/deeperfly",
19
- "FW_260418_g25i_Fly3_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260418_g25i_Fly3_001_label/deeperfly",
20
- "FW_260418_g25i_Fly4_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260418_g25i_Fly4_001_label/deeperfly",
21
- "FW_260420_g25_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260420_g25_Fly1_001_label/deeperfly",
22
- "FW_260420_g25_Fly2_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260420_g25_Fly2_001_label/deeperfly",
23
- "FW_260420_g25_Fly3_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260420_g25_Fly3_001_label/deeperfly",
24
- "FW_260420_g25_Fly4_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260420_g25_Fly4_001_label/deeperfly",
25
- "FW_260423_cs_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260423_cs_Fly1_001_label/deeperfly",
26
- "FW_260423_cs_Fly2_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260423_cs_Fly2_001_label/deeperfly",
27
- "FW_260423_cs_Fly3_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260423_cs_Fly3_001_label/deeperfly",
28
- "FW_260423_cs_Fly4_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260423_cs_Fly4_001_label/deeperfly",
29
- "FW_260423_g25_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260423_g25_Fly1_001_label/deeperfly",
30
- "FW_260424_g25_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260424_g25_Fly1_001_label/deeperfly",
31
- "FW_260507_dfd_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260507_dfd_Fly1_001_label/deeperfly",
32
- "FW_260507_g25_Fly1_002": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260507_g25_Fly1_002/deeperfly",
33
- "FW_260507_g25_Fly2_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260507_g25_Fly2_001_label/deeperfly",
34
- "FW_260507_g25_Fly3_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260507_g25_Fly3_001_label/deeperfly",
35
- "FW_260508_g25_Fly1_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260508_g25_Fly1_001_label/deeperfly",
36
- "FW_260508_g25_Fly2_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260508_g25_Fly2_001_label/deeperfly",
37
- "FW_260508_g25_Fly3_001_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260508_g25_Fly3_001_label/deeperfly",
38
- "FW_260508_g25_Fly4_007_label": "/home/tlam/deeperfly-projects/octacam/recordings/FW_260508_g25_Fly4_007_label/deeperfly",
39
- "IN07B001_260417_Fly3_003": "/home/tlam/deeperfly-projects/octacam/recordings/IN07B001_260417_Fly3_003/deeperfly",
40
- "IN07B001_260417_Fly4_004": "/home/tlam/deeperfly-projects/octacam/recordings/IN07B001_260417_Fly4_004/deeperfly",
41
- "IN07B001_260417_Fly4_005": "/home/tlam/deeperfly-projects/octacam/recordings/IN07B001_260417_Fly4_005/deeperfly",
42
- "IN07B001_260417_Fly4_007": "/home/tlam/deeperfly-projects/octacam/recordings/IN07B001_260417_Fly4_007/deeperfly",
43
- "IN07B007_260323_Fly3_002": "/home/tlam/deeperfly-projects/octacam/recordings/IN07B007_260323_Fly3_002/deeperfly",
44
- "IN10B012_260319_Fly1_003": "/home/tlam/deeperfly-projects/octacam/recordings/IN10B012_260319_Fly1_003/deeperfly",
45
- "IN10B012_260319_Fly1_006": "/home/tlam/deeperfly-projects/octacam/recordings/IN10B012_260319_Fly1_006/deeperfly",
46
- "IN10B014_260317_Fly1_004": "/home/tlam/deeperfly-projects/octacam/recordings/IN10B014_260317_Fly1_004/deeperfly",
47
- "IN10B014_260320_Fly2_003": "/home/tlam/deeperfly-projects/octacam/recordings/IN10B014_260320_Fly2_003/deeperfly",
48
- "IN10B014_260320_Fly2_009": "/home/tlam/deeperfly-projects/octacam/recordings/IN10B014_260320_Fly2_009/deeperfly",
49
- "IN14B010_251121_Fly3_003": "/home/tlam/deeperfly-projects/octacam/recordings/IN14B010_251121_Fly3_003/deeperfly",
50
- "IN14B011_251126_Fly3_004": "/home/tlam/deeperfly-projects/octacam/recordings/IN14B011_251126_Fly3_004/deeperfly",
51
- "IN19B038_260313_Fly3_003": "/home/tlam/deeperfly-projects/octacam/recordings/IN19B038_260313_Fly3_003/deeperfly",
52
- "LTM-MN_251217_Fly1_003": "/home/tlam/deeperfly-projects/octacam/recordings/LTM-MN_251217_Fly1_003/deeperfly",
53
- "LTM-MN_260119_Fly3_003": "/home/tlam/deeperfly-projects/octacam/recordings/LTM-MN_260119_Fly3_003/deeperfly",
54
- "LTM-MN_260120_Fly3_003": "/home/tlam/deeperfly-projects/octacam/recordings/LTM-MN_260120_Fly3_003/deeperfly",
55
- "LTM-MN_260120_Fly3_006": "/home/tlam/deeperfly-projects/octacam/recordings/LTM-MN_260120_Fly3_006/deeperfly",
56
- "oldrig_demo": "/home/tlam/deeperfly-projects/octacam/recordings/oldrig_demo/deeperfly",
57
- "scape_260417_IN07B001_Fly3_004": "/home/tlam/deeperfly-projects/octacam/recordings/scape_260417_IN07B001_Fly3_004/deeperfly",
58
- "scape_260417_IN07B001_Fly4_006": "/home/tlam/deeperfly-projects/octacam/recordings/scape_260417_IN07B001_Fly4_006/deeperfly"
59
- },
60
- "train_projects": [
61
- "9A9_251119_Fly3_003",
62
- "AN07B017_260414_Fly4_003",
63
- "AN07B017_260414_Fly4_004",
64
- "AN07B017_260414_Fly4_005",
65
- "AN19B004_260316_Fly2_003",
66
- "ANXXX049_251125_Fly1_003",
67
- "FW_260325_dna01a5_Fly1_001_label",
68
- "FW_260327_g25_Fly1_001_label",
69
- "FW_260327_g25_Fly2_001_label",
70
- "FW_260327_g25_Fly3_001_label",
71
- "FW_260327_g25_Fly5_001_label",
72
- "FW_260416_CS_Fly1_001_label",
73
- "FW_260418_cs_Fly1_001_label",
74
- "FW_260418_cs_Fly2_001_label",
75
- "FW_260418_g25i_Fly1_001_label",
76
- "FW_260418_g25i_Fly2_001_label",
77
- "FW_260418_g25i_Fly3_001_label",
78
- "FW_260418_g25i_Fly4_001_label",
79
- "FW_260420_g25_Fly1_001_label",
80
- "FW_260420_g25_Fly2_001_label",
81
- "FW_260420_g25_Fly3_001_label",
82
- "FW_260420_g25_Fly4_001_label",
83
- "FW_260423_cs_Fly1_001_label",
84
- "FW_260423_cs_Fly2_001_label",
85
- "FW_260423_cs_Fly3_001_label",
86
- "FW_260423_cs_Fly4_001_label",
87
- "FW_260423_g25_Fly1_001_label",
88
- "FW_260424_g25_Fly1_001_label",
89
- "FW_260507_dfd_Fly1_001_label",
90
- "FW_260507_g25_Fly1_002",
91
- "FW_260507_g25_Fly2_001_label",
92
- "FW_260507_g25_Fly3_001_label",
93
- "FW_260508_g25_Fly1_001_label",
94
- "FW_260508_g25_Fly2_001_label",
95
- "FW_260508_g25_Fly3_001_label",
96
- "FW_260508_g25_Fly4_007_label",
97
- "IN07B001_260417_Fly3_003",
98
- "IN07B001_260417_Fly4_004",
99
- "IN07B001_260417_Fly4_005",
100
- "IN07B001_260417_Fly4_007",
101
- "IN07B007_260323_Fly3_002",
102
- "IN10B012_260319_Fly1_003",
103
- "IN10B012_260319_Fly1_006",
104
- "IN10B014_260317_Fly1_004",
105
- "IN10B014_260320_Fly2_003",
106
- "IN10B014_260320_Fly2_009",
107
- "IN14B010_251121_Fly3_003",
108
- "IN14B011_251126_Fly3_004",
109
- "IN19B038_260313_Fly3_003",
110
- "LTM-MN_251217_Fly1_003",
111
- "LTM-MN_260119_Fly3_003",
112
- "LTM-MN_260120_Fly3_003",
113
- "LTM-MN_260120_Fly3_006",
114
- "oldrig_demo",
115
- "scape_260417_IN07B001_Fly3_004",
116
- "scape_260417_IN07B001_Fly4_006"
117
- ],
118
- "holdout": [],
119
- "holdout_frames": {},
120
- "n_train_items": 4488,
121
- "augment": {
122
- "degrees": 12.0,
123
- "scale": [
124
- 1.0,
125
- 1.0
126
- ],
127
- "aspect": [
128
- 0.85,
129
- 1.18
130
- ],
131
- "translate": [
132
- 0.0,
133
- 0.0
134
- ],
135
- "flip_p": 0.5,
136
- "brightness": 0.3,
137
- "contrast": 0.3,
138
- "gamma": [
139
- 0.7,
140
- 1.4
141
- ],
142
- "blur_sigma": [
143
- 0.5,
144
- 1.5
145
- ],
146
- "noise_std": 0.03,
147
- "photometric_p": 0.5
148
- },
149
- "final_loss": 6.612265586853027,
150
- "holdout_report": null,
151
- "select_best": null,
152
- "best_step": null,
153
- "best_score": null
154
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260927_mvt_dinov3b_512_hexaview_fly38/README.md DELETED
@@ -1,30 +0,0 @@
1
- # `mvt_dinov3b_512_hexaview_fly38` -- the hexaview detector, round 11
2
-
3
- A deeperfly 2 detector (`deeperfly-detector-1`, family `mvt`): a multiview transformer on a DINOv3 ViT-B/16 that predicts all 38 points of the `fly38` skeleton in the six views of the hexaview rig -- two cameras, each seeing the arena directly and through two prisms. It windows each view on the fly frame by frame, and a video holds three views of one fly, so it runs with its locator, `260920_fast_efficientvit_b1_352_hexaview_locator`, beside it.
4
-
5
- Exported 2026-09-28 from `hexaview/runs/r11ship_all`, trained 2026-09-27: round 10's recipe unchanged, retrained on the labels of 2026-09-27.
6
-
7
- | | |
8
- |---|---|
9
- | file | `mvt_dinov3b_512_hexaview_fly38.pth`, 383,792,459 bytes |
10
- | sha256 | `a832147c1bef46006b7e034215467bca1505a0aba32a01e581db02e8fa8db285` |
11
- | skeleton | `fly38` -- `fly38.toml` beside this file |
12
- | backbone | `vit_base_patch16_dinov3.lvd1689m` (timm) |
13
- | input | 512x512 per view: a square window centered on the fly in each frame |
14
- | trained on | 16 hexaview recordings, 3,018 items (`report.json`); no holdout |
15
- | recipe | `config.toml` beside this file |
16
-
17
- ## What it scores
18
-
19
- No held-out number of its own: a shipping model trains on every label. On the deeperfly repository's `examples/hexaview/` clip (250 frames of `260819_002`), the pictorial 3D reprojects at 3.15 px median through the recording's calibration. That is agreement across the six views, not an error against labels.
20
-
21
- ## Using it
22
-
23
- ```toml
24
- [pose2d]
25
- weights = ["/mnt/upramdya/data/TL/deeperfly-models/260927_mvt_dinov3b_512_hexaview_fly38/mvt_dinov3b_512_hexaview_fly38.pth"]
26
- window = "per_frame"
27
- locator = "/mnt/upramdya/data/TL/deeperfly-models/260920_fast_efficientvit_b1_352_hexaview_locator/fast_efficientvit_b1_352_hexaview_locator.pth"
28
- ```
29
-
30
- Copying this directory to the machine that runs it and naming the local path is the better habit. Verify a copy with `sha256sum -c SHA256SUMS`.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260927_mvt_dinov3b_512_hexaview_fly38/SHA256SUMS DELETED
@@ -1,4 +0,0 @@
1
- 5aaa8857861800b1a797dc69a7da51838ebaa03059112f9608592f6e6dc11c3b ./config.toml
2
- 56f9a33ea5c286bda06e599602e7b7adaefb7ba29a74a2516548b7cbb7776e52 ./fly38.toml
3
- a832147c1bef46006b7e034215467bca1505a0aba32a01e581db02e8fa8db285 ./mvt_dinov3b_512_hexaview_fly38.pth
4
- d15e43352ce008d3e5365b6aa126d5849f59d88ea7dfbd94838647129c9995a2 ./report.json
 
 
 
 
 
260927_mvt_dinov3b_512_hexaview_fly38/config.toml DELETED
@@ -1,100 +0,0 @@
1
- # r11ship_all: round 11's hexaview ship -- r10ship_all's recipe unchanged, retrained on
2
- # the labels of 2026-09-27 (504 frames in 17 projects: the 10 of round 10 plus the 7
3
- # large-arena GE recordings kept after the desync audit) by the code of main 796ae43.
4
- # The split is still splits/r10_all.toml: its one exclusion, 260804_002 frame 29500,
5
- # is still labeled. 260730_001's realignment (2026-09-25) split its labeled frames
6
- # 441250 and 445750 into t-1 (top views only) and t (bottom views only); each is a
7
- # partially labeled moment, which the fill completes like any other. No holdout.
8
- #
9
- # `transductive = true` as in `r6ship_all`: the ship trains on every label, so a
10
- # teacher that has seen them all leaks nothing it does not already have.
11
-
12
- format_version = 3
13
-
14
- [data]
15
- kind = "project"
16
- projects = ["../recordings/*"]
17
- split = "../splits/r10_all.toml"
18
- cache = "../cache"
19
-
20
- [data.crops]
21
- tightness = [0.75, 2.2] # per-sample crop around the animal, log-uniform
22
- jitter = 0.1
23
- eval_tightness = 1.25
24
- full_p = 0.0 # see above: a whole video frame is not one view's
25
-
26
- [data.fill]
27
- weight = 0.25
28
- max_residual_px = 10.0
29
-
30
- [model]
31
- input_hw = [512, 512]
32
- family = "mvt"
33
- backbone = "vit_base_patch16_dinov3.lvd1689m"
34
- pretrained = true
35
- attn_scopes = "llllllllglgl"
36
- margin = 64
37
- reach = 2
38
- drop_path = 0.0
39
- token_mask = 0.0
40
- token_pad = 2
41
- init_from = "/home/tlam/deeperfly-projects/octacam/runs/mvt_dinov3/ship_vitb_distill_s0/model.pth"
42
-
43
- [augment]
44
- degrees = 180.0 # every view, day 1: a walking fly faces anywhere
45
- scale = [1.0, 1.0] # the crop sampler supplies scale and shift
46
- aspect = [0.85, 1.18]
47
- translate = [0.0, 0.0]
48
- flip_p = 0.5
49
- brightness = 0.3
50
- contrast = 0.3
51
- gamma = [0.7, 1.4]
52
- blur_sigma = [0.5, 1.5]
53
- noise_std = 0.03
54
- photometric_p = 0.5
55
-
56
- [train]
57
- grad_checkpoint = true
58
- steps = 5000
59
- images_per_batch = 24 # four 6-view moments per step
60
- grad_clip = 1.0
61
- amp = true
62
- ema_decay = 0.999
63
- view_drop_p = 0.3
64
- view_min = 1
65
- log_every = 100
66
- seed = 0
67
- out = "../runs/r11ship_all"
68
-
69
- [train.optimizer]
70
- lr = 1e-4
71
- weight_decay = 0.05
72
- warmup_steps = 500
73
-
74
- [train.loss]
75
- sigma = 2.0
76
- field_weight = 1.0
77
- coord_weight = 0.0
78
- tri_weight = 0.0 # the calibration's units are arbitrary
79
-
80
- [train.eval]
81
- every = 0
82
-
83
- [compute]
84
- workers = 8
85
-
86
- [unlabeled]
87
- # No `teacher`: the teacher's points, confidences and windows come from each
88
- # project's merged detections (ADR-0083): r10ship_all, or r10ship_all_realigned.
89
- n_per_project = 250
90
- transductive = true
91
- agree_px = 6.0
92
- min_views = 3
93
- conf_min = 0.3
94
- geom_weight = 0.3
95
- weight = 0.5
96
- mask_ratios = [0.0, 0.5, 0.9]
97
- masked_weight = 1.0
98
- unmasked_weight = 0.5
99
- crop_tightness = [0.75, 1.6]
100
- cache = "../cache/unlabeled"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260927_mvt_dinov3b_512_hexaview_fly38/fly38.toml DELETED
@@ -1,129 +0,0 @@
1
- # fly38 -- the 38 tracked points of a tethered Drosophila: six 5-point legs, two
2
- # antennae, the neck, and a 5-point dorsal-midline abdomen chain (the tergite stripes).
3
- #
4
- # A skeleton is points, edges and point_symmetries -- the same decomposition as SLEAP
5
- # and DeepLabCut -- plus an optional palette (point_colors / edge_colors). The palette
6
- # is decoration, not identity: it draws the points but is kept out of the digest, so
7
- # recoloring never reports a different skeleton.
8
-
9
- [skeleton]
10
- name = "fly38"
11
-
12
- # The points IN ORDER: channel i of the detector is points[i]. This is the contract
13
- # with the weights.
14
- points = [
15
- "lf_thorax_coxa", "lf_coxa_trochanter", "lf_femur_tibia", "lf_tibia_tarsus", "lf_pretarsus",
16
- "lm_thorax_coxa", "lm_coxa_trochanter", "lm_femur_tibia", "lm_tibia_tarsus", "lm_pretarsus",
17
- "lh_thorax_coxa", "lh_coxa_trochanter", "lh_femur_tibia", "lh_tibia_tarsus", "lh_pretarsus",
18
- "l_antenna",
19
- "rf_thorax_coxa", "rf_coxa_trochanter", "rf_femur_tibia", "rf_tibia_tarsus", "rf_pretarsus",
20
- "rm_thorax_coxa", "rm_coxa_trochanter", "rm_femur_tibia", "rm_tibia_tarsus", "rm_pretarsus",
21
- "rh_thorax_coxa", "rh_coxa_trochanter", "rh_femur_tibia", "rh_tibia_tarsus", "rh_pretarsus",
22
- "r_antenna",
23
- "neck",
24
- "abdomen0", "abdomen1", "abdomen2", "abdomen3", "abdomen4",
25
- ]
26
-
27
- # The edges, as pairs of points. The antennae and neck appear in no edge -- tracked
28
- # points with no bone.
29
- edges = [
30
- ["lf_thorax_coxa", "lf_coxa_trochanter"], ["lf_coxa_trochanter", "lf_femur_tibia"],
31
- ["lf_femur_tibia", "lf_tibia_tarsus"], ["lf_tibia_tarsus", "lf_pretarsus"],
32
- ["lm_thorax_coxa", "lm_coxa_trochanter"], ["lm_coxa_trochanter", "lm_femur_tibia"],
33
- ["lm_femur_tibia", "lm_tibia_tarsus"], ["lm_tibia_tarsus", "lm_pretarsus"],
34
- ["lh_thorax_coxa", "lh_coxa_trochanter"], ["lh_coxa_trochanter", "lh_femur_tibia"],
35
- ["lh_femur_tibia", "lh_tibia_tarsus"], ["lh_tibia_tarsus", "lh_pretarsus"],
36
- ["rf_thorax_coxa", "rf_coxa_trochanter"], ["rf_coxa_trochanter", "rf_femur_tibia"],
37
- ["rf_femur_tibia", "rf_tibia_tarsus"], ["rf_tibia_tarsus", "rf_pretarsus"],
38
- ["rm_thorax_coxa", "rm_coxa_trochanter"], ["rm_coxa_trochanter", "rm_femur_tibia"],
39
- ["rm_femur_tibia", "rm_tibia_tarsus"], ["rm_tibia_tarsus", "rm_pretarsus"],
40
- ["rh_thorax_coxa", "rh_coxa_trochanter"], ["rh_coxa_trochanter", "rh_femur_tibia"],
41
- ["rh_femur_tibia", "rh_tibia_tarsus"], ["rh_tibia_tarsus", "rh_pretarsus"],
42
- ["abdomen0", "abdomen1"], ["abdomen1", "abdomen2"], ["abdomen2", "abdomen3"], ["abdomen3", "abdomen4"],
43
- ]
44
-
45
- # What each point becomes under a left/right flip. Write each pair once; anything absent
46
- # is on the midline and maps to itself (hence no neck, no abdomen). The loader checks
47
- # the implied mirror against `edges`: applying it must give the edge set back, so a
48
- # wrong side or two joints of one leg exchanged is named rather than trained on silently.
49
- point_symmetries = [
50
- ["lf_thorax_coxa", "rf_thorax_coxa"],
51
- ["lf_coxa_trochanter", "rf_coxa_trochanter"],
52
- ["lf_femur_tibia", "rf_femur_tibia"],
53
- ["lf_tibia_tarsus", "rf_tibia_tarsus"],
54
- ["lf_pretarsus", "rf_pretarsus"],
55
- ["lm_thorax_coxa", "rm_thorax_coxa"],
56
- ["lm_coxa_trochanter", "rm_coxa_trochanter"],
57
- ["lm_femur_tibia", "rm_femur_tibia"],
58
- ["lm_tibia_tarsus", "rm_tibia_tarsus"],
59
- ["lm_pretarsus", "rm_pretarsus"],
60
- ["lh_thorax_coxa", "rh_thorax_coxa"],
61
- ["lh_coxa_trochanter", "rh_coxa_trochanter"],
62
- ["lh_femur_tibia", "rh_femur_tibia"],
63
- ["lh_tibia_tarsus", "rh_tibia_tarsus"],
64
- ["lh_pretarsus", "rh_pretarsus"],
65
- ["l_antenna", "r_antenna"],
66
- ]
67
-
68
- # The palette. One #rrggbb per point; a key is a point name or a `*` pattern (an exact
69
- # name beats a pattern). Optional and may be partial -- an unnamed point takes tab10 by
70
- # index. The scheme is anatomical, so it reads at a glance: left = blue, right = red,
71
- # front -> hind lightening within a side; the midline neck and abdomen green. Edges take
72
- # the average of their endpoints, so every leg bone comes out its own limb's color.
73
- [skeleton.point_colors]
74
- "lf_*" = "#0f7399"
75
- "lm_*" = "#1a8daf"
76
- "lh_*" = "#75becb"
77
- l_antenna = "#0a4f6b"
78
- "rf_*" = "#ba1e31"
79
- "rm_*" = "#c9564f"
80
- "rh_*" = "#d58579"
81
- r_antenna = "#8c1525"
82
- neck = "#15a315"
83
- "abdomen*" = "#61e47b"
84
-
85
- # A canonical neutral posture (NeuroMechFly's rest pose), one [x, y, z] per point
86
- # in millimeters, with the body center of mass at the origin (x anterior, y the
87
- # left-right axis, z dorsal). It is NOT part of the skeleton's identity (out of the
88
- # digest); it draws the skeleton in 3D and SEEDS labeling: projected through a
89
- # recording's calibration it drops a rough draggable instance into each view when
90
- # nothing else (a prior labeled frame, another view) is available to seed from.
91
- [skeleton.default_pose]
92
- lf_thorax_coxa = [ 0.42966, 0.17200, 0.25226]
93
- lf_coxa_trochanter = [ 0.31028, 0.06883, -0.07688]
94
- lf_femur_tibia = [ 0.85227, 0.42043, 0.20537]
95
- lf_tibia_tarsus = [ 1.05606, 0.65936, -0.20658]
96
- lf_pretarsus = [ 1.45133, 1.02885, -0.58856]
97
- lm_thorax_coxa = [ 0.03366, 0.12500, 0.00026]
98
- lm_coxa_trochanter = [ 0.00831, 0.09367, -0.17620]
99
- lm_femur_tibia = [ 0.11746, 0.70120, 0.30719]
100
- lm_tibia_tarsus = [ 0.23055, 0.96680, -0.29411]
101
- lm_pretarsus = [ 0.38484, 1.49119, -0.73358]
102
- lh_thorax_coxa = [-0.19334, 0.08700, -0.01474]
103
- lh_coxa_trochanter = [-0.27402, 0.09655, -0.19640]
104
- lh_femur_tibia = [-0.64760, 0.63110, 0.32665]
105
- lh_tibia_tarsus = [-0.96496, 0.77982, -0.26073]
106
- lh_pretarsus = [-1.40791, 1.03885, -0.86325]
107
- l_antenna = [ 1.04836, 0.08600, 0.56596]
108
- rf_thorax_coxa = [ 0.42966, -0.17200, 0.25226]
109
- rf_coxa_trochanter = [ 0.31028, -0.06883, -0.07688]
110
- rf_femur_tibia = [ 0.85227, -0.42043, 0.20537]
111
- rf_tibia_tarsus = [ 1.05606, -0.65936, -0.20658]
112
- rf_pretarsus = [ 1.45133, -1.02885, -0.58856]
113
- rm_thorax_coxa = [ 0.03366, -0.12500, 0.00026]
114
- rm_coxa_trochanter = [ 0.00831, -0.09367, -0.17620]
115
- rm_femur_tibia = [ 0.11746, -0.70120, 0.30719]
116
- rm_tibia_tarsus = [ 0.23055, -0.96680, -0.29411]
117
- rm_pretarsus = [ 0.38484, -1.49119, -0.73358]
118
- rh_thorax_coxa = [-0.19334, -0.08700, -0.01474]
119
- rh_coxa_trochanter = [-0.27402, -0.09655, -0.19640]
120
- rh_femur_tibia = [-0.64760, -0.63110, 0.32665]
121
- rh_tibia_tarsus = [-0.96496, -0.77982, -0.26073]
122
- rh_pretarsus = [-1.40791, -1.03885, -0.86325]
123
- r_antenna = [ 1.04836, -0.08600, 0.56596]
124
- neck = [ 0.61936, 0.00000, 0.48296]
125
- abdomen0 = [-0.71698, 0.00000, 0.71444]
126
- abdomen1 = [-0.91268, 0.00000, 0.66169]
127
- abdomen2 = [-1.10060, 0.00000, 0.61850]
128
- abdomen3 = [-1.27163, 0.00000, 0.56551]
129
- abdomen4 = [-1.48737, 0.00000, 0.46364]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260927_mvt_dinov3b_512_hexaview_fly38/report.json DELETED
@@ -1,75 +0,0 @@
1
- {
2
- "projects": {
3
- "260730_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260730_001/deeperfly",
4
- "260804_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260804_001/deeperfly",
5
- "260804_002": "/home/tlam/deeperfly-projects/hexaview/recordings/260804_002/deeperfly",
6
- "260804_003": "/home/tlam/deeperfly-projects/hexaview/recordings/260804_003/deeperfly",
7
- "260804_004": "/home/tlam/deeperfly-projects/hexaview/recordings/260804_004/deeperfly",
8
- "260818_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260818_001/deeperfly",
9
- "260819_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260819_001/deeperfly",
10
- "260819_002": "/home/tlam/deeperfly-projects/hexaview/recordings/260819_002/deeperfly",
11
- "260819_003": "/home/tlam/deeperfly-projects/hexaview/recordings/260819_003/deeperfly",
12
- "260821_002": "/home/tlam/deeperfly-projects/hexaview/recordings/260821_002/deeperfly",
13
- "260916_Fly10_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260916_Fly10_001/deeperfly",
14
- "260916_Fly1_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260916_Fly1_001/deeperfly",
15
- "260916_Fly3_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260916_Fly3_001/deeperfly",
16
- "260916_Fly5_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260916_Fly5_001/deeperfly",
17
- "260916_Fly6_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260916_Fly6_001/deeperfly",
18
- "260916_Fly9_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260916_Fly9_001/deeperfly",
19
- "260917_Fly8_001": "/home/tlam/deeperfly-projects/hexaview/recordings/260917_Fly8_001/deeperfly"
20
- },
21
- "train_projects": [
22
- "260730_001",
23
- "260804_001",
24
- "260804_002",
25
- "260804_003",
26
- "260804_004",
27
- "260818_001",
28
- "260819_001",
29
- "260819_002",
30
- "260819_003",
31
- "260821_002",
32
- "260916_Fly10_001",
33
- "260916_Fly1_001",
34
- "260916_Fly3_001",
35
- "260916_Fly5_001",
36
- "260916_Fly9_001",
37
- "260917_Fly8_001"
38
- ],
39
- "holdout": [],
40
- "holdout_frames": {},
41
- "n_train_items": 3018,
42
- "augment": {
43
- "degrees": 180.0,
44
- "scale": [
45
- 1.0,
46
- 1.0
47
- ],
48
- "aspect": [
49
- 0.85,
50
- 1.18
51
- ],
52
- "translate": [
53
- 0.0,
54
- 0.0
55
- ],
56
- "flip_p": 0.5,
57
- "brightness": 0.3,
58
- "contrast": 0.3,
59
- "gamma": [
60
- 0.7,
61
- 1.4
62
- ],
63
- "blur_sigma": [
64
- 0.5,
65
- 1.5
66
- ],
67
- "noise_std": 0.03,
68
- "photometric_p": 0.5
69
- },
70
- "final_loss": 7.084183692932129,
71
- "holdout_report": null,
72
- "select_best": null,
73
- "best_step": null,
74
- "best_score": null
75
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
README.md CHANGED
@@ -17,15 +17,27 @@ tags:
17
 
18
  # deeperfly detectors
19
 
20
- Pretrained 2D keypoint detectors for [deeperfly](https://github.com/NeLy-EPFL/deeperfly), markerless 3D pose estimation of *Drosophila* from multi-camera rigs. They include the detectors the example run configs in the deeperfly repository name, all trained in the [Ramdya lab](https://www.epfl.ch/labs/ramdya-lab/) at EPFL on hand labels from two rigs.
21
 
22
  | Folder | Rig | What it is | Backbone | Trained on |
23
  | --- | --- | --- | --- | --- |
24
- | `261008_mvt_dinov3b_384_octacam_fly38` | octacam: eight cameras around a tethered fly on a ball | **the current octacam detector** (round 14): multiview transformer, all 38 `fly38` keypoints in every view, 384x768 window per view | DINOv3 ViT-B/16 | 62 recordings, 4,703 labeled items |
25
- | `260927_mvt_dinov3b_384_octacam_fly38` | octacam | the previous octacam detector (round 11), same architecture; the deeperfly repository's example config names it | DINOv3 ViT-B/16 | 56 recordings, 4,488 labeled items |
26
- | `261001_mvt_dinov3b_512_hexaview_fly38` | hexaview: two cameras, each seeing a freely walking fly directly and through two prisms (six views) | **the current hexaview detector** (round 13), for one fly: multiview transformer, 38 keypoints, 512x512 window centered on the fly in each frame; run it at `[pose2d] tightness = 1.2` | DINOv3 ViT-B/16 | 17 recordings, 3,240 labeled items |
27
- | `260927_mvt_dinov3b_512_hexaview_fly38` | hexaview | the previous hexaview detector (round 11), same architecture | DINOv3 ViT-B/16 | 16 recordings, 3,018 labeled items |
28
- | `260920_fast_efficientvit_b1_352_hexaview_locator` | hexaview | full-frame locator that places the hexaview detectors' windows (still the current one) | EfficientViT-B1 | 9 recordings, 824 labeled items |
 
 
 
 
 
 
 
 
 
 
 
 
29
 
30
  Each folder holds the checkpoint (`.pth`), the skeleton it predicts (`fly38.toml`), the training recipe (`config.toml`), the training report (`report.json`), `SHA256SUMS`, and a `README.md` written when the model was exported. The paths in those READMEs are the lab's; use the instructions below instead.
31
 
@@ -37,7 +49,7 @@ From the root of a deeperfly clone, where the example configs expect them:
37
  uv run hf download tkclam/deeperfly-models --local-dir models
38
  ```
39
 
40
- One model only, such as the current octacam detector:
41
 
42
  ```bash
43
  uv run hf download tkclam/deeperfly-models --local-dir models \
@@ -59,7 +71,7 @@ Paths resolve against the config file. See the [deeperfly quickstart](https://ne
59
 
60
  ## Scope and limitations
61
 
62
- The detectors were trained on recordings from two rigs in one lab, with every label used for training (no held-out set). The current octacam detector's twin, trained with four recordings held out, scores 3.25 px median and 4.49 px mean on their 9,269 labeled cells (93.7% within 10 px). On the bundled example clips, the octacam detector reprojects at 1.46 px median after bundle adjustment and the hexaview detector at 3.00 px median through the recording's calibration; that is agreement across views, not error against labels. They are not expected to transfer to other rigs, magnifications, or lighting without retraining. `deeperfly train` fits a detector on your own labels, and these checkpoints can serve as a starting point.
63
 
64
  ## License
65
 
 
17
 
18
  # deeperfly detectors
19
 
20
+ Pretrained 2D keypoint detectors for [deeperfly](https://github.com/NeLy-EPFL/deeperfly), markerless 3D pose estimation of *Drosophila* from multi-camera rigs. They are the detectors the example run configs in the deeperfly repository name, all trained in the [Ramdya lab](https://www.epfl.ch/labs/ramdya-lab/) at EPFL on hand labels from two rigs.
21
 
22
  | Folder | Rig | What it is | Backbone | Trained on |
23
  | --- | --- | --- | --- | --- |
24
+ | `261008_mvt_dinov3b_384_octacam_fly38` | octacam: eight cameras around a tethered fly on a ball | the octacam detector (round 14): multiview transformer, all 38 `fly38` keypoints in every view, 384x768 window per view | DINOv3 ViT-B/16 | 62 recordings, 4,703 labeled items |
25
+ | `261001_mvt_dinov3b_512_hexaview_fly38` | hexaview: two cameras, each seeing a freely walking fly directly and through two prisms (six views) | the hexaview detector (round 13), for one fly: multiview transformer, 38 keypoints, 512x512 window centered on the fly in each frame; run it at `[pose2d] tightness = 1.2` | DINOv3 ViT-B/16 | 17 recordings, 3,240 labeled items |
26
+ | `260920_fast_efficientvit_b1_352_hexaview_locator` | hexaview | full-frame locator that places the hexaview detector's windows | EfficientViT-B1 | 9 recordings, 824 labeled items |
27
+
28
+ A real-time octacam detector is in training and will be added here.
29
+
30
+ ### Expected input
31
+
32
+ Each detector expects frames like these, from the example clips in the deeperfly repository; the dashed boxes are its windows, and the skeleton is what it predicts. [Pretrained models](https://nely-epfl.github.io/deeperfly/stable/models/) in the deeperfly docs describes both rigs.
33
+
34
+ **octacam**
35
+
36
+ ![One frame of each octacam camera, with the detector's window and its predicted keypoints](https://huggingface.co/tkclam/deeperfly-models/resolve/main/assets/octacam.jpg)
37
+
38
+ **hexaview**
39
+
40
+ ![The top and bottom hexaview frames with the six view windows, and each window as the detector reads it](https://huggingface.co/tkclam/deeperfly-models/resolve/main/assets/hexaview.jpg)
41
 
42
  Each folder holds the checkpoint (`.pth`), the skeleton it predicts (`fly38.toml`), the training recipe (`config.toml`), the training report (`report.json`), `SHA256SUMS`, and a `README.md` written when the model was exported. The paths in those READMEs are the lab's; use the instructions below instead.
43
 
 
49
  uv run hf download tkclam/deeperfly-models --local-dir models
50
  ```
51
 
52
+ One model only, such as the octacam detector:
53
 
54
  ```bash
55
  uv run hf download tkclam/deeperfly-models --local-dir models \
 
71
 
72
  ## Scope and limitations
73
 
74
+ The detectors were trained on recordings from two rigs in one lab, with every label used for training (no held-out set). The octacam detector's twin, trained with four recordings held out, scores 3.25 px median and 4.49 px mean on their 9,269 labeled cells (93.7% within 10 px). On the bundled example clips, the octacam detector reprojects at 1.46 px median after bundle adjustment and the hexaview detector at 3.00 px median through the recording's calibration; that is agreement across views, not error against labels. They are not expected to transfer to other rigs, magnifications, or lighting without retraining. `deeperfly train` fits a detector on your own labels, and these checkpoints can serve as a starting point.
75
 
76
  ## License
77
 
260927_mvt_dinov3b_384_octacam_fly38/mvt_dinov3b_384_octacam_fly38.pth → assets/hexaview.jpg RENAMED
File without changes
260927_mvt_dinov3b_512_hexaview_fly38/mvt_dinov3b_512_hexaview_fly38.pth → assets/octacam.jpg RENAMED
File without changes