import numpy as np from edge.adapters.movenet_pose import MoveNetPoseAdapter class _FakeSession: """MoveNet 출력 형태 [1,1,17,3] (y,x,score) 정규화.""" def get_inputs(self): class I: name = "input" return [I()] def run(self, _out, feed): kp = np.zeros((1, 1, 17, 3), dtype=np.float32) for j in range(17): kp[0, 0, j] = [0.5, 0.25, 0.9] # y=0.5, x=0.25, score=0.9 return [kp] def test_infer_maps_movenet_to_coco17_persons(): frame = np.zeros((400, 800, 3), dtype=np.uint8) a = MoveNetPoseAdapter("unused.onnx", session=_FakeSession()) persons = a.infer(frame) assert len(persons) == 1 p = persons[0] assert len(p.keypoints) == 17 # x = 0.25 * 800 = 200, y = 0.5 * 400 = 200 assert abs(p.keypoints[0].x - 200) < 1 and abs(p.keypoints[0].y - 200) < 1 assert abs(p.keypoints[0].conf - 0.9) < 1e-6 assert p.bbox.x1 <= 200 <= p.bbox.x2 def test_low_score_person_dropped(): class Low(_FakeSession): def run(self, _o, feed): return [np.zeros((1, 1, 17, 3), dtype=np.float32)] # all score 0 a = MoveNetPoseAdapter("unused.onnx", session=Low()) assert a.infer(np.zeros((10, 10, 3), np.uint8)) == []