[{"data":1,"prerenderedAt":29},["ShallowReactive",2],{"chapter:vision-rs\u002Fcore-concepts\u002Fyolo26-architecture.json":3},{"project":4,"route":5,"title":6,"titleHtml":6,"navTitle":6,"part":7,"sourcePath":8,"editUrl":9,"html":10,"toc":11,"hasMermaid":22,"prev":23,"next":26},"vision-rs","\u002Fvision-rs\u002Fcore-concepts\u002Fyolo26-architecture","The YOLO26 Model","Core Concepts","core-concepts\u002Fyolo26-architecture.md","https:\u002F\u002Fgithub.com\u002Fteenygrad\u002Fvision-rs\u002Fedit\u002Fmain\u002Fbook\u002Fsrc\u002Fcore-concepts\u002Fyolo26-architecture.md","\u003Cp>\u003Ccode>vision_rs::models::yolo::yolo26\u003C\u002Fcode> implements\n\u003Ccode>ultralytics\u002Fcfg\u002Fmodels\u002F26\u002Fyolo26.yaml\u003C\u002Fcode>: a CSP-style backbone, an FPN neck,\nand one or two detection heads, with \u003Ccode>reg_max = 1\u003C\u002Fcode> (YOLO26 drops DFL\ncompared to earlier YOLO versions).\u003C\u002Fp>\n\u003Ch2 id=\"variants\">Variants\u003C\u002Fh2>\n\u003Cpre data-lang=\"rust\" class=\"shiki teeny-datasheet\" style=\"background-color:#16181a;color:#e6e8e3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF5F9E\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#FF5F9E\"> enum\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> Yolo26Variant\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> N\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\">,\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> S\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\">,\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> M\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\">,\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> L\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\">,\u003C\u002Fspan>\u003Cspan style=\"color:#B79AD4\"> XL\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Each variant has a \u003Ccode>depth\u003C\u002Fcode>\u002F\u003Ccode>width\u003C\u002Fcode>\u002F\u003Ccode>mc\u003C\u002Fcode> (max channels) scaling triple,\nreturned by \u003Ccode>Yolo26Variant::config()\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Variant\u003C\u002Fth>\n\u003Cth>depth\u003C\u002Fth>\n\u003Cth>width\u003C\u002Fth>\n\u003Cth>max channels\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>N\u003C\u002Ftd>\n\u003Ctd>0.5\u003C\u002Ftd>\n\u003Ctd>0.25\u003C\u002Ftd>\n\u003Ctd>1024\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>S\u003C\u002Ftd>\n\u003Ctd>0.5\u003C\u002Ftd>\n\u003Ctd>0.50\u003C\u002Ftd>\n\u003Ctd>1024\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>M\u003C\u002Ftd>\n\u003Ctd>0.5\u003C\u002Ftd>\n\u003Ctd>1.00\u003C\u002Ftd>\n\u003Ctd>512\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>L\u003C\u002Ftd>\n\u003Ctd>1.0\u003C\u002Ftd>\n\u003Ctd>1.00\u003C\u002Ftd>\n\u003Ctd>512\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>XL\u003C\u002Ftd>\n\u003Ctd>1.0\u003C\u002Ftd>\n\u003Ctd>1.50\u003C\u002Ftd>\n\u003Ctd>512\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Two helper functions scale the yaml’s base values by these multipliers:\n\u003Ccode>ch(base, width, mc)\u003C\u002Fcode> scales a channel count (capped at \u003Ccode>mc\u003C\u002Fcode>), and\n\u003Ccode>rep(base, depth)\u003C\u002Fcode> scales a block repeat count (minimum 1).\u003C\u002Fp>\n\u003Ch2 id=\"backbone--fpn-neck\">Backbone + FPN neck\u003C\u002Fh2>\n\u003Cp>\u003Ccode>build_neck\u003C\u002Fcode> constructs the shared backbone and neck, returning a closure\n\u003Ccode>Fn(SymTensor) -&gt; (SymTensor, SymTensor, SymTensor)\u003C\u002Fcode> producing the three FPN\nfeature maps \u003Ccode>(p3d, p4d, p5d)\u003C\u002Fcode> at strides 8\u002F16\u002F32, plus the three\ncorresponding channel widths.\u003C\u002Fp>\n\u003Cpre class=\"mermaid\" data-mermaid>graph TD\n    In[Input image] --&gt; L0[&quot;conv (stride 2)&quot;] --&gt; L1[&quot;conv (stride 2)&quot;]\n    L1 --&gt; L2[c3k2] --&gt; L3[&quot;conv (stride 2)&quot;]\n    L3 --&gt; L4[c3k2] --&gt; P3[&quot;p3 (stride 8)&quot;]\n    P3 --&gt; L5[&quot;conv (stride 2)&quot;] --&gt; L6[c3k2] --&gt; P4[&quot;p4 (stride 16)&quot;]\n    P4 --&gt; L7[&quot;conv (stride 2)&quot;] --&gt; L8[c3k2] --&gt; L9[sppf] --&gt; L10[c2psa] --&gt; P5[&quot;p5 (stride 32)&quot;]\n\n    P5 --&gt; Up1[upsample] --&gt; Cat1[concat with p4]\n    Cat1 --&gt; L13[c3k2] --&gt; Nk4[nk4]\n    Nk4 --&gt; Up2[upsample] --&gt; Cat2[concat with p3]\n    Cat2 --&gt; L16[c3k2] --&gt; P3D[&quot;p3d (to head)&quot;]\n    P3D --&gt; L17[&quot;conv (stride 2)&quot;] --&gt; Cat3[concat with nk4]\n    Cat3 --&gt; L19[c3k2] --&gt; P4D[&quot;p4d (to head)&quot;]\n    P4D --&gt; L20[&quot;conv (stride 2)&quot;] --&gt; Cat4[concat with p5]\n    Cat4 --&gt; L22[c3k2_psa] --&gt; P5D[&quot;p5d (to head)&quot;]\n\u003C\u002Fpre>\n\u003Cp>Every layer is wrapped in a \u003Ccode>name_scope\u003C\u002Fcode> matching its yaml layer index\n(\u003Ccode>model.0\u003C\u002Fcode> through \u003Ccode>model.22\u003C\u002Fcode>) — this is what lets weight loading map a\npretrained checkpoint’s parameter names onto the traced graph.\u003C\u002Fp>\n\u003Cp>Blocks (see \u003Ca href=\"https:\u002F\u002Fdocs.rs\u002Fvision-rs\u002Flatest\u002Fvision_rs\u002Fmodels\u002Fyolo\u002Fyolo26\u002Fblocks\u002Findex.html\" target=\"_blank\" rel=\"noopener noreferrer\">\u003Ccode>models::yolo::yolo26::blocks\u003C\u002Fcode>\u003C\u002Fa>):\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>conv\u003C\u002Fcode>\u003C\u002Fstrong> — Conv2d + BatchNorm + activation.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>c3k2\u003C\u002Fcode>\u003C\u002Fstrong> — the CSP bottleneck variant used throughout backbone\u002Fneck.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>c2psa\u003C\u002Fcode>\u003C\u002Fstrong> \u002F \u003Cstrong>\u003Ccode>c3k2_psa\u003C\u002Fcode>\u003C\u002Fstrong> — cross-stage-partial blocks with\nposition-sensitive attention (see \u003Ca href=\"\u002Fvision-rs\u002Fkernels-and-performance\u002Fcustom-kernels\">Custom Kernels\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>sppf\u003C\u002Fcode>\u003C\u002Fstrong> — Spatial Pyramid Pooling - Fast.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>upsample\u003C\u002Fcode>\u003C\u002Fstrong> \u002F \u003Cstrong>\u003Ccode>concat\u003C\u002Fcode>\u003C\u002Fstrong> — nearest-neighbor upsampling and\nchannel-wise concatenation, used to build the FPN top-down path.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"detection-heads\">Detection heads\u003C\u002Fh2>\n\u003Cpre data-lang=\"rust\" class=\"shiki teeny-datasheet\" style=\"background-color:#16181a;color:#e6e8e3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FF5F9E\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#FF5F9E\"> enum\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> DetectHead\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\"> {\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> OneToMany\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\">,\u003C\u002Fspan>\u003Cspan style=\"color:#6FBF98\"> OneToOne\u003C\u002Fspan>\u003Cspan style=\"color:#8A9088\"> }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>OneToMany\u003C\u002Fcode> binds to the \u003Ccode>cv2\u003C\u002Fcode>\u002F\u003Ccode>cv3\u003C\u002Fcode> weight namespace (the dense training\nhead); \u003Ccode>OneToOne\u003C\u002Fcode> binds to \u003Ccode>one2one_cv2\u003C\u002Fcode>\u002F\u003Ccode>one2one_cv3\u003C\u002Fcode> (the head used for\ninference, matching ultralytics eval-mode mAP). \u003Ccode>yolo26(nc, variant, head)\u003C\u002Fcode>\nbuilds a single-head forward closure producing raw \u003Ccode>DetectOutput { boxes, scores }\u003C\u002Fcode> (training-mode layout — apply detect-decode with the anchor\ngrid\u002Fstrides for inference-ready boxes; see\n\u003Ca href=\"\u002Fvision-rs\u002Fkernels-and-performance\u002Fcustom-kernels\">Custom Kernels\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>\u003Ccode>yolo26_dual(nc, variant)\u003C\u002Fcode> traces \u003Cstrong>both\u003C\u002Fstrong> heads in one graph, sharing the\nbackbone\u002Fneck, for dual-assignment training — see\n\u003Ca href=\"\u002Fvision-rs\u002Fcore-concepts\u002Ftraining\">Training\u003C\u002Fa>.\u003C\u002Fp>\n",[12,16,19],{"id":13,"text":14,"level":15},"variants","Variants",2,{"id":17,"text":18,"level":15},"backbone--fpn-neck","Backbone + FPN neck",{"id":20,"text":21,"level":15},"detection-heads","Detection heads",true,{"title":24,"titleHtml":24,"route":25},"The Detection API","\u002Fvision-rs\u002Fcore-concepts\u002Fdetection-api",{"title":27,"titleHtml":27,"route":28},"Training","\u002Fvision-rs\u002Fcore-concepts\u002Ftraining",1786271830472]