""" CamoNet pattern taxonomy. Each pattern has: - id: short slug used as the class label (stable, snake_case) - name: human-readable display name - origin: country / military of origin - era: rough date range of issue - family: visual family (woodland / desert / arid / digital / brushstroke / blob / multi-terrain) - notes: short blurb for the model card Keep this list curated, not exhaustive. ~40 patterns is the sweet spot: big enough to be impressive, small enough to actually train with limited data. """ from dataclasses import dataclass from typing import Literal Family = Literal[ "woodland", "desert", "arid", "digital", "brushstroke", "blob", "multi-terrain", "winter", "urban", "naval" ] @dataclass(frozen=True) class Pattern: id: str name: str origin: str era: str family: Family notes: str PATTERNS: list[Pattern] = [ # --- United States --- Pattern("us_erdl", "ERDL", "United States", "1948-1980s", "woodland", "Early US 4-color woodland pattern, used in Vietnam."), Pattern("us_m81_woodland", "M81 Woodland", "United States", "1981-2006", "woodland", "Iconic 4-color US woodland; the BDU pattern."), Pattern("us_dcu_chocolate_chip", "Chocolate Chip (DBDU)", "United States", "1981-1991", "desert", "6-color desert with pebble-like spots; Gulf War era."), Pattern("us_dcu_3color", "3-Color Desert (DCU)", "United States", "1990-2000s", "desert", "Coffee-stain pattern that replaced Chocolate Chip."), Pattern("us_marpat_woodland", "MARPAT Woodland", "USMC", "2002-present", "digital", "USMC digital woodland; first widely-issued pixelated camo."), Pattern("us_marpat_desert", "MARPAT Desert", "USMC", "2002-present", "digital", "USMC digital desert variant of MARPAT."), Pattern("us_ucp", "UCP (ACU)", "US Army", "2004-2019", "digital", "Universal Camo Pattern; grey-green digital, controversially ineffective."), Pattern("us_multicam", "MultiCam", "United States (Crye)", "2010-present", "multi-terrain", "Crye Precision blended multi-environment pattern; OEF-CP, OCP."), Pattern("us_ocp_scorpion", "OCP Scorpion W2", "US Army", "2015-present", "multi-terrain", "Army's MultiCam-derivative replacement for UCP."), Pattern("us_aor1", "AOR1", "US Navy/NSW", "2010-present", "desert", "NSW desert digital, MARPAT-derived."), Pattern("us_aor2", "AOR2", "US Navy/NSW", "2010-present", "digital", "NSW woodland digital, MARPAT-derived."), Pattern("us_tigerstripe", "Tiger Stripe", "South Vietnam / US SF", "1962-1975", "brushstroke", "Asymmetric horizontal-stripe pattern; many regional variants."), # --- United Kingdom --- Pattern("uk_dpm_woodland", "DPM Woodland", "United Kingdom", "1968-2011", "brushstroke", "British Disruptive Pattern Material; brush-stroke 4-color."), Pattern("uk_dpm_desert", "DPM Desert", "United Kingdom", "1990-2011", "desert", "2-color desert DPM."), Pattern("uk_mtp", "MTP (Multi-Terrain Pattern)", "United Kingdom", "2010-present", "multi-terrain", "British MultiCam-derivative with DPM brush-stroke shapes."), # --- Germany --- Pattern("de_flecktarn", "Flecktarn", "Germany (Bundeswehr)", "1990-present", "blob", "5-color blob pattern; one of the most effective in temperate forest."), Pattern("de_tropentarn", "Tropentarn", "Germany (Bundeswehr)", "1990s-present", "desert", "3-color arid Flecktarn variant."), Pattern("de_splittertarn", "Splittertarn", "Germany (Wehrmacht)", "1931-1945", "blob", "WW2-era angular splinter pattern."), # --- USSR / Russia --- Pattern("ru_klmk", "KLMK", "USSR", "1968-1990s", "brushstroke", "Soviet 'silver leaf' sun-ray 2-color oversuit pattern."), Pattern("ru_ttsko", "TTsKO (Butan)", "USSR", "1984-2000s", "blob", "Three-color Soviet computer-generated pattern."), Pattern("ru_vsr_93", "VSR-93 (Flora)", "Russia", "1993-2000s", "brushstroke", "Vertical brush-stroke 'Flora' pattern."), Pattern("ru_emr_digital_flora", "EMR (Digital Flora)", "Russia", "2008-present", "digital", "Russian Armed Forces digital pattern; pixelated greens."), Pattern("ru_surpat", "SURPAT", "Russia (Survival Corps)", "2010s-present", "digital", "Commercial Russian multi-terrain digital."), Pattern("ru_partizan", "Partizan / Spectre", "Russia (SSO)", "2000s-present", "multi-terrain", "SSO Tactical 'leaf' pattern; layered foliage shapes."), # --- Other NATO / Western --- Pattern("ca_cadpat_tw", "CADPAT TW", "Canada", "1997-present", "digital", "Canadian Disruptive Pattern; first issued digital camo (predates MARPAT)."), Pattern("ca_cadpat_ar", "CADPAT AR", "Canada", "2000s-present", "desert", "Arid CADPAT variant."), Pattern("fr_cce", "CCE F1", "France", "1991-2010s", "woodland", "Centre Europe; French M81-style woodland."), Pattern("fr_daguet", "Daguet", "France", "1991-2010s", "desert", "French desert pattern, Gulf War era."), Pattern("it_vegetata", "Vegetata", "Italy", "2004-present", "woodland", "Italian 4-color fractal-style woodland."), Pattern("au_auscam", "AUSCAM (DPCU)", "Australia", "1982-2014", "blob", "Australian 'hearts and bunnies' 5-color blob pattern."), Pattern("au_amcu", "AMCU", "Australia", "2014-present", "multi-terrain", "Australian MultiCam-derivative replacement for DPCU."), Pattern("se_m90", "M90", "Sweden", "1990-present", "blob", "Swedish angular 4-color splinter; very distinctive."), Pattern("ch_taz_90", "TAZ 90", "Switzerland", "1990-present", "blob", "Swiss 5-color leaf/blob pattern."), Pattern("no_m75", "M75", "Norway", "1975-2000s", "blob", "Norwegian 3-color blob pattern."), # --- Asia --- Pattern("cn_type07_universal", "Type 07 Universal", "China (PLA)", "2007-present", "digital", "Chinese Type 07 woodland-leaning digital."), Pattern("cn_type07_desert", "Type 07 Desert", "China (PLA)", "2007-present", "digital", "Type 07 arid variant."), Pattern("kr_granite", "ROK Granite", "South Korea", "2014-present", "digital", "Korean digital pattern with granite-like color blocks."), Pattern("jp_jgsdf", "JGSDF Type II", "Japan", "1991-present", "blob", "Japan Ground SDF pinkish-brown tinted blob pattern."), # --- Commercial / specialty --- Pattern("commercial_kryptek_mandrake", "Kryptek Mandrake", "United States (commercial)", "2012-present", "multi-terrain", "Commercial layered reptilian-scale pattern."), Pattern("commercial_atacs_au", "A-TACS AU", "United States (commercial)", "2009-present", "arid", "Commercial arid-urban 'pixelated organic' pattern."), ] PATTERN_BY_ID: dict[str, Pattern] = {p.id: p for p in PATTERNS} LABELS: list[str] = [p.id for p in PATTERNS] LABEL2ID: dict[str, int] = {label: i for i, label in enumerate(LABELS)} ID2LABEL: dict[int, str] = {i: label for i, label in enumerate(LABELS)} NUM_LABELS: int = len(LABELS) if __name__ == "__main__": print(f"CamoNet taxonomy: {NUM_LABELS} patterns across {len(set(p.family for p in PATTERNS))} families") for fam in sorted(set(p.family for p in PATTERNS)): members = [p for p in PATTERNS if p.family == fam] print(f" {fam:15s} ({len(members):2d}): {', '.join(m.id for m in members)}")