feat: AI 모델관리 어구 탐지 탭에 DAR-03 5종 어구 구조 비교 추가
- FAO ISSCFG 기준 5종 어구(저층트롤/쌍끌이/스토우넷/자망/통발) 특성 비교 표 - 어구별 구조 도식 5개 (이미지 + 사양 + G코드 연계) - AIS 신호 특성 및 이상 판정 기준 비교 표 - 근거: FAO 분류 + Wang et al.(2022) 논문 - 이미지 5장 /public/dar03/ 배포 - 디자인 시스템 준수 (Card/Badge intent/시맨틱 토큰) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
부모
0bc8883bb8
커밋
0d35807765
BIN
frontend/public/dar03/bottom-trawl.png
Normal file
BIN
frontend/public/dar03/bottom-trawl.png
Normal file
Binary file not shown.
|
After Width: | Height: | 크기: 72 KiB |
BIN
frontend/public/dar03/gillnet.png
Normal file
BIN
frontend/public/dar03/gillnet.png
Normal file
Binary file not shown.
|
After Width: | Height: | 크기: 51 KiB |
BIN
frontend/public/dar03/pair-trawl.png
Normal file
BIN
frontend/public/dar03/pair-trawl.png
Normal file
Binary file not shown.
|
After Width: | Height: | 크기: 69 KiB |
BIN
frontend/public/dar03/pot-trap.png
Normal file
BIN
frontend/public/dar03/pot-trap.png
Normal file
Binary file not shown.
|
After Width: | Height: | 크기: 67 KiB |
BIN
frontend/public/dar03/stow-net.png
Normal file
BIN
frontend/public/dar03/stow-net.png
Normal file
Binary file not shown.
|
After Width: | Height: | 크기: 54 KiB |
@ -197,6 +197,149 @@ const GEAR_PROFILES = [
|
|||||||
features: [{ k: 'High Speed', v: '>7 kt' }, { k: 'Circularity', v: 'High' }, { k: 'Speed Trans.', v: 'High' }, { k: 'Fleet', v: 'High' }] },
|
features: [{ k: 'High Speed', v: '>7 kt' }, { k: 'Circularity', v: 'High' }, { k: 'Speed Trans.', v: 'High' }, { k: 'Fleet', v: 'High' }] },
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// ─── DAR-03 5종 어구 구조 비교 (FAO ISSCFG) ──────────
|
||||||
|
|
||||||
|
interface DAR03GearSummary {
|
||||||
|
no: string;
|
||||||
|
name: string;
|
||||||
|
faoCode: string;
|
||||||
|
mesh: string;
|
||||||
|
iuuRisk: '매우 높음' | '높음' | '중간' | '낮음~중간';
|
||||||
|
aisType: string;
|
||||||
|
gCodes: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DAR03_GEAR_SUMMARY: DAR03GearSummary[] = [
|
||||||
|
{ no: '①', name: '저층 트롤', faoCode: 'OTB/TBB', mesh: '≥60mm', iuuRisk: '높음', aisType: '어선 AIS', gCodes: 'G-01, G-03' },
|
||||||
|
{ no: '②', name: '쌍끌이 트롤', faoCode: 'PTM', mesh: '≥56mm', iuuRisk: '매우 높음', aisType: '어선 AIS 2척', gCodes: 'G-02, G-06' },
|
||||||
|
{ no: '③', name: '스토우넷', faoCode: 'FYK', mesh: '≥55mm', iuuRisk: '중간', aisType: '어구 AIS 부표', gCodes: 'G-01, G-04, G-05' },
|
||||||
|
{ no: '④', name: '자망', faoCode: 'GNS/GND', mesh: '55~144mm', iuuRisk: '낮음~중간', aisType: '어구 AIS 부표', gCodes: 'G-03, G-05' },
|
||||||
|
{ no: '⑤', name: '통발·함정', faoCode: 'FPO', mesh: '탈출구 Ø≥8cm', iuuRisk: '중간', aisType: '어구 AIS 부표', gCodes: 'G-01, G-04' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const DAR03_IUU_INTENT: Record<DAR03GearSummary['iuuRisk'], BadgeIntent> = {
|
||||||
|
'매우 높음': 'critical',
|
||||||
|
'높음': 'high',
|
||||||
|
'중간': 'warning',
|
||||||
|
'낮음~중간': 'info',
|
||||||
|
};
|
||||||
|
|
||||||
|
interface DAR03GearDetail {
|
||||||
|
no: string;
|
||||||
|
name: string;
|
||||||
|
nameEn: string;
|
||||||
|
image: string;
|
||||||
|
specs: { k: string; v: string }[];
|
||||||
|
gCodes: { code: string; desc: string }[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const DAR03_GEAR_DETAILS: DAR03GearDetail[] = [
|
||||||
|
{
|
||||||
|
no: '①', name: '저층 트롤', nameEn: 'Bottom Trawl (OTB/TBB)', image: '/dar03/bottom-trawl.png',
|
||||||
|
specs: [
|
||||||
|
{ k: 'FAO 코드', v: 'OTB / TBB' },
|
||||||
|
{ k: '최소 망목', v: '≥ 60mm (마름모형)' },
|
||||||
|
{ k: '주요 어종', v: '참조기 · 갈치' },
|
||||||
|
{ k: '조업 속력', v: '2.5~4.5 knot' },
|
||||||
|
{ k: '항적 패턴', v: 'U형 회전 · 직선 왕복' },
|
||||||
|
{ k: 'AIS', v: '어선 AIS (어구 AIS 없음)' },
|
||||||
|
],
|
||||||
|
gCodes: [
|
||||||
|
{ code: 'G-01', desc: '허가 해역 외 트롤 → GIS 교차' },
|
||||||
|
{ code: 'G-03', desc: '미등록 어구 → label=1' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
no: '②', name: '쌍끌이 중층 트롤', nameEn: 'Pair Midwater Trawl (PTM)', image: '/dar03/pair-trawl.png',
|
||||||
|
specs: [
|
||||||
|
{ k: 'FAO 코드', v: 'PTM' },
|
||||||
|
{ k: '최소 망목', v: '≥ 56mm' },
|
||||||
|
{ k: '주요 어종', v: '전갱이 · 고등어 · 참조기' },
|
||||||
|
{ k: '선박 간격', v: '300~500m 유지' },
|
||||||
|
{ k: '조업 속력', v: '2~4 knot (2척 동기화)' },
|
||||||
|
{ k: 'AIS', v: '2척 어선 AIS 동기화' },
|
||||||
|
],
|
||||||
|
gCodes: [
|
||||||
|
{ code: 'G-02', desc: '금어기 내 공조 조업 탐지' },
|
||||||
|
{ code: 'G-06', desc: '2척 동기화 2시간+ → 공조' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
no: '③', name: '스토우넷 (안강망)', nameEn: 'Stow Net (FYK)', image: '/dar03/stow-net.png',
|
||||||
|
specs: [
|
||||||
|
{ k: 'FAO 코드', v: 'FYK' },
|
||||||
|
{ k: '최소 망목', v: '≥ 55mm (캔버스형)' },
|
||||||
|
{ k: '주요 어종', v: '참조기 · 갈치 · 실치' },
|
||||||
|
{ k: '설치 방식', v: '말뚝·닻으로 고정' },
|
||||||
|
{ k: 'AIS', v: '어구 AIS 부표 부착 의무' },
|
||||||
|
{ k: '탐지 지표', v: '위치 이탈·출현·소실 주기' },
|
||||||
|
],
|
||||||
|
gCodes: [
|
||||||
|
{ code: 'G-01', desc: '위치 편차 200m+ → 구역 외' },
|
||||||
|
{ code: 'G-04', desc: '신호 30분 내 반복 → MMSI 조작' },
|
||||||
|
{ code: 'G-05', desc: '이동 500m+ → 인위적 이동' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
no: '④', name: '자망', nameEn: 'Gillnet (GNS/GND)', image: '/dar03/gillnet.png',
|
||||||
|
specs: [
|
||||||
|
{ k: 'FAO 코드', v: 'GNS / GND' },
|
||||||
|
{ k: '최소 망목', v: '55~144mm (어종별 상이)' },
|
||||||
|
{ k: '참조기 기준', v: '55mm (황해)' },
|
||||||
|
{ k: '은돔 기준', v: '100mm' },
|
||||||
|
{ k: 'AIS', v: '어구 AIS 부표 부착' },
|
||||||
|
{ k: '탐지 지표', v: '미등록 여부·기간 이탈' },
|
||||||
|
],
|
||||||
|
gCodes: [
|
||||||
|
{ code: 'G-02', desc: '금어기 내 신호 출현 → label=1' },
|
||||||
|
{ code: 'G-03', desc: '등록DB 미매칭 → 불법 자망' },
|
||||||
|
{ code: 'G-05', desc: '조류 보정 후 500m+ → 이동' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
no: '⑤', name: '통발 · 함정', nameEn: 'Pot / Trap (FPO)', image: '/dar03/pot-trap.png',
|
||||||
|
specs: [
|
||||||
|
{ k: 'FAO 코드', v: 'FPO' },
|
||||||
|
{ k: '탈출구 (꽃게)', v: 'Ø ≥ 8cm 또는 높이 33mm' },
|
||||||
|
{ k: '탈출구 (참게)', v: '측면 30mm + 말단 7cm' },
|
||||||
|
{ k: '주요 어종', v: '꽃게 · 참게 · 장어' },
|
||||||
|
{ k: '미성어 방류율', v: '95% 이상 (탈출구 적용 시)' },
|
||||||
|
{ k: 'AIS', v: '어구 AIS 부표 부착' },
|
||||||
|
],
|
||||||
|
gCodes: [
|
||||||
|
{ code: 'G-01', desc: '허가 구역 외 설치 → GIS 교차' },
|
||||||
|
{ code: 'G-04', desc: '어선-어구 출현·소실 60분+ 불일치' },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
interface DAR03AisSignal {
|
||||||
|
no: string;
|
||||||
|
name: string;
|
||||||
|
aisType: string;
|
||||||
|
normal: string[];
|
||||||
|
threshold: string[];
|
||||||
|
gCodes: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DAR03_AIS_SIGNALS: DAR03AisSignal[] = [
|
||||||
|
{ no: '①', name: '저층 트롤', aisType: '어선 AIS (Class-A)',
|
||||||
|
normal: ['2.5~4.5 knot', 'U형 항적 반복'],
|
||||||
|
threshold: ['5 knot 이상 급가속', '금지 해역 진입'], gCodes: 'G-01, G-03' },
|
||||||
|
{ no: '②', name: '쌍끌이 트롤', aisType: '어선 AIS 2척',
|
||||||
|
normal: ['2~4 knot 동기화', '500m 간격 유지'],
|
||||||
|
threshold: ['동기화 2시간 이상', '동시 AIS 차단 30분+'], gCodes: 'G-02, G-06' },
|
||||||
|
{ no: '③', name: '스토우넷', aisType: '어구 AIS (Class-B)',
|
||||||
|
normal: ['위치 완전 고정', '신호 지속 출현'],
|
||||||
|
threshold: ['위치 편차 200m+', '출현·소실 30분 이내 반복'], gCodes: 'G-01, G-04, G-05' },
|
||||||
|
{ no: '④', name: '자망', aisType: '어구 AIS (Class-B)',
|
||||||
|
normal: ['위치 반고정', '조류에 따라 완만이동'],
|
||||||
|
threshold: ['등록 DB 미매칭', '금어기 내 신호 출현'], gCodes: 'G-02, G-03' },
|
||||||
|
{ no: '⑤', name: '통발', aisType: '어구 AIS (Class-B)',
|
||||||
|
normal: ['위치 완전 고정', '신호 지속'],
|
||||||
|
threshold: ['어선 접근·이탈 불일치 60분+', '구역 외 위치'], gCodes: 'G-01, G-04' },
|
||||||
|
];
|
||||||
|
|
||||||
// ─── ⑦ 7대 탐지 엔진 (불법조업 감시 알고리즘 v4.0) ───
|
// ─── ⑦ 7대 탐지 엔진 (불법조업 감시 알고리즘 v4.0) ───
|
||||||
|
|
||||||
interface DetectionEngine {
|
interface DetectionEngine {
|
||||||
@ -601,6 +744,166 @@ export function AIModelManagement() {
|
|||||||
</Card>
|
</Card>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* ── DAR-03 5종 어구 구조 비교 ── */}
|
||||||
|
<div className="bg-indigo-950/20 border border-indigo-900/30 rounded-xl p-4 flex items-center gap-4">
|
||||||
|
<Info className="w-5 h-5 text-indigo-400 shrink-0" />
|
||||||
|
<div className="flex-1">
|
||||||
|
<div className="text-[12px] font-bold text-indigo-300">DAR-03 · 5종 어구 구조 비교 (FAO ISSCFG)</div>
|
||||||
|
<div className="text-[10px] text-hint mt-0.5">
|
||||||
|
불법 어망·어구 탐지 참고자료 — FAO 국제 어구 분류 기준 · Wang et al.(2022) 논문 기반 · G-01~G-06 탐지 코드 연계
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<Badge intent="purple" size="sm">참고자료</Badge>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 5종 어구 특성 비교 요약 */}
|
||||||
|
<Card>
|
||||||
|
<CardHeader>
|
||||||
|
<CardTitle className="flex items-center gap-2">
|
||||||
|
<Anchor className="w-4 h-4 text-cyan-400" />
|
||||||
|
5종 어구 특성 비교 요약
|
||||||
|
</CardTitle>
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent>
|
||||||
|
<table className="w-full text-[10px]">
|
||||||
|
<thead>
|
||||||
|
<tr className="text-hint border-b border-border">
|
||||||
|
<th className="text-left py-2 px-2">어구</th>
|
||||||
|
<th className="text-center py-2">FAO 코드</th>
|
||||||
|
<th className="text-center py-2">최소 망목</th>
|
||||||
|
<th className="text-center py-2">IUU 위험도</th>
|
||||||
|
<th className="text-center py-2">AIS 부착</th>
|
||||||
|
<th className="text-left py-2 px-2">주요 G코드</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{DAR03_GEAR_SUMMARY.map((g) => (
|
||||||
|
<tr key={g.no} className="border-b border-border/50 hover:bg-surface-overlay transition-colors">
|
||||||
|
<td className="py-2 px-2">
|
||||||
|
<span className="text-cyan-400 font-mono mr-2">{g.no}</span>
|
||||||
|
<span className="text-heading font-medium">{g.name}</span>
|
||||||
|
</td>
|
||||||
|
<td className="py-2 text-center text-label font-mono">{g.faoCode}</td>
|
||||||
|
<td className="py-2 text-center text-muted-foreground font-mono">{g.mesh}</td>
|
||||||
|
<td className="py-2 text-center">
|
||||||
|
<Badge intent={DAR03_IUU_INTENT[g.iuuRisk]} size="xs">{g.iuuRisk}</Badge>
|
||||||
|
</td>
|
||||||
|
<td className="py-2 text-center text-muted-foreground">{g.aisType}</td>
|
||||||
|
<td className="py-2 px-2 text-cyan-400 font-mono text-[9px]">{g.gCodes}</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
{/* 어구별 구조 도식 */}
|
||||||
|
<Card>
|
||||||
|
<CardHeader>
|
||||||
|
<CardTitle className="flex items-center gap-2">
|
||||||
|
<Eye className="w-4 h-4 text-blue-400" />
|
||||||
|
어구별 구조 도식 비교
|
||||||
|
</CardTitle>
|
||||||
|
<p className="text-[9px] text-hint italic">
|
||||||
|
※ FAO 어구 분류 기준 및 Wang et al.(2022) 논문 기반 개념도. 임계값은 사업 착수 후 해양경찰청 실무 데이터 분석으로 최종 확정.
|
||||||
|
</p>
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent>
|
||||||
|
<div className="grid grid-cols-2 gap-3">
|
||||||
|
{DAR03_GEAR_DETAILS.map((g) => (
|
||||||
|
<Card key={g.no} className="bg-surface-raised border-border">
|
||||||
|
<CardContent className="p-4">
|
||||||
|
<div className="flex items-center gap-2 mb-3">
|
||||||
|
<span className="text-cyan-400 font-mono font-bold text-sm">{g.no}</span>
|
||||||
|
<div className="flex-1">
|
||||||
|
<div className="text-[12px] font-bold text-heading">{g.name}</div>
|
||||||
|
<div className="text-[9px] text-hint">{g.nameEn}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="bg-surface-overlay rounded-lg p-2 mb-3 flex items-center justify-center">
|
||||||
|
<img src={g.image} alt={g.nameEn} className="w-full h-auto max-h-48 object-contain" />
|
||||||
|
</div>
|
||||||
|
<div className="space-y-1 mb-3">
|
||||||
|
{g.specs.map((s) => (
|
||||||
|
<div key={s.k} className="flex justify-between text-[10px] px-2 py-1 bg-surface-overlay rounded">
|
||||||
|
<span className="text-muted-foreground">{s.k}</span>
|
||||||
|
<span className="text-heading font-medium">{s.v}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="border-t border-border pt-2">
|
||||||
|
<div className="text-[9px] text-hint mb-1.5 font-medium">G코드 연계</div>
|
||||||
|
<div className="space-y-1">
|
||||||
|
{g.gCodes.map((gc) => (
|
||||||
|
<div key={gc.code} className="flex items-start gap-2 text-[9px]">
|
||||||
|
<Badge intent="cyan" size="xs">{gc.code}</Badge>
|
||||||
|
<span className="text-muted-foreground flex-1">{gc.desc}</span>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
|
||||||
|
{/* AIS 신호 특성 및 이상 판정 기준 */}
|
||||||
|
<Card>
|
||||||
|
<CardHeader>
|
||||||
|
<CardTitle className="flex items-center gap-2">
|
||||||
|
<Radio className="w-4 h-4 text-purple-400" />
|
||||||
|
어구별 AIS 신호 특성 및 이상 판정 기준
|
||||||
|
</CardTitle>
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent>
|
||||||
|
<table className="w-full text-[10px]">
|
||||||
|
<thead>
|
||||||
|
<tr className="text-hint border-b border-border">
|
||||||
|
<th className="text-left py-2 px-2">어구</th>
|
||||||
|
<th className="text-left py-2">AIS 유형</th>
|
||||||
|
<th className="text-left py-2">정상 신호 특성</th>
|
||||||
|
<th className="text-left py-2">이상 탐지 임계값</th>
|
||||||
|
<th className="text-left py-2 px-2">G코드</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{DAR03_AIS_SIGNALS.map((s) => (
|
||||||
|
<tr key={s.no} className="border-b border-border/50 hover:bg-surface-overlay transition-colors align-top">
|
||||||
|
<td className="py-2.5 px-2">
|
||||||
|
<span className="text-cyan-400 font-mono mr-1">{s.no}</span>
|
||||||
|
<span className="text-heading font-medium">{s.name}</span>
|
||||||
|
</td>
|
||||||
|
<td className="py-2.5 text-label">{s.aisType}</td>
|
||||||
|
<td className="py-2.5">
|
||||||
|
<ul className="space-y-0.5">
|
||||||
|
{s.normal.map((n) => (
|
||||||
|
<li key={n} className="text-muted-foreground flex items-start gap-1">
|
||||||
|
<CheckCircle className="w-3 h-3 text-green-500 shrink-0 mt-0.5" />
|
||||||
|
<span>{n}</span>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
<td className="py-2.5">
|
||||||
|
<ul className="space-y-0.5">
|
||||||
|
{s.threshold.map((th) => (
|
||||||
|
<li key={th} className="text-muted-foreground flex items-start gap-1">
|
||||||
|
<AlertTriangle className="w-3 h-3 text-orange-400 shrink-0 mt-0.5" />
|
||||||
|
<span>{th}</span>
|
||||||
|
</li>
|
||||||
|
))}
|
||||||
|
</ul>
|
||||||
|
</td>
|
||||||
|
<td className="py-2.5 px-2 text-cyan-400 font-mono text-[9px]">{s.gCodes}</td>
|
||||||
|
</tr>
|
||||||
|
))}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
불러오는 중...
Reference in New Issue
Block a user