{"id":3418,"date":"2026-08-31T10:36:29","date_gmt":"2026-08-31T07:36:29","guid":{"rendered":"https:\/\/marshallai.com\/?post_type=solution&#038;p=3418"},"modified":"2026-09-29T12:12:02","modified_gmt":"2026-09-29T09:12:02","slug":"vieraiden-tolkkien-havaitseminen","status":"publish","type":"solution","link":"https:\/\/marshallai.com\/fi\/solution\/rogue-can-detection\/","title":{"rendered":"Tuntemattoman CAN-v\u00e4yl\u00e4laitteen ja ulkomaisen CAN-v\u00e4yl\u00e4laitteen tunnistus"},"content":{"rendered":"\n<div class=\"mai-section gb-element-8f2f42e3\">\n<div class=\"mai-container_inner-content\">\n<style>\n\/* GenerateBlocks owns outer spacing, background and width. *\/\n.mai-rogue-hero {\n  --mai-rh-orange: #ff742e;\n  --mai-rh-ink: #081722;\n  --mai-rh-muted: #b8c5ce;\n  --mai-rh-font: 'Aspekta', Arial, Helvetica, sans-serif;\n  --mai-rh-mono: 'JetBrains Mono', ui-monospace, monospace;\n  width: 100%; max-width: none; margin: 0; padding: 0;\n  color: #fff; background: transparent; font: 400 16px\/1.65 var(--mai-rh-font);\n  text-align: left; container-type: inline-size;\n}\n.mai-rogue-hero, .mai-rogue-hero *, .mai-rogue-hero *::before, .mai-rogue-hero *::after { box-sizing: border-box; }\n.mai-rogue-hero .mai-rogue-hero__grid { display: grid; grid-template-columns: .95fr 1.05fr; align-items: center; gap: 48px; }\n.breadcrumb {\n  color: #9fb0bd;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 13px;\n  padding: 36px 0 12px;\n  font-size: 12px;\n  display: flex;\n}\n.mai-rogue-hero .mai-rogue-hero__copy, .mai-rogue-hero .mai-rogue-hero__visual { min-width: 0; }\n.mai-rogue-hero .mai-rogue-hero__eyebrow { display: flex; align-items: center; gap: 10px; margin: 0 0 22px; padding: 0; color: var(--mai-rh-muted); font: 500 12px\/1.5 var(--mai-rh-mono); letter-spacing: .08em; text-transform: uppercase; }\n.mai-rogue-hero .mai-rogue-hero__eyebrow::before { content: ''; width: 6px; height: 6px; flex: 0 0 6px; background: var(--mai-rh-orange); }\n.mai-rogue-hero .mai-rogue-hero__title { margin: 0; padding: 0; color: #fff; font: 500 clamp(42px,4.8vw,68px)\/1.04 var(--mai-rh-font); letter-spacing: -.05em; text-transform: none; }\n.mai-rogue-hero .mai-rogue-hero__title span { color: var(--mai-rh-orange); }\n.mai-rogue-hero .mai-rogue-hero__lead { margin: 24px 0 0; padding: 0; color: #d6e0e7; font: 400 18px\/1.65 var(--mai-rh-font); }\n.mai-rogue-hero .mai-rogue-hero__detail { margin: 16px 0 0; padding: 0; color: var(--mai-rh-muted); font: 400 16px\/1.7 var(--mai-rh-font); }\n.mai-rogue-hero .mai-rogue-hero__detail strong { color: #fff; font-weight: 500; }\n.mai-rogue-hero .mai-rogue-hero__also { display: flex; align-items: flex-start; gap: 9px; margin: 18px 0 0; padding: 0; color: var(--mai-rh-muted); font: 400 14px\/1.6 var(--mai-rh-font); }\n.mai-rogue-hero .mai-rogue-hero__also svg { flex: 0 0 auto; margin-top: 2px; color: var(--mai-rh-orange); }\n.mai-rogue-hero .mai-rogue-hero__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 18px 24px; margin-top: 28px; }\n.mai-rogue-hero .mai-rogue-hero__button { display: inline-flex; align-items: center; justify-content: space-between; gap: 24px; min-height: 54px; margin: 0; padding: 17px 22px; border: 1px solid var(--mai-rh-orange); border-radius: 2px; background: var(--mai-rh-orange); color: var(--mai-rh-ink); font: 600 14px\/1.4 var(--mai-rh-font); text-decoration: none; box-shadow: none; touch-action: manipulation; }\n.mai-rogue-hero .mai-rogue-hero__button:hover { background: #ff8f56; border-color: #ff8f56; color: var(--mai-rh-ink); }\n.mai-rogue-hero .mai-rogue-hero__icon { display: block; width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\n.mai-rogue-hero .mai-rogue-hero__button svg { flex: 0 0 auto; }\n.mai-rogue-hero a:focus-visible { outline: 2px solid var(--mai-rh-orange); outline-offset: 5px; }\n.mai-rogue-hero .mai-rogue-hero__button:focus-visible { outline-color: #fff; }\n.mai-rogue-hero .mai-rogue-hero__proof { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); margin: 34px 0 0; padding: 24px 0; border-top: 1px solid #ffffff26; border-bottom: 1px solid #ffffff26; }\n.mai-rogue-hero .mai-rogue-hero__fact { margin: 0; padding: 0 28px; border-left: 1px solid #ffffff26; }\n.mai-rogue-hero .mai-rogue-hero__fact:first-child { padding-left: 0; border-left: 0; }\n.mai-rogue-hero .mai-rogue-hero__fact dt { margin: 0 0 7px; color: #fff; font: 500 26px\/1.25 var(--mai-rh-font); letter-spacing: -.025em; }\n.mai-rogue-hero .mai-rogue-hero__fact dd { margin: 0; color: var(--mai-rh-muted); font: 400 14px\/1.6 var(--mai-rh-font); }\n.mai-rogue-hero .mai-rogue-hero__links { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px 20px; margin-top: 16px; color: var(--mai-rh-muted); font: 400 14px\/1.7 var(--mai-rh-font); }\n.mai-rogue-hero .mai-rogue-hero__links a { color: #fff; text-decoration: underline; text-underline-offset: 4px; box-shadow: none; }\n.mai-rogue-hero .mai-rogue-hero__links a:hover { color: var(--mai-rh-orange); }\n@container (max-width: 950px) {\n  .mai-rogue-hero .mai-rogue-hero__grid { grid-template-columns: minmax(0,1fr); gap: 32px; }\n  .mai-rogue-hero .mai-rogue-hero__copy { max-width: 700px; }\n  .mai-rogue-hero .mai-rogue-hero__fact { padding-inline: 20px; }\n}\n@container (max-width: 560px) {\n  .mai-rogue-hero .mai-rogue-hero__title { font-size: clamp(36px,10cqw,52px); }\n  .mai-rogue-hero .mai-rogue-hero__lead { font-size: 17px; }\n  .mai-rogue-hero .mai-rogue-hero__proof { grid-template-columns: 1fr; gap: 20px; }\n  .mai-rogue-hero .mai-rogue-hero__fact { padding: 0; border-left: 0; }\n  .mai-rogue-hero .mai-rogue-hero__fact dt { font-size: 24px; }\n}\n@supports not (container-type: inline-size) {\n  @media (max-width: 950px) { .mai-rogue-hero .mai-rogue-hero__grid { grid-template-columns: 1fr; } }\n  @media (max-width: 560px) { .mai-rogue-hero .mai-rogue-hero__proof { grid-template-columns: 1fr; gap: 20px; } .mai-rogue-hero .mai-rogue-hero__fact { padding: 0; border: 0; } }\n}\n\n.mai-rogue-demo {\n  --mai-demo-accent: #ff742e;\n  --mai-demo-bg: #0b1d29;\n  --mai-demo-border: rgba(255,255,255,.16);\n  --mai-demo-muted: #b2c1cc;\n  --mai-demo-font: 'Aspekta', Arial, sans-serif;\n  --mai-demo-mono: 'JetBrains Mono', ui-monospace, monospace;\n  width: 100%; max-width: 100%; margin: 0; padding: 0;\n  color: #f5f8fa; background: var(--mai-demo-bg);\n  border: 1px solid var(--mai-demo-border); border-radius: 2px;\n  font: 400 16px\/1.5 var(--mai-demo-font);\n  text-align: left; isolation: isolate; container-type: inline-size;\n}\n.mai-rogue-demo *, .mai-rogue-demo *::before, .mai-rogue-demo *::after { box-sizing: border-box; }\n.mai-rogue-demo [hidden] { display: none !important; }\n.mai-rogue-demo button {\n  appearance: none; -webkit-appearance: none; box-shadow: none;\n  min-width: 0; margin: 0; padding: 0; border: 0; border-radius: 0;\n  background: transparent; color: inherit;\n  font: inherit; font-size: 14px; font-weight: 400;\n  text-align: left; text-transform: none; letter-spacing: normal;\n  line-height: 1.3; cursor: pointer; touch-action: manipulation;\n  transition: color .2s, background .2s;\n}\n.mai-rogue-demo button::before, .mai-rogue-demo button::after { content: none; }\n.mai-rogue-demo button:disabled { opacity: .5; cursor: default; }\n.mai-rogue-demo button:focus-visible { outline: 2px solid var(--mai-demo-accent); outline-offset: -4px; }\n.mai-rogue-demo svg { display: block; width: 20px; height: 20px; flex-shrink: 0; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\n.mai-rogue-demo__toolbar {\n  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;\n  gap: 10px 20px; min-height: 62px; padding: 15px 20px;\n  border-bottom: 1px solid var(--mai-demo-border);\n}\n.mai-rogue-demo__identity { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 18px; }\n.mai-rogue-demo__number { font: 400 12px\/1.5 var(--mai-demo-mono); color: var(--mai-demo-muted); letter-spacing: .05em; }\n.mai-rogue-demo__type { font-size: 14px; color: #f5f8fa; }\n.mai-rogue-demo__badge { color: var(--mai-demo-muted); font-size: 12px; white-space: nowrap; }\n.mai-rogue-demo__frame { position: relative; }\n.mai-rogue-demo__stage { position: relative; width: 100%; aspect-ratio: 16\/10; overflow: hidden; background: #060f17; }\n.mai-rogue-demo__plane { position: absolute; inset: 0; width: 100%; height: 100%; margin: auto; }\n.mai-rogue-demo .mai-rogue-demo__image { display: block; width: 100%; height: 100%; max-width: none; margin: 0; border: 0; border-radius: 0; box-shadow: none; object-fit: contain; }\n.mai-rogue-demo__scan { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }\n.mai-rogue-demo .mai-rogue-demo__scan::after { content: ''; position: absolute; left: 0; right: 0; height: 2px; background: var(--mai-demo-accent); box-shadow: 0 0 18px rgba(255,116,46,.65); animation: mai-rogue-demo-scan-v1 1s linear both; }\n.mai-rogue-demo [data-mai-rogue-scan][data-restart=\"true\"]::after { animation: none; }\n@keyframes mai-rogue-demo-scan-v1 { from { top: 12%; } to { top: 86%; } }\n.mai-rogue-demo[data-playing=\"false\"] .mai-rogue-demo__scan::after { animation-play-state: paused; }\n.mai-rogue-demo__box { position: absolute; border: 1px solid var(--mai-demo-accent); color: var(--mai-demo-accent); background: rgba(255,116,46,.04); pointer-events: none; }\n.mai-rogue-demo__box::before, .mai-rogue-demo__box::after { content: ''; position: absolute; inset: -2px; background: linear-gradient(currentColor,currentColor) left top\/16px 2px no-repeat, linear-gradient(currentColor,currentColor) right top\/16px 2px no-repeat, linear-gradient(currentColor,currentColor) left bottom\/16px 2px no-repeat, linear-gradient(currentColor,currentColor) right bottom\/16px 2px no-repeat; }\n.mai-rogue-demo__box::after { background-size: 2px 16px; }\n.mai-rogue-demo__box-label { position: absolute; bottom: calc(100% + 5px); left: -1px; padding: 4px 8px; color: #071520; background: var(--mai-demo-accent); font: 500 12px\/1.4 var(--mai-demo-mono); white-space: nowrap; }\n.mai-rogue-demo__result {\n  position: absolute; bottom: 16px; left: 16px; right: 16px;\n  display: flex; align-items: center; gap: 12px; padding: 12px 14px;\n  background: rgba(7,23,34,.96); border: 1px solid var(--mai-demo-border);\n}\n.mai-rogue-demo__result-icon { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 38px; height: 38px; background: rgba(255,116,46,.12); color: var(--mai-demo-accent); }\n.mai-rogue-demo__result-text { min-width: 0; flex: 1; }\n.mai-rogue-demo__phase { display: block; margin: 0 0 2px; font: 400 12px\/1.4 var(--mai-demo-mono); letter-spacing: .08em; color: var(--mai-demo-muted); }\n.mai-rogue-demo__message { display: block; margin: 0; color: #f5f8fa; font: 500 15px\/1.4 var(--mai-demo-font); }\n.mai-rogue-demo .mai-rogue-demo__play { display: flex; align-items: center; justify-content: center; flex-shrink: 0; width: 44px; min-height: 44px; border: 1px solid var(--mai-demo-border); border-radius: 2px; }\n.mai-rogue-demo .mai-rogue-demo__play:hover { background: rgba(255,255,255,.1); }\n.mai-rogue-demo[data-playing=\"true\"] .mai-rogue-demo__icon-play, .mai-rogue-demo[data-playing=\"false\"] .mai-rogue-demo__icon-pause { display: none; }\n.mai-rogue-demo__steps { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); border-top: 1px solid var(--mai-demo-border); }\n.mai-rogue-demo .mai-rogue-demo__step { display: flex; align-items: center; gap: 12px; min-height: 60px; padding: 16px 20px; color: var(--mai-demo-muted); border-right: 1px solid var(--mai-demo-border); }\n.mai-rogue-demo .mai-rogue-demo__step:last-child { border-right: 0; }\n.mai-rogue-demo .mai-rogue-demo__step[aria-pressed=\"true\"] { color: #fff; background: rgba(255,255,255,.035); box-shadow: inset 0 -2px var(--mai-demo-accent); }\n.mai-rogue-demo__step-number { font: 400 12px\/1.4 var(--mai-demo-mono); color: #9cafbc; }\n.mai-rogue-demo__step[aria-pressed=\"true\"] .mai-rogue-demo__step-number { color: var(--mai-demo-accent); }\n.mai-rogue-demo__step svg { width: 16px; height: 16px; margin-left: auto; color: #8da1af; }\n.mai-rogue-demo .mai-rogue-demo__step:hover { color: #fff; background: rgba(255,255,255,.07); }\n.mai-rogue-demo__sr { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; clip-path: inset(50%); overflow: hidden; white-space: nowrap; border: 0; }\n.mai-rogue-demo__noscript { display: block; padding: 14px 20px; font-size: 14px; color: var(--mai-demo-muted); }\n@container (max-width: 580px) {\n  .mai-rogue-demo__toolbar { padding: 12px 14px; }\n  .mai-rogue-demo__identity { gap: 3px; flex-direction: column; align-items: flex-start; }\n  .mai-rogue-demo__result { position: relative; bottom: auto; left: auto; right: auto; gap: 9px; padding: 10px 12px; border-left: 0; border-right: 0; border-bottom: 0; }\n  .mai-rogue-demo__result-icon { width: 30px; height: 30px; }\n  .mai-rogue-demo__message { font-size: 14px; }\n  .mai-rogue-demo .mai-rogue-demo__step { min-height: 54px; padding: 14px 12px; gap: 8px; }\n  .mai-rogue-demo__step svg { display: none; }\n}\n@container (max-width: 390px) {\n  .mai-rogue-demo__box-label { padding: 3px 5px; font-size: 12px; }\n  .mai-rogue-demo__type { font-size: 14px; }\n}\n@media (max-width: 580px) {\n  .mai-rogue-demo .mai-rogue-demo__step { padding: 14px 10px; gap: 7px; }\n  .mai-rogue-demo__step svg { display: none; }\n}\n@media (prefers-reduced-motion: reduce) {\n  .mai-rogue-demo *, .mai-rogue-demo *::before, .mai-rogue-demo *::after { transition: none !important; animation: none !important; }\n  .mai-rogue-demo__scan::after { top: 45%; }\n}\n\n.mai-rogue-demo .mai-rogue-demo__speed-note {\n  margin: 0;\n  padding: 16px 20px 18px;\n  color: var(--mai-demo-muted);\n  font: 400 13px\/1.6 var(--mai-demo-font);\n  text-align: left;\n}\n\n\n\/* Prominent benefits strip, with responsive separators. *\/\n.mai-rogue-hero .mai-rogue-hero__benefits { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 0; list-style: none; margin: 24px 0 0; padding: 20px 0; border: 1px solid #ffffff26; border-radius: 2px; background: #ffffff06; }\n.mai-rogue-hero .mai-rogue-hero__benefit { display: flex; align-items: flex-start; gap: 12px; min-width: 0; margin: 0; padding: 0 22px; border-left: 1px solid #ffffff26; color: #fff; font: 500 16px\/1.5 var(--mai-rh-font); }\n.mai-rogue-hero .mai-rogue-hero__benefit:first-child { border-left: 0; }\n.mai-rogue-hero .mai-rogue-hero__benefit::before, .mai-rogue-hero .mai-rogue-hero__benefit::after { content: none; }\n.mai-rogue-hero .mai-rogue-hero__benefit svg { flex: 0 0 auto; width: 22px; height: 22px; margin-top: 1px; color: var(--mai-rh-orange); }\n@container (max-width: 700px) {\n  .mai-rogue-hero .mai-rogue-hero__benefits { grid-template-columns: 1fr; padding: 0 18px; }\n  .mai-rogue-hero .mai-rogue-hero__benefit { padding: 16px 0; border-left: 0; border-top: 1px solid #ffffff26; }\n  .mai-rogue-hero .mai-rogue-hero__benefit:first-child { border-top: 0; }\n}\n@supports not (container-type: inline-size) {\n  @media (max-width: 700px) {\n    .mai-rogue-hero .mai-rogue-hero__benefits { grid-template-columns: 1fr; padding: 0 18px; }\n    .mai-rogue-hero .mai-rogue-hero__benefit { padding: 16px 0; border-left: 0; border-top: 1px solid #ffffff26; }\n    .mai-rogue-hero .mai-rogue-hero__benefit:first-child { border-top: 0; }\n  }\n}\n\/* The existing animation sets data-phase for autoplay and manual controls. *\/\n.mai-rogue-demo .mai-rogue-demo__result-icon > svg { display: none; }\n.mai-rogue-demo:not([data-phase]) .mai-rogue-demo__result-icon--capture,\n.mai-rogue-demo[data-phase=\"0\"] .mai-rogue-demo__result-icon--capture,\n.mai-rogue-demo[data-phase=\"1\"] .mai-rogue-demo__result-icon--analyse,\n.mai-rogue-demo[data-phase=\"2\"] .mai-rogue-demo__result-icon--act { display: block; }\n<\/style>\n<section class=\"mai-rogue-hero\" aria-label=\"Rogue Can Detector\">\n  <div class=\"mai-rogue-hero__grid\">\n    <div class=\"mai-rogue-hero__copy\">\n<p class=\"breadcrumb\"><a href=\"\/\">Home<\/a><span>\/<\/span><a href=\"\/solutions\/\">Solutions<\/a><span>\/<\/span>Rogue Can Detector<\/p>\n      <p class=\"mai-rogue-hero__eyebrow\">Rogue Can Detector<\/p>\n      <h1 class=\"mai-rogue-hero__title\">Stop the wrong can<br><span>before it ships.<\/span><\/h1>\n      <p class=\"mai-rogue-hero__lead\">Verify that every can matches the drink being filled\u2014even when labels look almost identical.<\/p>\n      <p class=\"mai-rogue-hero__detail\">We inspect the <strong>entire label<\/strong> to identify the can and catch subtle SKU differences, including import\/export markings.<\/p>\n      <p class=\"mai-rogue-hero__also\"><svg class=\"mai-rogue-hero__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m5 12 4 4L19 6\"><\/path><\/svg>Also detects fallen and damaged cans.<\/p>\n      <div class=\"mai-rogue-hero__actions\">\n        <a class=\"mai-rogue-hero__button\" href=\"https:\/\/marshallai.com\/contact\/\">Discuss your filling line<svg class=\"mai-rogue-hero__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 12h16m-6-6 6 6-6 6\"><\/path><\/svg><\/a>\n      <\/div>\n    <\/div>\n    <div class=\"mai-rogue-hero__visual\">\n<section class=\"mai-rogue-demo\" data-mai-rogue-rogue-demo=\"\" data-playing=\"false\" aria-label=\"Rogue can identity inspection demonstration\">\n  <div class=\"mai-rogue-demo__toolbar\">\n    <div class=\"mai-rogue-demo__identity\">\n      <span class=\"mai-rogue-demo__number\">INSPECTION VIEW \/ <span data-mai-rogue-number=\"\">01<\/span><\/span>\n      <!-- The inspection type (formerly image-meta) is now in the toolbar. -->\n      <span class=\"mai-rogue-demo__type\" data-mai-rogue-type=\"\">Product identity<\/span>\n    <\/div>\n    <span class=\"mai-rogue-demo__badge\">Illustrative demo<\/span>\n  <\/div>\n  <div class=\"mai-rogue-demo__frame\">\n  <div class=\"mai-rogue-demo__stage\" data-mai-rogue-stage=\"\">\n    <div class=\"mai-rogue-demo__plane\" data-mai-rogue-plane=\"\">\n      <img loading=\"lazy\" class=\"mai-rogue-demo__image\" data-mai-rogue-image=\"\" src=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/MarshallAI_beverage-identity.webp\" width=\"1586\" height=\"992\" alt=\"Closely packed beverage cans, with one rogue IMPORT label among DOMESTIC labels.\" decoding=\"async\">\n      <div class=\"mai-rogue-demo__scan\" data-mai-rogue-scan=\"\" hidden=\"\" aria-hidden=\"true\"><\/div>\n      <div class=\"mai-rogue-demo__box\" data-mai-rogue-box=\"\" hidden=\"\" aria-hidden=\"true\"><span class=\"mai-rogue-demo__box-label\" data-mai-rogue-box-label=\"\">IMPORT \u2260 DOMESTIC<\/span><\/div>\n    <\/div>\n  <\/div>\n    <div class=\"mai-rogue-demo__result\">\n      <span class=\"mai-rogue-demo__result-icon\" aria-hidden=\"true\">\n        <svg class=\"mai-rogue-demo__result-icon--capture\" viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M8 6l2-3h4l2 3h4v14H4V6h4Z\"><\/path><circle cx=\"12\" cy=\"12\" r=\"3\"><\/circle><\/svg>\n        <svg class=\"mai-rogue-demo__result-icon--analyse\" viewBox=\"0 0 24 24\" focusable=\"false\"><circle cx=\"10\" cy=\"10\" r=\"6\"><\/circle><path d=\"m14.5 14.5 6 6M7 11V9m3 3V7m3 4V9\"><\/path><\/svg>\n        <svg class=\"mai-rogue-demo__result-icon--act\" viewBox=\"0 0 24 24\" focusable=\"false\"><path d=\"M3 19h5V5h5m-4-4 4 4-4 4M8 13h13m-4-4 4 4-4 4\"><\/path><\/svg>\n      <\/span>\n      <div class=\"mai-rogue-demo__result-text\"><span class=\"mai-rogue-demo__phase\" data-mai-rogue-phase=\"\">CAPTURE<\/span><strong class=\"mai-rogue-demo__message\" data-mai-rogue-message=\"\">Acquiring product image<\/strong><\/div>\n      <button class=\"mai-rogue-demo__play\" type=\"button\" data-mai-rogue-play=\"\" disabled=\"\" aria-label=\"Play demonstration\">\n        <svg class=\"mai-rogue-demo__icon-pause\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8 5v14M16 5v14\"><\/path><\/svg>\n        <svg class=\"mai-rogue-demo__icon-play\" viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"m8 5 11 7-11 7Z\"><\/path><\/svg>\n      <\/button>\n    <\/div>\n  <\/div>\n  <div class=\"mai-rogue-demo__steps\" role=\"group\" aria-label=\"Inspection process steps\">\n    <button class=\"mai-rogue-demo__step\" type=\"button\" data-mai-rogue-step=\"0\" aria-pressed=\"true\" disabled=\"\"><span class=\"mai-rogue-demo__step-number\">01<\/span>Capture<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 12h16m-5-5 5 5-5 5\"><\/path><\/svg><\/button>\n    <button class=\"mai-rogue-demo__step\" type=\"button\" data-mai-rogue-step=\"1\" aria-pressed=\"false\" disabled=\"\"><span class=\"mai-rogue-demo__step-number\">02<\/span>Analyse<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 12h16m-5-5 5 5-5 5\"><\/path><\/svg><\/button>\n    <button class=\"mai-rogue-demo__step\" type=\"button\" data-mai-rogue-step=\"2\" aria-pressed=\"false\" disabled=\"\"><span class=\"mai-rogue-demo__step-number\">03<\/span>Act<\/button>\n  <\/div>\n  <p class=\"mai-rogue-demo__speed-note\">Actual inspection speed is measured in milliseconds. MarshallAI can comfortably inspect over 150,000 units per hour.<\/p>\n  <span class=\"mai-rogue-demo__sr\" data-mai-rogue-announcement=\"\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/span>\n  <noscript>&amp;amp;lt;span class=&#8221;mai-rogue-demo__noscript&#8221;&amp;amp;gt;Enable JavaScript to play the inspection demonstration.&amp;amp;lt;\/span&amp;amp;gt;<\/noscript>\n<\/section>\n    <\/div>\n  <\/div>\n  <dl class=\"mai-rogue-hero__proof\">\n    <div class=\"mai-rogue-hero__fact\"><dt>150,000+ cans\/hour<\/dt><dd>Inspection at full production speed.<\/dd><\/div>\n    <div class=\"mai-rogue-hero__fact\"><dt>No reconfiguration<\/dt><dd>Automatic recognition between batches and SKUs.<\/dd><\/div>\n    <div class=\"mai-rogue-hero__fact\"><dt>From the first can<\/dt><dd>No learning period at batch changeover.<\/dd><\/div>\n  <\/dl>\n  <ul class=\"mai-rogue-hero__benefits\" role=\"list\" aria-label=\"Benefits\">\n    <li class=\"mai-rogue-hero__benefit\"><svg class=\"mai-rogue-hero__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><path d=\"m8 12 3 3 5-6\"><\/path><\/svg><span>Reduce recall risk<\/span><\/li>\n    <li class=\"mai-rogue-hero__benefit\"><svg class=\"mai-rogue-hero__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><path d=\"m8 12 3 3 5-6\"><\/path><\/svg><span>Avoid batch-wide manual inspections<\/span><\/li>\n    <li class=\"mai-rogue-hero__benefit\"><svg class=\"mai-rogue-hero__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><path d=\"m8 12 3 3 5-6\"><\/path><\/svg><span>Protect your brand<\/span><\/li>\n  <\/ul>\n  <div class=\"mai-rogue-hero__links\">\n    <span>Combine with:<\/span>\n    <a href=\"https:\/\/marshallai.com\/solution\/lot-and-date-code-inspection\/\">Lot and date code inspection<\/a>\n    <a href=\"https:\/\/marshallai.com\/solution\/label-inspection\/\">Label presence &amp; condition inspection<\/a>\n    <a href=\"https:\/\/marshallai.com\/industries\/beverage-and-drink-manufacturing\/\">All beverage solutions \u2192<\/a>\n  <\/div>\n<\/section>\n<script>\n\n(function () {\n  'use strict';\n  function initialise(root) {\n    if (root.dataset.maiRogueReady === 'true') return;\n    root.dataset.maiRogueReady = 'true';\n    var find = function (selector) { return root.querySelector(selector); };\n    var image = find('[data-mai-rogue-image]');\n    var stage = find('[data-mai-rogue-stage]');\n    var plane = find('[data-mai-rogue-plane]');\n    var box = find('[data-mai-rogue-box]');\n    var scan = find('[data-mai-rogue-scan]');\n    var play = find('[data-mai-rogue-play]');\n    var message = find('[data-mai-rogue-message]');\n    var announcement = find('[data-mai-rogue-announcement]');\n    var stepButtons = Array.from(root.querySelectorAll('[data-mai-rogue-step]'));\n\n    \/* VIEW CONFIGURATION\n       box = [left, top, width, height] as percentages of the ORIGINAL image.\n       Images are contained, never cropped; overlay coordinates follow the image.\n       Replace src values with WordPress Media Library URLs if desired.\n       messages are a scripted demonstration, not measured model outputs.\n    *\/\n    var views = {\n      beverage: {\n        number: '01', type: 'Product identity',\n        src: image.getAttribute('src'),\n        alt: 'Closely packed NORTHLINE cans, with one IMPORT label among DOMESTIC labels.',\n        label: 'IMPORT \u2260 DOMESTIC', box: [50.8, 56.8, 12.5, 9],\n        messages: ['Acquiring product image', 'Import can on a domestic run', 'Reject signal \u2192 production line']\n      }\n    };\n    var phaseNames = ['CAPTURE', 'ANALYSE', 'ACT'];\n    var phaseDurations = [1000, 2600, 2600]; \/\/ Capture, Analyse, Act (milliseconds).\n    var selected = 'beverage';\n    var phase = 0;\n    var timer = null;\n    var loaded = false;\n    var failed = false;\n    var visible = true;\n    var reduced = window.matchMedia('(prefers-reduced-motion: reduce)');\n    var playing = !reduced.matches;\n    if (!playing) phase = 1;\n\n    function fitImage() {\n      if (!image.naturalWidth || !stage.clientWidth) return;\n      var scale = Math.min(stage.clientWidth \/ image.naturalWidth, stage.clientHeight \/ image.naturalHeight);\n      plane.style.width = (image.naturalWidth * scale) + 'px';\n      plane.style.height = (image.naturalHeight * scale) + 'px';\n    }\n    function clearTimer() { window.clearTimeout(timer); timer = null; }\n    function schedule() {\n      clearTimer();\n      if (!root.isConnected || !playing || !visible || document.hidden || !loaded) return;\n      \/\/ Restart the CSS sweep together with the Capture timer, including\n      \/\/ cached images, repeated view clicks, and resuming a paused capture.\n      if (phase === 0) {\n        scan.dataset.restart = 'true';\n        void scan.offsetWidth;\n        delete scan.dataset.restart;\n      }\n      timer = window.setTimeout(function () {\n        phase = (phase + 1) % 3;\n        render(false);\n        schedule();\n      }, phaseDurations[phase]);\n    }\n    function render(announce) {\n      var view = views[selected];\n      root.dataset.playing = String(playing);\n      root.dataset.phase = String(phase);\n      find('[data-mai-rogue-number]').textContent = view.number;\n      find('[data-mai-rogue-type]').textContent = view.type;\n      find('[data-mai-rogue-phase]').textContent = phaseNames[phase];\n      message.textContent = failed ? 'Image unavailable \u2014 please reload the page' : loaded ? view.messages[phase] : 'Loading inspection image\u2026';\n      find('[data-mai-rogue-box-label]').textContent = view.label;\n      ['left', 'top', 'width', 'height'].forEach(function (property, index) { box.style[property] = view.box[index] + '%'; });\n      box.hidden = !loaded || phase === 0;\n      scan.hidden = !loaded || phase !== 0;\n      play.setAttribute('aria-label', playing ? 'Pause demonstration' : 'Play demonstration');\n      stepButtons.forEach(function (button, index) { button.setAttribute('aria-pressed', String(index === phase)); });\n      if (announce) announcement.textContent = view.type + '. ' + message.textContent;\n    }\n    function imageReady() {\n      if (!image.complete || !image.naturalWidth) return;\n      loaded = true; failed = false;\n      fitImage(); render(false); schedule();\n    }\n    image.addEventListener('load', imageReady);\n    image.addEventListener('error', function () {\n      loaded = false; failed = true; clearTimer(); render(true);\n    });\n    stepButtons.forEach(function (button) {\n      button.disabled = false;\n      button.addEventListener('click', function () {\n        playing = false; clearTimer(); phase = Number(button.dataset.maiRogueStep); render(true);\n      });\n    });\n    play.disabled = false;\n    play.addEventListener('click', function () { playing = !playing; render(true); schedule(); });\n    document.addEventListener('visibilitychange', schedule);\n    function reducedChanged(event) { if (event.matches) { playing = false; phase = 1; render(false); schedule(); } }\n    if (reduced.addEventListener) reduced.addEventListener('change', reducedChanged);\n    if ('ResizeObserver' in window) new ResizeObserver(fitImage).observe(stage);\n    else window.addEventListener('resize', fitImage);\n    if ('IntersectionObserver' in window) {\n      new IntersectionObserver(function (entries) {\n        visible = entries[0].isIntersecting; schedule();\n      }, { threshold: 0.05 }).observe(root);\n    }\n    render(false);\n    imageReady();\n  }\n  function boot() { document.querySelectorAll('[data-mai-rogue-rogue-demo]').forEach(initialise); }\n  \/\/ Works inline, with defer\/delayed script execution, and with multiple block copies.\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, { once: true });\n  else boot();\n})();\n\n<\/script>\n<\/div>\n<\/div>\n\n\n\n<section class=\"gbp-section gb-element-207c56eb\">\n<div class=\"gb-element-0ed52b43\">\n<div>\n<div class=\"gb-text gb-text-a7fb84b8 mai-eyebrow\">Trusted by<\/div>\n<\/div>\n\n\n\n<div class=\"gb-element-0fbd3479\">\n<div>\n<img decoding=\"async\" class=\"gb-media-5a172836\" src=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/02\/Hartwall-logo-svg.svg\" alt=\"\" title=\"Hartwall logo svg\"\/>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!-- MarshallAI \/ BrauBeviale 2026 \u2014 WordPress Custom HTML block.\n     Paste this whole fragment into one Custom HTML block.\n     Alternatively, move the CSS inside <style> to mai-system.css once.\n     No JavaScript or dependencies. Images use your supplied WordPress URLs.\n-->\n<style>\n.mai-bb-banner {\n  --mai-bb-orange: #ff742e;\n  --mai-bb-navy: #081722;\n  --mai-bb-font: 'Aspekta', Arial, Helvetica, sans-serif;\n  --mai-bb-mono: 'JetBrains Mono', ui-monospace, monospace;\n  width: 100%; max-width: 1280px; margin: 0 auto; padding: 0;\n  background: var(--mai-bb-navy); color: #fff;\n  border: 1px solid #ffffff26; border-top: 3px solid var(--mai-bb-orange);\n  font: 400 16px\/1.55 var(--mai-bb-font); text-align: left;\n  container-type: inline-size;\n}\n.mai-bb-banner, .mai-bb-banner *, .mai-bb-banner *::before, .mai-bb-banner *::after { box-sizing: border-box; }\n.mai-bb-banner .mai-bb-banner__inner { display: grid; grid-template-columns: 1.15fr 1fr; align-items: stretch; }\n.mai-bb-banner .mai-bb-banner__copy { display: flex; flex-direction: column; align-items: flex-start; justify-content: center; padding: 28px 32px; }\n.mai-bb-banner .mai-bb-banner__eyebrow { display: flex; align-items: center; gap: 10px; margin: 0 0 22px; padding: 0; color: #b8c5ce; font: 500 12px\/1.5 var(--mai-bb-mono); letter-spacing: .08em; text-transform: uppercase; }\n.mai-bb-banner .mai-bb-banner__eyebrow::before { content: ''; width: 6px; height: 6px; flex: 0 0 6px; background: var(--mai-bb-orange); }\n.mai-bb-banner .mai-bb-banner__title { margin: 0; padding: 0; color: #fff; font: 500 clamp(32px,3.4vw,48px)\/1.08 var(--mai-bb-font); font-size: clamp(30px, 3vw, 40px); letter-spacing: -.045em; text-transform: none; }\n.mai-bb-banner .mai-bb-banner__title span { color: var(--mai-bb-orange); }\n.mai-bb-banner .mai-bb-banner__details { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 18px; margin: 23px 0 28px; padding: 0; color: #d4dfe6; font: 400 16px\/1.6 var(--mai-bb-font); }\n.mai-bb-banner .mai-bb-banner__location { padding-left: 18px; border-left: 1px solid #ffffff40; }\n.mai-bb-banner .mai-bb-banner__cta { display: inline-flex; align-items: center; justify-content: space-between; gap: 28px; min-height: 54px; padding: 16px 22px; border: 1px solid var(--mai-bb-orange); border-radius: 2px; background: var(--mai-bb-orange); color: var(--mai-bb-navy); font: 600 15px\/1.4 var(--mai-bb-font); text-decoration: none; box-shadow: none; transition: background .2s; touch-action: manipulation; }\n.mai-bb-banner .mai-bb-banner__cta:hover { background: #ff8f56; border-color: #ff8f56; color: var(--mai-bb-navy); text-decoration: none; }\n.mai-bb-banner .mai-bb-banner__cta svg { display: block; width: 20px; height: 20px; flex: 0 0 auto; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\n.mai-bb-banner a:focus-visible { outline: 3px solid #fff; outline-offset: 5px; }\n.mai-bb-banner .mai-bb-banner__visual { min-width: 0; margin: 0; padding: 16px; background: #122631; border-left: 1px solid #ffffff1c; }\n.mai-bb-banner .mai-bb-banner__map-card { background: #f6f3ee; }\n.mai-bb-banner .mai-bb-banner__map-head { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 12px 20px; padding: 10px 16px; border-bottom: 1px solid #d9dfdf; background: #fff; }\n.mai-bb-banner .mai-bb-banner__logo { display: block; width: 90px; height: auto; max-width: 100%; margin: 0; padding: 0; border: 0; border-radius: 0; box-shadow: none; }\n.mai-bb-banner .mai-bb-banner__stand { color: #101d27; font: 500 12px\/1.6 var(--mai-bb-mono); letter-spacing: .04em; }\n.mai-bb-banner .mai-bb-banner__map-link { display: block; padding: 0; margin: 0; color: #101d27; text-decoration: none; box-shadow: none; }\n.mai-bb-banner .mai-bb-banner__map-link:focus-visible { outline-color: var(--mai-bb-orange); outline-offset: -3px; }\n.mai-bb-banner .mai-bb-banner__map { display: block; width: 100%; height: 220px; object-fit: contain; max-width: 100%; margin: 0; padding: 0; border: 0; border-radius: 0; box-shadow: none; }\n.mai-bb-banner .mai-bb-banner__caption { display: flex; justify-content: space-between; gap: 12px; margin: 0; padding: 10px 16px; border-top: 1px solid #d9dfdf; color: #43535e; background: #fff; font: 400 12px\/1.5 var(--mai-bb-font); }\n.mai-bb-banner .mai-bb-banner__map-link:hover .mai-bb-banner__caption span:last-child { text-decoration: underline; text-underline-offset: 3px; }\n\n@container (max-width: 760px) {\n  .mai-bb-banner .mai-bb-banner__inner { grid-template-columns: minmax(0,1fr); }\n  .mai-bb-banner .mai-bb-banner__visual { border-left: 0; border-top: 1px solid #ffffff1c; padding: 20px; }\n  .mai-bb-banner .mai-bb-banner__map-card { max-width: 500px; margin-inline: auto; }\n  .mai-bb-banner .mai-bb-banner__title { font-size: clamp(32px,6cqw,44px); }\n}\n@container (max-width: 420px) {\n  .mai-bb-banner .mai-bb-banner__copy { padding: 28px 22px; }\n  .mai-bb-banner .mai-bb-banner__details { flex-direction: column; align-items: flex-start; gap: 5px; }\n  .mai-bb-banner .mai-bb-banner__location { padding-left: 0; border-left: 0; }\n  .mai-bb-banner .mai-bb-banner__visual { padding: 14px; }\n  .mai-bb-banner .mai-bb-banner__map-head { padding: 12px; }\n  .mai-bb-banner .mai-bb-banner__logo { width: 100px; }\n  .mai-bb-banner .mai-bb-banner__stand { font-size: 11px; }\n}\n@supports not (container-type: inline-size) {\n  @media (max-width: 760px) {\n    .mai-bb-banner .mai-bb-banner__inner { grid-template-columns: minmax(0,1fr); }\n    .mai-bb-banner .mai-bb-banner__visual { border-left: 0; }\n    .mai-bb-banner .mai-bb-banner__details { flex-direction: column; align-items: flex-start; }\n    .mai-bb-banner .mai-bb-banner__location { border-left: 0; padding-left: 0; }\n  }\n}\n@media (prefers-reduced-motion: reduce) {\n  .mai-bb-banner .mai-bb-banner__cta { transition: none; }\n}\n<\/style>\n\n<section class=\"mai-bb-banner\" aria-label=\"Meet MarshallAI at BrauBeviale 2026\">\n  <div class=\"mai-bb-banner__inner\">\n    <div class=\"mai-bb-banner__copy\">\n      <p class=\"mai-bb-banner__eyebrow\">MarshallAI \/ Live at BrauBeviale<\/p>\n      <h2 class=\"mai-bb-banner__title\">Meet us at<br><span>BrauBeviale 2026.<\/span><\/h2>\n      <p class=\"mai-bb-banner__details\">\n        <span><time datetime=\"2026-11-10\">10<\/time>\u2013<time datetime=\"2026-11-12\">12 November 2026<\/time><\/span>\n        <span class=\"mai-bb-banner__location\">Hall 10 \u00b7 Stand 10-139<\/span>\n      <\/p>\n      <a class=\"mai-bb-banner__cta\" href=\"https:\/\/marshallai.com\/braubeviale-2026\/\">\n        Book a live demo @ BrauBeviale\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 12h16m-6-6 6 6-6 6\"><\/path><\/svg>\n      <\/a>\n    <\/div>\n    <div class=\"mai-bb-banner__visual\">\n      <div class=\"mai-bb-banner__map-card\">\n        <div class=\"mai-bb-banner__map-head\">\n          <img class=\"mai-bb-banner__logo\" src=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/BB_Logo_RGB_black-scaled.webp\" alt=\"BrauBeviale\" width=\"2560\" height=\"1380\" loading=\"lazy\" decoding=\"async\">\n          <span class=\"mai-bb-banner__stand\">HALL 10 \/ 10-139<\/span>\n        <\/div>\n        <a class=\"mai-bb-banner__map-link\" href=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/MarshallAI_BrauBeviale2026_floor-plan.webp\" target=\"_blank\" rel=\"noopener\" aria-label=\"View the floor plan showing stand 10-139, opens in a new tab\">\n          <img class=\"mai-bb-banner__map\" src=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/MarshallAI_BrauBeviale2026_floor-plan.webp\" width=\"1564\" height=\"1240\" alt=\"Hall 10 floor plan with stand 10-139 highlighted in yellow.\" loading=\"lazy\" decoding=\"async\">\n          <span class=\"mai-bb-banner__caption\"><span>Find us in Hall 10<\/span><span>Enlarge floor plan \u2197<\/span><\/span>\n        <\/a>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n\n\n<div style=\"height:24px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div class=\"mai-section\">\n<div class=\"mai-container_inner-content\">\n<!-- MarshallAI product section \u2014 reusable WordPress Custom HTML block.\nPlace inside a GenerateBlocks container. It controls outer padding, margins,\nbackground and maximum width. Default text colours suit a light background.\nNo JavaScript or external icon\/font dependencies. CSS can move to mai-system.css.\n\nREUSE FOR ANOTHER PRODUCT:\nChange the section aria-label, title, summary, image URL\/alt, key facts,\nincluded items and enquiry subject. Keep the four scope groups and class names.\nThe enquiry button currently opens an email; replace href with your enquiry-page\nURL if preferred. Confirm product-specific equipment and service scope in each proposal.\n-->\n<style>\n.mai-product {\n  --mai-product-ink: #101d27;\n  --mai-product-muted: #56656e;\n  --mai-product-line: #d9dfdf;\n  --mai-product-orange: #ff742e;\n  --mai-product-navy: #081722;\n  --mai-product-font: 'Aspekta', Arial, Helvetica, sans-serif;\n  --mai-product-mono: 'JetBrains Mono', ui-monospace, monospace;\n  margin: 0; padding: 0; width: 100%; max-width: none;\n  background: transparent; color: var(--mai-product-ink);\n  font: 400 16px\/1.65 var(--mai-product-font);\n  text-align: left; container-type: inline-size;\n}\n.mai-product, .mai-product *, .mai-product *::before, .mai-product *::after { box-sizing: border-box; }\n.mai-product .mai-product__header { display: grid; grid-template-columns: 1.2fr 1fr; align-items: end; gap: 24px 48px; margin: 0 0 36px; padding: 0; }\n.mai-product .mai-product__eyebrow { display: flex; align-items: center; gap: 10px; margin: 0 0 18px; padding: 0; color: var(--mai-product-muted); font: 500 12px\/1.5 var(--mai-product-mono); letter-spacing: .08em; text-transform: uppercase; }\n.mai-product .mai-product__eyebrow::before { content: ''; width: 6px; height: 6px; flex: 0 0 6px; background: var(--mai-product-orange); }\n.mai-product .mai-product__title { margin: 0; padding: 0; color: var(--mai-product-ink); font: 500 clamp(32px,3.4vw,49px)\/1.1 var(--mai-product-font); letter-spacing: -.045em; text-transform: none; }\n.mai-product .mai-product__intro { max-width: 440px; margin: 0; padding: 0; color: var(--mai-product-muted); font: 400 17px\/1.65 var(--mai-product-font); }\n.mai-product .mai-product__layout { display: grid; grid-template-columns: 1.05fr 1fr; gap: 40px; align-items: start; }\n.mai-product .mai-product__visual { min-width: 0; margin: 0; padding: 0; background: var(--mai-product-navy); color: #fff; }\n.mai-product .mai-product__image { display: block; width: 100%; height: auto; max-width: 100%; margin: 0; padding: 0; border: 0; border-radius: 0; box-shadow: none; }\n.mai-product .mai-product__facts { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); margin: 0; padding: 22px 0; }\n.mai-product .mai-product__fact { padding: 0 18px; border-right: 1px solid #ffffff26; min-width: 0; }\n.mai-product .mai-product__fact:last-child { border-right: 0; }\n.mai-product .mai-product__fact dt { margin: 0 0 5px; color: #fff; font: 500 22px\/1.2 var(--mai-product-font); letter-spacing: -.025em; }\n.mai-product .mai-product__fact dd { margin: 0; color: #b8c5ce; font: 400 13px\/1.5 var(--mai-product-font); }\n.mai-product .mai-product__caption { display: block; margin: 0; padding: 16px 20px; border-top: 1px solid #ffffff26; color: #b8c5ce; font: 400 12px\/1.6 var(--mai-product-font); }\n.mai-product .mai-product__scope { min-width: 0; }\n.mai-product .mai-product__scope-title { margin: 0 0 22px; padding: 0; color: var(--mai-product-ink); font: 500 24px\/1.25 var(--mai-product-font); letter-spacing: -.025em; }\n.mai-product .mai-product__groups { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 30px 26px; }\n.mai-product .mai-product__group { min-width: 0; margin: 0; padding: 18px 0 0; border: 0; border-top: 1px solid var(--mai-product-line); background: transparent; }\n.mai-product .mai-product__group h4 { display: flex; align-items: center; gap: 10px; margin: 0 0 14px; padding: 0; color: var(--mai-product-ink); font: 500 19px\/1.3 var(--mai-product-font); letter-spacing: -.02em; text-transform: none; }\n.mai-product .mai-product__icon { width: 22px; height: 22px; display: block; flex: 0 0 auto; fill: none; stroke: #c9531d; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }\n.mai-product .mai-product__list { list-style: none; margin: 0; padding: 0; }\n.mai-product .mai-product__list li { position: relative; margin: 0 0 11px; padding: 0 0 0 14px; color: var(--mai-product-muted); font: 400 15px\/1.65 var(--mai-product-font); }\n.mai-product .mai-product__list li:last-child { margin-bottom: 0; }\n.mai-product .mai-product__list li::before { content: ''; position: absolute; top: .7em; left: 0; width: 4px; height: 4px; background: #c9531d; }\n.mai-product .mai-product__list li::after { content: none; }\n.mai-product .mai-product__list strong { color: var(--mai-product-ink); font-weight: 500; }\n.mai-product .mai-product__footer { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 20px 32px; margin: 34px 0 0; padding: 24px 28px; background: var(--mai-product-navy); color: #fff; }\n.mai-product .mai-product__footer p { margin: 0; padding: 0; color: #b8c5ce; font: 400 15px\/1.6 var(--mai-product-font); }\n.mai-product .mai-product__footer strong { display: block; margin-bottom: 4px; color: #fff; font: 500 21px\/1.3 var(--mai-product-font); letter-spacing: -.02em; }\n.mai-product .mai-product__button { display: inline-flex; align-items: center; justify-content: space-between; gap: 22px; min-height: 52px; margin: 0; padding: 15px 20px; background: var(--mai-product-orange); border: 1px solid var(--mai-product-orange); border-radius: 2px; color: var(--mai-product-navy); font: 600 14px\/1.4 var(--mai-product-font); text-decoration: none; box-shadow: none; touch-action: manipulation; }\n.mai-product .mai-product__button:hover { background: #ff8f56; border-color: #ff8f56; color: var(--mai-product-navy); text-decoration: none; }\n.mai-product .mai-product__button:focus-visible { outline: 3px solid #fff; outline-offset: 4px; }\n.mai-product .mai-product__button svg { display: block; width: 20px; height: 20px; flex: 0 0 auto; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }\n@container (max-width: 1000px) {\n  .mai-product .mai-product__header { grid-template-columns: 1fr; gap: 20px; }\n  .mai-product .mai-product__intro { max-width: 650px; }\n  .mai-product .mai-product__layout { grid-template-columns: 1fr; gap: 30px; }\n}\n@container (max-width: 520px) {\n  .mai-product .mai-product__groups { grid-template-columns: minmax(0,1fr); gap: 24px; }\n  .mai-product .mai-product__title { font-size: 32px; }\n  .mai-product .mai-product__fact { padding-inline: 12px; }\n  .mai-product .mai-product__fact dt { font-size: 20px; }\n  .mai-product .mai-product__footer { padding: 24px 20px; }\n  .mai-product .mai-product__eyebrow { font-size: 11px; letter-spacing: .05em; }\n}\n@supports not (container-type: inline-size) {\n  @media (max-width: 1000px) { .mai-product .mai-product__header, .mai-product .mai-product__layout { grid-template-columns: 1fr; } }\n  @media (max-width: 520px) { .mai-product .mai-product__groups { grid-template-columns: 1fr; } }\n}\n<\/style>\n\n<section class=\"mai-product\" aria-label=\"Rogue Can Detector station \u2014 system contents\">\n  <header class=\"mai-product__header\">\n    <div>\n      <p class=\"mai-product__eyebrow\">Complete inspection station<\/p>\n      <h2 class=\"mai-product__title\">Rogue Can Detector station<\/h2>\n    <\/div>\n    <p class=\"mai-product__intro\">Identify foreign cans and mismatched SKUs on your production line. One complete system: software, hardware, deployment and support.<\/p>\n  <\/header>\n  <div class=\"mai-product__layout\">\n    <figure class=\"mai-product__visual\">\n      <img class=\"mai-product__image\" src=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/08\/MarshallAI_rogue-can_inspection-station.webp\" width=\"1742\" height=\"980\" alt=\"Rogue Can Detector station with cameras, lighting and processing equipment around a can conveyor.\" loading=\"lazy\" decoding=\"async\">\n      <div class=\"mai-product__facts\">\n        <dl class=\"mai-product__fact\"><dt>2 cameras<\/dt><dd>With inspection lighting<\/dd><\/dl>\n        <dl class=\"mai-product__fact\"><dt>Full label<\/dt><dd>Whole label inspection.<\/dd><\/dl>\n        <dl class=\"mai-product__fact\"><dt>On-site<\/dt><dd>Edge processing<\/dd><\/dl>\n      <\/div>\n      <figcaption class=\"mai-product__caption\">Station illustration. Hardware layout and integration are configured for your production line.<\/figcaption>\n    <\/figure>\n    <div class=\"mai-product__scope\">\n      <h3 class=\"mai-product__scope-title\">What\u2019s included<\/h3>\n      <div class=\"mai-product__groups\">\n        <section class=\"mai-product__group\">\n          <h4><svg class=\"mai-product__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"><\/rect><path d=\"m9 9-3 3 3 3m6-6 3 3-3 3\"><\/path><\/svg>Software<\/h4>\n          <ul class=\"mai-product__list\">\n            <li><strong>AFSA deep learning platform<\/strong> for annotation, model training, evaluation and inspection analytics.<\/li>\n          <\/ul>\n        <\/section>\n        <section class=\"mai-product__group\">\n          <h4><svg class=\"mai-product__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\"><\/rect><path d=\"M9 2v4m6-4v4M9 18v4m6-4v4M2 9h4m-4 6h4m12-6h4m-4 6h4\"><\/path><\/svg>Hardware<\/h4>\n          <ul class=\"mai-product__list\">\n            <li><strong>Two cameras and lighting<\/strong> for a 360\u00b0 view of the can.<\/li>\n            <li><strong>IP-protected edge processing hardware.<\/strong><\/li>\n            <li><strong>All mounts, supports and cabling.<\/strong><\/li>\n          <\/ul>\n        <\/section>\n        <section class=\"mai-product__group\">\n          <h4><svg class=\"mai-product__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M8 4H4v16h16v-4M10 4h10v10M20 4 9 15\"><\/path><\/svg>Deployment<\/h4>\n          <ul class=\"mai-product__list\">\n            <li><strong>On-site data collection and model development.<\/strong> Evaluation and refinement until all agreed KPIs are met.<\/li>\n            <li><strong>Hardware scoping, installation and rigging.<\/strong><\/li>\n            <li><strong>Integration with your rejection system, PLC, MES and ERP.<\/strong><\/li>\n          <\/ul>\n        <\/section>\n        <section class=\"mai-product__group\">\n          <h4><svg class=\"mai-product__icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 13v-1a8 8 0 0 1 16 0v1M20 17v1a3 3 0 0 1-3 3h-5\"><\/path><rect x=\"3\" y=\"11\" width=\"4\" height=\"7\" rx=\"2\"><\/rect><rect x=\"17\" y=\"11\" width=\"4\" height=\"7\" rx=\"2\"><\/rect><\/svg>Support<\/h4>\n          <ul class=\"mai-product__list\">\n            <li><strong>On-site service and system support.<\/strong><\/li>\n            <li><strong>Remote monitoring and troubleshooting<\/strong> when needed.<\/li>\n          <\/ul>\n        <\/section>\n      <\/div>\n    <\/div>\n  <\/div>\n  <div class=\"mai-product__footer\">\n    <p><strong>Pricing? Deployment time? Can it really keep up with our line?<\/strong>Send us a quick email and we&#8217;ll answer all your questions.<\/p>\n    <a class=\"mai-product__button\" href=\"mailto:info@marshallai.com?subject=Rogue%20Can%20Detector%20station%20enquiry\">Discuss the station<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4 12h16m-6-6 6 6-6 6\"><\/path><\/svg><\/a>\n  <\/div>\n<\/section>\n<\/div>\n<\/div>\n\n\n\n<div class=\"mai-section gb-element-a7cd9bbe\">\n<div class=\"gbp-section__inner gb-element-32ffddf5\">\n<div class=\"gb-element-7c2f1edf\">\n<div class=\"gb-element-f4df5adb\">\n<p class=\"mai-list-title\"><span class=\"gb-shape\"><svg aria-hidden=\"true\" role=\"img\" height=\"1em\" width=\"1em\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path fill=\"currentColor\" d=\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"><\/path><\/svg><\/span><span class=\"gb-text\"><strong>Full production speed:<\/strong> inspection rate of over 2500 cans per minute. Performance can be scaled with processing hardware.<\/span><\/p>\n\n\n\n<p class=\"mai-list-title\"><span class=\"gb-shape\"><svg aria-hidden=\"true\" role=\"img\" height=\"1em\" width=\"1em\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path fill=\"currentColor\" d=\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"><\/path><\/svg><\/span><span class=\"gb-text\"><strong>Zero Changeover Downtime:<\/strong> Recognizes each SKU automatically as it starts running. No operator &#8220;train&#8221; step, no teaching the system between batches. Perfect for even small batches.<\/span><\/p>\n\n\n\n<p class=\"mai-list-title\"><span class=\"gb-shape\"><svg aria-hidden=\"true\" role=\"img\" height=\"1em\" width=\"1em\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path fill=\"currentColor\" d=\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"><\/path><\/svg><\/span><span class=\"gb-text\"><strong>No ramp-up period:<\/strong> Flags a mismatched can the moment it appears. No ramp-up period or sample run needed.<\/span><\/p>\n\n\n\n<p class=\"mai-list-title\"><span class=\"gb-shape\"><svg aria-hidden=\"true\" role=\"img\" height=\"1em\" width=\"1em\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path fill=\"currentColor\" d=\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"><\/path><\/svg><\/span><span class=\"gb-text\"><strong>99.99995% Detection Accuracy:<\/strong> a well trained model can reach extremely high accuracy and low false positive rates even at full line speed.<\/span><\/p>\n\n\n\n<p class=\"mai-list-title\"><span class=\"gb-shape\"><svg aria-hidden=\"true\" role=\"img\" height=\"1em\" width=\"1em\" viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path fill=\"currentColor\" d=\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z\"><\/path><\/svg><\/span><span class=\"gb-text\"><strong>Fallen, misaligned and damaged can detection<\/strong>: our station can detect other abnormalities.<\/span><\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"mai-reveal\">\n<div class=\"gb-element-575113d7 mai-reveal\">\n<div class=\"gb-text gbp-section__text gb-text-b6134db9 mai-quote-text\">&#8220;We had been trying to solve this problem for 15 years before you came along.&#8221;<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">&#8211; Customer, beverage industry<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"mai-section mai-bg-alt-1\">\n<div class=\"mai-container_inner-content gb-element-1475a085\">\n<div class=\"gb-element-531a117a\">\n<h2 class=\"gb-text gbp-section__headline mai-reveal mai-headline\">Why Foreign \/ Rogue Cans Slip Past<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A rogue can happens when an empty can meant for one product ends up on the wrong filling line \u2014 a domestic-market can filled with an export formulation, or a leftover can from the previous batch mixed into a new run. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">According to our estimates there are hundreds of rogue can incidents each year globally and only a small percentage are caught.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Because SKUs in a portfolio can share near-identical can geometry and print design, the two cans can look almost identical to a traditional inspection system.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Traditional label verifiers are not built to tell apart two versions of the <em>same<\/em> label with only a subtle formulation difference. <\/li>\n\n\n\n<li>Traditional systems can be hard to tune, tightening thresholds to catch subtle differences means risking more false rejects.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6abbebfde7b99&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6abbebfde7b99\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"1280\" height=\"960\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/08\/MarshallAI_beverage_cans2-v2.webp\" alt=\"\" class=\"wp-image-4108\" srcset=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/08\/MarshallAI_beverage_cans2-v2.webp 1280w, https:\/\/marshallai.com\/wp-content\/uploads\/2026\/08\/MarshallAI_beverage_cans2-v2-500x375.webp 500w, https:\/\/marshallai.com\/wp-content\/uploads\/2026\/08\/MarshallAI_beverage_cans2-v2-768x576.webp 768w, https:\/\/marshallai.com\/wp-content\/uploads\/2026\/08\/MarshallAI_beverage_cans2-v2-16x12.webp 16w\" sizes=\"auto, (max-width: 1280px) 100vw, 1280px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"mai-section\">\n<div class=\"mai-container_inner-content\">\n<style>\n.mai-compare { --mc-ink:#081722; --mc-orange:#ff742e; --mc-line:#dce2e6; --mc-muted:#52616c; margin:0; padding:0; width:100%; color:var(--mc-ink); background:transparent; font:400 16px\/1.6 'Aspekta',Arial,sans-serif; text-align:left; }\n.mai-compare,.mai-compare * { box-sizing:border-box; }\n.mai-compare .mai-compare__eyebrow { display:flex; align-items:center; gap:10px; margin:0 0 16px; color:var(--mc-muted); font:500 12px\/1.5 'JetBrains Mono',ui-monospace,monospace; letter-spacing:.08em; text-transform:uppercase; }\n.mai-compare .mai-compare__eyebrow::before { content:''; width:6px; height:6px; background:var(--mc-orange); }\n.mai-compare .mai-compare__title { max-width:800px; margin:0; padding:0; color:var(--mc-ink); font:500 clamp(32px,4vw,52px)\/1.08 'Aspekta',Arial,sans-serif; letter-spacing:-.045em; text-transform:none; }\n.mai-compare .mai-compare__intro { max-width:760px; margin:20px 0 28px; color:var(--mc-muted); font-size:17px; }\n.mai-compare .mai-compare__scroll { width:100%; overflow-x:auto; border:1px solid var(--mc-line); border-radius:2px; scrollbar-color:#89959d #eef1f3; }\n.mai-compare .mai-compare__scroll:focus-visible,.mai-compare a:focus-visible,.mai-compare summary:focus-visible { outline:3px solid var(--mc-orange); outline-offset:4px; }\n.mai-compare table { width:100%; min-width:920px; margin:0; border:0; border-collapse:collapse; table-layout:fixed; font:inherit; }\n.mai-compare caption { padding:0; height:0; overflow:hidden; font-size:0; }\n.mai-compare th,.mai-compare td { padding:22px; border:0; border-bottom:1px solid var(--mc-line); vertical-align:top; text-align:left; overflow-wrap:break-word; }\n.mai-compare thead th { width:27%; padding-top:25px; padding-bottom:25px; background:#f0f3f4; color:var(--mc-ink); font-size:18px; line-height:1.35; font-weight:500; }\n.mai-compare thead th:first-child { width:19%; font-size:13px; color:var(--mc-muted); vertical-align:bottom; }\n.mai-compare thead small { display:block; margin-top:7px; color:var(--mc-muted); font-size:13px; font-weight:400; }\n.mai-compare tbody th { background:#f8fafb; font-size:15px; line-height:1.5; font-weight:500; }\n.mai-compare tbody td { background:#fff; color:var(--mc-muted); font-size:14px; line-height:1.65; }\n.mai-compare th.mai-compare__featured,.mai-compare td.mai-compare__featured { background:var(--mc-ink); color:#d1dce3; border-bottom-color:#ffffff26; }\n.mai-compare thead th.mai-compare__featured { border-top:4px solid var(--mc-orange); color:#fff; }\n.mai-compare .mai-compare__featured small { color:var(--mc-orange); }\n.mai-compare td strong { display:block; margin-bottom:7px; color:var(--mc-ink); font-weight:500; font-size:15px; line-height:1.4; }\n.mai-compare .mai-compare__featured strong { color:#fff; }\n.mai-compare .mai-compare__check { display:inline-block; margin-right:6px; color:var(--mc-orange); font-weight:600; }\n.mai-compare tbody tr:last-child>* { border-bottom:0; }\n.mai-compare .mai-compare__hint { margin:10px 0 0; color:var(--mc-muted); font-size:12px; }\n.mai-compare .mai-compare__scope { margin:22px 0 0; color:var(--mc-muted); font-size:13px; line-height:1.7; }\n.mai-compare details { margin:18px 0 0; padding:16px 0 0; border-top:1px solid var(--mc-line); color:var(--mc-muted); font-size:13px; }\n.mai-compare summary { width:fit-content; cursor:pointer; color:var(--mc-ink); font-weight:500; }\n.mai-compare details p { margin:12px 0 0; }\n.mai-compare details ul { margin:12px 0 0; padding-left:20px; }\n.mai-compare details li { margin:5px 0; }\n.mai-compare a { color:var(--mc-ink); text-decoration:underline; text-underline-offset:3px; }\n.mai-compare a:hover { text-decoration-thickness:2px; }\n@media(max-width:600px) { .mai-compare th,.mai-compare td { padding:18px; } .mai-compare .mai-compare__intro { font-size:16px; } }\n<\/style>\n<section class=\"mai-compare\" aria-label=\"Choosing a rogue can inspection system\">\n  <p class=\"mai-compare__eyebrow\">What to look for in rogue can inspection<\/p>\n  <h2 class=\"mai-compare__title\">The questions worth asking.<br>The details that matter.<\/h2>\n  <p class=\"mai-compare__intro\">Your closest SKU variants and busiest changeovers are the real test. Use these five questions to evaluate an inspection solution for your line.<\/p>\n  <div class=\"mai-compare__scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Inspection buying checklist. Scroll horizontally on smaller screens.\">\n    <table>\n      <caption>Inspection evaluation questions and the MarshallAI approach<\/caption>\n      <thead><tr>\n        <th scope=\"col\">What matters on your line<\/th>\n        <th scope=\"col\">What to ask<small>Your inspection checklist<\/small><\/th>\n        <th scope=\"col\" class=\"mai-compare__featured\">The MarshallAI approach<small>Rogue Can Detector<\/small><\/th>\n      <\/tr><\/thead>\n      <tbody>\n        <tr>\n          <th scope=\"row\">Label coverage<\/th>\n          <td><strong>How much of the label is inspected?<\/strong>Ask whether the system checks a selected area or the full label around the can, including different can orientations.<\/td>\n          <td class=\"mai-compare__featured\"><strong><span class=\"mai-compare__check\" aria-hidden=\"true\">\u2713<\/span>Full-label identity<\/strong>Inspects the full label around the can and verifies its identity against the expected SKU.<\/td>\n        <\/tr>\n        <tr>\n          <th scope=\"row\">Near-identical SKUs<\/th>\n          <td><strong>Can it distinguish your closest variants?<\/strong>Test with your hardest-to-separate SKUs: small export markings, language differences and nearly identical artwork.<\/td>\n          <td class=\"mai-compare__featured\"><strong><span class=\"mai-compare__check\" aria-hidden=\"true\">\u2713<\/span>Trained on SKU-specific details<\/strong>Detects distinguishing features such as domestic\/export markings, with performance validated on your cans.<\/td>\n        <\/tr>\n        <tr>\n          <th scope=\"row\">Batch changeovers<\/th>\n          <td><strong>What happens at the first can?<\/strong>Check whether operators must select a recipe or teach a batch, and how inspection works during the transition.<\/td>\n          <td class=\"mai-compare__featured\"><strong><span class=\"mai-compare__check\" aria-hidden=\"true\">\u2713<\/span>No per-batch re-teaching<\/strong>Automatically recognizes changeovers between trained SKUs, with inspection active from the first can.<\/td>\n        <\/tr>\n        <tr>\n          <th scope=\"row\">Detection performance<\/th>\n          <td><strong>What is validated at your line speed?<\/strong>Request separate results for missed defects and false rejects, using representative cans and agreed operating conditions.<\/td>\n          <td class=\"mai-compare__featured\"><strong><span class=\"mai-compare__check\" aria-hidden=\"true\">\u2713<\/span>Validated against agreed KPIs<\/strong>Detection and false-reject targets are agreed for your application and validated on your SKUs at operating speed.<\/td>\n        <\/tr>\n        <tr>\n          <th scope=\"row\">Inspection scope<\/th>\n          <td><strong>Which checks can share one station?<\/strong>Confirm which defects the proposed configuration covers and what additional hardware or software is required.<\/td>\n          <td class=\"mai-compare__featured\"><strong><span class=\"mai-compare__check\" aria-hidden=\"true\">\u2713<\/span>Multiple checks. One station.<\/strong>Combine rogue-can, fallen-can and damaged-can detection in one configured inspection station.<\/td>\n        <\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n  <p class=\"mai-compare__hint\">On smaller screens, swipe sideways to see the full checklist.<\/p>\n  <p class=\"mai-compare__scope\">Every deployment starts with application-specific training and validation. New SKUs may require model updates. Inspection scope and acceptance targets are agreed for your configuration.<\/p>\n<\/section>\n<\/div>\n<\/div>\n\n\n\n\n\n<div class=\"mai-section gb-element-62641e3d\">\n<div class=\"mai-container_inner-content\">\n<div class=\"gb-element-62143277\">\n<h2 class=\"gb-text gb-text-d1064ca6 mai-reveal mai-headline\">Case studies<\/h2>\n<\/div>\n<\/div>\n\n\n\n<div class=\"mai-container_inner-content\">\n<div><ul class=\"gbp-list--unstyled gb-looper-5cf487fa\">\n<li class=\"gb-loop-item post-2282 case-study type-case-study status-publish has-post-thumbnail hentry category-beverage-industry category-quality-assurance tag-beverage-industry tag-case-study tag-defect-detection tag-drinks-industry tag-edge-computing tag-label-verification tag-quality-assurance tag-rogue-can\">\n<article class=\"mai-card-article gb-element-ff0abb7c\">\n<a href=\"https:\/\/marshallai.com\/fi\/case-study\/eliminating-rogue-cans-high-speed-edge-ai-qa-in-beverage-manufacturing\/\"><img loading=\"lazy\" decoding=\"async\" width=\"663\" height=\"634\" alt=\"\" data-media-id=\"4025\" class=\"gb-media-264cf724\" src=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/image.webp\" srcset=\"https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/image.webp 663w, https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/image-500x478.webp 500w, https:\/\/marshallai.com\/wp-content\/uploads\/2026\/09\/image-13x12.webp 13w\" sizes=\"auto, (max-width: 663px) 100vw, 663px\" \/><\/a>\n\n\n\n<div class=\"gb-element-b7e65b9a\">\n<span class=\"gb-text mai-card-article-title\"><a href=\"https:\/\/marshallai.com\/fi\/case-study\/eliminating-rogue-cans-high-speed-edge-ai-qa-in-beverage-manufacturing\/\">Eliminating Rogue Cans: High-Speed QA in Beverage Manufacturing<\/a><\/span>\n\n\n\n<div>\n<p class=\"gb-text mai-card-article-text\">A global beverage manufacturer spent 15 years trying to reliably intercept &#8220;rogue cans&#8221; on their high-speed filling lines. Discover how MarshallAI deployed a minimal latency edge vision system to inspect 2,500 cans per minute, preventing mismatched products and costly mechanical jams with near-perfect precision.<\/p>\n<\/div>\n\n\n\n<div class=\"gb-element-62fba4e0\">\n<p class=\"gb-text mai-article-card-tag\"><span>Beverage industry<\/span> <span>Quality assurance<\/span><\/p>\n<\/div>\n<\/div>\n<\/article>\n<\/li>\n<\/ul><\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"mai-section\">\n<div class=\"mai-container_inner-content\">\n<div class=\"gb-element-002df6c4\">\n<h2 class=\"gb-text gbp-section__headline mai-reveal mai-headline\">Questions &amp; Answers<\/h2>\n<\/div>\n<\/div>\n\n\n\n<div class=\"mai-container_inner-content\">\n<div class=\"gb-accordion\" data-transition=\"fade\">\n<div class=\"gb-accordion__item gbp-card--border gb-accordion__item-a91230e8\">\n<div role=\"button\" tabindex=\"0\" class=\"gb-accordion__toggle gb-accordion__toggle-95a2a1e6\" id=\"gb-accordion-toggle-95a2a1e6\">\n<h3 class=\"gb-text gbp-card__title gb-text-8462845e\"><strong><strong>Does MarshallAI need to &#8220;learn&#8221; each new SKU before it can protect the line?<\/strong><\/strong><\/h3>\n\n\n\n<span class=\"gb-accordion__toggle-icon gb-accordion__toggle-icon-837853b1\"><span class=\"gb-accordion__toggle-icon-open\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"208 96 128 176 48 96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><span class=\"gb-accordion__toggle-icon-close\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"48 160 128 80 208 160\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><\/span>\n<\/div>\n\n\n\n<div class=\"gb-accordion__content\" id=\"gb-accordion-content-78547f3f\">\n<div class=\"gb-element-32d8ed4e\">\n<p class=\"gb-text\">No. Every SKU in your portfolio is modeled in advance, so the system recognizes what&#8217;s running the moment a changeover happens. There&#8217;s no operator-triggered training step and no window where the line is unprotected.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"gb-accordion__item gbp-card--border gb-accordion__item-ed6d81e3\">\n<div role=\"button\" tabindex=\"0\" class=\"gb-accordion__toggle gb-accordion__toggle-31d588f0\" id=\"gb-accordion-toggle-31d588f0\">\n<h3 class=\"gb-text gbp-card__title gb-text-6144ab51\"><strong><strong>What happens when a rogue\/foreign can is detected?<\/strong><\/strong><\/h3>\n\n\n\n<span class=\"gb-accordion__toggle-icon gb-accordion__toggle-icon-27fc4f20\"><span class=\"gb-accordion__toggle-icon-open\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"208 96 128 176 48 96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><span class=\"gb-accordion__toggle-icon-close\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"48 160 128 80 208 160\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><\/span>\n<\/div>\n\n\n\n<div class=\"gb-accordion__content\" id=\"gb-accordion-content-48a9528c\">\n<div class=\"gb-element-e63f42d0\">\n<p class=\"gb-text\">We can issue an alert, halt the line or integrate with a rejection mechanism. Timelined statistics are also provided for total products and faulty products for OEE optimisation and root cause analysis.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"gb-accordion__item gbp-card--border gb-accordion__item-ea60d4d0\">\n<div role=\"button\" tabindex=\"0\" class=\"gb-accordion__toggle gb-accordion__toggle-0a3cc5d2\" id=\"gb-accordion-toggle-0a3cc5d2\">\n<h3 class=\"gb-text gbp-card__title gb-text-2e32a8ee\"><strong><strong>Can it tell apart two versions of the same can \u2014 like a domestic and export variant?<\/strong><\/strong><\/h3>\n\n\n\n<span class=\"gb-accordion__toggle-icon gb-accordion__toggle-icon-875e7dfc\"><span class=\"gb-accordion__toggle-icon-open\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"208 96 128 176 48 96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><span class=\"gb-accordion__toggle-icon-close\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"48 160 128 80 208 160\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><\/span>\n<\/div>\n\n\n\n<div class=\"gb-accordion__content\" id=\"gb-accordion-content-7b045ed7\">\n<div class=\"gb-element-aa0bdc02\">\n<p class=\"gb-text\">Yes. This is exactly where MarshallAI excels. Because the model verifies a can&#8217;s full identity rather than comparing print patterns against a similarity threshold, it catches differences that fall below what pattern-matching systems are tuned to flag.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"gb-accordion__item gbp-card--border gb-accordion__item-9ad4315a\">\n<div role=\"button\" tabindex=\"0\" class=\"gb-accordion__toggle gb-accordion__toggle-2c1f4ff3\" id=\"gb-accordion-toggle-2c1f4ff3\">\n<h3 class=\"gb-text gbp-card__title gb-text-90a1207e\"><strong><strong>Does inspection data leave our facility?<\/strong><\/strong><\/h3>\n\n\n\n<span class=\"gb-accordion__toggle-icon gb-accordion__toggle-icon-2318e749\"><span class=\"gb-accordion__toggle-icon-open\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"208 96 128 176 48 96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><span class=\"gb-accordion__toggle-icon-close\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"48 160 128 80 208 160\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><\/span>\n<\/div>\n\n\n\n<div class=\"gb-accordion__content\" id=\"gb-accordion-content-ef942f15\">\n<div class=\"gb-element-0f6bac9a\">\n<p class=\"gb-text\">No. Processing runs entirely on-site. Detection images and production data stay on your network.<\/p>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"gb-accordion__item gbp-card--border gb-accordion__item-66a1818c\">\n<div role=\"button\" tabindex=\"0\" class=\"gb-accordion__toggle gb-accordion__toggle-7f231504\" id=\"gb-accordion-toggle-7f231504\">\n<h3 class=\"gb-text gbp-card__title gb-text-a5b834fb\"><strong><strong>Will this slow down our line or require a new SKU program for every product?<\/strong><\/strong><\/h3>\n\n\n\n<span class=\"gb-accordion__toggle-icon gb-accordion__toggle-icon-47f045b7\"><span class=\"gb-accordion__toggle-icon-open\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"208 96 128 176 48 96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><span class=\"gb-accordion__toggle-icon-close\"><svg aria-hidden=\"true\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"><\/rect><polyline points=\"48 160 128 80 208 160\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"><\/polyline><\/svg><\/span><\/span>\n<\/div>\n\n\n\n<div class=\"gb-accordion__content\" id=\"gb-accordion-content-cfbd539e\">\n<div class=\"gb-element-97dba764\">\n<p class=\"gb-text\">No. MarshallAI runs at full line speed: 2500+ cans a minute and handles SKU changeovers automatically, with no reconfiguration required.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Teko\u00e4lypohjainen vieraiden ja v\u00e4\u00e4rien t\u00f6lkkien sek\u00e4 sekaetikettien tunnistus juomalinjoille. Varmista jokaisen t\u00f6lkin identiteetti ensimm\u00e4isest\u00e4 t\u00f6lkist\u00e4 alkaen yli 2500 t\u00f6lkin minuutin nopeudella ilman uudelleenm\u00e4\u00e4rityst\u00e4 tuotenumeroiden (SKU) v\u00e4lill\u00e4.<\/p>","protected":false},"featured_media":3920,"template":"","meta":{"content-type":"","footnotes":""},"categories":[58],"tags":[],"class_list":["post-3418","solution","type-solution","status-publish","has-post-thumbnail","hentry","category-beverage-industry"],"_links":{"self":[{"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/solution\/3418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/solution"}],"about":[{"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/types\/solution"}],"version-history":[{"count":15,"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/solution\/3418\/revisions"}],"predecessor-version":[{"id":4516,"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/solution\/3418\/revisions\/4516"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/media\/3920"}],"wp:attachment":[{"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/media?parent=3418"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/categories?post=3418"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marshallai.com\/fi\/wp-json\/wp\/v2\/tags?post=3418"}],"curies":[{"name":"Hyvin pelattu","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}