물리치료용 운동 검증 엔진 Kinetiq 구축: 가치는 포즈 모델 위의 신뢰도 게이트·RTM 청구 가능 증명이다.
Physical TherapyDigital HealthHealthcare AI

어떤 포즈 모델이든 무릎이 무너지는데도 스쿼트 15회를 양호로 기록한다. 나는 9회째를 잡는 AI를 만들었다.

Ashutosh SinghalAshutosh Singhal2026년 7월 8일13 min

나는 포즈 모델이 스쿼트를 셀 수 있다는 걸 증명하려고 이 데모의 첫 버전을 만들었고, 하루 만에 잘못된 것을 증명해 버렸다. ACL 재건 수술 후 8주째인 62세 합성 환자 Maria에게 체중 부하 스쿼트 15회를 처방했다고 가정하고 입력을 넣었다. 무료 포즈 라이브러리는 무료 포즈 라이브러리가 하는 일을 정확히 했다. 15회를 기록하고, 전부 세고, 넘어갔다. 15회 중 15회. 깔끔한 세션이었다.

문제는 9회째였다. 9회째에 Maria의 무릎이 안쪽으로 무너지고 이를 보상하려고 속도를 늦춘다. ACL 재건 후 물리치료사가 주시하는 바로 그 동작인데, 사람들이 이식건을 다시 파열시키는 방식이기 때문이다. 포즈 모델은 스쿼트를 보았다. 재부상 위험은 보지 않았다. 그것을 보는 일은 포즈 모델의 역할이 아니기 때문이다. 플래그했어야 할 그 렙이 곧 세어 버린 그 렙이었다.

그 순간 실제 제품이 내게 선명해졌다. 나는 포즈 추정을 어려운 부분으로 다루고 있었다. 더는 어려운 부분이 아니다. 무료다.

포즈 추정은 무료다, 그래서 그와 경쟁하기를 그만두었다

첫 주에는 더 나은 키포인트 트래커를 만들려 했고, 그 주는 프로젝트에서 가장 낭비한 한 주였다. BlazePose와 MoveNet은 이미 폰에서 초당 30프레임으로 돌아가며, 33개 키포인트 스켈레톤을 공짜로 준다. 모든 PT 플랫폼과 기업 웰니스 앱이 이미 갖고 있거나 내일 바로 넣을 수 있다. 그 영역에서 경쟁하는 것은 이미 공짜로 주고 있는 것을 공짜로 주겠다고 경쟁하는 일이다.

아무도 주지 않는 것은 레이어 이후 키포인트입니다. 원시 포즈 스트림을 받아 임상의가 조치할 수 있고 보험지급자가 상환할 무언가로 바꾸는 것. 그것이 내가 Kinetiq가 처음부터 끝까지 구축하기로 한 레이어이고, 내가 계속 돌아오던 논지는 이것이다.

포즈 추정은 무료다. 가치는 그 위의 두뇌, 그리고 청구 가능 증명이다.

그래서 트래커는 버리고 대신 해석 엔진을 만들었다. 키포인트 스트림을 받아(테스트 환자 셋은 합성, 네 번째는 실제 촬영 스쿼트 클립에서 오프라인으로 추출해 파이프라인이 실제 영상에 돌아가는 것을 증명), 1-Euro 필터로 평활화하고, 신뢰도로 게이트하며, 시간적 자기유사성으로 렙을 분할하고, 임상의가 실제로 추론하는 특징을 계산한다: 관절 각도와 가동범위, 무릎 외반 지수, 하강-상승 템포 비율, Log Dimensionless Jerk로 측정한 움직임 부드러움, 좌우 대칭 지수. 평범한 단위 테스트된 NumPy. 채점 경로에 모델은 없다. 전체를 veriprajna.com/ko/demos/ai-biomechanics-exercise-verification 에서 구축할 수 있으며, 세션을 채점하는 모습을 볼 수 있습니다.

이 엔진에 Maria를 다시 돌렸을 때, 9회째는 처음부터 나왔어야 할 결과로 돌아왔다.

Maria용 Kinetiq 회차별 표, 9회째가 KNEE VALGUS로 플래그됨, 외반 지수 0.054가 임계값 0.03을 초과하고 템포 1.4가 1.25를 초과, 주변 렙은 양호로 채점되는 동안 재부상 위험으로 플래그
원시 카운터가 양호로 부른 9회째: 엔진은 무릎 외반 지수 0.054(임계값 0.03 이상)와 템포 1.4(1.25 초과), 재부상 위험 플래그를 돌려준다. 열다섯 번째 양호 렙이 아니다.

엔진은 그저 "나쁜 렙"이라고만 말하지 않는다. 검사한 조항을 적는다: 외반 0.054가 0.03 이상, 템포 1.4가 1.25 초과. 임상의는 그것을 교차 검증할 수 있다. 블랙박스는 교차 검증할 수 없고, ACL 수술 뒤에는 그걸 매우 원하게 된다.

