{"id":1731,"date":"2026-11-11T15:11:06","date_gmt":"2026-11-11T15:11:06","guid":{"rendered":"https:\/\/q2label.com\/?page_id=1731"},"modified":"2026-11-11T15:11:06","modified_gmt":"2026-11-11T15:11:06","slug":"q2label-2","status":"publish","type":"page","link":"https:\/\/q2label.com\/","title":{"rendered":"q2label"},"content":{"rendered":"\n<style>\n#q2{--ink:#14271f; --muted:#52655c; --bg:#fff; --paper:#f4f7f3; --line:#d9e5dc; --dark:#0c231b; --dark-2:#15362a; --dark-line:#3d6350; --mint:#68ec9d; --mint-deep:#187b4c; --amber:#e8ac58; --note:#fff8e9; --max:1160px; --sans:Inter,\"Segoe UI\",Arial,sans-serif; --mono:\"SFMono-Regular\",Consolas,\"Liberation Mono\",monospace;}\n#q2 *{box-sizing:border-box}\nhtml{scroll-behavior:smooth}\n#q2{margin:0;font:400 16px\/1.6 var(--sans);color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased}\n#q2 a{color:inherit}\n#q2 a:focus-visible,#q2 button:focus-visible,#q2 summary:focus-visible,#q2 input:focus-visible,#q2 textarea:focus-visible{outline:3px solid #25a46b;outline-offset:3px}\n#q2 h1,#q2 h2,#q2 h3,#q2 h4,#q2 p{margin:0}\n#q2 h1,#q2 h2,#q2 h3{line-height:1.1;letter-spacing:-.033em;text-wrap:balance}\n#q2 h1{font-size:clamp(2.7rem,5vw,4.8rem);font-weight:780}\n#q2 h2{font-size:clamp(1.9rem,3.4vw,2.9rem);font-weight:760}\n#q2 h3{font-size:clamp(1.2rem,1.9vw,1.5rem)}\n#q2 [id]{scroll-margin-top:84px}\n#q2 .wrap{width:min(var(--max),calc(100% - 48px));margin-inline:auto}\n#q2 .section{padding:clamp(60px,7.5vw,104px) 0}\n#q2 .cream{background:var(--paper)}\n#q2 .dark{background:var(--dark);color:#f3fff7}\n#q2 .mono{font:500 .71rem\/1.5 var(--mono);letter-spacing:.08em;text-transform:uppercase}\n#q2 .eyebrow{color:var(--mint-deep)}\n#q2 .dark .eyebrow{color:var(--mint)}\n#q2 .muted{color:var(--muted)}\n#q2 .dark .muted{color:#b4d1bf}\n#q2 .section-head{max-width:770px;margin-bottom:36px}\n#q2 .section-head h2{margin:10px 0 15px}\n#q2 .section-head .intro{max-width:660px;color:var(--muted);font-size:1.08rem}\n#q2 .dark .section-head .intro{color:#b4d1bf}\n#q2 .btn{display:inline-flex;justify-content:center;align-items:center;gap:8px;min-height:48px;padding:12px 21px;border-radius:7px;border:1px solid transparent;font:700 .94rem\/1.2 var(--sans);text-decoration:none;cursor:pointer;transition:transform .15s,background .15s}\n#q2 .btn:hover{transform:translateY(-1px)}\n#q2 .btn.primary{color:#092215;background:var(--mint)}\n#q2 .btn.primary:hover{background:#a1ffc2}\n#q2 .btn.outline{border-color:#406858;color:#fff}\n#q2 .btn.outline:hover{background:#1d4636}\n#q2 .text-link{display:inline-flex;align-items:center;gap:7px;font-weight:700;color:var(--mint-deep);text-decoration:none}\n#q2 .text-link::after{content:'\u2192'}\n#q2 .text-link:hover{text-decoration:underline;text-underline-offset:4px}\n#q2 .pill{display:inline-block;padding:6px 11px;border-radius:30px;background:#e5f3e9;color:#18643d;font:600 .72rem\/1.25 var(--mono);white-space:nowrap}\n#q2 .hero{background:radial-gradient(circle at 84% 30%,#214c36 0%,transparent 40%),linear-gradient(150deg,#092119,#102e22);color:#f3fff7}\n#q2 .site-nav{width:min(1260px,calc(100% - 48px));margin:auto;display:flex;align-items:center;justify-content:space-between;gap:24px;min-height:84px;position:relative;z-index:10}\n#q2 .brand{display:flex;align-items:center;gap:9px;font-size:1.5rem;font-weight:800;letter-spacing:-.04em;text-decoration:none}\n#q2 .brand svg{width:29px;height:29px;color:var(--mint)}\n#q2 .nav-links{display:flex;align-items:center;gap:28px}\n#q2 .nav-links a{color:#d9eee0;font-weight:600;font-size:.9rem;text-decoration:none}\n#q2 .nav-links a:hover{color:#fff}\n#q2 .nav-links .nav-cta{color:#071f13;background:var(--mint);padding:11px 16px;border-radius:6px}\n#q2 .nav-links .nav-cta:hover{color:#071f13;background:#b8ffd0}\n#q2 .menu-toggle{display:none;align-items:center;gap:8px;border:1px solid #47705a;background:transparent;color:#fff;padding:9px 11px;border-radius:6px;font-weight:600;cursor:pointer}\n#q2 .menu-toggle .bars{display:grid;gap:4px}\n#q2 .menu-toggle .bars i{display:block;width:18px;height:2px;background:currentColor}\n#q2 .hero-grid{width:min(1260px,calc(100% - 48px));margin:auto;display:grid;grid-template-columns:minmax(0,1.05fr) minmax(350px,.95fr);gap:clamp(32px,5.4vw,74px);align-items:center;padding:70px 0 88px}\n#q2 .hero-copy .mono{color:var(--mint);margin-bottom:22px}\n#q2 .hero-copy h1 em{font-style:normal;color:var(--mint)}\n#q2 .hero-copy .lead{margin-top:28px;max-width:630px;font-size:clamp(1.12rem,1.6vw,1.3rem);line-height:1.46;font-weight:570;color:#e5f5e9}\n#q2 .hero-copy .support{margin-top:13px;max-width:570px;color:#b0cabc}\n#q2 .hero-actions{display:flex;flex-wrap:wrap;gap:12px;margin:28px 0}\n#q2 .hero-facts{display:flex;flex-wrap:wrap;gap:8px 18px;padding:0;margin:0;list-style:none;color:#9fbdad;font:500 .77rem\/1.5 var(--mono)}\n#q2 .hero-facts li::before{content:'\u2197';color:var(--mint);margin-right:6px}\n#q2 .viewer{min-width:0;padding:16px;border:1px solid #476654;border-radius:13px;background:linear-gradient(145deg,#1c3d30,#0d241b);box-shadow:0 22px 65px #06180e70}\n#q2 .viewer-top{display:flex;justify-content:space-between;align-items:center;gap:10px;margin:2px 2px 12px;font:650 .72rem var(--mono)}\n#q2 .viewer-top strong{color:#d9f1de}\n#q2 .viewer-top span{color:#a8bfaf;font-weight:400}\n#q2 .viewer-stage{position:relative;border:1px solid #4d6a56;border-radius:7px;overflow:hidden;background:#152c22}\n#q2 .viewer-stage svg{display:block;width:100%;height:auto}\n#q2 .viewer-stage .layer{transition:opacity .2s}\n#q2 .viewer-stage .layer.off{opacity:0}\n#q2 .layer-toggles{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}\n#q2 .layer-toggles button{flex:1;min-width:0;padding:9px 8px;border:1px solid #345943;border-radius:5px;background:#123125;color:#9fbdad;font:600 .7rem var(--mono);cursor:pointer;text-align:left}\n#q2 .layer-toggles button b{display:block;font-weight:600;color:#6f8d7c;margin-bottom:2px}\n#q2 .layer-toggles button[aria-pressed=\"true\"]{border-color:var(--mint);color:#e4f6e8}\n#q2 .layer-toggles button[aria-pressed=\"true\"] b{color:var(--mint)}\n#q2 .layer-toggles button.amber[aria-pressed=\"true\"]{border-color:var(--amber)}\n#q2 .layer-toggles button.amber[aria-pressed=\"true\"] b{color:var(--amber)}\n#q2 .viewer-top{flex-wrap:wrap}\n#q2 .seg{display:flex;flex-wrap:wrap;gap:4px}\n#q2 .seg button{padding:7px 12px;border:1px solid #345943;border-radius:5px;background:transparent;color:#a8bfaf;font:600 .72rem var(--mono);letter-spacing:.04em;text-transform:uppercase;cursor:pointer}\n#q2 .seg button:hover{color:#fff}\n#q2 .seg button[aria-pressed=\"true\"]{border-color:var(--mint);background:var(--mint);color:#092215}\n#q2 .seg.light button{border-color:#c7dbce;background:#fff;color:#3a6949}\n#q2 .seg.light button:hover{color:#164c31;background:#eef7f1}\n#q2 .seg.light button[aria-pressed=\"true\"]{border-color:var(--dark);background:var(--dark);color:var(--mint)}\n#q2 .viewer [data-view].off{display:none}\n#q2 .view-note{margin-top:10px;padding:11px 12px;border:1px solid #345943;border-radius:5px;background:#123125;color:#d6e8da;font-size:.84rem;line-height:1.5}\n#q2 .view-note b{color:var(--mint)}\n#q2 .clients{padding:clamp(40px,5vw,64px) 0}\n#q2 .clients h2{margin:8px 0 24px;font-size:clamp(1.4rem,2.2vw,1.8rem)}\n#q2 .logo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin:0;padding:0;list-style:none}\n#q2 .logo-grid li{display:flex;align-items:center;justify-content:center;height:116px;padding:24px 28px;border:1px solid var(--line);border-radius:8px;background:#fff}\n#q2 .logo-grid li.on-dark{background:var(--dark);border-color:var(--dark)}\n#q2 .logo-grid img{display:block;max-width:100%;max-height:100%;object-fit:contain}\n#q2 .spec-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}\n#q2 .spec{display:flex;flex-direction:column;min-width:0;padding:27px 24px 23px;border:1px solid var(--line);border-radius:10px;background:#fff}\n#q2 .spec .num{margin-bottom:26px;color:#16814c;font:.78rem var(--mono)}\n#q2 .spec .value{margin-bottom:11px;font-size:1.1rem;line-height:1.35;font-weight:750;letter-spacing:-.02em}\n#q2 .spec .desc{font-size:.94rem;line-height:1.59;color:var(--muted)}\n#q2 .kw{margin-top:18px}\n#q2 .kw-label{margin-bottom:7px;font:600 .66rem var(--mono);letter-spacing:.08em;text-transform:uppercase;color:#6a7c70}\n#q2 .chips{display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none}\n#q2 .chips li{padding:5px 10px;border:1px solid;border-radius:30px;font-size:.76rem;font-weight:600;line-height:1.3}\n#q2 .chips.do li{background:#e7f5eb;border-color:#b5d9c1;color:#1e6a42}\n#q2 .chips.get li{background:#fff4e4;border-color:#e6cda3;color:#7d5216}\n#q2 .spec-legend{display:flex;flex-wrap:wrap;gap:8px 20px;margin:0 0 18px;font-size:.84rem;color:var(--muted)}\n#q2 .spec-legend span::before{content:'';display:inline-block;width:11px;height:11px;margin-right:7px;border:1px solid;border-radius:50%;vertical-align:-1px}\n#q2 .spec-legend .do::before{background:#e7f5eb;border-color:#6fb88a}\n#q2 .spec-legend .get::before{background:#fff4e4;border-color:#d9a85a}\n#q2 .loop-line{display:flex;align-items:center;gap:12px;margin:22px 0 0;color:#315745;font:.74rem var(--mono)}\n#q2 .loop-line::before,#q2 .loop-line::after{content:'';flex:1;border-top:1px dashed #a9c4b1}\n#q2 .demo-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:17px}\n#q2 .demo{border:1px solid var(--line);border-radius:9px;overflow:hidden;background:#fff;min-width:0}\n#q2 .demo-media{padding:14px;background:linear-gradient(180deg,#f6faf7,#edf4ef)}\n#q2 .demo-tag{display:inline-block;margin-bottom:10px;padding:5px 7px;background:#e3f1e6;color:#3a6949;font:.61rem var(--mono);letter-spacing:.06em}\n#q2 .demo-stage{padding:16px;border:1px solid #d6e5da;border-radius:8px;background:#fff}\n#q2 .demo-body{padding:20px 21px 23px}\n#q2 .demo-body h3{font-size:1.15rem;margin-bottom:8px}\n#q2 .demo-body p{font-size:.91rem;color:var(--muted)}\n#q2 .ripe-row{display:flex;gap:8px;margin:0;padding:0;list-style:none}\n#q2 .ripe-row li{flex:1;min-width:0;text-align:center}\n#q2 .ripe-row svg{display:block;width:100%;max-width:84px;height:auto;margin:0 auto}\n#q2 .ripe-row .rank{display:inline-grid;place-items:center;width:24px;height:24px;margin-top:8px;border:1px dashed #a9c4b1;border-radius:50%;font:700 .72rem var(--mono);color:#6a7c70}\n#q2 .ripe-row .rank::before{content:'?'}\n#q2 .ripe-row.ranked .rank{border:0;background:var(--dark);color:var(--mint)}\n#q2 .ripe-row.ranked .rank::before{content:attr(data-n)}\n#q2 .ripe-row .grade{display:block;margin-top:5px;font:600 .66rem var(--mono);color:#4e5f54;visibility:hidden}\n#q2 .ripe-row.ranked .grade{visibility:visible}\n#q2 .ripe-scale{height:6px;margin-top:12px;border-radius:3px;background:linear-gradient(90deg,#7fb069,#c9c75a,#eda84a,#e2603a,#a92f24);opacity:.2;transition:opacity .2s}\n#q2 .ripe-scale.ranked{opacity:1}\n#q2 .ripe-axis{display:flex;justify-content:space-between;margin-top:6px;font:.64rem var(--mono);color:#6a7c70}\n#q2 .ripe-foot{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-top:14px;padding-top:12px;border-top:1px solid #e1ebe4;font-size:.83rem;color:#5b6d62}\n#q2 .ripe-foot span{flex:1;min-width:200px}\n#q2 .ripe-foot button{padding:7px 12px;border:1px solid #9fc2ab;border-radius:5px;background:#fff;color:#1e6a42;font:700 .8rem var(--sans);cursor:pointer}\n#q2 .ripe-foot button:hover{background:#eef7f1}\n#q2 .rank-tabs{margin-bottom:16px}\n#q2 .ripe-row.off{display:none}\n#q2 .ripe-scale[data-set=\"leaf\"]{background:linear-gradient(90deg,#5fa052,#e8d24a,#8a5a2b)}\n#q2 .ripe-scale[data-set=\"rot\"]{background:linear-gradient(90deg,#e3c94f,#b8873a,#5a3418)}\n#q2 .qc-sample{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid #d3e1d6;border-radius:7px;background:#f3f7f3}\n#q2 .qc-sample svg{flex:none;width:86px;height:58px;border-radius:5px}\n#q2 .qc-sample span{font:.66rem\/1.5 var(--mono);color:#5d6b64}\n#q2 .qc-steps{display:grid;gap:8px;margin:14px 0 0;padding:0;list-style:none}\n#q2 .qc-steps li{display:grid;grid-template-columns:108px 1fr;gap:10px;align-items:center;transition:opacity .25s}\n#q2 .qc-steps li.pending{opacity:.12}\n#q2 .qc-steps b{font-size:.74rem;letter-spacing:.04em;text-transform:uppercase;color:#2d5140}\n#q2 .chip{display:inline-flex;align-items:center;min-height:34px;padding:7px 10px;border:1px solid #c7dbce;border-radius:6px;background:#eef7f1;color:#284a38;font-size:.84rem;font-weight:700}\n#q2 .chip.agree{border-color:#aed4ba;background:#e7f5eb;color:#1e6a42}\n#q2 .chip.differ{border-color:#e0c394;background:#fff4e4;color:#8a5b18}\n#q2 .chip.final{border-color:#96cbab;background:#dff4e7;color:#195d38}\n#q2 .qc-steps li.route{grid-template-columns:1fr;padding-left:118px;font:.7rem var(--mono);color:#6f806f}\n#q2 .qc-steps li.route::before{content:'\u2198 ';color:#268b58}\n#q2 .qc-foot{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-top:12px;padding-top:12px;border-top:1px solid #e1ebe4;font-size:.83rem;color:#5b6d62}\n#q2 .qc-foot span{flex:1;min-width:200px}\n#q2 .qc-foot button{padding:7px 12px;border:1px solid #9fc2ab;border-radius:5px;background:#fff;color:#1e6a42;font:700 .8rem var(--sans);cursor:pointer}\n#q2 .qc-foot button:hover{background:#eef7f1}\n#q2 .flow{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:38px;margin:0;padding:0;list-style:none}\n#q2 .flow li{position:relative;padding:22px 18px 20px;border:1px solid var(--line);border-radius:10px;background:#fff}\n#q2 .flow li:not(:last-child)::after{content:'\u2192';position:absolute;top:32px;right:-31px;width:24px;text-align:center;font-size:1.5rem;line-height:1;color:#28744e}\n#q2 .flow-icon{display:grid;place-items:center;width:58px;height:58px;border-radius:50%;background:var(--dark);color:var(--mint)}\n#q2 .flow-icon svg{width:28px;height:28px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}\n#q2 .flow .index{display:block;margin-top:16px;font:.74rem var(--mono);color:#207749}\n#q2 .flow h3{margin:6px 0 8px;font-size:1.12rem}\n#q2 .flow p{font-size:.9rem;color:var(--muted)}\n#q2 .flow .result{display:inline-block;margin-top:14px;padding:5px 10px;border:1px solid #e6cda3;border-radius:30px;background:#fff4e4;color:#7d5216;font-size:.76rem;font-weight:600}\n#q2 .flow-loop{position:relative;height:30px;margin:0 12.5% 0 37.5%;border:2px dashed #7fae90;border-top:0;border-radius:0 0 14px 14px}\n#q2 .flow-loop::before{content:'\u25b2';position:absolute;top:-9px;left:-7px;font-size:.75rem;line-height:1;color:#28744e}\n#q2 .flow-loop span{position:absolute;left:50%;bottom:-11px;transform:translateX(-50%);padding:0 12px;background:var(--paper);font:.72rem var(--mono);color:#315745;white-space:nowrap}\n#q2 .outputs-panel{display:grid;grid-template-columns:1fr 1fr;gap:30px;align-items:center;margin-top:35px;padding:27px 30px;border:1px solid var(--line);border-radius:10px;background:#fff}\n#q2 .outputs-panel h3{font-size:1.32rem}\n#q2 .outputs-panel p{margin-top:7px;font-size:.94rem;color:var(--muted)}\n#q2 .outputs-panel ul{margin:0;padding-left:20px;columns:2;column-gap:18px;font-size:.92rem;color:#365b44}\n#q2 .outputs-panel li{break-inside:avoid;margin-bottom:4px}\n#q2 .principles{display:grid;grid-template-columns:repeat(3,1fr);gap:25px}\n#q2 .principle{padding-top:18px;border-top:2px solid #43895e}\n#q2 .principle h3{font-size:1.2rem;margin-bottom:10px}\n#q2 .principle p{font-size:.94rem;color:#bfd3c4}\n#q2 .about-grid{display:grid;grid-template-columns:1fr 1fr;gap:60px}\n#q2 .about-grid .section-head{margin-bottom:22px}\n#q2 .about-grid h2{font-size:clamp(1.8rem,3.1vw,2.6rem)}\n#q2 .about-copy>p{color:var(--muted)}\n#q2 .about-copy>p+p{margin-top:14px}\n#q2 .people{display:grid;gap:12px}\n#q2 .person{display:grid;grid-template-columns:68px 1fr;gap:15px;align-items:start;padding:17px;border:1px solid var(--line);border-radius:8px;background:#fff}\n#q2 .portrait{display:flex;align-items:center;justify-content:center;width:68px;height:68px;padding:7px;border:1px dashed #a0b6a5;border-radius:6px;background:linear-gradient(125deg,#deeee1,#c8ded0);color:#588466;font:.62rem var(--mono);text-align:center}\n#q2 .person h3{font-size:1.12rem;margin-bottom:3px}\n#q2 .person .role{margin-bottom:8px;font:.74rem\/1.4 var(--mono);color:#297951}\n#q2 .person p{font-size:.89rem;line-height:1.55;color:var(--muted)}\n#q2 .person img{display:block;width:68px;height:68px;border-radius:6px;object-fit:cover}\n#q2 .person blockquote{margin:10px 0 8px;padding-left:11px;border-left:2px solid #9fc2ab;font-size:.89rem;line-height:1.5;font-style:italic;color:#40564a}\n#q2 .person .text-link{font-size:.84rem}\n#q2 .contact-grid{display:grid;grid-template-columns:.8fr 1.2fr;gap:65px;align-items:start}\n#q2 .contact-intro h2{margin:12px 0 19px}\n#q2 .contact-intro>p:not(.mono){color:#bdcfc3}\n#q2 .contact-methods{display:grid;gap:9px;margin-top:28px}\n#q2 .contact-methods b{display:block;color:#fff;font-size:.95rem}\n#q2 .contact-methods a{color:var(--mint);font:.86rem\/1.4 var(--mono);text-decoration:none;word-break:break-word}\n#q2 .contact-methods a:hover{text-decoration:underline}\n#q2 .form{display:grid;gap:15px;padding:30px;border:1px solid #416550;border-radius:12px;background:#18382b}\n#q2 .form fieldset{margin:0;padding:0;border:0}\n#q2 .form legend,#q2 .field label{display:block;margin-bottom:9px;color:#ecf7ed;font-size:.9rem;font-weight:700}\n#q2 .opt{color:#a8c9b1;font-weight:400}\n#q2 .topics{display:flex;flex-wrap:wrap;gap:8px}\n#q2 .topics label{position:relative}\n#q2 .topics input{position:absolute;inset:0;width:100%;height:100%;margin:0;opacity:0;cursor:pointer}\n#q2 .topics span{display:inline-flex;align-items:center;min-height:39px;padding:8px 11px;border:1px solid #56735f;border-radius:5px;color:#c4d5ca;font-size:.85rem}\n#q2 .topics input:checked+span{background:#d6f8df;border-color:#d6f8df;color:#11442a}\n#q2 .topics input:focus-visible+span{outline:3px solid var(--mint);outline-offset:2px}\n#q2 .two{display:grid;grid-template-columns:1fr 1fr;gap:13px}\n#q2 .field input,#q2 .field textarea{width:100%;padding:11px 12px;border:1px solid #56735f;border-radius:5px;background:#0e281d;color:#fff;font:400 .95rem\/1.4 var(--sans)}\n#q2 .field textarea{min-height:113px;resize:vertical}\n#q2 .field input::placeholder,#q2 .field textarea::placeholder{color:#91af9c}\n#q2 .form-foot{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px}\n#q2 .form-foot .privacy{max-width:410px;font-size:.78rem;color:#c0d2c4}\n#q2 .form .btn.primary{border:0}\n#q2 .form .btn[disabled]{opacity:.6;cursor:wait}\n#q2 .hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}\n#q2 .status{min-height:1em;font-size:.85rem;color:#d5e7d9}\n#q2 .status.ok{color:var(--mint)}\n#q2 .status.error{color:#ffc080}\n#q2 .foot{padding:27px 0;border-top:1px solid var(--line);background:#f7faf7}\n#q2 .foot .wrap{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;font-size:.87rem;color:#536a5a}\n#q2 .foot a{color:#255d42}\n@media (max-width:1040px){#q2 .nav-links{gap:18px}\n#q2 .hero-grid{grid-template-columns:1fr .94fr;gap:30px}\n#q2 .spec-grid{gap:10px}\n#q2 .spec{padding:22px 19px}\n#q2 .contact-grid{gap:34px}}\n@media (max-width:830px){#q2 .menu-toggle{display:flex}\n#q2 .site-nav{min-height:74px}\n#q2 .nav-links{display:none;position:absolute;top:calc(100% - 3px);left:0;right:0;flex-direction:column;align-items:stretch;gap:0;padding:18px;border:1px solid #376b4d;border-radius:9px;background:#153c29;box-shadow:0 17px 30px #03140b88}\n#q2 .nav-links.open{display:flex}\n#q2 .nav-links a{padding:12px 8px}\n#q2 .nav-links .nav-cta{margin-top:9px;text-align:center}\n#q2 .hero-grid{grid-template-columns:1fr;padding-top:40px}\n#q2 .viewer{max-width:630px}\n#q2 .about-grid,#q2 .contact-grid{grid-template-columns:1fr;gap:34px}\n#q2 .spec-grid{grid-template-columns:1fr}\n#q2 .spec .num{margin-bottom:13px}\n#q2 .logo-grid,#q2 .principles{grid-template-columns:1fr 1fr}\n#q2 .flow{grid-template-columns:1fr;gap:34px}\n#q2 .flow li{display:grid;grid-template-columns:58px 1fr;column-gap:16px}\n#q2 .flow li>*{grid-column:2}\n#q2 .flow li>.flow-icon{grid-column:1;grid-row:1 \/ span 4}\n#q2 .flow .index{margin-top:0}\n#q2 .flow .result{justify-self:start}\n#q2 .flow li:not(:last-child)::after{content:'\u2193';top:auto;right:auto;bottom:-31px;left:35px}\n#q2 .flow-loop{height:auto;margin:14px 0 0;border:0}\n#q2 .flow-loop::before{content:none}\n#q2 .flow-loop span{position:static;display:block;transform:none;padding:0;white-space:normal}\n#q2 .principles .principle:last-child{grid-column:1\/-1}\n#q2 .demo-grid{grid-template-columns:1fr}}\n@media (max-width:550px){#q2 .wrap,#q2 .site-nav,#q2 .hero-grid{width:calc(100% - 32px)}\n#q2 .section{padding:56px 0}\n#q2 .hero-grid{padding:30px 0 56px}\n#q2 .hero-copy h1{font-size:clamp(2.4rem,10vw,3.4rem)}\n#q2 .hero-actions{flex-direction:column}\n#q2 .hero-actions .btn,#q2 .form-foot .btn{width:100%}\n#q2 .viewer{padding:10px}\n#q2 .logo-grid li{height:92px;padding:18px}\n#q2 .outputs-panel,#q2 .two{grid-template-columns:1fr}\n#q2 .outputs-panel ul{columns:1}\n#q2 .principles{grid-template-columns:1fr}\n#q2 .principles .principle:last-child{grid-column:auto}\n#q2 .outputs-panel{padding:22px}\n#q2 .ripe-row{gap:4px}\n#q2 .ripe-row .grade{font-size:.56rem}\n#q2 .qc-steps li{grid-template-columns:92px 1fr}\n#q2 .qc-steps li.route{padding-left:0}\n#q2 .person{grid-template-columns:54px 1fr;gap:12px;padding:12px}\n#q2 .person img{width:54px;height:54px}\n#q2 .form{padding:19px}\n#q2 .foot .wrap{flex-direction:column;align-items:flex-start}}\n@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}\n#q2 .btn,#q2 .ripe-scale,#q2 .qc-steps li,#q2 .viewer-stage .layer{transition:none}}\n.site-header,.site-footer,.page-header,.elementor-location-header,.elementor-location-footer,.comments-area{display:none!important}\nmain.site-main,.site-main .page-content{max-width:none!important;width:100%!important;margin:0!important;padding:0!important}\n#q2 h1,#q2 h2,#q2 h3,#q2 h4{font-family:inherit;color:inherit;text-transform:none}\n#q2 button{white-space:normal;text-transform:none;letter-spacing:normal}\n#q2 ul,#q2 ol{line-height:inherit}\n#q2 .form .wpforms-container{margin:0;--wpforms-field-background-color:#0e281d;--wpforms-field-border-color:#56735f;--wpforms-field-text-color:#fff;--wpforms-label-color:#ecf7ed;--wpforms-label-sublabel-color:#a8c9b1;--wpforms-button-background-color:#68ec9d;--wpforms-button-text-color:#092215;--wpforms-field-border-radius:5px;--wpforms-button-border-radius:7px}\n#q2 .form .wpforms-container .wpforms-field-label,#q2 .form .wpforms-container legend{color:#ecf7ed;font-size:.9rem;font-weight:700}\n#q2 .form .wpforms-container .wpforms-field-sublabel{color:#a8c9b1}\n#q2 .form .wpforms-container input[type=text],#q2 .form .wpforms-container input[type=email],#q2 .form .wpforms-container textarea{width:100%;max-width:100%;border:1px solid #56735f;border-radius:5px;background:#0e281d;color:#fff}\n#q2 .form .wpforms-container .wpforms-field-row{max-width:100%}\n#q2 .form .wpforms-container button.wpforms-submit{min-height:48px;padding:12px 21px;border:0;border-radius:7px;background:#68ec9d;color:#092215;font-weight:700}\n#q2 .form .wpforms-container button.wpforms-submit:hover{background:#a1ffc2}\n#q2 .form .privacy{font-size:.78rem;color:#c0d2c4}\n<\/style>\n<div id=\"q2\">\n<header class=\"hero\" id=\"top\">\n<nav class=\"site-nav\" aria-label=\"Main navigation\">\n<a class=\"brand\" href=\"#top\" aria-label=\"Q2Label home\">\n<svg viewBox=\"0 0 32 32\" aria-hidden=\"true\"><rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" rx=\"2\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\/><rect x=\"1.5\" y=\"1.5\" width=\"5\" height=\"5\" fill=\"currentColor\"\/><rect x=\"25.5\" y=\"1.5\" width=\"5\" height=\"5\" fill=\"currentColor\"\/><rect x=\"1.5\" y=\"25.5\" width=\"5\" height=\"5\" fill=\"currentColor\"\/><rect x=\"25.5\" y=\"25.5\" width=\"5\" height=\"5\" fill=\"currentColor\"\/><path d=\"M15.4 21.8C9.6 22.4 7.2 17.6 8.4 12.2C13.6 12.4 16.6 16 15.4 21.8Z\" fill=\"currentColor\"\/><path d=\"M16.6 21.8C15.6 14.2 19.4 9.4 24.8 8.6C25.6 15.8 22 21 16.6 21.8Z\" fill=\"currentColor\"\/><rect x=\"15.1\" y=\"20.5\" width=\"1.8\" height=\"5.5\" rx=\"0.9\" fill=\"currentColor\"\/><\/svg>\n<span>Q2Label<\/span>\n<\/a>\n<button class=\"menu-toggle\" type=\"button\" aria-controls=\"nav-items\" aria-expanded=\"false\"><span class=\"bars\" aria-hidden=\"true\"><i><\/i><i><\/i><i><\/i><\/span>Menu<\/button>\n<div class=\"nav-links\" id=\"nav-items\">\n<a href=\"#clients\">Clients<\/a>\n<a href=\"#specialisations\">Specialisations<\/a>\n<a href=\"#approach\">Our approach<\/a>\n<a href=\"#about\">About<\/a>\n<a href=\"#contact\" class=\"nav-cta\">Discuss a project<\/a>\n<\/div>\n<\/nav>\n<div class=\"hero-grid\">\n<div class=\"hero-copy\">\n<h1>Computer Vision <em>Data &amp; Performance<\/em> Partner<\/h1>\n<p class=\"lead\">Reliable data. Trained models. Measured improvement.<\/p>\n<p class=\"support\">We build high-quality training datasets and run annotation at scale for in-house vision engineers, and we train complete models for companies that have no computer vision team of their own.<\/p>\n<div class=\"hero-actions\">\n<a class=\"btn primary\" href=\"#contact\">Discuss a technical challenge <span aria-hidden=\"true\">\u2197<\/span><\/a>\n<a class=\"btn outline\" href=\"#specialisations\">Explore our specialisations<\/a>\n<\/div>\n<ul class=\"hero-facts\"><li>Annotation &amp; workflows<\/li><li>Ambiguous cases<\/li><li>Model training<\/li><li>Performance experiments<\/li><\/ul>\n<\/div>\n<div class=\"viewer\">\n<div class=\"viewer-top\">\n<div class=\"seg\" role=\"group\" aria-label=\"Choose a view\">\n<button type=\"button\" aria-pressed=\"true\" data-view-tab=\"annotate\">Annotate<\/button>\n<button type=\"button\" aria-pressed=\"false\" data-view-tab=\"detect\">Detect<\/button>\n<button type=\"button\" aria-pressed=\"false\" data-view-tab=\"classify\">Classify<\/button>\n<button type=\"button\" aria-pressed=\"false\" data-view-tab=\"order\">Order<\/button>\n<\/div>\n<\/div>\n<div class=\"viewer-stage\">\n<svg viewBox=\"0 0 500 360\" role=\"img\" aria-label=\"Schematic conveyor scene with three objects. Four views: annotation layers, detection, classification, and ordering fruit by rot severity.\">\n<defs><pattern id=\"grid\" width=\"28\" height=\"28\" patternUnits=\"userSpaceOnUse\"><path d=\"M28 0H0V28\" fill=\"none\" stroke=\"#2b4638\" stroke-width=\".7\"\/><\/pattern><\/defs>\n<rect width=\"500\" height=\"360\" fill=\"#152c22\"\/><rect width=\"500\" height=\"360\" fill=\"url(#grid)\"\/>\n<!-- conveyor -->\n<rect x=\"0\" y=\"92\" width=\"500\" height=\"196\" fill=\"#1f3a2e\"\/>\n<path d=\"M0 92H500M0 288H500\" stroke=\"#3f5f4d\" stroke-width=\"2\"\/>\n<path d=\"M60 92V288M180 92V288M300 92V288M420 92V288\" stroke=\"#2a4739\" stroke-width=\"1.5\"\/>\n<!-- objects -->\n<ellipse cx=\"118\" cy=\"188\" rx=\"52\" ry=\"45\" fill=\"#7d9a72\"\/>\n<path d=\"M218 150 l78 -14 24 62 -44 46 -66 -22z\" fill=\"#8a9f7c\"\/>\n<ellipse cx=\"402\" cy=\"196\" rx=\"46\" ry=\"54\" fill=\"#7d9a72\" transform=\"rotate(18 402 196)\"\/>\n<ellipse cx=\"414\" cy=\"182\" rx=\"13\" ry=\"9\" fill=\"#5a4a33\"\/>\n<g data-view=\"annotate\">\n<!-- boxes -->\n<g class=\"layer\" data-layer=\"boxes\" fill=\"none\" stroke-width=\"2.2\">\n<rect x=\"62\" y=\"139\" width=\"112\" height=\"98\" stroke=\"#68ec9d\"\/>\n<rect x=\"206\" y=\"132\" width=\"118\" height=\"116\" stroke=\"#68ec9d\"\/>\n<rect x=\"344\" y=\"136\" width=\"116\" height=\"120\" stroke=\"#e8ac58\"\/>\n<rect x=\"62\" y=\"120\" width=\"72\" height=\"19\" fill=\"#68ec9d\" stroke=\"none\"\/><text x=\"68\" y=\"133\" font-family=\"monospace\" font-size=\"10.5\" fill=\"#0b3220\" stroke=\"none\">class_a<\/text>\n<rect x=\"206\" y=\"113\" width=\"72\" height=\"19\" fill=\"#68ec9d\" stroke=\"none\"\/><text x=\"212\" y=\"126\" font-family=\"monospace\" font-size=\"10.5\" fill=\"#0b3220\" stroke=\"none\">class_b<\/text>\n<rect x=\"344\" y=\"117\" width=\"92\" height=\"19\" fill=\"#e8ac58\" stroke=\"none\"\/><text x=\"350\" y=\"130\" font-family=\"monospace\" font-size=\"10.5\" fill=\"#291b08\" stroke=\"none\">edge_case<\/text>\n<\/g>\n<!-- mask -->\n<g class=\"layer\" data-layer=\"masks\">\n<path d=\"M218 150 l78 -14 24 62 -44 46 -66 -22z\" fill=\"#68ec9d\" fill-opacity=\".3\" stroke=\"#68ec9d\" stroke-width=\"1.6\" stroke-dasharray=\"5 3\"\/>\n<ellipse cx=\"414\" cy=\"182\" rx=\"15\" ry=\"11\" fill=\"#e8ac58\" fill-opacity=\".35\" stroke=\"#e8ac58\" stroke-width=\"1.6\" stroke-dasharray=\"4 3\"\/>\n<\/g>\n<!-- keypoints -->\n<g class=\"layer\" data-layer=\"keypoints\">\n<path d=\"M118 143V233M66 188H170\" stroke=\"#d9f1de\" stroke-width=\"1\" stroke-dasharray=\"2 4\"\/>\n<g fill=\"#fff\" stroke=\"#0b3220\" stroke-width=\"1.4\"><circle cx=\"118\" cy=\"143\" r=\"4.5\"\/><circle cx=\"118\" cy=\"233\" r=\"4.5\"\/><circle cx=\"66\" cy=\"188\" r=\"4.5\"\/><circle cx=\"170\" cy=\"188\" r=\"4.5\"\/><circle cx=\"118\" cy=\"188\" r=\"4.5\"\/><\/g>\n<\/g>\n<\/g>\n<!-- detection model view -->\n<g data-view=\"detect\" class=\"off\" fill=\"none\" stroke-width=\"2.2\">\n<rect x=\"59\" y=\"142\" width=\"117\" height=\"94\" stroke=\"#68ec9d\"\/>\n<rect x=\"209\" y=\"134\" width=\"113\" height=\"111\" stroke=\"#68ec9d\"\/>\n<rect x=\"347\" y=\"139\" width=\"110\" height=\"114\" stroke=\"#e8ac58\" stroke-dasharray=\"7 4\"\/>\n<rect x=\"59\" y=\"123\" width=\"98\" height=\"19\" fill=\"#68ec9d\" stroke=\"none\"\/><text x=\"65\" y=\"136\" font-family=\"monospace\" font-size=\"10.5\" fill=\"#0b3220\" stroke=\"none\">class_a  0.98<\/text>\n<rect x=\"209\" y=\"115\" width=\"98\" height=\"19\" fill=\"#68ec9d\" stroke=\"none\"\/><text x=\"215\" y=\"128\" font-family=\"monospace\" font-size=\"10.5\" fill=\"#0b3220\" stroke=\"none\">class_b  0.94<\/text>\n<rect x=\"347\" y=\"120\" width=\"110\" height=\"19\" fill=\"#e8ac58\" stroke=\"none\"\/><text x=\"353\" y=\"133\" font-family=\"monospace\" font-size=\"10.5\" fill=\"#291b08\" stroke=\"none\">class_a  0.61 ?<\/text>\n<text x=\"347\" y=\"270\" font-family=\"monospace\" font-size=\"10\" fill=\"#e8ac58\" stroke=\"none\">low confidence \u2192 review<\/text>\n<\/g>\n<!-- classification model view -->\n<g data-view=\"classify\" class=\"off\" font-family=\"monospace\" font-size=\"11\" font-weight=\"700\" text-anchor=\"middle\">\n<rect x=\"56\" y=\"126\" width=\"124\" height=\"124\" rx=\"10\" fill=\"#68ec9d\" fill-opacity=\".1\" stroke=\"#68ec9d\" stroke-width=\"1.6\"\/>\n<rect x=\"200\" y=\"126\" width=\"128\" height=\"130\" rx=\"10\" fill=\"#68ec9d\" fill-opacity=\".1\" stroke=\"#68ec9d\" stroke-width=\"1.6\"\/>\n<rect x=\"340\" y=\"126\" width=\"124\" height=\"138\" rx=\"10\" fill=\"#e8ac58\" fill-opacity=\".12\" stroke=\"#e8ac58\" stroke-width=\"1.6\"\/>\n<rect x=\"76\" y=\"262\" width=\"84\" height=\"22\" rx=\"11\" fill=\"#68ec9d\"\/><text x=\"118\" y=\"277\" fill=\"#0b3220\">\u2713 ACCEPT<\/text>\n<rect x=\"222\" y=\"268\" width=\"84\" height=\"22\" rx=\"11\" fill=\"#68ec9d\"\/><text x=\"264\" y=\"283\" fill=\"#0b3220\">\u2713 ACCEPT<\/text>\n<rect x=\"360\" y=\"276\" width=\"84\" height=\"22\" rx=\"11\" fill=\"#e8ac58\"\/><text x=\"402\" y=\"291\" fill=\"#291b08\">\u2715 REJECT<\/text>\n<\/g>\n<!-- ordering view -->\n<g data-view=\"order\" class=\"off\">\n<defs><linearGradient id=\"sevbar\"><stop stop-color=\"#68ec9d\"\/><stop offset=\"1\" stop-color=\"#e8ac58\"\/><\/linearGradient><\/defs>\n<rect width=\"500\" height=\"360\" fill=\"#152c22\"\/><rect width=\"500\" height=\"360\" fill=\"url(#grid)\"\/>\n<rect x=\"20\" y=\"52\" width=\"170\" height=\"20\" fill=\"#68ec9d\"\/><text x=\"27\" y=\"66\" font-family=\"monospace\" font-size=\"11\" fill=\"#0b3220\">ordered by rot severity<\/text>\n<g transform=\"translate(20 104) scale(1.05)\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><\/g><circle cx=\"62\" cy=\"212\" r=\"12\" fill=\"#68ec9d\"\/><text x=\"62\" y=\"216.5\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"12\" font-weight=\"700\" fill=\"#0b3220\">1<\/text>\n<g transform=\"translate(114 104) scale(1.05)\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"47\" cy=\"50\" r=\"4\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"47\" cy=\"50\" r=\"2.0\" fill=\"#5a3418\"\/><\/g><circle cx=\"156\" cy=\"212\" r=\"12\" fill=\"#68ec9d\"\/><text x=\"156\" y=\"216.5\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"12\" font-weight=\"700\" fill=\"#0b3220\">2<\/text>\n<g transform=\"translate(208 104) scale(1.05)\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"46\" cy=\"49\" r=\"8\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"46\" cy=\"49\" r=\"4.0\" fill=\"#5a3418\"\/><\/g><circle cx=\"250\" cy=\"212\" r=\"12\" fill=\"#68ec9d\"\/><text x=\"250\" y=\"216.5\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"12\" font-weight=\"700\" fill=\"#0b3220\">3<\/text>\n<g transform=\"translate(302 104) scale(1.05)\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"45\" cy=\"48\" r=\"12\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"45\" cy=\"48\" r=\"6.0\" fill=\"#5a3418\"\/><circle cx=\"27\" cy=\"54\" r=\"4\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"27\" cy=\"54\" r=\"2.0\" fill=\"#5a3418\"\/><\/g><circle cx=\"344\" cy=\"212\" r=\"12\" fill=\"#68ec9d\"\/><text x=\"344\" y=\"216.5\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"12\" font-weight=\"700\" fill=\"#0b3220\">4<\/text>\n<g transform=\"translate(396 104) scale(1.05)\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"44\" cy=\"47\" r=\"17\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"44\" cy=\"47\" r=\"8.5\" fill=\"#5a3418\"\/><circle cx=\"24\" cy=\"52\" r=\"6\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"24\" cy=\"52\" r=\"3.0\" fill=\"#5a3418\"\/><\/g><circle cx=\"438\" cy=\"212\" r=\"12\" fill=\"#68ec9d\"\/><text x=\"438\" y=\"216.5\" text-anchor=\"middle\" font-family=\"monospace\" font-size=\"12\" font-weight=\"700\" fill=\"#0b3220\">5<\/text>\n<rect x=\"30\" y=\"250\" width=\"440\" height=\"6\" rx=\"3\" fill=\"url(#sevbar)\"\/>\n<text x=\"30\" y=\"278\" font-family=\"monospace\" font-size=\"11\" fill=\"#9cbaa8\">\u2190 less severe<\/text>\n<text x=\"470\" y=\"278\" text-anchor=\"end\" font-family=\"monospace\" font-size=\"11\" fill=\"#9cbaa8\">more severe \u2192<\/text>\n<\/g>\n<\/svg>\n<\/div>\n<div class=\"layer-toggles\" data-view=\"annotate\" role=\"group\" aria-label=\"Toggle annotation layers\">\n<button type=\"button\" aria-pressed=\"true\" data-toggle=\"boxes\"><b>01<\/b>Boxes<\/button>\n<button type=\"button\" aria-pressed=\"true\" data-toggle=\"masks\" class=\"amber\"><b>02<\/b>Masks<\/button>\n<button type=\"button\" aria-pressed=\"true\" data-toggle=\"keypoints\"><b>03<\/b>Keypoints<\/button>\n<\/div>\n<p class=\"view-note off\" data-view=\"detect\"><b>Detection model.<\/b> Finds and localises every object, each with a confidence score. Low-confidence predictions are routed back for review and relabelling.<\/p>\n<p class=\"view-note off\" data-view=\"order\"><b>Ordering model.<\/b> Ranks objects along a scale, for example fruit by rot severity, instead of forcing a yes\/no class.<\/p>\n<p class=\"view-note off\" data-view=\"classify\"><b>Classification model.<\/b> Assigns one class per object, for example accept or reject on a sorting line.<\/p>\n<\/div>\n<\/div>\n<\/header>\n<main>\n<section class=\"clients\" id=\"clients\" aria-labelledby=\"clients-title\"><div class=\"wrap\">\n<p class=\"mono eyebrow\">Clients<\/p>\n<h2 id=\"clients-title\">Computer vision teams we work with<\/h2>\n<ul class=\"logo-grid\">\n<li><img decoding=\"async\" src=\"https:\/\/q2label.com\/wp-content\/uploads\/2026\/04\/logo_breed.png\" alt=\"VBTI\" loading=\"lazy\"><\/li>\n<li><img decoding=\"async\" src=\"https:\/\/q2label.com\/wp-content\/uploads\/2026\/04\/200123-LOGO-PIP-blue-rgb.png\" alt=\"PIP Innovations\" loading=\"lazy\"><\/li>\n<li><img decoding=\"async\" src=\"https:\/\/q2label.com\/wp-content\/uploads\/2026\/04\/logoBlue-YC.svg\" alt=\"Yield Computer\" loading=\"lazy\"><\/li>\n<\/ul>\n<\/div><\/section>\n<section class=\"section cream\" id=\"specialisations\"><div class=\"wrap\">\n<div class=\"section-head\">\n<p class=\"mono eyebrow\">Our specialisations<\/p>\n<h2>Deep expertise where data and model performance meet.<\/h2>\n<p class=\"intro\">Engage Q2Label for one focused work package, or connect all four disciplines into a single systematic improvement loop.<\/p>\n<\/div>\n<p class=\"spec-legend\"><span class=\"do\">What we do<\/span><span class=\"get\">What you receive<\/span><\/p>\n<div class=\"spec-grid\">\n<article class=\"spec\">\n<p class=\"num\">01 \/ PRECISION DATA ANNOTATIONS &amp; WORKFLOWS<\/p>\n<p class=\"value\">Reliable training data at scale, without the operational overhead.<\/p>\n<p class=\"desc\">We design and operate efficient image and video annotation workflows: label ontologies and annotation rules, dataset composition, task instructions, workforce management, model-assisted pre-labelling where appropriate, and documented quality review.<\/p>\n<div class=\"kw\"><p class=\"kw-label\">What we do<\/p><ul class=\"chips do\"><li>Image &amp; video<\/li><li>Boxes, polygons, masks, keypoints<\/li><li>Label ontology<\/li><li>Annotation guidelines<\/li><li>Dataset composition<\/li><li>Model-assisted pre-labelling<\/li><li>Reviewer calibration<\/li><li>Batch review &amp; rework<\/li><\/ul><\/div>\n<div class=\"kw\"><p class=\"kw-label\">What you receive<\/p><ul class=\"chips get\"><li>Annotated dataset<\/li><li>Task specification<\/li><li>Quality-review results<\/li><li>Agreed export format<\/li><\/ul><\/div>\n<\/article>\n<article class=\"spec\">\n<p class=\"num\">02 \/ AMBIGUOUS CASES HANDLING<\/p>\n<p class=\"value\">Decide the hard cases once, then label them the same way every time.<\/p>\n<p class=\"desc\">Borderline, unclear and partly visible objects are where labels start to diverge. We write explicit rules for them, detect disagreement between annotators and route it to expert judgment. For ordered properties such as clarity, severity or growth, we structure richer ordinal labels and, when justified, expert-relative comparisons.<\/p>\n<div class=\"kw\"><p class=\"kw-label\">What we do<\/p><ul class=\"chips do\"><li>Ambiguity rules<\/li><li>Visibility &amp; occlusion<\/li><li>Multi-annotator voting<\/li><li>Expert escalation<\/li><li>Ordinal scales<\/li><li>Calibration anchors<\/li><li>Expert-relative comparison<\/li><\/ul><\/div>\n<div class=\"kw\"><p class=\"kw-label\">What you receive<\/p><ul class=\"chips get\"><li>Edge-case rubric<\/li><li>Disagreement overview<\/li><li>Graded labels<\/li><li>Validated pilot workflow<\/li><\/ul><\/div>\n<\/article>\n<article class=\"spec\">\n<p class=\"num\">03 \/ MODEL TRAINING<\/p>\n<p class=\"value\">From reviewed dataset to a trained model your team can run.<\/p>\n<p class=\"desc\">We train and fine-tune computer vision models on your data, for detection, segmentation, classification and grading tasks. Runs are tracked and reproducible, and the weights, configuration and evaluation are handed over to your engineers.<\/p>\n<div class=\"kw\"><p class=\"kw-label\">What we do<\/p><ul class=\"chips do\"><li>Detection<\/li><li>Segmentation<\/li><li>Classification<\/li><li>Ordinal grading<\/li><li>Fine-tuning<\/li><li>Train \/ val \/ test splits<\/li><li>Augmentation<\/li><li>Tracked runs<\/li><li>Export for deployment<\/li><\/ul><\/div>\n<div class=\"kw\"><p class=\"kw-label\">What you receive<\/p><ul class=\"chips get\"><li>Model weights<\/li><li>Training configuration<\/li><li>Run log<\/li><li>Hold-out evaluation<\/li><\/ul><\/div>\n<\/article>\n<article class=\"spec\">\n<p class=\"num\">04 \/ MODEL PERFORMANCE ENGINEERING<\/p>\n<p class=\"value\">Find the bottleneck. Test the intervention. Measure the result.<\/p>\n<p class=\"desc\">For models we trained or models you already run: baseline evaluation, failure analysis, controlled data and training experiments, and reproducible comparisons on independent data.<\/p>\n<div class=\"kw\"><p class=\"kw-label\">What we do<\/p><ul class=\"chips do\"><li>Baseline &amp; metrics<\/li><li>Per-class error analysis<\/li><li>Scenario slicing<\/li><li>Label defect checks<\/li><li>Controlled experiments<\/li><li>Version tracking<\/li><li>Independent hold-out<\/li><\/ul><\/div>\n<div class=\"kw\"><p class=\"kw-label\">What you receive<\/p><ul class=\"chips get\"><li>Evaluation report<\/li><li>Error taxonomy<\/li><li>Experiment log<\/li><li>Recommended next steps<\/li><\/ul><\/div>\n<\/article>\n<\/div>\n<p class=\"loop-line\">LABEL \u2192 DEFINE \u2192 TRAIN \u2192 MEASURE \u2192 REPEAT WHERE IT PAYS OFF<\/p>\n<\/div><\/section>\n<section class=\"section\" id=\"examples\"><div class=\"wrap\">\n<div class=\"section-head\">\n<p class=\"mono eyebrow\">Technical examples<\/p>\n<h2>What careful computer vision data work looks like.<\/h2>\n<p class=\"intro\">Two simplified examples that make ordinal grading and quality control tangible.<\/p>\n<\/div>\n<div class=\"demo-grid\">\n<article class=\"demo\">\n<div class=\"demo-media\"><span class=\"demo-tag\">ORDINAL GRADING \/ RANKING<\/span>\n<div class=\"demo-stage\" id=\"rank-demo\">\n<div class=\"seg light rank-tabs\" role=\"group\" aria-label=\"Choose a sample set\">\n<button type=\"button\" aria-pressed=\"true\" data-rank-tab=\"ripeness\">Ripeness<\/button>\n<button type=\"button\" aria-pressed=\"false\" data-rank-tab=\"leaf\">Disease<\/button>\n<button type=\"button\" aria-pressed=\"false\" data-rank-tab=\"rot\">Rot<\/button>\n<\/div>\n<ul class=\"ripe-row\" data-set=\"ripeness\" data-by=\"ripeness\" data-low=\"less ripe\" data-high=\"riper\" data-ranked=\"Ranked 1 to 5, from unripe to fully ripe.\" aria-label=\"Five tomatoes at different stages of ripeness\">\n<li data-rank=\"3\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><ellipse cx=\"40\" cy=\"45\" rx=\"29\" ry=\"26\" fill=\"#eda84a\"\/><path d=\"M22 58a29 26 0 0 0 40 2a32 26 0 0 1-40-2z\" fill=\"#d8923a\"\/><ellipse cx=\"29\" cy=\"35\" rx=\"7\" ry=\"4\" fill=\"#fff\" opacity=\".35\" transform=\"rotate(-30 29 35)\"\/><path d=\"M40 22l-9-5 5 7-9 2 9 2-3 7 7-6 7 6-3-7 9-2-9-2 5-7z\" fill=\"#3f7d3a\"\/><rect x=\"38.5\" y=\"11\" width=\"3\" height=\"10\" rx=\"1.5\" fill=\"#3f7d3a\"\/><\/svg><b class=\"rank\" data-n=\"3\"><\/b><span class=\"grade\">Half ripe<\/span><\/li>\n<li data-rank=\"1\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><ellipse cx=\"40\" cy=\"45\" rx=\"29\" ry=\"26\" fill=\"#7fb069\"\/><path d=\"M22 58a29 26 0 0 0 40 2a32 26 0 0 1-40-2z\" fill=\"#6a9a56\"\/><ellipse cx=\"29\" cy=\"35\" rx=\"7\" ry=\"4\" fill=\"#fff\" opacity=\".35\" transform=\"rotate(-30 29 35)\"\/><path d=\"M40 22l-9-5 5 7-9 2 9 2-3 7 7-6 7 6-3-7 9-2-9-2 5-7z\" fill=\"#3f7d3a\"\/><rect x=\"38.5\" y=\"11\" width=\"3\" height=\"10\" rx=\"1.5\" fill=\"#3f7d3a\"\/><\/svg><b class=\"rank\" data-n=\"1\"><\/b><span class=\"grade\">Unripe<\/span><\/li>\n<li data-rank=\"5\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><ellipse cx=\"40\" cy=\"45\" rx=\"29\" ry=\"26\" fill=\"#b93628\"\/><path d=\"M22 58a29 26 0 0 0 40 2a32 26 0 0 1-40-2z\" fill=\"#9c2a1f\"\/><ellipse cx=\"29\" cy=\"35\" rx=\"7\" ry=\"4\" fill=\"#fff\" opacity=\".35\" transform=\"rotate(-30 29 35)\"\/><path d=\"M40 22l-9-5 5 7-9 2 9 2-3 7 7-6 7 6-3-7 9-2-9-2 5-7z\" fill=\"#3f7d3a\"\/><rect x=\"38.5\" y=\"11\" width=\"3\" height=\"10\" rx=\"1.5\" fill=\"#3f7d3a\"\/><\/svg><b class=\"rank\" data-n=\"5\"><\/b><span class=\"grade\">Fully ripe<\/span><\/li>\n<li data-rank=\"2\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><ellipse cx=\"40\" cy=\"45\" rx=\"29\" ry=\"26\" fill=\"#c9c75a\"\/><path d=\"M22 58a29 26 0 0 0 40 2a32 26 0 0 1-40-2z\" fill=\"#b3b048\"\/><ellipse cx=\"29\" cy=\"35\" rx=\"7\" ry=\"4\" fill=\"#fff\" opacity=\".35\" transform=\"rotate(-30 29 35)\"\/><path d=\"M40 22l-9-5 5 7-9 2 9 2-3 7 7-6 7 6-3-7 9-2-9-2 5-7z\" fill=\"#3f7d3a\"\/><rect x=\"38.5\" y=\"11\" width=\"3\" height=\"10\" rx=\"1.5\" fill=\"#3f7d3a\"\/><\/svg><b class=\"rank\" data-n=\"2\"><\/b><span class=\"grade\">Turning<\/span><\/li>\n<li data-rank=\"4\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><ellipse cx=\"40\" cy=\"45\" rx=\"29\" ry=\"26\" fill=\"#e2603a\"\/><path d=\"M22 58a29 26 0 0 0 40 2a32 26 0 0 1-40-2z\" fill=\"#c94d2b\"\/><ellipse cx=\"29\" cy=\"35\" rx=\"7\" ry=\"4\" fill=\"#fff\" opacity=\".35\" transform=\"rotate(-30 29 35)\"\/><path d=\"M40 22l-9-5 5 7-9 2 9 2-3 7 7-6 7 6-3-7 9-2-9-2 5-7z\" fill=\"#3f7d3a\"\/><rect x=\"38.5\" y=\"11\" width=\"3\" height=\"10\" rx=\"1.5\" fill=\"#3f7d3a\"\/><\/svg><b class=\"rank\" data-n=\"4\"><\/b><span class=\"grade\">Ripe<\/span><\/li>\n<\/ul>\n<ul class=\"ripe-row off\" data-set=\"leaf\" data-by=\"severity\" data-low=\"less severe\" data-high=\"more severe\" data-ranked=\"Ranked 1 to 5, from healthy to very severe leaf spot.\" aria-label=\"Five leaves with increasing numbers of yellow disease spots\">\n<li data-rank=\"4\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><path d=\"M40 6C63 21 67 50 40 76C13 50 17 21 40 6Z\" fill=\"#7da852\"\/><path d=\"M40 10V76M40 30l-11-8M40 30l11-8M40 46l-13-9M40 46l13-9M40 61l-9-7M40 61l9-7\" fill=\"none\" stroke=\"#3f7d3a\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\".55\"\/><circle cx=\"32\" cy=\"35\" r=\"5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"32\" cy=\"35\" r=\"2.2\" fill=\"#8a5a2b\"\/><circle cx=\"48\" cy=\"51\" r=\"5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"48\" cy=\"51\" r=\"2.2\" fill=\"#8a5a2b\"\/><circle cx=\"47\" cy=\"30\" r=\"4\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"33\" cy=\"55\" r=\"4\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"41\" cy=\"43\" r=\"3.5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"52\" cy=\"41\" r=\"3\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"29\" cy=\"46\" r=\"3\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><\/svg><b class=\"rank\" data-n=\"4\"><\/b><span class=\"grade\">Severe<\/span><\/li>\n<li data-rank=\"2\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><path d=\"M40 6C63 21 67 50 40 76C13 50 17 21 40 6Z\" fill=\"#5fa052\"\/><path d=\"M40 10V76M40 30l-11-8M40 30l11-8M40 46l-13-9M40 46l13-9M40 61l-9-7M40 61l9-7\" fill=\"none\" stroke=\"#3f7d3a\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\".55\"\/><circle cx=\"32\" cy=\"35\" r=\"3\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"48\" cy=\"51\" r=\"3\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><\/svg><b class=\"rank\" data-n=\"2\"><\/b><span class=\"grade\">Light<\/span><\/li>\n<li data-rank=\"5\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><path d=\"M40 6C63 21 67 50 40 76C13 50 17 21 40 6Z\" fill=\"#97ad52\"\/><path d=\"M40 10V76M40 30l-11-8M40 30l11-8M40 46l-13-9M40 46l13-9M40 61l-9-7M40 61l9-7\" fill=\"none\" stroke=\"#3f7d3a\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\".55\"\/><circle cx=\"32\" cy=\"35\" r=\"6.5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"32\" cy=\"35\" r=\"2.9\" fill=\"#8a5a2b\"\/><circle cx=\"48\" cy=\"52\" r=\"6.5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"48\" cy=\"52\" r=\"2.9\" fill=\"#8a5a2b\"\/><circle cx=\"47\" cy=\"30\" r=\"5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"47\" cy=\"30\" r=\"2.2\" fill=\"#8a5a2b\"\/><circle cx=\"33\" cy=\"56\" r=\"5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"33\" cy=\"56\" r=\"2.2\" fill=\"#8a5a2b\"\/><circle cx=\"41\" cy=\"43\" r=\"4.5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"41\" cy=\"43\" r=\"2.0\" fill=\"#8a5a2b\"\/><circle cx=\"53\" cy=\"41\" r=\"3.5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"28\" cy=\"46\" r=\"3.5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"42\" cy=\"64\" r=\"3.5\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"39\" cy=\"21\" r=\"3\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><\/svg><b class=\"rank\" data-n=\"5\"><\/b><span class=\"grade\">Very severe<\/span><\/li>\n<li data-rank=\"1\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><path d=\"M40 6C63 21 67 50 40 76C13 50 17 21 40 6Z\" fill=\"#5fa052\"\/><path d=\"M40 10V76M40 30l-11-8M40 30l11-8M40 46l-13-9M40 46l13-9M40 61l-9-7M40 61l9-7\" fill=\"none\" stroke=\"#3f7d3a\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\".55\"\/><\/svg><b class=\"rank\" data-n=\"1\"><\/b><span class=\"grade\">Healthy<\/span><\/li>\n<li data-rank=\"3\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><path d=\"M40 6C63 21 67 50 40 76C13 50 17 21 40 6Z\" fill=\"#68a352\"\/><path d=\"M40 10V76M40 30l-11-8M40 30l11-8M40 46l-13-9M40 46l13-9M40 61l-9-7M40 61l9-7\" fill=\"none\" stroke=\"#3f7d3a\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\".55\"\/><circle cx=\"32\" cy=\"35\" r=\"4\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"48\" cy=\"51\" r=\"4\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"47\" cy=\"30\" r=\"3\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><circle cx=\"33\" cy=\"55\" r=\"3\" fill=\"#ecd64a\" stroke=\"#c9a92e\" stroke-width=\"1\"\/><\/svg><b class=\"rank\" data-n=\"3\"><\/b><span class=\"grade\">Moderate<\/span><\/li>\n<\/ul>\n<ul class=\"ripe-row off\" data-set=\"rot\" data-by=\"severity\" data-low=\"less severe\" data-high=\"more severe\" data-ranked=\"Ranked 1 to 5, from sound to rotten.\" aria-label=\"Five apples with rot spots of increasing size\">\n<li data-rank=\"2\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"47\" cy=\"50\" r=\"4\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"47\" cy=\"50\" r=\"2.0\" fill=\"#5a3418\"\/><\/svg><b class=\"rank\" data-n=\"2\"><\/b><span class=\"grade\">Minor<\/span><\/li>\n<li data-rank=\"5\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"44\" cy=\"47\" r=\"17\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"44\" cy=\"47\" r=\"8.5\" fill=\"#5a3418\"\/><circle cx=\"24\" cy=\"52\" r=\"6\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"24\" cy=\"52\" r=\"3.0\" fill=\"#5a3418\"\/><\/svg><b class=\"rank\" data-n=\"5\"><\/b><span class=\"grade\">Rotten<\/span><\/li>\n<li data-rank=\"3\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"46\" cy=\"49\" r=\"8\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"46\" cy=\"49\" r=\"4.0\" fill=\"#5a3418\"\/><\/svg><b class=\"rank\" data-n=\"3\"><\/b><span class=\"grade\">Moderate<\/span><\/li>\n<li data-rank=\"1\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><\/svg><b class=\"rank\" data-n=\"1\"><\/b><span class=\"grade\">Sound<\/span><\/li>\n<li data-rank=\"4\"><svg viewBox=\"0 0 80 80\" aria-hidden=\"true\"><rect x=\"38.5\" y=\"10\" width=\"3\" height=\"12\" rx=\"1.5\" fill=\"#6b4b2b\"\/><path d=\"M42 15c7-7 15-5 16 1c-6 4-12 3-16-1z\" fill=\"#5fa052\"\/><path d=\"M40 22c-7-5-27-3-27 20c0 17 13 30 27 30s27-13 27-30c0-23-20-25-27-20z\" fill=\"#e3c94f\"\/><path d=\"M17 56c5 10 14 16 23 16s18-6 23-16c-8 8-36 9-46 0z\" fill=\"#cdb23c\"\/><ellipse cx=\"27\" cy=\"34\" rx=\"6\" ry=\"3.5\" fill=\"#fff\" opacity=\".4\" transform=\"rotate(-30 27 34)\"\/><circle cx=\"45\" cy=\"48\" r=\"12\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"45\" cy=\"48\" r=\"6.0\" fill=\"#5a3418\"\/><circle cx=\"27\" cy=\"54\" r=\"4\" fill=\"#8a5a2b\" stroke=\"#b8873a\" stroke-width=\"2\"\/><circle cx=\"27\" cy=\"54\" r=\"2.0\" fill=\"#5a3418\"\/><\/svg><b class=\"rank\" data-n=\"4\"><\/b><span class=\"grade\">Severe<\/span><\/li>\n<\/ul>\n<div class=\"ripe-scale\" id=\"rank-scale\" data-set=\"ripeness\"><\/div>\n<div class=\"ripe-axis\"><span id=\"rank-low\">\u2190 less ripe<\/span><span id=\"rank-high\">riper \u2192<\/span><\/div>\n<div class=\"ripe-foot\"><span id=\"rank-status\" role=\"status\" aria-live=\"polite\">Five samples in the order they arrived.<\/span><button type=\"button\" id=\"rank-toggle\">Rank by ripeness \u2192<\/button><\/div>\n<\/div>\n<\/div>\n<div class=\"demo-body\">\n<h3>Ordinal grading by ranking<\/h3>\n<p>Ripeness, leaf disease and rot have no sharp class boundaries. Instead of forcing a yes\/no label, samples are ordered relative to each other, from less to more ripe or severe. The ranking gives a consistent five-step scale, and the threshold for harvesting, treating or rejecting can be set afterwards without relabelling.<\/p>\n<\/div>\n<\/article>\n<article class=\"demo\">\n<div class=\"demo-media\"><span class=\"demo-tag\">LABEL QUALITY CONTROL<\/span>\n<div class=\"demo-stage\">\n<div class=\"qc-sample\">\n<svg viewBox=\"0 0 86 58\" aria-hidden=\"true\"><rect width=\"86\" height=\"58\" fill=\"#e0e8e1\"\/><rect x=\"10\" y=\"16\" width=\"44\" height=\"22\" rx=\"10\" fill=\"#e3bd7c\" stroke=\"#c89242\" transform=\"rotate(-8 32 27)\"\/><rect x=\"46\" y=\"26\" width=\"32\" height=\"18\" rx=\"8\" fill=\"#ecd09c\" stroke=\"#c89242\" transform=\"rotate(7 62 35)\"\/><rect x=\"30\" y=\"20\" width=\"14\" height=\"10\" rx=\"2\" fill=\"none\" stroke=\"#c17421\" stroke-width=\"2\"\/><\/svg>\n<span>FOOD-PROCESSING SAMPLE<br>DEFECT CANDIDATE \u00b7 SCHEMATIC<\/span>\n<\/div>\n<ol class=\"qc-steps\" id=\"qc-steps\">\n<li><b>AI pre-label<\/b><span class=\"chip\">Pimple defect<\/span><\/li>\n<li><b>Annotator 1<\/b><span class=\"chip agree\">Pimple defect<\/span><\/li>\n<li><b>Annotator 2<\/b><span class=\"chip differ\">Surface stain<\/span><\/li>\n<li class=\"route\">Disagreement detected \u2192 escalate to expert<\/li>\n<li><b>Expert review<\/b><span class=\"chip final\">Pimple defect \u2713 final label<\/span><\/li>\n<\/ol>\n<div class=\"qc-foot\"><span>Only samples where labels disagree are routed to expert judgment.<\/span><button type=\"button\" id=\"qc-replay\">Replay review \u21bb<\/button><\/div>\n<\/div>\n<\/div>\n<div class=\"demo-body\">\n<h3>Quality control with multi-annotator voting<\/h3>\n<p>A QC workflow from food processing: start from an AI pre-label, compare it with two independent annotators, and trigger expert judgment when they disagree. Annotation stays scalable while label quality on ambiguous samples is protected.<\/p>\n<\/div>\n<\/article>\n<\/div>\n<\/div><\/section>\n<section class=\"section cream\" id=\"approach\"><div class=\"wrap\">\n<div class=\"section-head\">\n<p class=\"mono eyebrow\">How we work<\/p>\n<h2>Engineering discipline, clear ownership and evidence at each step.<\/h2>\n<p class=\"intro\">We adapt to the client&#8217;s existing computer vision stack. A pilot validates the approach before work is scaled or experiments are repeated.<\/p>\n<\/div>\n<ol class=\"flow\">\n<li><span class=\"flow-icon\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><circle cx=\"12\" cy=\"12\" r=\"5\"\/><circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"currentColor\"\/><\/svg><\/span><span class=\"index\">01 \/ ALIGN<\/span><h3>Define the goal<\/h3><p>What must the model detect or assess, under which constraints, and how will success be measured?<\/p><span class=\"result\">Baseline &amp; success metric<\/span><\/li>\n<li><span class=\"flow-icon\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect x=\"5\" y=\"4.5\" width=\"14\" height=\"16.5\" rx=\"2\"\/><path d=\"M9 3h6v3.5H9z\"\/><path d=\"M8.5 11.5l1.5 1.5 2.5-3M14.5 11.5h1.5M8.5 16.5h7.5\"\/><\/svg><\/span><span class=\"index\">02 \/ SPECIFY<\/span><h3>Design the workflow<\/h3><p>Label rules, datasets, quality controls and the experiment protocol, checked with your experts.<\/p><span class=\"result\">Annotation specification<\/span><\/li>\n<li><span class=\"flow-icon\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M9 3h6M10 3v6.5l-5.2 8.7A1.9 1.9 0 0 0 6.4 21h11.2a1.9 1.9 0 0 0 1.6-2.8L14 9.5V3M7.6 15h8.8\"\/><\/svg><\/span><span class=\"index\">03 \/ PILOT<\/span><h3>Run a controlled pilot<\/h3><p>A representative batch or experiment. Edge cases are inspected before any larger commitment.<\/p><span class=\"result\">Reviewed pilot batch<\/span><\/li>\n<li><span class=\"flow-icon\"><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 20.5h16M7 20.5v-5M12 20.5v-9M17 20.5v-13\"\/><path d=\"M5 9.5l4.5-4 3 2.5 5-4.5\"\/><\/svg><\/span><span class=\"index\">04 \/ EVIDENCE<\/span><h3>Scale and measure<\/h3><p>Reviewed data, trained models or experiment results, with open risks documented.<\/p><span class=\"result\">Results &amp; next decision<\/span><\/li>\n<\/ol>\n<div class=\"flow-loop\"><span>\u21ba Iterate where another round adds value<\/span><\/div>\n<div class=\"outputs-panel\">\n<div><h3>Deliverables, not just recommendations.<\/h3><p>Scope-specific technical outputs that your engineers can review, reproduce and use in their own pipeline.<\/p><\/div>\n<ul><li>Annotation specifications<\/li><li>Reviewed training datasets<\/li><li>Quality-control summaries<\/li><li>Label ontology \/ decision rules<\/li><li>Trained models &amp; training configs<\/li><li>Evaluation breakdowns<\/li><li>Experiment summaries<\/li><\/ul>\n<\/div>\n<\/div><\/section>\n<section class=\"section dark\" id=\"difference\"><div class=\"wrap\">\n<div class=\"section-head\">\n<p class=\"mono eyebrow\">Why Q2Label<\/p>\n<h2>Specialist support for teams that already know computer vision.<\/h2>\n<p class=\"intro\">We contribute where another perspective, a dedicated data operation or a controlled experiment can unlock the next engineering decision.<\/p>\n<\/div>\n<div class=\"principles\">\n<div class=\"principle\"><h3>Cross-project perspective<\/h3><p>Repeated exposure to different datasets, annotation ambiguities and model behaviours informs how we approach each new problem.<\/p><\/div>\n<div class=\"principle\"><h3>Data work connected to model outcomes<\/h3><p>Annotations, definitions and sampling decisions are guided by what the model must learn and how its performance will be evaluated.<\/p><\/div>\n<div class=\"principle\"><h3>Work alongside your engineers<\/h3><p>Domain knowledge stays with your experts. We bring dedicated specialist capacity, documented methods and a clear division of responsibilities.<\/p><\/div>\n<\/div>\n<\/div><\/section>\n<section class=\"section\" id=\"about\"><div class=\"wrap\"><div class=\"about-grid\">\n<div class=\"about-copy\">\n<div class=\"section-head\"><p class=\"mono eyebrow\">About Q2Label<\/p><h2>A focused engineering partner, based in the Netherlands.<\/h2><\/div>\n<p>Q2Label was founded in January 2024 in Eindhoven. We combine computer vision expertise with managed annotation operations, and work for computer vision teams in the food and agri sectors.<\/p>\n<p>We focus on the practical interface between datasets, ground-truth quality, model training and evaluation. Our team is intentionally specialised: clients work directly with the people who design the workflow and review the technical decisions.<\/p>\n<\/div>\n<div class=\"people\">\n<article class=\"person\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/q2label.com\/wp-content\/uploads\/2026\/01\/bart.jpg\" alt=\"Portrait of Bart de Backer\" width=\"68\" height=\"68\" loading=\"lazy\">\n<div><h3>Bart de Backer<\/h3><p class=\"role\">Co-founder \u00b7 Workflow expert<\/p><p>Works on annotation strategy, project delivery, operational coordination and quality-control workflows.<\/p>\n<blockquote>\u201cWe\u2019ve seen how unclear instructions ruin datasets. That\u2019s why we lock quality before scaling.\u201d<\/blockquote>\n<a class=\"text-link\" href=\"https:\/\/www.linkedin.com\/in\/bart-de-backer-58652428\/\" target=\"_blank\" rel=\"noopener\">LinkedIn<\/a><\/div>\n<\/article>\n<article class=\"person\">\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/q2label.com\/wp-content\/uploads\/2026\/01\/erik.jpg\" alt=\"Portrait of Erik van der Poel\" width=\"68\" height=\"68\" loading=\"lazy\">\n<div><h3>Erik van der Poel<\/h3><p class=\"role\">Co-founder \u00b7 Computer vision engineer<\/p><p>Works on model training, evaluation, experiment tooling and research into expert-aligned visual grading.<\/p>\n<blockquote>\u201cWe understand the importance of qualitative data to improve your model performance at experimentation and in production.\u201d<\/blockquote>\n<a class=\"text-link\" href=\"https:\/\/www.linkedin.com\/in\/erikvanderpoel\/\" target=\"_blank\" rel=\"noopener\">LinkedIn<\/a><\/div>\n<\/article>\n<\/div>\n<\/div><\/div><\/section>\n<section class=\"section dark\" id=\"contact\"><div class=\"wrap contact-grid\">\n<div class=\"contact-intro\">\n<p class=\"mono eyebrow\">Let&#8217;s talk<\/p>\n<h2>Bring us a real computer vision challenge.<\/h2>\n<p>Tell us which part of your dataset or model workflow needs attention. We can define a focused first assessment together with your engineers.<\/p>\n<div class=\"contact-methods\">\n<div><b>Bart de Backer<\/b><a href=\"mailto:bart.de.backer@q2label.com\">bart.de.backer@q2label.com<\/a><\/div>\n<div><b>Erik van der Poel<\/b><a href=\"mailto:erik.van.der.poel@q2label.com\">erik.van.der.poel@q2label.com<\/a><\/div>\n<\/div>\n<\/div>\n<div class=\"form\">\n<fieldset><legend>What would you like to do?<\/legend><div class=\"topics\">\n<label><input type=\"radio\" name=\"q2-topic\" value=\"Discuss a project\" checked><span>Discuss a project<\/span><\/label>\n<label><input type=\"radio\" name=\"q2-topic\" value=\"Just get in touch\"><span>Just get in touch<\/span><\/label>\n<\/div><\/fieldset>\n<fieldset id=\"q2-areas\"><legend>What is it about? <span class=\"opt\">(optional)<\/span><\/legend><div class=\"topics\">\n<label><input type=\"checkbox\" name=\"q2-area\" value=\"Annotation &amp; workflows\"><span>Annotation &amp; workflows<\/span><\/label>\n<label><input type=\"checkbox\" name=\"q2-area\" value=\"Ambiguous cases\"><span>Ambiguous cases<\/span><\/label>\n<label><input type=\"checkbox\" name=\"q2-area\" value=\"Model training\"><span>Model training<\/span><\/label>\n<label><input type=\"checkbox\" name=\"q2-area\" value=\"Model performance\"><span>Model performance<\/span><\/label>\n<\/div><\/fieldset>\n<style id=\"wpforms-css-vars-38\">\n\t\t\t\t#wpforms-38 {\n\t\t\t\t\n\t\t\t}\n\t\t\t<\/style><div class=\"wpforms-container wpforms-container-full wpforms-render-modern\" id=\"wpforms-38\"><form id=\"wpforms-form-38\" class=\"wpforms-validate wpforms-form wpforms-ajax-form\" data-formid=\"38\" method=\"post\" enctype=\"multipart\/form-data\" action=\"\/index.php\/wp-json\/wp\/v2\/pages\/1731\" data-token=\"e222f5a6e0627ff05f0107771399948e\" data-token-time=\"1794580400\"><noscript class=\"wpforms-error-noscript\">Please enable JavaScript in your browser to complete this form.<\/noscript><div id=\"wpforms-error-noscript\" style=\"display: none;\">Please enable JavaScript in your browser to complete this form.<\/div><div class=\"wpforms-field-container\"><div id=\"wpforms-38-field_0-container\" class=\"wpforms-field wpforms-field-name\" data-field-id=\"0\"><fieldset><legend class=\"wpforms-field-label\">Name <span class=\"wpforms-required-label\" aria-hidden=\"true\">*<\/span><\/legend><div class=\"wpforms-field-row wpforms-field-medium\"><div class=\"wpforms-field-row-block wpforms-first wpforms-one-half\"><input type=\"text\" id=\"wpforms-38-field_0\" class=\"wpforms-field-name-first wpforms-field-required\" name=\"wpforms[fields][0][first]\" aria-errormessage=\"wpforms-38-field_0-error\" required><label for=\"wpforms-38-field_0\" class=\"wpforms-field-sublabel after\">First<\/label><\/div><div class=\"wpforms-field-row-block wpforms-one-half\"><input type=\"text\" id=\"wpforms-38-field_0-last\" class=\"wpforms-field-name-last wpforms-field-required\" name=\"wpforms[fields][0][last]\" aria-errormessage=\"wpforms-38-field_0-last-error\" required><label for=\"wpforms-38-field_0-last\" class=\"wpforms-field-sublabel after\">Last<\/label><\/div><\/div><\/fieldset><\/div>\t\t<div id=\"wpforms-38-field_3-container\"\n\t\t\tclass=\"wpforms-field wpforms-field-text\"\n\t\t\tdata-field-type=\"text\"\n\t\t\tdata-field-id=\"3\"\n\t\t\t>\n\t\t\t<label class=\"wpforms-field-label\" for=\"wpforms-38-field_3\" >Comment Email Message<\/label>\n\t\t\t<input type=\"text\" id=\"wpforms-38-field_3\" class=\"wpforms-field-medium\" name=\"wpforms[fields][3]\" >\n\t\t<\/div>\n\t\t<div id=\"wpforms-38-field_1-container\" class=\"wpforms-field wpforms-field-email\" data-field-id=\"1\"><label class=\"wpforms-field-label\" for=\"wpforms-38-field_1\">Email <span class=\"wpforms-required-label\" aria-hidden=\"true\">*<\/span><\/label><input type=\"email\" id=\"wpforms-38-field_1\" class=\"wpforms-field-medium wpforms-field-required\" name=\"wpforms[fields][1]\" spellcheck=\"false\" aria-errormessage=\"wpforms-38-field_1-error\" required><\/div><div id=\"wpforms-38-field_2-container\" class=\"wpforms-field wpforms-field-textarea\" data-field-id=\"2\"><label class=\"wpforms-field-label\" for=\"wpforms-38-field_2\">Comment or Message<\/label><textarea id=\"wpforms-38-field_2\" class=\"wpforms-field-medium\" name=\"wpforms[fields][2]\" aria-errormessage=\"wpforms-38-field_2-error\" ><\/textarea><\/div><script>\n\t\t\t\t( function() {\n\t\t\t\t\tconst style = document.createElement( 'style' );\n\t\t\t\t\tstyle.appendChild( document.createTextNode( '#wpforms-38-field_3-container { position: absolute !important; overflow: hidden !important; display: inline !important; height: 1px !important; width: 1px !important; z-index: -1000 !important; padding: 0 !important; } #wpforms-38-field_3-container input { visibility: hidden; } #wpforms-conversational-form-page #wpforms-38-field_3-container label { counter-increment: none; }' ) );\n\t\t\t\t\tdocument.head.appendChild( style );\n\t\t\t\t\tdocument.currentScript?.remove();\n\t\t\t\t} )();\n\t\t\t<\/script><\/div><!-- .wpforms-field-container --><div class=\"wpforms-recaptcha-container wpforms-is-turnstile\" ><div class=\"wpforms-turnstile\" data-sitekey=\"0x4AAAAAACgK-ypfFu6b4knx\" data-action=\"FormID-38\"><\/div><input type=\"text\" name=\"g-recaptcha-hidden\" class=\"wpforms-recaptcha-hidden\" style=\"position:absolute!important;clip:rect(0,0,0,0)!important;height:1px!important;width:1px!important;border:0!important;overflow:hidden!important;padding:0!important;margin:0!important;\" data-rule-turnstile=\"1\"><\/div><div class=\"wpforms-submit-container\" ><input type=\"hidden\" name=\"wpforms[id]\" value=\"38\"><input type=\"hidden\" name=\"wpforms[time_token]\" value=\"1794580400.049c5f5396bb6c5e8c874a0d75fcfe2990aab86f185aa57c158798710e7dbd4a\"><input type=\"hidden\" name=\"page_title\" value=\"\"><input type=\"hidden\" name=\"page_url\" value=\"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/pages\/1731\"><input type=\"hidden\" name=\"url_referer\" value=\"\"><button type=\"submit\" name=\"wpforms[submit]\" id=\"wpforms-submit-38\" class=\"wpforms-submit\" data-alt-text=\"Sending...\" data-submit-text=\"Submit\" aria-live=\"assertive\" value=\"wpforms-submit\">Submit<\/button><img decoding=\"async\" src=\"https:\/\/q2label.com\/wp-content\/plugins\/wpforms-lite\/assets\/images\/submit-spin.svg\" class=\"wpforms-submit-spinner\" style=\"display: none;\" width=\"26\" height=\"26\" alt=\"Loading\"><\/div><\/form><\/div>  <!-- .wpforms-container -->\n<p class=\"privacy\">We use these details to respond to your enquiry. Do not include confidential images or personal data in this form.<\/p>\n<\/div>\n<\/div><\/section>\n<\/main>\n<footer class=\"foot\"><div class=\"wrap\">\n<span>\u00a9 Q2Label \u00b7 Computer Vision Data &amp; Performance Partner<\/span>\n<span>Netherlands<\/span>\n<\/div><\/footer>\n<\/div>\n<script>\n\/* Navigation *\/\n(() => {\nconst toggle = document.querySelector('.menu-toggle');\nconst nav = document.getElementById('nav-items');\nconst close = () => { nav.classList.remove('open'); toggle.setAttribute('aria-expanded', 'false'); };\ntoggle.addEventListener('click', () => {\nconst open = nav.classList.toggle('open');\ntoggle.setAttribute('aria-expanded', String(open));\n});\nnav.querySelectorAll('a').forEach((a) => a.addEventListener('click', close));\ndocument.addEventListener('click', (e) => { if (!nav.contains(e.target) && !toggle.contains(e.target)) close(); });\ndocument.addEventListener('keydown', (e) => { if (e.key === 'Escape') close(); });\n})();\n\/* Hero: annotation layer toggles *\/\n(() => {\ndocument.querySelectorAll('[data-toggle]').forEach((btn) => btn.addEventListener('click', () => {\nconst on = btn.getAttribute('aria-pressed') !== 'true';\nbtn.setAttribute('aria-pressed', String(on));\nconst layer = document.querySelector('[data-layer=\"' + btn.dataset.toggle + '\"]');\nif (layer) layer.classList.toggle('off', !on);\n}));\n})();\n\/* Hero: Annotate \/ Detect \/ Classify views *\/\n(() => {\nconst viewer = document.querySelector('.viewer');\nif (!viewer) return;\nconst tabs = Array.from(viewer.querySelectorAll('[data-view-tab]'));\ntabs.forEach((tab) => tab.addEventListener('click', () => {\ntabs.forEach((t) => t.setAttribute('aria-pressed', String(t === tab)));\nviewer.querySelectorAll('[data-view]').forEach((el) => el.classList.toggle('off', el.dataset.view !== tab.dataset.viewTab));\n}));\n})();\n\/* Ordinal ranking demo: ripeness, leaf disease, fruit rot *\/\n(() => {\nconst demo = document.getElementById('rank-demo');\nif (!demo) return;\nconst tabs = Array.from(demo.querySelectorAll('[data-rank-tab]'));\nconst rows = Array.from(demo.querySelectorAll('.ripe-row'));\nconst scale = document.getElementById('rank-scale');\nconst low = document.getElementById('rank-low');\nconst high = document.getElementById('rank-high');\nconst status = document.getElementById('rank-status');\nconst button = document.getElementById('rank-toggle');\nlet active = rows[0];\nlet ranked = false;\nconst render = () => {\nrows.forEach((row) => {\nconst on = row === active;\nrow.classList.toggle('off', !on);\nrow.classList.toggle('ranked', on && ranked);\nArray.from(row.children).forEach((li) => { li.style.order = on && ranked ? li.dataset.rank : ''; });\n});\ntabs.forEach((t) => t.setAttribute('aria-pressed', String(t.dataset.rankTab === active.dataset.set)));\nscale.dataset.set = active.dataset.set;\nscale.classList.toggle('ranked', ranked);\nlow.textContent = '\u2190 ' + active.dataset.low;\nhigh.textContent = active.dataset.high + ' \u2192';\nbutton.textContent = ranked ? 'Show unsorted \u21bb' : 'Rank by ' + active.dataset.by + ' \u2192';\nstatus.textContent = ranked ? active.dataset.ranked : 'Five samples in the order they arrived.';\n};\ntabs.forEach((tab) => tab.addEventListener('click', () => {\nactive = rows.find((row) => row.dataset.set === tab.dataset.rankTab) || rows[0];\nranked = false;\nrender();\n}));\nbutton.addEventListener('click', () => { ranked = !ranked; render(); });\nrender();\n})();\n\/* QC voting demo: replay the review sequence *\/\n(() => {\nconst button = document.getElementById('qc-replay');\nconst steps = Array.from(document.querySelectorAll('#qc-steps li'));\nif (!button || !steps.length) return;\nlet timers = [];\nbutton.addEventListener('click', () => {\ntimers.forEach(clearTimeout);\ntimers = [];\nif (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\nsteps.forEach((li) => li.classList.add('pending'));\nsteps.forEach((li, i) => timers.push(setTimeout(() => li.classList.remove('pending'), 350 + i * 650)));\n});\n})();\n\/* Contact options: the WPForms form has no fields for these, so the choices are written at the top of the message on submit *\/\n(() => {\nconst box = document.querySelector('#q2 .form');\nconst areas = document.getElementById('q2-areas');\nif (!box || !areas) return;\nconst topic = () => box.querySelector('input[name=\"q2-topic\"]:checked').value;\nbox.addEventListener('change', (e) => {\nif (e.target.name !== 'q2-topic') return;\nconst project = topic() === 'Discuss a project';\nareas.hidden = !project;\nif (!project) areas.querySelectorAll('input').forEach((i) => { i.checked = false; });\n});\nconst apply = () => {\nconst message = box.querySelector('.wpforms-field-textarea textarea');\nif (!message) return;\nconst picked = Array.from(areas.querySelectorAll('input:checked'), (i) => i.value);\nlet head = '[Topic: ' + topic() + ']\\n';\nif (picked.length) head += '[About: ' + picked.join(', ') + ']\\n';\nmessage.value = head + '\\n' + message.value.replace(\/^(\\[(Topic|About): [^\\]]*\\]\\n)+\\n?\/, '');\n};\nbox.addEventListener('click', (e) => { if (e.target.closest('.wpforms-submit')) apply(); }, true);\nbox.addEventListener('keydown', (e) => { if (e.key === 'Enter' && e.target.matches('input')) apply(); }, true);\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Q2Label Menu Clients Specialisations Our approach About Discuss a project Computer Vision Data &amp; Performance Partner Reliable data. Trained models. Measured improvement. We build high-quality training datasets and run annotation at scale for in-house vision engineers, and we train complete models for companies that have no computer vision team of their own. Discuss a technical [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1731","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/pages\/1731","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/comments?post=1731"}],"version-history":[{"count":2,"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/pages\/1731\/revisions"}],"predecessor-version":[{"id":1733,"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/pages\/1731\/revisions\/1733"}],"wp:attachment":[{"href":"https:\/\/q2label.com\/index.php\/wp-json\/wp\/v2\/media?parent=1731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}