요즘 핫한 기능. 코드를 줄여준다는 Ponytail 오픈소스입니다.

 


1. 개요

  • AI 코딩 에이전트에 붙이는 규칙셋(ruleset). npm 라이브러리나 실행 프로그램이 아님
  • 개발자 DietrichGebert가 2026년 6월 공개, MIT 라이선스
  • 목적: AI 에이전트의 과잉 구현(over-engineering) 억제
  • 이름 유래: 코드 50줄을 보여주면 말없이 한 줄로 바꿔놓는 베테랑 시니어 개발자

2. 해결하려는 문제

  • AI는 방대한 "제대로 만든" 코드로 학습 → 사소한 요청에도 그 방식으로 응답
  • 대표 사례: 날짜 선택기 요청 시
    • 에이전트 → flatpickr 설치 + 래퍼 컴포넌트 + 스타일시트 + 타임존 논의
    • 실제 필요 → <input type="date"> 한 줄
  • 리액트에서 특히 빈발: UI 요구 하나가 컴포넌트·상태관리·스타일·유틸로 번짐
  • 누적 시 PR diff 비대화, 리뷰 비용 상승

3. 동작 방식

  • ESLint와의 차이
    • ESLint: 이미 쓰인 코드를 결정론적 규칙으로 사후 검사
    • Ponytail: 코드를 쓰기 전에 에이전트 컨텍스트에 규칙 주입 → 판단 기준 변경
  • 의사결정 사다리(먼저 걸리는 단계에서 정지)
 
1. 이게 있을 필요가 있나?      → 없다: 건너뛴다 (YAGNI)
2. 이미 이 코드베이스에 있나?   → 다시 짜지 말고 가져다 쓴다
3. 표준 라이브러리로 되나?      → 쓴다
4. 네이티브 플랫폼 기능인가?    → 쓴다
5. 깔려 있는 의존성이 푸나?     → 쓴다
6. 한 줄로 되나?               → 한 줄
7. 그제서야: 돌아가는 최소한
  • 설계 요점
    • 새 코드 작성이 마지막 선택지
    • 사다리 적용은 문제 이해 이후. 변경이 닿는 코드를 먼저 읽음
    • 해법에는 게을러도 읽는 데는 게으르지 않음
  • 절대 축소하지 않는 항목: 신뢰 경계 검증, 데이터 손실 방지, 보안, 접근성
    • "짧게 써줘" 프롬프트는 벤치마크에서 안전 항목 1개 누락, Ponytail은 전부 유지

4. 설치

4.1 Claude Code

 
/plugin marketplace add DietrichGebert/ponytail
 
/plugin install ponytail@ponytail
  • 주의: 두 프롬프트를 반드시 따로 전송. 한 메시지에 붙이면 설치 실패

4.2 Claude 데스크톱 앱

  • /plugin 명령 미지원 → UI로 진행
  • 경로: Customize → 개인 플러그인 옆 + → Create plugin and add marketplace → Add from repository → 저장소 URL 입력

4.3 규칙 파일 복사 방식

  • 대상: Cursor, Windsurf, Cline, Aider, Zed, 에디터용 Copilot, Kiro
  • 저장소에서 해당 파일을 프로젝트에 복사
    • .cursor/rules/
    • .windsurf/rules/
    • .clinerules/
    • .github/copilot-instructions.md
    • AGENTS.md
    • .kiro/steering/
  • 제약: 늘 켜진 규칙만 적용. 슬래시 명령·모드 전환 미지원

4.4 기타

  • 총 15개 내외 에이전트 지원 (Codex, Copilot CLI, Gemini CLI, OpenCode, Devin CLI 등)
  • 도구별 설치법 상이 → README의 해당 항목 참조

4.5 사전 조건

  • Claude Code·Codex 플러그인은 Node.js 라이프사이클 훅 2개 실행 → node가 PATH에 필요
  • nvm 사용 시 비대화형 셸 PATH에도 등록 필요
  • 미충족 시: 스킬 자체는 동작, 자동 활성화만 조용히 비활성

5. 강도 모드

모드내용
off 비활성화
lite 가볍게 적용
full 의사결정 사다리 엄격 적용, 기존 코드 최대 재활용 (기본값)
ultra 극단적 미니멀리즘. 신규 외부 라이브러리 추가·파일 생성 원천 차단
  • 세션 중 변경: /ponytail ultra
  • 기본값 변경: PONYTAIL_DEFAULT_MODE 환경변수 또는 ~/.config/ponytail/config.json의 defaultMode
    • Windows: %APPDATA%\ponytail\config.json
  • 설정 파일은 선택 사항 (필수 아님)

6. 명령어

명령기능
/ponytail [lite|full|ultra|off] 강도 설정·해제. 인수 없으면 현재 레벨 표시
/ponytail-review 현재 diff를 과잉 구현 관점에서 검토, 삭제 목록 반환
/ponytail-audit 저장소 전체 감사
/ponytail-debt 미뤄둔 간소화 항목을 장부로 집계
/ponytail-gain 절감 스코어보드 표시
/ponytail-help 명령 빠른 참조
  • 스킬 지원 호스트에서만 동작 (Claude Code, Codex, Devin CLI, OpenCode, Gemini, pi, Swival)
  • Codex에서는 @ 접두사 사용: @ponytail-review
  • 지시문 전용 어댑터(Cursor, Windsurf, Cline, Copilot, Kiro)는 명령 미지원

7. 기존 코드 축소 가능 여부 → 가능

7.1 용도별 명령 선택

  • 작업 중인 변경분만 → /ponytail-review (PR 직전 사용, 범위 한정으로 판단 용이)
  • 프로젝트 전체 → /ponytail-audit
  • 미처리 항목 관리 → /ponytail-debt

7.2 /ponytail-audit 탐지 대상

  • 사용하지 않는 중복 유틸리티
  • HTML 네이티브로 대체 가능한 커스텀 컴포넌트
    • 예) 커스텀 날짜 선택기 → <input type="date">

7.3 한계 및 주의

  • 자동 리팩터링 도구 아님. 제안까지가 역할, 실제 삭제·수정은 별도 지시 필요
  • 실무 코드 적용 시 브랜치 분리 권장
  • 오탐 가능 항목
    • 현재 미사용이나 향후 사용 예정인 코드
    • 팀이 의도적으로 만든 추상화 레이어
  • 도구는 이런 맥락을 알 수 없음 → 제안 목록을 개별 검토 후 반영

8. 성능 수치

8.1 에이전트 벤치마크 (기준 수치)

  • 조건: 실제 FastAPI + React 저장소, 기능 티켓 12건, 동일 에이전트 온/오프 비교, n=4, Haiku 4.5
  • 결과 (스킬 미적용 대비)
항목변화
LOC −54%
토큰 −22%
비용 −20%
시간 −27%
안전성 100% 유지

8.2 수치 해석 시 유의점

  • 94%는 평균이 아니라 상한. 과잉 구현 함정이 있는 작업에서만 도달
    • 날짜 선택기: 404줄 → 23줄
    • 색상 선택기: 287줄 → 23줄
  • 이미 간결한 코드에서는 효과 ≒ 0
  • 기존에 유통되던 "80~94% 감소"는 단발성 벤치마크 수치 → 저자가 직접 정정
    • 원인: 스킬 미적용 기준선 모델이 설명·선택지로 답변을 부풀림 → 격차 과장
  • 역효과 사례: 사고 토큰을 많이 쓰는 추론 모델은 비용이 오히려 증가 가능 (GPT-5.5 명시)
  • 비교군 대비 우위
비교군LOC토큰안전
Ponytail −54% −22% 100%
caveman −20% +7% 100%
"YAGNI + one-liners" 프롬프트 −33% −14% 95%

9. 학습자 관점 평가

9.1 장점

  • 짧은 코드 → 입문자가 전부 읽고 이해 가능
  • 200줄 컴포넌트는 핵심 파악 곤란, 20줄은 완독 가능

9.2 단점

  • 왜 그 한 줄로 충분한지는 설명하지 않음
  • 결과만 수용 시 판단 근거에 대한 감각 미형성
  • 보완책: 결과 수령 후 "원래는 어떻게 짰을 것 같은데 왜 이걸로 충분한가" 재질문 습관

9.3 도입 순서 제안

  1. 개인 연습 프로젝트에 설치
  2. /ponytail-audit 1회 실행 → 기존 코드의 부풀림 정도 확인
  3. 결과 판단 후 실무 적용 여부 결정

 


나는 기존에 있는 코드의 불필요한 부분들을 줄이고 싶은것인데

ponytail은 AI를 이용하여 코드 생성할 때 불필요한 부분 생성하지 않게 도와주는 기능인 것같다.

 

그럼 기존 파일이 규칙에 맞게 작성이 되어있나를 검사하는

ESLint가 더 맞을지도 모르겠다.

 

 

'개발' 카테고리의 다른 글

[frontend] js · jsx · ts · tsx · css의 차이  (0) 2026.09.02

프론트엔드 입문자가 가장 먼저 헷갈리는 것
js · jsx · ts · tsx · css, 뭐가 다를까

────────────────────────────────────────

 


리액트 프로젝트를 처음 열어보면 폴더 안에 확장자가
제각각인 파일들이 섞여 있습니다.

    main.tsx
    useUser.ts
    index.css
    vite.config.js

분명 같은 프로젝트인데 왜 이름 뒤가 다 다를까요.
결론부터 말하면 규칙은 딱 한 문장입니다.

    ┌──────────────────────────────┐
    │  타입을 쓰면 t               │
    │  화면을 그리면 x             │
    └──────────────────────────────┘


────────────────────────────────────────
■  일단 css부터 떼어놓고 시작합시다
────────────────────────────────────────

js, jsx, ts, tsx는 사실 전부 같은 언어입니다.
자바스크립트라는 뿌리 하나에서 갈라져 나온 형태들이에요.
무엇을 할지, 어떤 계산을 하고 어떤 조건에서 무엇을
보여줄지를 적는 언어입니다.

반면 css는 완전히 다른 언어입니다.
문법 자체가 다르고, 계산도 조건 분기도 하지 않습니다.
색은 무엇이고 여백은 얼마이고 어디에 놓일지,
오직 생김새만 적습니다.

그래서 처음 정리할 때는 css를 옆으로 빼두고
나머지 넷만 보는 게 훨씬 빠릅니다.


────────────────────────────────────────
■  두 개의 질문으로 네 갈래가 나뉩니다
────────────────────────────────────────

▸ 첫 번째 질문 — 화면 요소를 직접 그리나요?

자바스크립트 코드 안에 HTML처럼 생긴 문법을 쓰는 걸
JSX라고 합니다. 이런 코드 말이죠.

    return <button>저장</button>;

이게 들어가는 파일에는 확장자 뒤에 x가 붙습니다.
x가 없는 파일에서 저 코드를 쓰면 에러가 납니다.
파서가 JSX를 해석하지 않기 때문에 부등호를
다른 의미로 읽어버리거든요.


▸ 두 번째 질문 — 타입 검사를 받나요?

타입스크립트는 값의 종류를 미리 적어두는 방식입니다.
이 함수는 숫자를 받아 문자열을 돌려준다고 써두면,
실행하기 전에 편집기가 틀린 부분을 빨간 줄로
알려줍니다. 타입스크립트 파일은 앞에 t가 붙습니다.


▸ 두 질문을 겹치면

                  화면 안 그림    화면 그림
                ─────────────────────────────
    타입 없음   │    .js     │    .jsx    │
                ─────────────────────────────
    타입 있음   │    .ts     │    .tsx    │
                ─────────────────────────────

    · 같은 줄끼리는 같은 언어입니다
    · 오른쪽 칸에만 <div> 를 쓸 수 있습니다