내가 조작하고 싶었던 렙

내가 탐욕스러워진 지점을 정확히 기억한다. 12회째였다. Maria 세션의 12회째에 엉덩이 키포인트가 가시성 게이트 아래로 떨어진다. 그 관절의 트래커 신뢰도가 너무 낮아 믿을 수 없다. 몇 프레임 동안 엔진은 그녀의 엉덩이가 어디 있는지 알지 못한다.

벤치마크를 더 좋게 보이게 만드는 유혹적인 수는 보간이다. 주변 프레임에서 엉덩이 위치를 추측하고, 어쨌든 각도를 계산하고, 렙을 채점하고, 숫자를 깔끔하게 유지하는 것. 나는 그 보간을 짰다. 잘 됐다. 그리고 단안 정확도 문헌을 읽고 삭제했다.

단일 카메라 무릎 각도 오차는 평균 절대 오차 9.3도에서 21.9도다(Nature Scientific Reports, 2025). 이것이 이런 측정의 정직한 천장이다. 저신뢰 프레임에서 엉덩이 위치를 날조한 뒤 그걸로 관절 각도를 보고한다면, 나는 무릎을 측정하는 게 아니라 그럴듯한 숫자를 만들어 임상적이라 부르는 것이다. 참된 지혜라는 뜻의 Veriprajna라는 이름의 회사로서, 그건 고민할 문제가 아니었다.

Kinetiq 표에서 12회째가 NOT SCORED로 표시되고 이유는 LHIP not visible, 엉덩이 키포인트가 가시성 게이트 아래, 해당 렙에 대해 날조된 각도 없음
12회째: 엉덩이 키포인트가 가시성 게이트 아래로 떨어지므로 판정은 "채점 안 함, 엉덩이 비가시". 스켈레톤은 회색으로 처리되고 그 프레임에 각도는 발명되지 않는다.

그래서 엔진은 기권한다. 화면에서 "렙 채점 안 함, 엉덩이 비가시"라고 말한다. 스켈레톤을 회색으로 처리한다. 가장하지 않는다.

우리는 저신뢰 키포인트에서 관절 각도를 추측하지 않는다.

그 문장을 화면에 넣은 이유는 규율을 설정 파일에 묻히지 않고 보이게 하고 싶어서였다. 라벨링된 세트의 가려진 렙에서 셋 중 셋이 기권했고 날조된 각도는 0이었다. 내가 주장하는 주장이 아니라 단위 테스트된 불변조건이다. 채점된 가려진 렙은 정의상 날조된 각도다. 테스트가 잡는다. 답하지 않는 것은 내 본능과 싸워 가며 지켜야 했던 기능이다.

같은 스쿼트가 한 환자에서는 통과하고 다음 환자에서는 실패하는 이유는?

나는 거의 단일 전역 임계값을 출시할 뻔했고, 초기 빌드를 보여준 물리치료사가 약 30초 만에 나를 말렸다. 그녀의 요점은 단순했다. ACL 수술 후 8주째 여성의 80도 스쿼트는 좋은 진전이다. 건강한 30세 웰니스 고객의 같은 80도 스쿼트는 게으른 렙이다. 엔진이 둘을 같게 채점한다면, 재활을 이해하는 게 아니라 기하학을 이해하는 것이다.

그래서 규칙 엔진은 집단 적응형이 되었다. 임계값은 환자 프로필에 연동됩니다: 연령대, 상태, 회복 주차. ACL 수술 후 8주차 Maria는 굴곡 목표 75도를 받는다. 무릎이 건강한 30세 기업 웰니스 운동선수 Jordan은 95도를 받는다. 논점을 부인할 수 없게 만들려고 데모에 컨트롤을 넣었다: 프로필 드롭다운을 바꾸고, 정확히 같은 동작을 유지한 채, 판정이 바뀌는 것을 보라.

Kinetiq가 Jordan 웰니스 운동선수 프로필을 보여 주며, 대략 80도 같은 스쿼트가 불충분한 깊이로 채점됨(화면의 shallow 판정), 굴곡이 95도 목표 미만이라 Maria의 ACL 수술 후 프로필에서는 양호였던 것과 대비
Maria에게 양호로 채점된 대략 80도 깊이(목표 75도)가 Jordan에게는 불충분한 깊이로 채점된다(목표 95도), 화면에는 shallow 판정으로 표시된다. 한 동작, 두 판정. 임계값이 환자에 맞게 적응하기 때문이다.

