왜 이걸하냐면
원래는 이렇게까지 않하는데
network를 다뜯어고쳐야되게 생겼거든요.
겸사겸사 분석이나 해봅시다.
1. Load graph
우선 graph를 load하는데요. 어떤 데이터 종류를 쓰냐가 여기서 결정됩니다.
이 부분을 보면 graph 인스턴스를 생성하네요. 한번 까봅시다.
음 종류를 보니 기본 initialize는 layout으로 openpose, partitioning으로는 uniform을 사용하네요. max_hop 은 1 이겠죠. 애초에 논문에서 distance를 1에 대해서만 봤으니까요. max_hop은 node간 maximal distance랍니다. dilation은 kernel points간의 spacing을 controls하는 상수고 1이네요. 자, 기본은 설명 했고 볼까요? get_edge( layout )은 openpose를 따르겠고 hop_dis 는 get_hop_distance() 에 의해 결정되는데, 아직안봐서 모르겠고, adjacency matrix은 uniform으로 뽑는다고 했으니까 우선을 그렇게 알고 갑시다. 그럼 우리가 봐야할 함수는 get_edge, get_hop_distance(), get_addjacency 이거네요. 봅시다.
get_edge()
layout을 openpose로만 썻으니까 if Layout = 'openpose' 만 보면 됩니다. num_node = 18 개고 우선 self_link를 해주네요. 그 다음 리스트에 neighbor_link를 tuple로 담아놨는데, 이는 openpose에서 미리 정의해 놓은 연결을 그대로 가져옵니다. edge는 두 리스트가 합쳐지겠네요. 그럼 35 개의 tuple이 들어간 list가 나오겠네요. node는 18개 link는 17일테니까요. center는 1을 주네요. 음 여기까지는 뭐 그냥그냥 그러네요
get_adjacency()
마찬 가지로 uniform만 볼꺼니까 나머지는 생락하고 가져올게요. valid_hop이 range( 0, 2 ) 를 갖겠네요. 왜냐면 dilation이 1이고 max_hop이 1이니까요. adjacency는 우선 18 x 18 matrix이고 0으로 초기화하고요. for문을 돌며 index가 self.hop_dis == hop 인 adjacency matrix 에 1을 주네요. 음 아직 hop_dis를 결정하는 함수를 안봤으니까 그렇구나 하고 넘어갑시다. 그 아래서는 normalize_digraph()에 넣어 normalize해주네요. 저것도 봐야겠네요. strategy가 uniform일때 A는 1 x 18 x 18 matrix이고 A[0] 에 normalize_adjacency를 넣어주네요. 그럼 결국에 A는 normalize_adjacency니까 저게 뭐하는 건가만 알면 A를 파악할 수 있겠네요.
get_hope_distance()
이 친구가 hop_dis를 결정해주는 친구였죠? 그럼 볼까요? num_node와 edge, max_hop을 받아오고 A는 18x18 matrix이며 0으로 초기화 합니다. edge를 가져와 A matrix에 연결 상태를 표현해 줬네요. 연결이 되어 있다면 1, 아니면 0입니다. 그럼 이제 # compute hop steps 아래부분을 봅시다. hop_dis matrix역시 18x18 matrix을 만들고 무한대로 초기화했네요. np.lingalg.matrix_power(A,d) 는 A 라는 행렬을 d 번 행렬 곱 한다는 말이고 음 이 행렬은 대각 기준 대칭 행렬이니까, 위치가 바뀌는 역할이네요. 그게 리스트로 들어가고, 그걸 stack에서 쌓아서 0이 아닌 값에 대해서만 True값을 받고 max_hop부터 0까지 거꾸로 for문을 주행하면서 hop_dis를 결정해 주네요. dis는 1이 최대겠네요.
normalize_digraph()
마지막으로 이함수인데, A를 받아서 axis =0 방향으로 합쳐주고 dn을 18 x18 marix으로 만들고 Dl 이 0보다 큰 index에 대해 dn ( 대각 행렬을 -1로 바꿔주고, ad에서 dot연산으로 곱해주네요. 음 이역시 행렬을 바꿔주게 되겠네요. 논문과 대입해서 보면 Normalized Laplacian을 표현한다고 봐야할까요? 음 조금 다르긴한데.. 여튼 오늘은 여기까지만 볼게요
'AI' 카테고리의 다른 글
[torch] 기본 함수 이해와 활용 (0) | 2023.01.19 |
---|---|
coco 2017 pose track image and open pose keypoint (0) | 2022.10.18 |
Transformer 동작 원리 이해하기 (0) | 2022.07.05 |
SORT 구현을 위한 기초 이론 5 ( feat. Hungarian algorithm ) (0) | 2022.07.01 |
SORT 구현을 위한 기초 이론 4 ( feat. Hungarian algorithm을 위한 이론들 ) (0) | 2022.06.30 |