────────────────────────────────────────
■  각각 언제 쓰는지
────────────────────────────────────────

▸ .js  ㅡ  순수 자바스크립트

브라우저가 그대로 읽을 수 있는 유일한 형식입니다.
빌드 도구 설정 파일이나, 리액트를 쓰지 않는
짧은 스크립트에 씁니다.

    export function formatWon(value) {
      return value.toLocaleString() + "원";
    }


▸ .jsx  ㅡ  자바스크립트 + 화면 문법

타입스크립트를 도입하지 않은 프로젝트에서
리액트 컴포넌트를 만들 때 씁니다.

    export default function Badge({ label }) {
      return <span className="badge">{label}</span>;
    }


▸ .ts  ㅡ  타입이 붙은 로직 파일

화면은 안 그립니다. 서버와 통신하는 함수,
타입 정의, 커스텀 훅, 유틸 함수가 여기 들어갑니다.

    export type User = { id: number; name: string };

    export async function getUser(id: number) {
      const res = await fetch("/api/users/" + id);
      return res.json();
    }


▸ .tsx  ㅡ  타입 + 화면 문법

이 컴포넌트가 어떤 값을 받아야 하는지 파일 스스로
설명하기 때문에, 요즘 실무 리액트 프로젝트는
거의 이걸로 통일합니다.

    type Props = { label: string; onPress: () => void };

    export default function Button({ label, onPress }: Props) {
      return <button onClick={onPress}>{label}</button>;
    }


▸ .css  ㅡ  생김새만 담당

전체에 적용할 스타일은 index.css 처럼,
특정 컴포넌트에만 적용할 스타일은
Button.module.css 처럼 씁니다.

    .badge {
      padding: 2px 8px;
      border-radius: 4px;
      background: #e8eef7;
    }


────────────────────────────────────────
■  실제 프로젝트에서는 이렇게 섞여 있습니다
────────────────────────────────────────

    my-app/
    │
    ├─ vite.config.ts          빌드 설정, 화면 없음
    │
    └─ src/
       ├─ main.tsx             앱을 화면에 붙이는 진입점
       ├─ App.tsx              최상위 컴포넌트
       ├─ index.css            전역 스타일
       │
       ├─ components/
       │  ├─ Button.tsx        버튼을 그림
       │  └─ Button.module.css 버튼 생김새
       │
       ├─ hooks/
       │  └─ useUser.ts        로직만, 화면 없음
       │
       ├─ api/
       │  └─ client.ts         서버 통신
       │
       └─ types/
          └─ user.ts           타입 정의만

규칙이 눈에 보이시나요.
화면을 그리는 파일은 tsx, 로직만 있는 파일은 ts입니다.
이 하나만 봐도 절반은 이해한 셈입니다.


────────────────────────────────────────
■  마지막으로 알아두면 좋은 것들
────────────────────────────────────────

▸ 브라우저는 결국 js와 css만 이해합니다

    .tsx  .ts  .jsx
          ↓
    Vite · webpack 이 변환
          ↓
         .js

ts, tsx, jsx는 사람이 읽고 쓰기 좋으라고 만든
형식일 뿐이고, 실행 전에 평범한 js로 바뀝니다.
그래서 확장자를 고르는 일은 성능 문제가 아니라
나와 팀이 편해지는 문제입니다.


▸ 작은 함정 하나

.ts 에서는 부등호를 이용한 옛날식 타입 단언이
되지만, .tsx 에서는 JSX와 충돌해서 쓸 수 없습니다.
어느 쪽이든 as 키워드로 통일하는 게 요즘 관례입니다.


▸ 파일을 새로 만들 때 생각하는 순서

    1  스타일인가          → css
    2  화면을 그리나       → 뒤에 x
    3  타입스크립트인가    → 앞에 t


────────────────────────────────────────


지금 막 배우는 중이라면 새 프로젝트는 tsx와 ts
조합으로 시작하는 걸 권합니다. 처음엔 빨간 줄이
자주 뜨지만, 그 빨간 줄은 나중에 브라우저에서
만났을 버그를 미리 보여주는 것이라 오히려
학습 속도가 빨라집니다.

'개발' 카테고리의 다른 글

Ponytail 사용기(1)  (0) 2026.09.02

Abstract

  • 영상 전체에 걸쳐 세밀한 인간 행동을 인식하고 시간적으로 분할하는 능력은 로봇공학, 감시, 교육 등 다양한 분야에서 매우 중요함
  • 기존 접근 방식의 문제 처리 방법
    1. 영상 프레임에서 국소적인 시공간 특징 추출
    2. 고수준의 시각적 패턴 학습하는 temporal classifier에 입력으로 사용함
  • 새로운 형태의 시간 기반 모델 Temporal Convolutional Networks(TCNs) 제안
    • 시간 축에 대한 계층적인 convolution 구조를 활용하여 세밀한 행동 분할 및 탐지 수행
    • Encoder-Decoder TCN: pooling과 upsampling을 사용하여 장기적인 시간 패턴 효율적 포착
    • Dilated TCN: dilation convolution을 활용하여 넓은 시간 범위를 효과적으로 모델링
    • 행동의 구성 이해, 행동 구간의 길이 학습, 장기 의존성 학습 가능
    • 기존의 LSTM 기반 RNN에 비해 학습 속도가 10배 이상 빠름

Introduction

  • 목표는 시간 축에서 모든 행동을 분할하고 각 구간에 해당하는 행동을 동시에 분류하는 것
  • 본 연구에서는 주방 환경이나 감시 시스템과 같이 특정 환경에서 이루어지는 situated activities를 모델링하는 데 초점
    • 서로 매우 미묘하게 다른 행동들로 구성된 영상
  • 최근 temporal 모델들이 가지는 한계
    • Sliding window 기반 방법
      • 일반적으로 긴 시간 범위의 패턴 잘 포착하지 못함
    • Segmental 모델
      • 각 구간 내부의 특징은 잘 학습, 구간 간 조건부 독립을 가정하기 때문에 장기적인 잠재 의존성 무시
    • Recurrent 모델 (RNN, LSTM)
      • 잠재적인 시간 패턴 학습 가능하지만 해석이 어려움
      • attention 범위가 제한적이어서 장기 의존성을 충분히 학습하지 못하며 학습 과정 또한 어렵고 불안정함
  • Temporal Convolutional Networks(TCNs)
    • 계층적 시간 convolution 필터 구조 사용하여 장기적인 시간 패턴 효과적 학습
    • 두 가지 형태의 TCN 제안
      1. Encoder-Decoder TCN (ED-TCN)
        • 시간 convolution, pooling, upsampling 으로 구성된 계층 구조 사용
        • 비교적 적은 수의 층을 가지지만 각 층은 긴 convolution filter 포함
        • 장기적 시간 패턴 효율적 포착 가능
      2. Dilated TCN
        • pooling, upsampling 대신 dilated convolution 사용
        • layer 간 skip connection 추가
        • 더 많은 층을 가지지만 각 층은 적은 시간 범위만 처리
        • dilation을 통해 전체적으로 넓은 시간 범위 학습
          • dilation
            • convolution 필터 사이에 간격을 넣어서 더 넓은 범위를 보게 하는 방법
            • 필터 크기, 파라미터 수 변경 X
            • 장기적 시간 패턴 학습 가능
            • 계산 효율 좋음
            • 깊은 네트워크 불필요함 
          • dilation rate= d/ t, t+d, t+2d/ d=1, d=2, d=4로 늘려가며 보는 영역을 크게하는 방식

    • 실험적으로 두 TCN 모델이 다음과 같은 특성을 모두 학습할 수 있음을 확인함
      • segmental 모델의 특징인 행동 길이(duration) 및 구간 간 전이(pairwise transitions)
      • recurrent 모델의 특징인 장기적인 시간 패턴(long-range temporal patterns)
    • Bi-LSTM보다 높은 성능, 10배 이상 빠른 학습 속도
    • over-segmentation(하나의 행동을 너무 잘게 쪼개 여러 개로 잘못 나누는) 오류를 훨씬 적게 발생시킴
  • over-segmentation오류를 action segmentation 또는 action detection이라고 부름
    • 실질적으로 동일한 문제, 두 분야에서 사용하는 temporal 모델과 평가 지표가 서로 다름
    • 본 논문에서는 두 유형을 모두 대상으로 하는 데이터셋에서 평가 수행
    • 기존 지표보다 실제 환경에서 더 적합한 segmental F1 score를 새롭게 제안
  • 데이터셋
    • Merl Shopping  → action detection을 위해 설계된 데이터셋
    • Georgia Tech Egocentric Activities → action segmentation을 위해 설계된 데이터셋
    • 50 Salads → 두 작업 모두에 사용되는 데이터셋

Temporal Convolutional Networks

  1. 연산은 layer 단위로 수행, 각 시간 스텝이 프레임 단위로 순차적으로 업데이트되는 것이 아니라 모든 시간 스텝이 동시에 업데이트됨
  2. convolution 연산은 시간 축을 따라 수행됨
  3. 각 프레임에서의 예측은 고정된 길이의 시간 구간에 의존함(receptive field)
  • ED-TCN은 temporal convolution을 사용하는 encoder-decoder 구조 기반
  • Dilated TCN은 WaveNet 모델을 기반으로 하여 dilated convolution을 깊게 쌓은 구조 사용
  • TCN의 입력은 영상의 각 프레임에서 추출된 feature들의 집합(feature들은 spatial CNN 또는 spatiotemporal CNN의 출력일 수 있음)

 

  • 시간 스텝 t에서의 입력 feature 벡터 (시간 스텝의 개수 t는 각 영상마다 달라질 수 있음)
  • 각 프레임의 행동 라벨

 

 

 

Encoder-Decoder TCN

  • encoder는 L개의 layer로 구성, 각 layer는 다음과 같이 표현됨
    • 각 layer는 다음으로 구성됨
      1. 시간 방향 convolution (temporal convolution)
      2. 비선형 활성화 함수 (activation function)
      3. 시간 축에 대한 max pooling
  • 각 layer의 필터 집합은 다음과 같의 정의됨


  • 다양한 활성화 함수 비교함, Normalized ReLU가 가장 좋은 성능 보임
  • 각 activation 이후에는 시간 축 방향으로 width 2 maxpooling 수행, 시간 길이는 다음과 같이 줄어듬
  • pooling은 긴 시간 구간을 효율적으로 처리할 수 있게 해줌 
  • Decoder
    • encoder와 유사하지만 차이점 있음
    • pooling 대신 upsampling 사용 (각 값을 단순히 두 번 반복하는 방식으로 수행됨)
    • 연산 순서: upsample → convolution → activation
    • convolution 필터는 중간에서 압축된 정보를 위쪽으로 전달하여 최종 행동 예측에 반영됨
    • convolution은 성능을 크게 향상시키며 행동 간 전이를 잘 포착함
    • decoder는 encoder와 반대 순서로 indexing되기 때문에, encoder의 첫 번째 layer와 필터 수는 decoder의 마지막 layer와 동일함
  • Prediction

Dilated TCN

  • dilated convolution을 사용해서 장기 시간 의존성을 효율적으로 학습
  • 여러 개의 block 구조
  • 각 block 안에 여러 layer 존재
  • 각 layer는 
    • dilated convolution
    • activation
    • residual connection
  • Dilated Convolution
  • 일반 conv: 인접한 시간만 봄/ dilated conv: 간격을 두고 과거 참조


  • layer가 깊어질수록 더 먼 과거를 보게 됨
  • Receptive Field 증가 방식


  • layer 증가 → 지수적으로 시간 범위 확장
  • pooling 없이도 장기적 시간 의존성 학습 가능

 


 

