"use client"; import { motion } from "framer-motion"; import { COLORS, VizFrame } from "./common"; /** * ILSVRC top-5 error rates on ImageNet, year by year. Numbers from the * official ILSVRC competition leaderboards. * * 2010 NEC 28.2 % * 2011 XRCE 25.8 % * 2012 AlexNet (Krizhevsky) 16.4 % ← deep learning arrives * 2013 ZFNet (Zeiler & Fergus) 11.7 % * 2014 GoogLeNet 6.7 % * 2015 ResNet (He et al.) 3.6 % ← surpasses human * 2016 ResNeXt / Trimps 3.0 % * 2017 SENet (Hu et al.) 2.3 % */ const ROWS: { year: number; name: string; err: number; emphasis?: boolean }[] = [ { year: 2010, name: "NEC", err: 28.2 }, { year: 2011, name: "XRCE", err: 25.8 }, { year: 2012, name: "AlexNet", err: 16.4, emphasis: true }, { year: 2013, name: "ZFNet", err: 11.7 }, { year: 2014, name: "GoogLeNet", err: 6.7 }, { year: 2015, name: "ResNet", err: 3.6, emphasis: true }, { year: 2016, name: "ResNeXt", err: 3.0 }, { year: 2017, name: "SENet", err: 2.3 }, ]; const HUMAN_BASELINE = 5.1; export function ImageNetLeap({ width = 920, height = 420, }: { width?: number; height?: number; }) { const padX = 70; const padY = 60; const innerW = width - padX * 2; const innerH = height - padY - 70; const stepW = innerW / ROWS.length; const yMax = 30; const sy = (v: number) => padY + (1 - v / yMax) * innerH; return ( {/* Y-axis */} {[0, 5, 10, 15, 20, 25, 30].map((v) => ( {v}% ))} {/* Human baseline */} human ≈ {HUMAN_BASELINE}% {/* Bars */} {ROWS.map((r, i) => { const cx = padX + i * stepW + stepW / 2; const barW = Math.min(40, stepW - 14); const barX = cx - barW / 2; const barTop = sy(r.err); const color = r.emphasis ? COLORS.ink : COLORS.accent; return ( {r.err.toFixed(1)} {r.year} {r.name} ); })} AlexNet (2012) cuts error in half · ResNet (2015) crosses the human baseline ); }