누군가 앞에서 그 드롭다운을 처음 바꿨을 때, 동작은 그대로인데 판정 열 전체가 바뀌는 것을 보며 그들이 이해했다는 걸 봤다. 같은 동작이 프로필에 따라 다른 판정을 받으며, 그것은 버그가 아니라 임상적 판단이다. 이것 또한 시효가 없는 논지의 일부다. 포즈 추정이 완벽해질 때—그리고 그렇게 될 것이다—센서는 여전히 80도가 치유 중인 무릎과 건강한 무릎에서 다른 의미라는 걸 말해 주지 못한다. 그 이해는 위 레이어에 산다.

에이전트는 조언하고, 코드가 결정한다

나는 AI 에이전트가 나를 한 번 망신 준 적이 있고, 그게 아키텍처가 지금 모습인 이유다. 내가 피칭한 사람마다 유행하는 기능을 원했다: 세션을 읽고 임상 노트를 쓰는 에이전트, 추세를 보고 에스컬레이션하는 에이전트. 좋다. 다른 환자 Eleanor—70세, 무릎 치환술 후, 세션 이력에 걸쳐 가동범위가 조용히 감소 중—위에 Clinical Scribe와 Longitudinal Monitor를 연결했다.

서기가 쓴 첫 초안은 유창하고 자신감 있었지만, 근거에 없는 가동범위 수치가 들어 있었다. 반올림했거나, 평활화했거나, 그냥 읽기 좋게 숫자를 발명한 것이다. 그걸 믿었다면 날조된 측정치가 든 임상 노트를 출시했을 것이다. 의료 루프에 언어 모델을 넣는 실패 모드 전체이고, 내 화면에서 방금 그걸 봤다.

해결책은 에이전트가 구조적으로 그걸 할 수 없게 만드는 것이었다. 에이전트가 도입하는 모든 수치는 결정론적 근거와 대조해 검사된다. 엔진 출력에 없는 숫자는 거부되고, 대신 결정론적 템플릿이 표시된다. 두 에이전트 모두 API 키가 없으면 완전히 기권한다. 해석하고 전달한다. 결정하지 않는다.

Eleanor용 Kinetiq AI Scribe와 Longitudinal Monitor 패널, 둘 다 grounding-checked로 표시, 모니터가 세션 이력에 걸친 가동범위 감소 추세를 보고하고 임상의 검토로 에스컬레이션
Eleanor의 합성 세션 이력 위 Longitudinal Monitor: 가동범위 감소 추세를 감지하고 선제적 임상의 에스컬레이션 초안을 작성한다. 두 에이전트 모두 결정론적 엔진에 대해 grounding-checked되어, 근거에 없는 수치는 노트에 도달하기 전에 거부된다.
에이전트는 조언하고, 코드가 결정한다.

그 문장이 데모 전체의 하중을 지탱하는 설계 결정이다. 신뢰 코어, 모든 회차별 판정과 청구 결정은, 언어 모델이 어디에도 없는 평범한 단위 테스트된 코드다. 에이전트는 위에 앉되, 경계가 있고 grounding-checked되며, 그들이 진짜 잘하는 일—검증된 숫자를 임상의용 글로 바꾸는 일—만 한다. 에이전트가 판정에 한 표를 얻는 순간, 전체가 목적이었던 감사 가능성을 잃은 것이다.

보험지급자가 실제로 상환하는 것은 영수증이지, 렙 카운트가 아니다

이 모든 것을 만든 상업적 이유는 CMS 청구 규칙을 읽으며 배운 것인데, 한 달을 그렇게 보낼 줄은 몰랐다. 임상의는 CPT 98975-98981 아래 Remote Therapeutic Monitoring을 청구할 수 있고, 2026 코드 98979와 98985도 더해지며, 2026 자격 임계값은 최소 2일과 10분 데이터로 내려갔다(Veriprajna WP29 research, 2026). 그러나 CMS는 원시 좌표를 상환하지 않는다. 치료 결정에 묶인 기기 수집 데이터를 요구한다. 키포인트 더미는 청구할 수 없다. 문서화되고 감사 가능한 결정이 청구된다.

그 간극은 작지 않다. 근본 문제도 작지 않기 때문이다. PT 가정 운동 순응도는 약 35%이고, 환자의 65%가 첫 달 안에 프로그램을 포기한다(Veriprajna WP29 research, 2026). 자기보고는 순응도를 과장하므로, 임상의는 종종 믿을 수 없는 데이터로 청구하고 치료한다. 고용주 쪽에서는 근골격계 질환이 직원 1인당 연간 약 3,591달러의 비용이고, MSK 수술의 추정 36%가 불필요하다고 여겨지며(900억 달러), 직원의 절반 이상이 프라이버시 때문에 건강 데이터 공유를 거부한다(Veriprajna WP29 research, 2026). 검증되고, 프라이버시가 안전하며, 청구 가능한 운동 데이터가 그 사슬의 모두가 빠뜨린 것이다.