Abstract

  • 딥러닝 기반 시각 인식 모델들이 왜 특정 결정을 내렸는지 이해하는 것은 여전히 어려운 문제
  • 사용자가 모델의 판단 근거 신뢰하기 어려움
  • CNN 기반 모델의 예측을 시각적으로 설명할 수 있는 일반적인 기법인 Gradient-weighted Class Activation Mapping(Grad-CAM)을 제안함
  • Grad-CAM은 특정 클래스에 대한 gradient 정보를 활용하여, 해당 클래스 예측에 중요한 입력 영역을 강조하는 coarse localization map을 생성함
  • 다양한 CNN 구조에 적용 가능, 이미지 분류뿐만 아니라 다양한 시각 인식 과제에도 사용 가능함
  • 기존의 CAM과 달리 네트워크 구조를 변경하거나 재학습할 필요 없이 적용 가능
  • Grad-CAM은 모델의 예측을 인간이 이해할 수 있는 방식으로 효과적으로 설명할 수 있고, 잘못된 예측의 원인을 분석하거나 모델의 신뢰성을 평가하는 데에도 유용함을 보임

Introduction

  • AI 시스템에 대한 신뢰를 구축하고 이를 우리의 일상생활에 의미 있게 통합하기 위해서는 모델이 왜 특정 예측을 했는지를 설명할 수 있는 '투명한'모델이 필요함
  • 투명성과 설명가능성은 인공지능 발전의 세 단계에서 각각 중요한 역할을 함
    1. AI가 인간보다 훨씬 약한 단계에서는, 설명을 통해 실패 원인을 파악하고 연구 방향을 설정하는 데 도움을 줌
    2. AI가 인간 수준에 도달한 단계에서는, 사용자에게 신뢰와 확신을 제공하는 것이 중요함
    3. AI가 인간보다 훨씬 강한 단계에서는, 설명을 통해 기계가 인간에게 더 나은 의사결정 방법을 가르치는 역할을 하게 됨
  • 정확도와 해석 가능성 사이의 trade-off
    • 규칙 기반 시스템이나 전문가 시스템은 해석 가능성이 높지만 정확도가 낮음
    • 딥러닝 모델은 높은 성능을 얻는 대신 해석 가능성이 떨어짐
  • CAM(Class Activation Mapping)기법
    • 특정 CNN 모델에서 중요한 영역을 시각화할 수 있도록 함
    • fully-connected layer가 없는 특정 구조의 CNN에만 적용이 가능하며 모델 구조를 변경해야 하는 한계가 있음
  • Grad-CAM 적용 가능 CNN 모델
    • fully-connected layer를 포함한 CNN
    • 구조적 출력을 생성하는 CNN
    • multi-modal 입력이나 강화학습 문제에 사용되는 CNN
  • 좋은 시각적 설명이란?
    • class-discriminative: 해당 클래스와 관련된 영역을 정확히 구분해야 함
    • high-resolution: 세밀한 디테일까지 표현해야 함
  • 고해상도이면서 동시에 클래스 구분이 가능한 시각화 제공


Grad-CAM

  • convolution layers는  fully-connected layers에서 사라지는 공간 정보를 자연스럽게 유지함
  • 따라서 마지막 합성곱 층은 고수준 의미 정보와 공간 정보 간의 균형이 가장 잘 맞는 층
  • 이 층의 뉴런들은 이미지 내에서 클래스별 의미 정보를 탐지함
  • CNN의 마지막 합성곱 층으로 흐르는 gradient 정보를 이용하여 특정 결정에 대해 각 뉴런의 중요도를 할당함
  • gradient로 중요도 계산

    • 해당 값이 크면 중요한 위치
    • 값이 작으면 상대적으로 덜 중요한 위치
  • feature map에 중요도 적용
  • 중요도 계산

    • 해당 feature map이 이 클래스에 얼마나 기여했는지 계산
    • 위치마다 중요도가 다르기 때문에 전체 평균으로 대표값 결정
  • Heatmap 생성(ReLU)

    • feature map을 가져온 후 중요도를 곱하고 다 더한 후 ReLU 적용

 

검은 화살표: activation forward흐름(순전파, 예측)/ 파란 화살표: gradient의 backward흐름(역전파, 설명)

 

  1. 입력 이미지를 CNN에 넣어서 feature map 생성
    • CNN을 통과하고 만들어진 여러 feature map: Rectified Conv Feature Maps
    • 마지막 conv layer의 feature map: 의미정보 + 위치정보를 가지고 있음
  2. 관심 있는 클래스의 점수 추출
    • Image Classification, Image Captioning, Visual Question Answering 중 하나를 선택
  3. 점수로부터 마지막 conv layer까지 gradient를 역전파
    • 파란색 화살표: gradient
    • 관심 없는 다른 클래스의 gradient는 0으로 설정, 관심 있는 클래스만 1로 설정하여 신호를 뒤로 전송
    • 마지막 conv layer의 각 feature map이 그 클래스 점수에 얼마나 영향을 줬는지 gradient로 계산 됨
    • 값이 크면 그 위치는 중요한 정보
  4. gradient로 각 feature map 의 중요도 계산
    • feature map의 각 위치마다의 gradient를 공간 전체에 대해 평균을 내서 feature map 하나의 중요도 생성
  5. 중요도를 반영한 heatmap 생성, 필요하면 Guided Backprop과 결합
    • 각 feature map에 중요도를 곱한 후 더함
    • 중요한 feature map은 크게 반영, 덜 중요하면 작게 반영
    • 마지막에 ReLU를 적용하여 양의 기여만 남김(도움이 되는 부분만 필요)
    • Grad-CAM의 결과물 생성
    • Grad-CAM은 위치정보는 좋지만 세밀한 디테일은 부족함(어디가 중요한지)
      • 마지막 conv layer에서 만들어져서 크기가 작음
      • 원본 이미지 크기로 키워도 경계가 정확하진 않음
    • Guided Backpropagation
      • 원본 이미지에 대해 gradient를 구해서 세밀한 edge, texture를 보여줌(어떻게 생겼는지)
      • 디테일이 선명하지만 특정 클래스만 구분해서 보여주는 것은 약함
    • Guided Grad-CAM
      • Grad-CAM heatmap, Guided Backprop 결과를 pointwise multiplication해서 만든 것
      • Grad-CAM의 클래스 구분력, Guided Backprop의 고해상도 디테일을 가짐

 

 


 

 

 

 

 

이외에도 다양한 Evaluating Visualization들을 포함하고 있으니 논문을 참고하시길 권장드립니다.


오늘은 Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization 논문을 읽어봤습니다.

설명 가능한 AI 분야에 대해 관심이 있었던 만큼 논문이 도움이 되었고, 활용 가능한 분야가 많다고 생각했습니다.

 

Grad-CAM은 CNN의 gradient를 활용하여 모델이 특정 클래스를 판단할 때 중요한 입력 영역을 시각적으로 설명하는 방법입니다.

 

이 논문의 핵심 기여는 다음과 같습니다.

  1. Gradient 기반 시각화 방법 제안
    • feature map의 중요도를 gradient로 계산하여 class-discriminative heatmap 생성
  2. 모델 구조 변경 없이 적용 가능
    • 기존 CAM과 달리 재학습 없이 다양한 CNN구조에 사용 가능
  3. CAM의 일반화
    • classification뿐 아니라 captioning, VQA 등 다양한 task에 확장 가능
  4. Guided Grad-CAM 제안
    • Grad-CAM heatmap, Guided Backprop 결과를 pointwise multiplication해서 만든 것
    • 고해상도 + 클래스 구분력을 동시에 만족하는 시각화 제공

 

다음은 이 논문의 한계점 입니다.

  1. 시간 흐름이나 순서 정보 반영 불
    • 이미지의 공간 위치만 설명 가능하고 시간 흐름은 설명이 불가함
  2. 정밀도 부족
    • 마지막 conv-layer 기반이라 해상도가 낮음
    • Guided Grad-CAM은 보기에는 더 선명해지지만, 실제 위치 정확도가 개선된 것은 아님
  3. 인과성 부족
    • 검출된 영역이 결정의 원인인지 보장하지 않음
    • 설명은 가능하나 진짜 이유인지 확신 불가

AAAI 2018

 

Abstract

  •  인간 신체의 골격 움직임은 인간 동작 인식을 위해 중요한 정보를 전달함
  • 기존 골격 모델링 방법들은 일반적으로 수작업으로 정의된 신체부위나 순회 규칙에 의존해 와서 표현력이 제한되고 일반화에 어려움이 있었음
  • 동적 골격을 모델링하기 위한 Spatial Temporal Graph Convolutional Networks(ST-GCN)을 제안함
  • 데이터로부터 공간적 패턴과 시각적 패턴을 자동으로 학습함으로써 기존 방법의 한계를 극복

Introduction

  • 모달리티를 체계적으로 탐구하며 동적인 골격을 모델링하고 동작 인식에 활용하기 위한 원리적이고 효과적인 방법을 개발하는 것을 목표로 함
  • 초기의 골격 기반 동작 인식 방법들은 각 시점의 관절 좌표를 단순히 특징 벡터로 구성하고 그 위에서 시간적 분석을 수행하는 방식이었음
    • 관절들 간의 공간적 관계를 명시적으로 활용하지 않기 때문에 한계가 있음
  • 관절들 간의 자연스러운 연결 구조를 활용하려는 새로운 방법들이 제안됨
  • 대부분의 기존 방법들은 공간적 패턴을 분석하기 위해 수작업으로 정의된 신체 부위나 규칙에 의존함
    • 다른 분야로 일반화하기 어려움
  • 관절의 공간적 구성에 내재된 패턴과 시간적 동역학을 자동으로 포착할 수 있는 새로운 방법이 필요함
  • Graph 신경망을 공간-시간 그래프 모델로 확장하여 동작 인식을 위한 골격 시퀀스의 일반적인 표현 방식을 설계하고자 함
    • Spatial-Temporal Graph Convolutional Networks(ST-GCN)

파란점은 신체 관절, 관절 좌표는 ST-GCN의 입력으로 사용됨

  • 모델은 골격 그래프들의 시퀀스 위에 구성되며 각 노드는 인체의 하나의 관절에 해당함
  • edge는 두 가지 유형으로 구성됨
    1. 관절들의 자연스러운 연결 구조를 따르는 공간적 간선(spatial edges)
    2. 연속된 시간 단계 사이에서 동일한 관절을 연결하는 시간적 간선(temporal deges)
  • 이 구조 위에 여러 층의 spatial-temporal graph convolution(공간-시간 그래프 합성곱) 계층이 쌓이게 되며, 이를 통해 정보가 공간 차원과 시간 차원 양쪽을 따라 통합될 수 있음

본 연구의 주요 기여는 다음 세 가지로 요약됨

  1. 동적인 골격을 모델링하기 위한 일반적인 그래프 기반 정식화인 ST-GCN을 제안함. 그래프 기반 신경망을 적용한 최초의 연구
  2. 골격 모델링의 특수한 요구 사항을 충족하기 위해 ST-GCN에서 합성곱 커널을 설계하는 여러 원칙을 제안함
  3. 골격 기반 동작 인식을 위한 두 개의 대규모 데이터셋에서 실험한 결과 ,수작업으로 정의된 신체 부위나 순회 규칙에 의존한 기존 방법들보다 우수한 성능을 달성함, 수동 설계 노력은 상당히 줄였음

