
Hm0360 breakout
NUBIVlab/SpiderCam
[CVPR 2026] SpiderCam: Low-power Snapshot Depth from Differential Defocus

[CVPR 2026] SpiderCam: Low-power Snapshot Depth from Differential Defocus
Ecp5-fpc adapter is an open-source printed circuit board by NUBIVlab, from the NUBIVlab/SpiderCam repository on GitHub, published under the MIT licence. It is a 4-layer board of 47.5 × 67 mm with 54 parts on 73 nets, routed with 872 tracks and 113 vias.
It is built around the TPS62841DLCR. Its parts include 14 resistors, 10 capacitors, 7 connectors, 3 ICs and 2 inductors. It belongs with the fPGA and programmable logic and interfaces and adapters boards and the FPGA and CPLD boards of this library.
Marcos A. Ferreira*,1, Tianao Li*,1, John Mamish*,2, Josiah Hester2, Yaman Sangar2, Qi Guo3, Emma Alexander1
1Northwestern University, 2Georgia Institute of Technology, 3Purdue University, *Equal contribution.
IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2026
Official code for SpiderCam: Low-Power Snapshot Depth from Differential Defocus.

| Path | Contents |
|---|---|
configs/, datasets/, models/, utils/ | Hydra configs and DfDD training / inference code |
serialcam_ft232h/ | Live FT232H stream viewer and on-device DfDD parameter UI |
fpga/ | FPGA RTL (see fpga/README.md) |
pcb/ | PCB layouts |
3d_printed_parts/ | Printable enclosure parts |
To install required packages:
pip install -r requirements.txtPoint data_path in a config under configs/data/ to your capture directory. Each group folder should contain paired frames:
cam_1_500_480_{idx}.png — near-focus (+) imagecam_0_500_480_{idx}.png — far-focus (-) imageCrop, frame range, depth step/offset, and image center are set in the same YAML (see e.g. configs/data/11-06.yaml).
Defaults live in configs/model/focal_split.yaml. Override any of them on the CLI with Hydra (model.<key>=...).
| Parameter | Options / typical values | Meaning |
|---|---|---|
model.n_scales | 1 or 2 | Number of Laplacian-pyramid levels. Depth is estimated at each scale and fused; 2 is the paper default and improves robustness across texture frequencies. |
model.dxdy | true / false | If true, append spatial derivatives (∂/∂x, ∂/∂y) of V and W as extra channels before fusion (3 channels per scale). Helps on oriented textures. |
model.const | rings, universal, radial, polynomial, pixel-grid | How optical constants A and B vary over the field of view (see below). |
model.n_rings | e.g. 16 | Used when const=rings: number of concentric annuli with a shared (A, B) per ring. |
model.n_orders | e.g. 2 | Used when const=radial or polynomial: polynomial degree of the radial / 2D field. |
model.conf | VW, W2, V, W | Confidence map used for sparsity filtering and (in separate mode) scale fusion. |
model.mode | joint / separate | How multi-channel estimates are fused (see below). |
Optical constants (model.const). DfDD recovers depth from a linear combination of the image Laplacian and the differential image, with learnable maps A and B (one pair per scale):
universal — single scalar (A, B) per scale (spatially constant; ablation / simplest FPGA mapping).rings — piecewise-constant (A, B) on concentric rings about data.center (paper default; matches on-device zone tables).radial — A(r), B(r) as low-order polynomials in image radius.polynomial — full 2D polynomial in (x, y).pixel-grid — independent (A, B) at every pixel (most flexible, heaviest).Confidence (model.conf). With numerator/denominator terms built from V and W:
VW — confidence ∝ V·W (paper default; aligns with the depth numerator).W2 — confidence ∝ W² (denominator energy).V / W — confidence ∝ |V| or |W|.Higher confidence pixels are kept when evaluating at a given sparsity (see optim.sparsity).
Fusion (model.mode). Softmax weights ω combine channels across scales (and dx/dy if enabled):
joint — fuse numerator and denominator first, then divide (more stable; default).separate — form a depth map per channel, then confidence-weighted average.Paper setting (recommended start):
model.n_scales=2 model.dxdy=true model.mode=joint model.const=rings model.n_rings=16 model.conf=VWCalibrate / train optical constants with Hydra overrides:
python train_focal_split.py data=11-06 data.group=texture1 \
model.n_scales=2 model.dxdy=true model.mode=joint model.const=rings model.n_rings=16 \
model.conf=VWCheckpoints and logs are written under ./results/. For the full ablation suite used in the paper, see train.sh.
After training, run inference with the same data/model/optim settings (must match the trained checkpoint path):
python run_focal_split.py data=11-06 data.group=texture1 \
model.n_scales=2 model.dxdy=true model.mode=joint model.const=rings model.n_rings=16 \
model.conf=VWThis loads checkpoint_{n_epochs}epochs.pth, reports MAE/MSE and working range at several sparsities, and saves heatmaps / depth maps under ./results/.
With the SpiderCam FPGA connected over FT232H:
python serialcam_ft232h/serialcam_stream_ft232h.pyRequires the serialcam stack (PyQt5, ftd2xx). Use Set DfDD Parameters in the viewer to push A/B/ω and confidence thresholds to the device.
@InProceedings{ferreira2026spidercam,
author = {Ferreira, Marcos A. and Li, Tianao and Mamish, John and Hester, Josiah and Sangar, Yaman and Guo, Qi and Alexander, Emma},
title = {SpiderCam: Low-Power Snapshot Depth from Differential Defocus},
booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
month = {June},
year = {2026},
pages = {41699-41709}
}This research was partially supported by the National Science Foundation under award numbers CNS-2430327 and CCF-2431505. Any opinions, findings, conclusions, or recommendations expressed in this material are those of the authors and do not necessarily reflect the views of the National Science Foundation or other supporters. We would also like to thank Junjie Luo and Alan Fu for helpful discussions.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 11 | Jumper_2_Small_Open | Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm | JP1, JP4, JP5, JP7, JP8, JP9, JP10, JP11, JP12, JP13, JP15 |
| 6 | 1u | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C5, C6, C7, C8, C9, C10 |
| 4 | 100k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R12, R14, R19, R21 |
| 4 | 10k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R4, R5, R6, R7 |
| 4 | 10u | Capacitor_SMD:C_0603_1608Metric_Pad1.08x0.95mm_HandSolder | C1, C2, C3, C4 |
| 4 | Jumper_2_Small_Bridged | Jumper:SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm | JP2, JP3, JP6, JP14 |
| 3 | 0 | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R15, R20, R26 |
| 3 | Conn_01x02_Pin | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J5, J6, J7 |
| 3 | LOGO | LOGO | G***, G***, G*** |
| 2 | 2.2u | L_2016:IND_DFE2016_MUR | L1, L2 |
| 2 | 5051103091 | molex_5051:CON_5051103091_MOL | J3, J4 |
| 2 | Conn_02x20_Odd_Even | Connector_PinHeader_2.54mm:PinHeader_2x20_P2.54mm_Vertical | J1, J2 |
| 2 | TPS62841DLCR | tps62840:VSON8_2P1X1P6_TEX | U1, U2 |
| 1 | 12k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R22 |
| 1 | 28.7k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R13 |
| 1 | 2k | Resistor_SMD:R_0603_1608Metric_Pad0.98x0.95mm_HandSolder | R23 |
| 1 | AP7331-SNG-7 | AP7331-SNG-7:DFN200X200X60-8N | U3 |

NUBIVlab/SpiderCam
[CVPR 2026] SpiderCam: Low-power Snapshot Depth from Differential Defocus

gusmanb/logicanalyzer
24 channel, 100Msps logic analyzer hardware and software

polpo/picogus
Emulation of ISA sound cards and CD-ROM on Raspberry Pi Pico (GUS, SB/Adlib, MPU-401, Tandy, CMS, Panasonic CD-ROM) with USB mouse/joystick support


loxodes/vna
Under development open hardware microwave vector network analyzer

cnlohr/cnhardware
My dumping grounds for all my kicad projects and random hardware bringup.


jpconstantineau/NRF52-Board
This Repository is a collection of NRF5x boards.

i2cjak/Framework_Expansion_Cards
In which i2cjak creates a new expansion card design every day until he is given a NICE Framework laptop
It measures 47.5 × 67 mm and has 4 copper layers, 1.6 mm thick.
54 parts, built around the TPS62841DLCR. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the NUBIVlab/SpiderCam repository on GitHub, at the commit this page was made from: the board is pcb/ecp5-fpc-adapter/ecp5-fpc-adapter.kicad_pcb and its schematic pcb/ecp5-fpc-adapter/ecp5-fpc-adapter.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).