그래서 엔진이 세션마다 마지막으로 하는 일은 결정이다: 청구 가능, 임상의 검토 필요, 또는 기기 데이터 부족, 그리고 FHIR형 세션 보고서를 내보낸다. 회차별 관찰, 각 회차에서 검사한 임계값 조항, 세션 롤업, RTM 결정, CMS가 요구하는 문서 필드. FHIR형이라고 말하지, FHIR 검증이라고는 절대 말하지 않는다. Observation과 DocumentReference 필드 형태를 거울처럼 따르는 구조화 JSON이지, 실제 EHR에 POST한 페이로드가 아니기 때문이다. 나는 내보낸다. POST했다고 가장하지 않는다.

9회 외반 플래그가 있는 Maria의 세션은 자동 청구되지 않는다. 재부상 신호는 청구가 되기 전에 사람이 봐야 하므로 먼저 임상의에게 라우팅된다. 내가 계속 고집한 정직한 뉘앙스다: 청구 가능이 곧 전부 양호를 뜻하지는 않는다, 뒤에 설 수 있을 만큼 문서화되었다는 뜻이다.

Kinetiq 벤치마크 요약: 명확 사례 25건에서 판정 일치 100%, 임계값 1시그마 이내 경계 사례 10건에서 100%, 가려진 렙 3건 중 3건 기권·날조 각도 0, 세션 4건 중 3건 자동 청구 가능·1건 검토로 라우팅
고정 라벨 합성 세트의 벤치마크: 명확 사례 25건과 경계 사례 10건(임계값 약 1시그마 이내)에서 판정 일치 100%, 가려진 렙 3건 중 3건 기권·날조 각도 0, 세션 4건에 걸쳐 3건 자동 청구 가능·1건 검토로 라우팅.

그 패널의 숫자가 내가 아끼는 것이고, 범위를 정확히 말하고 싶다. 여기서 정답은 심어 둔 물리 파라미터 대 프로필 임계값이 함의하는 판정이며, 엔진과 독립적으로 계산한 뒤, 라벨을 고정한 다음 측정 노이즈를 더해 키포인트로 렌더링하므로, 엔진은 노이즈를 뚫고 판정을 복구해야 한다. 그 세트에서 명확 사례 25건 일치 100%, 임계값 약 1표준편차 안에 앉은 경계 사례 10건 일치 100%다. 그것은 라벨링된 합성 세트에서의 판별 결과이지, 열린 세계 보장이 아니다, 그리고 경계 사례는 나이브한 임계값 처리에서 뒤집힐 것들이며, 그래서 따로 보고한다. 이것들은 내구성 있는 지표다: 과제 정확도, 자동화 처리량, 정직성. 포즈 모델이 좋아져도 시효가 없다. 어느 것도 포즈 모델 오차율이 아니기 때문이다.

내게 남은 질문

나는 컴퓨터 비전 제품을 만든다고 생각했고, 끝에서는 카메라로 시작할 뿐인 책임성 제품을 만들었다고 확신한다. 흥미로운 일은 키포인트를 얻는 것이 아니었다. 시스템이 무엇을 주장해도 되는지, 언제 기권해야 하는지, 누구의 임계값이 적용되는지, 임상의가 면허를 걸고 뒷받침할 수 있는 것이 무엇인지 결정하는 일이었다. 무너지는 무릎을 채점하고, 가려진 렙을 거부하고, 영수증을 내보내는 엔진을 보고 싶다면, 키 없이 veriprajna.com/ko/demos/ai-biomechanics-exercise-verification에서 실행됩니다.

내가 설명하는 글을 읽기보다 직접 보고 싶다면, 여기 처음부터 끝까지 돌아가는 전체가 있다.

내가 계속 뒤집고, 다른 빌더들이 나와 진지하게 논쟁해 주었으면 하는 질문은 이것이다. 센서가 완벽에 점근할수록, 모델이 더 많이 결정하게 두려는 유혹이 생긴다. 거의 틀리지 않을 테니까. 그러나 거의 틀리지 않음이야말로 날조된 숫자가 가장 큰 피해를 주는 조건이다, 검사가 멈췄기 때문이다. 그렇다면 당신 시스템에서, 모델이 넘지 못하게 거부하는 선은 어디에 있고, 그것을 강제하는 코드를 가리킬 수 있는가?

관련 연구

확신을 가지고 AI를 구축하세요.

차세대 엔터프라이즈 AI 구축에 깊은 경험을 갖춘 팀과 협업하세요. 신뢰할 수 있는 AI 전략을 설계하고 구축하며 배포할 수 있도록 지원해 드리겠습니다.

Veriprajna 딥테크 컨설팅 은(는) 헬스케어, 금융, 규제 분야를 위한 안전 필수 AI 시스템 구축을 전문으로 합니다. 당사의 아키텍처는 확립된 프로토콜에 따라 검증되며 포괄적인 규정 준수 문서를 갖추고 있습니다.