Spatial Temporal Graph ConvNet

  • 신체 부위가 전체 골격이 아니라 국소 영역(local regions) 내에서 관절 궤적을 제한적으로 모델링하도록 만들기 때문에 성능 향상이 일어남
  • 결과적으로 골격 시퀀스의 계층적 표현(hierarchical representation)을 형성함
  • 이미지 객체 인식과 같은 작업에서는 계층적 표현과 국소성(locality)이 객체 부위를 수작업으로 정의해서 얻어지는 것이 아니라, CNN의 본질적 특성에 의해 자동으로 형성됨 (Krizhevsky, Sutskever, and Hinton 2012)

 

3.1 Pipeline Overview

  • 골격 기반 데이터는 모션 캡처 장치나 비디오에서의 포즈 추정 알고리즘을 통해 얻을 수 있음
  • 일반적으로 데이터는 프레임 시퀀스 형태, 각 프레임에는 관절 좌표 집합이 존재
  • 관절을 그래프의 노드로 하고, 인체의 자연스러운 연결성과 시간 간 연결성을 간선으로 갖는 공간-시간 그래프(spatial temporal graph)를 구성함
  • ST-GCN에 입력되는 데이터는 그래프 노드 상의 관절 좌표 벡터
  • 2D 이미지 상의 픽셀 강도 값을 입력으로 사용하는 CNN과 유사하게 생각할 수 있음
  • 여러 층의 spatial temporal graph의 convolution 연산이 입력 데이터에 적용, 점진적으로 그래프 상에서 더 높은 수준의 feature maps 생성. 최종 feature map은 표준 Softmax를 통해 해당 동작 범주로 분류됨
  • end-to-end 방식으로 학습,  backpropagation을 통해 최적화 됨.

 

3.2 Skeleton Graph Construction

  • 골격 데이터를 공간 + 시간 그래프 형태로 정의하는 단계
  • Skeleton sequence를 Spatial-Temporal Graph로 변환하는 단계
  • 노드 정의(시간이 포함된 관절 그래프)
    • 노드 = 사람 관절
    • 각 프레임마다 관절 존재
    • 시퀀스 전체를 하나의 그래프로 확장
  • 간선 정의
    • Spatial edge
    • 같은 프레임 안에서 인체 구조에 따른 연결
    • ex) shoulder ↔ elbow
    • Temporal edge
    • 연속 프레임 사이에서 같은 관절 연결
    • ex) left wrist(t) ↔ left wrist(t+1)
  • 공간 + 시간 연결을 모두 가진 하나의 큰 그래프
  • 관절 간 관계 학습 가능
  • 관절의 시간 변화 학습 가능

 

3.3 Spatial Graph Convolution

  • 이미지 CNN의 픽셀은 grid(격자) 구조, 주변 픽셀 위치가 고정되어 있음
  • 하지만 그래프는 이웃 개수가 다르고 위치 개념이 없음
  • ! 그래프에서도 convolution처럼 이웃 노드들을 모아서 가중합 진행
  • 출력 노드 feature의 기본 형태:
  •  

  • Partition Strategy
    • 그래프는 위치 개념이 없으므로 이웃 노드를 그룹으로 나눔
    • ex) 자기 자신, 가까운 관절, 먼 관절
    • 각 그룹마다 다른 weight를 적용 (CNN에서 커널 위치에 따라 weight를 다르게 쓰는 것과 대응됨)
  • 공간 이웃 + 시간 이웃 모두 포함
  • 관절 간 정보 전달, 시간 흐름 정보 전달
  • 그래프에서 CNN처럼 이웃 노드를 모아 가중합하는 연산 정의

여러 관절(이웃 노드)의 정보를 가중합해서 만든 새로운 Feature

  • Input Video: 원본 비디오(RGB)
  • Pose Estimation: 각 프레임마다 사람 관절 추출 ( 영상 → 관절 좌표(skeleton) 시퀀스 )
  • Spatial-Temporal Graph 구성
    • 각 프레임의 관절을 같은 프레임 내 관절끼리 연결(Temporal 연결)/ 연속 프레임의 같은 관절끼리 연결(spatial 연결)
    • 관절들을 공간+시간 그래프로 확장
  • ST-GCN 적용
    • 여러 층의 spatial-temporal graph convolution 수행
    • 관절 간 관계 학습, 시간 흐름 학습, 고차원 feature 생성 ( 점점 더 추상적인 동작 표현으로 변환됨 )
  • Action Classification: 최종 feature를 Softmax에 입력하여 행동 클래스 확률 출력

 

3.4 Partition Strategies

  • spatial-temporal graph convolution의 high-level formulation(정식화)가 주어졌을 때, 라벨 맵 l을 구현하기 위한 분할 전략을 설계하는 것이 중요함
  • Uni-labeling
    • 가장 단순하고 직관적인 분할 전략은 이웃 집합 전체를 하나의 부분집합으로 두는 것
    • 이 전략에서는 모든 이웃 노드의 feature 벡터가 동일한 가중치 벡터와 내적을 수행( Kipf and Welling (2017)에서 제안된 전파 규칙과 유사)
    • 그러나 단일 프레임의 경우, 이 전략은 모든 이웃 노드 feature의 평균 벡터와 하나의 가중치 벡터를 내적하는 것과 동일함
    • 지역적 차이를 잃어버릴 수 있기 때문에 skeleton 시퀀스 분류에는 최적이 아님
    •  
  • Distance Partitioning
    • 또 다른 자연스러운 전략은 루트 노드 vti로부터의 거리 d( ⋅, vti)에 따라 이웃을 분할하는 것
    • D = 1 이므로 이웃 집합은 두 부분으로 나뉨
    • 거리 0: 루트 노드 자체
    • 거리 1: 나머지 이웃 노드
    • 두 개의 서로 다른 가중치 벡터를 사용하게 되며, 관절 간 상대적 이동과 같은 지역적 차이를 모델링 할 수 있음
  • Spatial Configuration Partitioning
    • 인체 골격은 공간적으로 구조화되어 있으므로, 이 구조적 특성을 활용할 수 있음
      1. 루트노드
      2. centripetal(구심 그룹): 골격 무게중심에 더 가까운 노드
      3. centrifugal(원심 그룹): 무게중심에서 더 먼 노드
    • 한 프레임에서 모든 관절 좌표의 평균을 무게중심으로 정의함
    • 신체 움직임이 구심성과 원심성 움직임으로 나뉠 수 있다는 점에서 영감 받음
    • 더 정교한 분할 전략이 더 좋은 모델링 능력과 인식 성능으로 이어질 것으로 기대됨
    • ri는 관절 i가 무게중심으로부터 가지는 평균 거리

3.5 Learnable Edge Importance Weighting

  • 사람이 동작을 수행할 때 관절은 그룹 단위로 움직이지만, 하나의 관절은 여러 신체 부위에 동시에 포함 될 수 있음
  • 이러한 경우 각 edge는 서로 다른 중요도를 가져야 함
  • 따라서 ST-GCN 레이어에 학습 가능한 마스크 M을 추가함
  • 마스크는 각 공간 간선의 중요도를 학습하여, 이웃 노드에 전달되는 feature 기여도를 조절함 (인식 성능을 추가적으로 향상시킴)

 

3.6 Implementing ST-GCN

  • 그래프 합성곱 구현은 일반적인 2D/3D 합성곱보다 복잡함
  • 단일 프레임의 경우 인체 관절 연결은 인접행렬 A와 단위행결 I로 표현됨

spatial-temporal의 경우 입력은 (C,V,T)텐서로 표현

  • 그래프 합성곱은 1 x Γ(Gamma) 2D convolution 수행, 정규화된 adjacency 행렬과 곱셈
  • 다중 부분집합의 경우
    • Adjacency 행렬을 여러 개 Aj로 분해
    •  

  • Edge Importance Weighting 구현
    • 각 adjacency 행렬에 학습 가능한 마스크 M을 곱함

  • 네트워크 구조 및 학습
    • ST-GCN 레이어 9개
    • 채널 구성: 64 → 128 → 256
    • Temporal kernel size = 9
    • 4번째, 7번째 레이어 stride = 2
    • ResNet 구조 적용
    • Dropout 0.5
    • 마지막에 Global Pooling
    • SGD 학습
    • learning rate 0.01  → 10 epoch마다 0.1배 감소
  • 데이터 증강(Kinetics)
    1. Random moving (affine 변환으로 카메라 움직임 시뮬레이션)
    2. Random fragment sampling


Experiments

  • skeleton 기반 행동 인식 실험을 통해 ST-GCN의 성능 평가
  • 데이터셋 (매우 다른 특성을 가진 두 개의 대규모 행동 인식 데이터셋에서 실험 수행)
    • Kinetics 인간 행동 데이터셋 (Kinetics) (Kay et al. 2017): 현재까지 가장 큰 규모의 비제약(unconstrained) 환경 행동 인식 데이터셋 (240,000개의 학습 클립/ 20,000개의 검증 클립)
    • NTU-RGB+D (Shahroudy et al. 2016): 실내 환경에서 수집된 3D 관절 주석이 제공되는 가장 큰 행동 인식 데이터셋
  • Kinetics 데이터셋에서 상세한 ablation study를 수행하여 제안된 모델 구성 요소들이 인식 성능에 어떤 기여를 하는지 분석
  • ST-GCN의 인식 성능을 기존 최신(state-of-the-art) 방법들과 다른 입력 모달리티들과 비교
  • 비제약 환경에서 얻은 결과가 일반적인지 확인하기 위해, 제약 환경인 NTU-RGB+D에서도 실험을 수행하고 기존 최신 방법들과 비교
  • PyTorch 딥러닝 프레임워크에서 수행, 8개의 TITAN X GPU를 사용 

 

4.1 Dataset & Evaluation Metrics

  • Skeleton 입력 구성 방식
    • 본 연구는 skeleton 기반 행동 인식에 초점을 맞추므로, 원본 RGB프레임은 사용하지 않고 픽셀 좌표계에서 추정된 관절 위치만을 입력으로 사용함
    • 관절 위치를 얻기 위해:
      1. 모든 비디오를 340x256 해상도로 리사이즈
      2. 프레임 rate를 30FPS로 변환
      3. 공개된 OpenPose 툴박스 (Cao et al. 2017b) 를 사용하여 각 프레임에서 18개의 관절 위치 추정 (OpenPose는 각 관절에 대해 2D좌표 X,Y / 신뢰도 점수 C를 제공함)
    • 각 관절은 (X,Y,C)튜플로 표현, 하나의 skeleton 프레임은 18개의 튜플 배열로 구성됨
  • Multi-person 처리
    • 한 클립에 여러 사람이 존재하는 경우, 평균 관절 신뢰도가 가장 높은 상위 2명을 선택
    • T 프레임을 가지는 하나의 클립은 skeleton 시퀀스로 변환됨
  • 입력 텐서 표현
    • 단순화를 위해 모든 클립은 시퀀스를 반복 재생하여 T=300이 되도록 padding

  • 평가 지표
    • Top-1 accuracy
    • Top-5 accuracy
  • 입력 데이터
    • NTU-RGB+D에서 제공되는 주석은:
    • 3D 관절 좌표(X,Y,Z)
    • 카메라 좌표계 기준
    • Kinect depth 센서를 통해 추출
    • 각 skeleton 시퀀스는 25 개의 관절을 가짐
    • 각 클립에는 최대 2명까지만 존재함
  • 평가 프로토콜
    • 데이터셋 저자들은 두 가지 벤치마크를 제안함
    • 1. Cross-Subject (X-sub)
      • 40,320개 클립: 학습
      • 16,560개 클립: 평가
    • 2. Cross-View (X-View)
      • 37,920개 클립: 학습
      • 18,960개 클립: 평가

4.2 Ablation Study

  • ST-GCN이 왜 좋은지 구성 요소별로 실험하여 증명
    • (공간 그래프가 진짜 필요한지, Partition 전략이 왜 중요한지, Edge importance는 왜 필요한지)
  • Spatial temporal graph convolution
    • 필요성 검증을 위해 비교:
    • Baseline TCN
      • 관절을 그냥 이어붙이고 시간축만 CNN 적용
      • 사실상 fully connected graph 에서 weight를 공유 안 한 것과 같음
    • Local Convolution
      • 그래프 구조는 사용하지만 weight 공유는 안 함
    • ST-GCN
      • 자연스러운 인체 연결 + .weight 공유
      • Baseline TCN보다 훨씬 좋음
    • 단순 temporal convolution만으로는 부족함
    • 성능 차이의 원인은 희소한 자연 연결 구조, weight 공유 (자연스러운 관절 연결 구조를 쓰는 것이 중요함)

 

  • Partiton Strategy
    • 3가지 전략 비교:
    • Uni-labeling
      • 이웃 다 같은 weight
      • convolution 전에 feature를 평균 내는 것과 동일함
    • Distance partition
      • 거리 기준 분리
    • Spatial configuration
      • 중심/바깥 기준 분리
      • 여러 subset으로 나누는 게 훨씬 좋음
    • 이웃 관절을 어떻게 나누냐에 따라 성능이 좌우됨

 

  • Learnable edge importance weighting
    • 각 edge마다 중요도를 학습하게 하여 성능이 1%이상 추가 상승
    • → 모든 관절 연결이 동일하게 중요하지 않음
    • 모델이 어떤 관절 연결이 더 중요한지, 덜 중요한지 자동으로 학습

성능 향상의 원인:

  1. 공간 구조를 반드시 써야 함
  2. 이웃을 구분해야 함
  3. 관절 연결 중요도를 학습해야 함

 


4.3 Comparison with State of the Arts

  • ST-GCN이 SOTA 방법들보다 좋은지, 서로 다른 환경에서도 잘 작동하는지 검증
  • Kinetics
    • Skeleton 기반 방법들:
      • Hand-crafted feature 방식
      • Deep LSTM
      • Temporal ConvNet
      • RGB 모델 (참고용)
      • Optical Flow 모델 (참고)
    • 비교 결과:
      • ST-GCN이 기존 skeleton 기반 모델보다 확실히 좋음
      • RGB/Flow 보다는 낮음
      • (Kinetics는 물체, 장면, 사람과의 상호작용을 인식해야하는 클래스가 많아서 Skeleton만으로는 부족한 클래스가 존재함)
    •  Kinetics에서 30개 motion 중심 클래스만 추려서 실험 진행
      • Skeleton 모델과 RGB 모델 성능 차이가 거의 줄어듦
      • 순수 body motion 문제에서는 skeleton이 거의 RGB 수준

  • NTU-RGB+D
    • 실내, 카메라 고정, 3D 관절 데이터, 정제된 환경 데이터셋
    • ST-GCN이 기존 SOTA보다 좋음
    • LSTM 계열보다 높음
    • 구조도 더 단순함
    • 제약 환경과 비제약 환경 모두에서 잘 작동함(모델이 데이터 특성에 강건함)

  • 추가 분석
    • RGB + ST-GCN이 RGB 단독보다 더 좋음
    • RGB + Flow + ST-GCN이 가장 좋음
    • Skeleton은 단독으로는 RGB보다 약할 수 있지만 동작 정보는 더 정확하게 잡음

검증 결과 요약

  1. ST-GCN은 기존 skeleton 모델보다 확실히 강함
  2. 순수 motion 문제에서는 매우 강력
  3. 다양한 환경에서 잘 작동함
  4. Skeleton은 RGB와 보완적 정보

오늘은 Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition(ST-GCN) 논문을 읽어봤습니다. 수식과 단계가 많고 복잡해 이해하는 데 시간이 좀 걸릴 수는 있으나, 실험 방법에 대한 자세한 설명과 보충 비교 실험까지 포함되어있는 논문이라서 시간을 들여 읽어보아도 충분한 가치가 있다고 생각됩니다.

 

이 논문은 Skeleton 시퀀스를 spatial temporal graph로 표현하고, 그 위에서 graph convolution을 수행하는 ST-GCN을 제안했습니다. 관절 간 공간 관계와 시간적 움직임을 동시에 학습하여 기존 LSTM/TCN 기반 skeleton 모델보다 우수한 성능을 달성했습니다. 특히 순수 action motion 문제에서 강력한 표현력을 보였습니다.

 

이 논문의 핵심 기여는 다음과 같습니다.

  1. Spatial-Temporal Graph Convolution 제안
    • Skeleton을 그래프로 모델링하고, 공간 + 시간 정보를 동시에 처리하는 최초의 일반적(graph-based) 정식화 제시
  2. Graph Convolution Kernel  설계 전략 제안
    • Partition 전략 (distance / spatial configuration) 도입
    • Learnable edge importance weighting 추가
      → 단순 평균이 아닌 구조적 차이를 학습 가능하게 함
  3. 대규모 데이터셋에서 SOTA 성능 달성
    • Kinetics, NTU-RGB+D에서 기존 skeleton 기반 방법들보다 우수한 성능 검증
    • Skeleton 정보가 RGB와 보완적임을 실험적으로 증명

다음은 이 논문의 한계점 입니다.

  1. Fine-grained motion 강도 구분에 약할 수 있음
    • ST-GCN은 걷기vs점프, 앉기vs서기와 같은 완전히 다른 동작을 구분하는 문제를 위해 설계됨
    • 미세한 velocity magnitude 차이를 직접적으로 모델링하진 않음
  2. 관절 좌표 기반이라 Velocity/Acceleration을 직접 모델링하지 않음
    • 입력에 위치 정보만 있어서 속도나 가속도는 모델이 간접적으로 학습해야 함
  3. 소규모 데이터셋에서 과적합 위험
    • GCN 계열 모델은 파라미터 수가 많아서 데이터셋에서는 overfitting이 우려됨

ICT Express 2025

 

Keywords: Human pose estimation, Human pose refinement, Deep learning

 

Abstract

  • Human Pose Estimation(인체 포즈 추정, HPE)은 빠르고 가려진 신체 움직임을 정확하게 포착해야 하기 때문에 어려운 문제, 이로 인해 예측 결과에 불확실성이 자주 발생
  • 야구 스윙과 같은 고속 스포츠 동작의 경우 기존 HPE 방법들은 domain-specific prior knowledge(도메인 특화 사전 지식)을 충분히 활용하지 못하고 있음
  • 본 연구에서는 Baseball Player Pose Corrector(BPPC)를 제안
  • BPPC는 고품질의 3D standard motion 데이터를 활용하여 야구 스윙 영상에서 추정된 2차원 키포인트를 refine(보정)하는 최적화 기반 프레임 워크
    1. action recognition(동작 인식), offset learning, 3D-to-2D 투영을 통해 3차원 표준 동작을 테스트 스윙 영상에 정렬
    2. movement-aware optimization(동작 인지 최적화)를 적용하여 키포인트를 보정함으로써 스윙 패턴의 변형에도 강인한 결과 보장
  • BPPC는 추가적인 데이터셋에 의존하지 않으며, 야구 스윙에 대해 수작업으로 주석된 3차원 표준 동작 데이터만을 필요로 함

Introduction

  • HPE(Human Pose Estimation)은 인간의 신체 자세를 정확하게 분석하고 이해하고자 하는 컴퓨터 비전 분야의 핵심 문제
  • 다양한 연구들이 복잡하고 다양한 환경에서도 HPE의 강인성과 효율성을 크게 향상시켰음
  • 그럼에도 불구하고, 빠르거나 가려진 움직임을 포함하는 자세 추정에는 많은 어려움이 존재
  • 비디오 기반 2차원 포즈 추정 방법들은 연속된 프레임에서의 시간적 정보를 활용함으로써 문제를 해결하고자 했음
    • CNN, LSTM, CNN-Transformer 기반의 하이브리드 모델 탐구
    • 범용 목적(general-purpose)에 초점, 야구 스윙과 같은 특정한 동작 패턴에 특화된 분석에 한계
  • Baseball Player Pose Corrector(BPPC)를 제안
    • 야구 스윙에 특화된 새로운 포즈 refinement(보정)방법, 고품질의 3차원 야구 스윙 표준 동작 데이터를 사전지식으로 활용
    • 표준 동작을 테스트 비디오의 스윙 동작과 정렬한 뒤, movement-aware optimization(동작 인지 기반 최적화)를 통해 기존 포즈 추정 모델로부터 얻어진 2차원 키포인트 보정
    • 표준 동작은 스윙 비디오를 기반으로 한 사람의 수작업 주석을 통해 획득됨

사전 데이터(Motion Prior), 수작업 키포인트(3D Standard Motion), BPPC 후 refine된 결과 2D Refined Pose Sequence

 

  • BPPC는 대규모 데이터셋에 의존하지 않고, 도메인 특화 사전 지식에 집중하여 동작함
  • 테스트 비디오와 표준 동작 간의 차이는 크게 네 가지 범주로 구분됨
    1. 프레임 수의 차이
    2. 스윙 시작 및 종료 시점(또는 프레임)의 차이
    3. 스윙 패턴의 불일치
    4. 카메라 시점(viewpoint)의 변화
  • BPPC는 1과2를 처리하기 위해 스윙의 시작 및 종료 프레임을 식별하는 temporal alignment(고급 시간 정렬)을 사용하고, 3을 해결하기 위해 표준 동작을 다양한 스윙 패턴에 맞추는 offset learning을 적용하며, 4를 처리하기 위해 3차원 표준 동작을 2차원 테스트 비디오로 투영하는 viewpoint alignment(시점 정렬)을 수행함
  • 범용 포즈 추정과 도메인 특화 응용 사이의 간극 연결, 특수한 작업에서 사전 동작 지식(prior motion knowledge)을 활용하는 것의 중요성을 강조

본 연구의 기여

 

  • 본 연구에서는 3차원 스윙 동작에 대한 사전 지식을 활용하여 야구 타격 동작에서의 키포인트를 보정하는 최적화 기반 방법 BPPC를 제안한다.
  • 표준 동작과 테스트 스윙 비디오 간의 차이에 관계없이, 3차원 표준 동작을 2차원 테스트 비디오에 정확하게 정합시키는 4차원 키포인트 투영 방법을 제안한다.
  • 키포인트의 신뢰도와 움직임을 기반으로 포즈를 적응적으로 최적화하는 손실 함수(loss function) 를 제안한다.
  • BPPC는 벤치마크 데이터셋에서 최신 HPE 모델들의 정량적 및 정성적 성능을 모두 향상시킨다.

Proposed method

  • BPPC는 타격 동작의 prior knowledge인 standard motion을 활용
    • 추정된 키포인트와 표준 동작 간의 차이를 해결하기 위한 전체 최적화 목적 함수
    • 표준 동작을 추정된 키포인트에 정렬하기 위한 미분가능한 투영 방법
    • 최적화된 표준 동작을 기반으로 키포인트를 보정하기 위한 손실 함수 제시
  • 기존 HPE가 뽑은 2D 키포인트(x)를 야구 스윙의 3D 표준 동작(s)을 기준으로 최적화해서 더 정확한 2D 키포인트(y)로 만든다

3.1 Problem Formulation(문제 정의)

  • 테스트 비디오에서 기존 HPE 가 뽑은 2D 포즈

현실 세계 영상(노이즈 많음), 현실적(data)

  • 야구 스윙의 3D  표준 동작 (고속카메라 + 수작업 주석으로 만든 정답에 가까운 기준)

실험실 기준(노이즈 없음), 이상적인 기준(prior)

  • K는 키포인트 개수
  • F는 각각 xs의 프레임 수 의미
  • 추정된 2차원 포즈 x는 타격 동작 전후의 상태 포함, 동작 블러와 가림 현상으로 인해 검출 어려움 자주 발생
  • 3차원 표준 동작 s는 고속 카메라로 촬영된 영상 프레임을 활용하여 생성됨
  • BPPC는 학습 데이터셋 필요하지 않음, 보정된 2차원 포즈

보정된 2D 포즈

를 직접 최적화 함. 최적화 목적 함수는 다음과 같이 정의됨.

기존 결과 x(data)와 너무 멀어지면 안되고, 표준 동작 s(prior)와도 잘 맞아야 함

  • Ldata는 테스트 포즈 시퀀스 x를 입력으로 사용
  • Lprior는 표준 동작 s를 활용
  • Lprior를 경사 하강법으로 최적화하기 위해 미분가능한 4차원(3D 공간 + 시간) 투영 방법을 도입하여 s와 x 정렬

 

3.2 Step 1: 4D Motion Projection

  • 테스트 비디오의 추정 키포인트x와 표준 동작 s간의 차이 네 가지 유형(s를 그대로 쓸 수 없는 이유) 
    1. 프레임 수의 차이
    2. 스윙 시작 및 종료 시점(또는 프레임)의 차이
    3. 스윙 패턴의 불일치
    4. 카메라 시점(viewpoint)의 변화
  • s를 x에 맞추는 단계, 정렬이 필요함

(1) Action Recognition via Key point Grid Sampler

  • 테스트 비디오에서 스윙 구간의 시작과 끝 프레임 찾아서 표준 동작과 시간 축 맞추는 것
  • 테스트 비디오에서 스윙의 시작과 종료 프레임을 나타내는 인덱스를 각각 정의 

스윙 시작 프레임 인덱스, 스윙 끝 프레임 인덱스

동작 인식은 학습 가능한(연속 값) 파라미터 (시작/끝 위치를 나타내는 연속값)

인덱스를 정수로 표현X, 연속 파라미터로 표현

를 통해 시간-공간 정렬 수행, 표준 동작이 스윙 시작부터 종료까지 클리핑되어 있다고 가정. 시간- 공간 정렬 연산은 다음과 같다.

잘라내기(cropping),resampling해서 프레임 수 맞춤

원래 포즈 시퀀스 x에서 [ts,te]구간 (스윙 시작/끝 구간)을 기준으로 스윙 부분만 뽑고, 그 결과를 길이 F로 맞춰서 𝒙̄를 만든다

G는 그리드 샘플러를 의미(시작/끝은 정수 프레임으로 자르면 미분 불가하여 t 학습하기 어려움), 결과적으로

생성. 동일한 연산이 추정 키포인트의 신뢰도 점수(confidence, c)에도 적용됨.

표준 동작 길이 F에 맞추려고 resampling하여 길이 통일

 

(2) Action Offset Learning for Swing Discrepancies

  • 사람마다 다른 신체조건 ·자세 ·위치 차이 때문에 생기는 절대 위치 차이를 표준 동작 전체를 이동시켜서 맞춤
  • 형태는 유지하고, 위치만 보정하는 단계
  • offset: 표준 동작 전체를 같은 벡터만큼 평행 이동, 모든 프레임에 동일한 양만큼 키포인트 이동

원래의 3D 표준 동작, 수작업으로 만든 순수한 기준 스윙

모든 프레임에 대해 동일한 벡터로 평행이동시킴(전역 평행이동하기 때문에 1)

학습가능한 offset, 프레임 차원 F가 없음

 

위치 보정 후 3D 표준 동작 s-hat은 offset이 적용됨을 나타냄

 

(3) Viewpoint Alignment through 3D to 2D

  • 3차원에서 2차원으로의 투영을 위해 3차원 비동차 좌표를 동차 좌표로 변환(이동을 행렬로 표현하기 위함)

3D heterogeneous에서 3D homogeneous로 변환
f번째 프레임의 k번째 관절의 3차원 위치

 

동차좌표(x,y,z,1)
투영행렬, 8개의 학습 가능한 파라미터

3D 좌표를 현재 테스트 영상의 카메라 시점에 맞는 2D 좌표로 바꿈

(4) Optimization for 4D Motion Projection

  • 표준 3D 동작을 현재 테스트 영상에 가장 잘 맞는 2D 기준 동작으로 만든다

최적화 대상(학습 대상), 시간+위치+시점을 동시에 맞춤

  • Lmse: 정렬된 표준 동작과 테스트 포즈가 최대한 가깝게 되도록 만듦
  • confidence-weighted MSE(ohkm): 신뢰도가 낮은 관절은 덜 믿고, 높은 관절은 강하게 맞춤
  • 정규화(reg): offset이 너무 커지는 걸 방지, 표준 동작을 망가뜨리지 않도록 제한

  • 영상에 맞게 투영된 2D 표준 동작


3.3 Step 2: Pose refinement

 

  • 기존 2D 추정 포즈 x를 표준동작 s*를 참고하여 더 좋은 포즈 y로 보정

 

  • 보정된 포즈 y는 움직임 패턴이 표준 동작과 비슷하고, 시간적으로 부드럽고, 원래 추정 결과 x와도 너무 다르지 않도록 한다

 

  • Velocity Loss(속도 손실)
    • 포즈 자체를 맞추는 게 아니라 움직임 패턴을 맞춤
    • 움직임 패턴 유지

  • Acceleration Loss(가속도 손실)
    • 동작을 더 부드럽게 만들고 갑작스러운 튐을 줄임
    • 부드러움 유지

프레임 간 변화의 변화 = 가속도, 급격한 흔들림 억제

  • Confidence Loss(신뢰도 기반 손실)
    • 모델이 자신 있는 건 유지하고 자신 없는 건 고쳐줌
    • 기본 anchor 역할, 원본 보존


Experiment

  • 데이터셋 Penn Action(정량 평가용)
    • 총 2,326개 영상/ 15개 액션 중 야구 스윙 165개 시퀀스만 사용
    • 사람 수동 주석 존재
    • PCKh@0.5로 정량 평가
  • MLB-YouTube(정성 평가용)
    • MLB 포스트시즌 20경기
    • 42시간 이상 영상
    • 키포인트 정답 없음
  • 평가지표 PCKh@0.5
    • 예측 키포인트 오차가 머리 크기의 50%이내이면 correct
  • Baseline
    • Simple(ResNet-50/ 101/152)
    • HRNet (W32/ W48)
    • DARK(HRNet 기반)
  • 구현 세부사항
    • Optimizer: Adam
    • 하이퍼파라미터: 
    • Step1 1000 iteration
    • Step2 1000 iteration
    • 총 2,000 iteration

Results

 

 

 

 

 

 

 

 

 

 

  • 전체 평균 성능 (Penn Action)
    • PCKh@0.5 기준
    • 모든 baseline 대비 평균 0.2~0.3% 향상
  • 관절별 성능 개선
    • 빠른 가림 동작에서 prior 기반 보정이 효과적임
  • Confidence 구간별 분석
    • Low confidence [0,0.5)
      • 2.1%이상 정확도 향상
      • HRNet, DARK에서 뚜렷
    • High confidence[0.9, 1]
      • 개선 서의 없음
    • 원래 잘 맞는 건 유지하면서 틀리기 쉬운 구간만 보정
    • prior기반 최적화가 data-driven 모델 보완
  • BPPC는 평균 정확도는 소폭 향상시키지만, 특히 빠르고 가려진 저신뢰도 관절에서 의미 있는 개선을 보이며, 기존 데이터 기반 HPE 모델을 보완하는 prior 기반 최적화 기법임을 실험적으로 입증하였다.

 

  • 하이퍼파라미터 민감도 분석
    • Ablation 결과는 velocity 기반 prior가 BPPC의 핵심 기여임을 보여주며, acceleration은 보조적 역할을 하고 confidence weighting은 기존 예측과의 균형을 조절함


오늘은 Accurate baseball player pose refinement using motion prior guidance 논문을 읽어봤습니다.

이 논문은 일반 HPE가 아니라 야구 스윙이라는 도메인 특화 동작에 대한 연구이며, 핵심 기술인 BPPC는 데이터 재학습이 아니라 사전 정의된 3D 표준 동작을 활용하여 최적화 기반 보정을 실시합니다. 또한 위치 자체가 아니라 움직임의 변화를 정렬하였습니다.

 

이 논문의 핵심 기여는 다음과 같습니다.

  1. 3D 표준 스윙 동작을 prior로 사용
  2. 4D projection(시간 + 공간 정렬)
  3. velocity/ accleration 기반 보정
  4. low-confidence 관절에서 성능 개선

다음은 이 논문의 한계점 입니다.

  1. 표준 동작 하나에 의존
    • 하나의 이상적인 스윙만 사용하여 사람별, 스타일별 다양성 반영이 부족함
    • 타격 결과(성공/실패) 구분 없음
    • 스윙 품질 차이를 학습하지 않음
  2. 평귱 성능 개선이 작음
    • 평균 PCKh 향상이 0.2~0.3%로 구조적 개선보다는 정제 모듈 수준의 성능
  3. 결과 분석이 포즈 정확도에만 국한
    • 타격 결과 예측 없음
    • 스윙 품질 평가 없음
    • 동작의 으미ㅣ 분석 없음
    • pose refinement에 불과함
  4. 수작업 3D 표준 동작 필요
    • 실용성 제한, 새로운 스포츠나 동작에 확장 적용하기 어려움

 

Sensors(MDPI) 2021

 

 

Abstract

  • inertial measurement units(IMU, 관성측정장치)와 eye-tracking device를 활용하여 다른 두 level의 타자의 스윙 전략들을 분석하는 것이 연구의 목적이다.
  • 연구 참가자는 20~30세의 건강한 성인 남성 20명 (프로 선수 10명, 아마추어 선수 10명)
  • Eye gaze position(시선위치), head, shoulder, trunk(몸통),pelvis angular velocity(골반의 각속도; 회전 속도),ground reaction forces(지면 반력)이 기록되었다.
  • 분석 결과: 프로 타자 그룹은 아마추어 그룹에 비해 신체 관절을 리듬적이고 효율적이게 회전하는 특징을 보임
    1. 준비 단계에 더 적은 시간 소모
    2. 최대 각속도 발생 시점이 스윙 사이클 내에서 보다 집중되어 나타남
    3. 아마추어 그룹에서는 시선의 최대 각속도 발생 시점 프로 그룹에 비해 유의하게(significantly) 더 빨리 나타남
      • 시선의 최대 각속도 발생 시점은 다섯 개의 분절(segments) 파라미터 중 가장 이른 시점, 아마추어 그룹 내에서 머리, 어깨, 몸통, 골반의 최대 각속도 발생 시점보다 유의하게 앞서는 것으로 확인됨
      • 이러한 차이는 IMU 기반 웨어러블 계측 장비를 통해 성공적으로 구분될 수 있음

Keywords: inertial measurement units; visual-motor coordination; eye gaze; baseball swing


Introduction

  • 기술이 발전하여 IMU는 정확한 데이터 획득이 가능해짐, 낮은 배터리 소모와 소형화가 이루어져 스마트폰이나 스마트워치로 측정 가능
  • 웨어러블 장치를 활용한 연구는 수십 년 동안 rehabilitation(재활),진단, 스포츠 분야에 적용되어 왔으며, acceleration, angular velocity, ground reaction forces(지면 반력), electromyographic signals(근전도 신호)를 분석하여 치료 결과나 선수의 수행 능력을 평가해왔다.
  • 야구 타격은 어려운 과제로 간주되고 몸의 여러 부분의 움직임을 필요로 한다.
  • 타격 동작의 순서는 하체에서 상체로 이어지는 kinematic chain(운동학적 연쇄)로 구성됨.
    • 무릎 굴곡, 고관절 외전, 허리 회전, 어깨 회전, 목 회전 이후 상지(upper limb) 스윙
  •  성공적인 타격은 동적 균형 능력(dynamic balance ability)이 요구됨, 몸통 회전과 적절한 체중 이동간의 협응 포함
  • proprioception(고유수용감각): 신체 위치 정보에 대한 실시간 피드백에 필수적
    • 야구 타자 - 수평 방향의 머리 및 눈 움직임은 타격 위치와 타이밍을 추정하는 데 사용됨,운동 협응 능력을 통해 이러한 정보를 처리함
  • visual-motor coordination(시각-운동 협응) 은 시각 추적, 차단(intercept), 이동 물체 식별 등 스윙 동작에서 중요한 역할
    • 전반적인 수행 능력에 긍정적인 영향을 미침, 시각과 고유수용감각은 팔의 자세 구성과 그에 상응하는 움직임에 중요
  • 기존 연구들은 모션 캡처 시스템 사용하여 몸통 회전 기록, Ground Reaction Forces(지면 반력, GRF)을 분석했음 (배트 스윙 속도나 스윙 타이밍 조절 포함)
  • 대부분의 기존 연구는 핵심 요인들의 통합적 효과를 고려하지 않고 신체의 국소 분절에만 초점을 맞추어 왔음
  • 최적의 타격 타이밍에 대한 연구는 회전 각도를 기반으로 수행됨
  • 시각 탐색 전략과 수평 방향의 머리 및 눈 움직임 연구에서는 야구 타자들이 투구된 공을 받기 이전에 이미 공을 지각한다는 점이 보고됨
  • 타격 동작 중 주요 요인들 간의 관계는 아직 동시에 체계적으로 분석되지 않았으며, 이는 계측 장치 통합의 한계로 인한 것일 수 있음
  • 머리 움직임은 신체 회전 과정에서 하나의 운동학적 연쇄 요소임에도 불구하고 거의 다루어지지 않았음
  • (코치들은 주로 눈 움직임의 중요성을 강조해왔음)
  • 야구 타격 자세에서 전신 움직임의 순차적 연쇄가 존재함을 시사함
  • IMU와 시선 추적 장치의 계측 통합을 통해, 준비 단계에서 시각 정보를 수용하는 과정, 동작 협응, 스윙 수행, 그리고 균형 회복에 이르는 야구 타자의 전략 및 타이밍을 규명하는 것을 목적으로 함.

Materials and Methods

2.1 Participants

  • 오른손잡이 아마추어 타자 10명 (연령 = 23.8 ± 1.4세, 신장 = 174.3 ± 4.4 cm, 체중 = 67.1 ± 8.8 kg)
    • 최근 10년간 학교 야구팀 활동 경험 없음, 정규적인 야구 훈련에도 참여하지 않음.
  • 오른손잡이 프로 타자 10명 (연령 = 21.5 ± 1.4세, 신장 = 175.5 ± 4.5 cm, 체중 = 72.5 ± 9.3 kg)
    • 1년~5년 동안 대학 야구팀에 소속되어 활동한 경험 있으며 현역 선수

2.2 Instruments and Procedures

  • 머리, 제7경추(C7, vertebra prominens), 제10흉추(T10), 천골(sacrum), 배트 하단에 5개의 IMU 부착
  • 머리, 어깨, 고관절의 회전 측정하고 타격 순간을 검출
  • 머리에 부착된 IMU는 두 선의 중심점 교차점(intersection point of the center point of two lines)에 설정
    • 하나의 선은 좌측 이주 전방점(left pre-auricular point, LPA)과 우측 이주 전방점(right pre-auricular point, RPA)을 연결하여 머리 상단을 통과하는 선
    • 다른 하나의 선은 inion에서 nasion을 잇는 선
    • 특정 목표물을 응시할 때의 고정점(fixation point)을 검출하기 위해 eye tracker가 사용됨
      • eye tracker에는 6개의 반사 마커(reflective markers)가 부착됨
      • Vicon Nexus 2.5 모션 캡처 시스템(Vicon Industries Inc., Oxford, UK)과 8대의 카메라(Vicon Vero cameras v2.2) 를 사용하여 여섯 개 마커의 3차원 좌표를 계산함으로써 시각 축(visual axis)을 정의
      • 고정점과 시각 축을 이용하여 벡터 계산, 이를 시선 정보(gaze information)로 사용
    • 바닥에 매립된 두 개의 지면 반력 측정판(force plate)을 통해 GRF(지면반력)의 변화 평가

  • 참가자들은 각각 한 발씩을 두 개의 force plate 위에 서 있도록 지시
  • FIELD-FORCE 야구 투구 머신 FTM-240AR을 사용, 거리는 1.2m
  • 그물망(net)을 향해 공 타격, 그물망의 너비는 2.0 m, 높이는 2.4 m
  • 각 참가자는 15분간 워밍업 및 타격 연습 후, 공 타격 여부와 관계없이 총 30회의 스윙 수행
  • 타격 성공률(batting average)각 참가자의 성공적인 타격 횟수의 비율로 계산하여 두 그룹 간의 타격 기술 수준 비교

스윙 이벤트 정의 (스윙 주기 내에서 다섯 개의 이벤트 타이밍이 정의됨)

  1. FFmin
    • 앞발의 최소 GRF 또는 GRF(Ground Reaction Forces)가 0이 되는 첫 번째 프레임
  2. FF50
    • 앞발의 지면 반력이 체중의 50%(%BW)를 초과한 시점
  3. FFmax
    • 앞발의 최대 GRF
  4. IMP(impact)
    • 공이 배트에 충돌한 순간, IMU 센서에서 측정된 최대 가속도 데이터 기준으로 정의
  5. BF50
    • 뒷발의 GRP가 체중의 50%(%BW)를 초과한 시점이거나, IMP 이후 체중의 50%에 가장 근접한 시점

  • 하나의 스윙 주기 내에서 이러한 이벤트 사이의 네 개의 구간은 각각
    Sst(S는 stage, st는 start),
    Sff(ff는 front foot),
    Sbf(bf는 back foot),
    Sfn(fn은 finish)으로 정의
  • 스윙 주기는 FFmin부터 BF50까지로 정의되었으며, 각 단계의 지속 시간은 전체 스윙 시간 대비 백분율(%) 로 표시되었다.

 

 

 

분석 항목 정의

  • 아마추어 그룹과 프로 그룹 간의 차이는 세 가지 항목에 초점을 맞추어 분석함
    • stage duration(단계 지속 시간)
    • maximum angular velocity(다섯 개 분절의 최대 각속도)
    • timing off maximum counterclockwise angular velocity(다섯 개 분절의 최대 반시계 방향 각속도 발생 시점) : 전세 스윙 시간 대비 백분율로 표현

통계 분석

  • 아마추어 그룹과 프로 그룹 간의 타격 성공률과 네 개 스윙 단계의 시간 비율 차이 비교하기 위해  독립표본 t-test(independent sample t-test)이 사용됨
  • 두 그룹 간 다섯 개 주요 이벤트에서의 최대 각속도 차이를 검증하기 위해 t-test 수행
  • 스킬 수준 그룹과 타격 이벤트 간의 최대 각속도 발생 시점 차이를 분석하기 위해 이원 분산분석(two factor analysis of variance, ANOVA)이 수행됨

Results

아마추어는 임팩트 이후 마무리 단계가 짧고 불안정, 프로는 임팩트 이후에도 충분한 시간 동안 동작을 유지

 

 

 

프로는 임팩트 시점에서 몸통·골반·머리의 회전이 강함 아마추어는 임팩트 이후(BF50)에 회전이 남아 있음 → 에너지 전달 타이밍 차이

 

 

프로는 응집된(sequentially compact) 운동 연쇄 아마추어는 늘어진(sequentially dispersed) 연쇄
Table 1. 아마추어: 시선이 다른 분절보다 현저히 빠름 프로: 분절 간 타이밍 차이가 거의 없음 Table 2.“어느 분절이 언제 최대가 되느냐”는 숙련도에 따라 다르게 조직됨

 

 

 

 

  • 아마추어 타자는 시선의 최대 각속도가 다른 신체 분절보다 현저히 이르게 발생하며, 분절 간 최대 각속도 타이밍이 분산된 반면, 프로 타자는 전신 분절의 최대 각속도 타이밍이 응집된 순차적 운동 연쇄 패턴을 보였다.

 


"Utilization of Inertial Measurement Units for Determining the Sequential Chain of Baseball Strike Posture" 논문을 공부했습니다. 논문에서의 핵심 결과는 프로 타자는 시선-머리-어깨-몸통-골반의 최대 각속도 발생 시점이 매우 짧은 구간에 응집되어 나타났고, 아마추어 타자는 넓게 분산되어 나타났습니다. 숙련도 차이는 속도가 아니라 타이밍 조직 방식에서 발생한다는 것을 알 수 있었습니다.

다음은 논문에 대한 비판점 입니다.

 

  1. 표본 및 실험 설계 한계
    1. 표본 수의 제한
      • 프로 타자 10명, 아마추어 타자 10명으로 실험을 진행했기 때문에 전체 야구 선수 집단을 대표하기에는 제한적이었습니다.
    2. 숙련도 구분의 단순화
      • 숙련도를 단순히 프로와 아마추어로 구분하여 숙련도 변화에 따른 연속적 패턴 분석은 불가하였습니다.
  2. 실험 환경의 현실성 한계
    1. 실제 경기 환경 미반영
      • 머신 투구를 사용하여 실제 경기 현장에서 나올 수 있는 경우의 수를 충분히 반영하지 못하였습니다.
    2. 타격 결과의 Quality 미분석
      • 타격 성공 여부만 평가하였기 때문에 실험 결과가 실제 퍼포먼스 품질로 어떻게 연결되는지 불분명합니다.
  3. 측정 및 분석 방법의 한계
    1. IMU 기반 분석의 구조적 제약
      • 각속도는 측정가능하나, 관절 토크, 근육 활성도, 힘 전달 메커니즘을 직접 측정 불가하여 운동의 원인보다는 결과 중심 분석 결과입니다.
    2. 시선을 분절과 동일 수준에서 분석
      • 시선을 하나의 분절처럼 처리하였으나, 시선은 인지 지각 신호로 근육 기반 회전과는 다르기 때문에 해당 실험 결과를 실제 상황과 대비하여 보기에는 어려움이 있습니다.
  4. 일반화 가능성의 한계
    • 오른손 타자만 포함, 연령대 제한이 있었기에 좌타자, 청소년, 프로 리그로 확장은 어렵습니다.

 

본 연구는 IMU 기반 분석을 통해 야구 타격 동작의 순차적 운동 연쇄를 정량적으로 제시하였으나, 제한된 표본 수와 숙련도 구분의 단순화, 실제 경기 환경을 충분히 반영하지 못한 실험 설계, 그리고 각속도 중심 분석이라는 방법론적 한계를 지닌다. 또한 시선을 신체 분절과 동일 수준에서 분석한 점과 이벤트 정의 기준의 임의성은 결과 해석에 있어 주의가 필요하다.

 


본 논문을 공부한 이유는, 야구 타격 동작에서의 숙련도 차이를 각속도 크기나 단일 이벤트 비교가 아닌, 분절 간 최대 각속도 발생 시점의 시간적 조직 방식으로 설명했기 때문이다. 특히 시선(gaze)과 신체 분절의 회전 타이밍을 동시에 분석함으로써, 시각–운동 협응과 전신 순차적 운동 연쇄를 통합적으로 해석하려는 시도는 기존 연구와 차별화되는 접근이다.

또한 본 연구는 고가의 모션 캡처 시스템 대신 IMU와 시선 추적 장치를 활용하여, 실험실 환경에 국한되지 않고 현장 적용이 가능한 분석 프레임워크를 제시하였다. 이는 향후 타격 동작 분석을 실제 훈련 환경이나 경기 상황으로 확장하는 데 있어 중요한 참고 기준이 된다.

 

 

https://pmc.ncbi.nlm.nih.gov/articles/PMC8126038/

 

Utilization of Inertial Measurement Units for Determining the Sequential Chain of Baseball Strike Posture - PMC

Abstract The purpose of this study was to employ inertial measurement units (IMU) with an eye-tracking device to investigate different swing strategies between two levels of batters. The participants were 20 healthy males aged 20 to 30 years old, with ten

pmc.ncbi.nlm.nih.gov

 

첫 글을 너무 짧게하고 끝냈던거 같지만 천천히 해야 재미도 오래 느낄 수 있다고 생각한다.

어제는 약간 컴퓨터 비전과의 첫만남과도 같았다고 생각한다. 

 

> 간단 복습

  • 이미지 분류 : 단순 레이블 분류 (고양이, 강아지)
  • Detection : 이미지에서 여러 개 객체 찾고 위치 표시 (강아지 네모박스, 고양이 파란 네모박스)
  • Tracking : 이미지 추적 (직캠)
  • 컨텐츠 기반 이미지 검색 : 비슷한 이미지 보여줌 (쇼핑할 때 비슷한 거 추천해줌)
  • Semantic Segmentation : 픽셀단위 카테고리 분류 (고양이 다 파란색, 강아지는 초록색), 전체적 분류
  • Classification + Localization : 하나만 분류 가능 (고양이 네모박스)
  • Object Detection : 여러개 찾고 위치와 종류 인식 (고양이1, 고양이2, 강아지1)
  • Instance Segmentation : 핵심되는거 동일 객체도 구별, 픽셀 단위

복습하러 가기 :  https://studyingai.tistory.com/16

 


OpenCV1 이미지 읽고 출력하기

 

Image Read & Display

- import cv2 as cv

- import sys

두개의 모듈을 import해야한다.

 

이미지 로드하는 코드

img = cv.imread('rose.png') 

 

이미지가 존재하지 않으면 sys 모듈 이용하여 프로그램 종료

if img is None:

   sys.exit('파일 존재하지 않음')

 

이미지 출력 창에 Image Display 출력, img 출력

cv.imshow('Image Display', img)

 

키보드 입력이 들어올때까지 켜놓기

cv.waitKey()

cv.destroyAllWindows()

 

Image Display 창이 꺼지면 img의 type과 shape 출력

print(type(img))

print(img.shape)

 

출력화면 (BGR 값)

 

 

 

 


 

OpenCV2 영상 형태 변환하고 크기 축소하기

 

이미지를 읽고 없으면 처리하는 부분은 동일함

 

이미지 색상 조절

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) 

  • 이미지를 흑백(Grayscale)로 변환
  • BGR을 Grayscale로 변환

 

이미지 사이즈 조절

gray_small = cv.resize(gray, dsize=(0,0), fy=0.5, fy=0.5)

  • cv.resize()를 사용하여 원본 이미지 사이즈를 절반으로 줄임
  • dsize=(0,0) : 자동 크기 계산(직접 지정 X)
  • fx=0.5, fy=0.5 : 가로 세로를 각각 50% 축소

 

출력화면

 


OpenCV3 웹캠에서 비디오 읽기

 

  • cv.VideoCapture: 웹캠과 연결시도
  • cv.CAP_DSHOW: 비디오가 화면에 바로 나타나게 함
  • ret: 카메라로부터 프레임을 성공적으로 읽었는지를 나타내는 변수
  • cap.release(): 카메라 연결 해제
  • cv.destroyAllWindows: 윈도우창 종료

 

 

🔹 Github에서 코드 확인하기

https://github.com/daanhaa/Study/tree/main

 

Study/openCV1.py at main · daanhaa/Study

Contribute to daanhaa/Study development by creating an account on GitHub.

github.com

'컴퓨터 비전' 카테고리의 다른 글

[컴퓨터 비전] 1. 컴퓨터 비전 기초 + OpenCV  (0) 2025.03.05

컴퓨터 비전에 대해 배운 것을 정리하려고 한다.

시작이 마지막이 되지 않길 바라며 열심히 꾸준히 해보겠다.


컴퓨터 비전이란 컴퓨터와 시스템이 이미지 및 비디오에서 얻은 인사이트에 따라 행동할 수 있도록하는 AI의 일종이라고 한다.

(검색 내용을 따라 적기만 하고 아직 이해하지 못했다. 일단 조금 더 개념을 알아보겠다.)

 

컴퓨터 비전의 주요 기능은 다음과 같다

  • 이미지 분류 : 주어진 이미지를 특정 카테고리나 레이블로 분류하는 작업 (단순히 고양이, 풀, 나무,하늘)
  • 객체 감지(Detection) : 이미지 속에서 여러개의 객체를 찾고 그 위치 표시 (고양이 강아지 찾고 각각 위치에 표시)
  • 객체 추적(Tracking) : 동영상에서 특정 객체가 어떻게 이동하는지 추적 (뮤뱅 직캠 자동화시스템)
  • 컨텐츠 기반 이미지 검색 : 특정 이미지 검색하면 비슷한 이미지 찾아줌 (쇼핑몰 옷 구경하면 비슷한 옷들 보여줌) 

  • Semantic Segmentation(의미론적 분할?) :
    • 이미지를 픽셀 단위로 나누어 각 픽셀을 카테고리 분류(고양이,잔디,하늘,나무)
    • 동일한 카테고리는 같은 색, 구별하지 않음(2마리 고양이가 있어도 둘 다 노란색)
  • Classification + Localization (분류 + 위치 인식):
    • 하나의 객체만 분류 가능
    • 위치 표시 가능(기본은 사각형이나 원형, 다각형 등 다른 형태도 있음. 정밀도 떨어짐)
  • Object Detection(객체 탐지)
    • 여러 개 객체 찾아내고 각각의 위치와 종류 인식 (고양이, 강아지, 강아지 따로 표시)
    • (Semantic Segmentation에서는 동일한 카테고리 구별X, Object Detection에서는 동일해도 분류함 각각 다른 Bounding Box와 ID부여함  ex. 강아지 #1, 강아지 #2)
  • Instance Segmentation(?):
    • 같은 카테고리에 속하더라도 객체 구별
    • 픽셀 단위 구별함

https://velog.io/@claude_ssim/%EC%8B%9C%EA%B0%81%EC%A7%80%EB%8A%A5-Instance-segmentation

위와 같은 그림을 보면 Semantic Segmentation은 전체적인 픽셀단위로 분류하지만 동일 객체는 같은 색 표시함

Instance Segmentation은 분류하기 어려운 배경은 제외하고 동일 객체도 다른 색상으로 분류함

각각의 장단점이 있으니 두개를 합친 Panoptic Segmentation은 전체적으로 분류하고 동일 객체도 분류함

(사실 여기까지는 너무 딥해지긴 했지만 참고하길 바람)

 

컴퓨터 비전의 방법 분류

  • 다중 신경망 방식(MLP)
    • 주로 이미지 분류(Image classification, 단순히 레이블 분류)에서 사용
    • 충분한 양의 데이터를 가지고 훈련하여(과적합 이슈로) 이미지 분류 (강아지냐 고양이냐 구별할 때 사용)
    • 평면 이미지 특징 학습에 효과적, 위치나 패턴 인식은 어려움이 있음
    • MNIST에서 숫자 분류
  • 컨볼루션 방식(CNN)
    • Detection (고양이 강아지 찾고 각각 위치에 표시) , Tracking (뮤뱅 직캠 자동화시스템) 등에서 사용
    • CNN은 단일 이미지(정지된 이미지)에 주로 적용/ RNN은 비디오에 주로 적용(이전 상태 정보 기억

 

 


이제 본격적인 개념? 실습? 사용법?에 대해 알아보겠다

 

다음번에 알아보겠다..ㅎ(머릿속 개념 정리 필요함)

'컴퓨터 비전' 카테고리의 다른 글

[컴퓨터 비전] 1-1. 컴퓨터 비전 + OpenCV  (0) 2025.03.06

학교에서 페스티벌을 한다는 소식을 듣고 작품을 출품해서

 

12월 5일부터 6일까지 세종대학교에서 진행되는 SW인재 페스티벌에 참가했습니다! 

 

타지에 살아서 기차를 타고 세종대에 도착했답니다

아침부터 비몽사몽해서 왔는데 이 화면을 보고나서 페스티벌에 참가하는게 실감이 났어요

(부스 운영은 처음이라 너무너무 떨리고 은근 기대되었답니다?)

 

 

이번 행사는 세종대학교 광개토관 컨벤션홀에서 진행 되었고,

소프트웨어중심대학으로 선정된 58개의 학교가 부스를 운영하고 우수작품을 발표했습니다.

(전국에서 모인 58개 학교를 한 장소에서 볼 수 있기에 흔하지 않은 기회라고 생각하고 열심히 둘러보았어요)

 

 

 

부스가 다른 페스티벌과 달리 개방적인 형태여서 부스에 와주시는 분들도 더 많았고,

설명할 때도 위치나 방향에 제약이 없어서 자유롭게 더 자세하게 설명을 해드릴 수 있었습니다!

다른 학교 학생분들 작품을 구경하고 체험도 할 수 있어서 신기한 경험이었습니다.

 

 

 

 

인기상은 투표를 통해서 정해지는 방식이었는데

그 덕분에 더 열심히 즐기면서 부스를 운영할 수 있었습니다~

(인기상은 못받았지만 내년에도 오게 된다면 우수작품으로 선정될 수 있게 노력할거에요)

 

 

 


저희 학교가 소프트웨어 중심대학에 선정되어서 받는 혜택과 참여할 수 있는 행사가 많아져서 

학교 생활에 다양성과 새로운 경험들도 많이 할 수 있게 되었어요.

2일간 세종대에서 부스를 팀원분들과 교대로 운영하면서 

저희의 작품을 설명할 때 보러와주시는 분들이 다양한 질문을 해주셔서 

저도 더 다양하게 지식을 쌓아야 겠다고 생각하는 계기가 되었고,

저의 부족한 부분을 알고 더 노력을 할 수 있는 계기가 되었습니다.

 

(학교 부스를 운영한다는 생각에 괜히 자부심이 생기고

뭔가 뿌듯하고 자랑스러운 기분이 들었어요

괜히 뭐 된거같구..

나중에는 취업해서 기업 부스 운영으로 참가하고 싶다는 생각,,)

 

다른 부스들을 돌아보면서 신기한 아이디어도 많았고,

실생활에 쓰이면 많은 사람들에게 이로움이 되는 주제도 많았습니다.

 

가장 기억에 남는 체험은

NPC와 채팅으로 대화를 하며

숨겨진 비밀을 찾는 거였습니다

대화 횟수가 제한적이고, 쉽게 알려주지 않아서

어려움이 있었지만

집요하게 물어보고 약점을 공략해서

비밀을 알아낼 수 있었답니다 !!

 

부스 운영 인증사진으로 마무리 하겠습니다~ 

 

 

 


아래는 2024 인재 페스티벌 홈페이지 주소입니다.

행사에 관련된 상세 내용과, 출품작을 보실 수 있습니다.

https://swfestival2024.kr/

 

 

 

 

글 읽어주셔서 감사합니다 :)

+ Recent posts