borch

torchvision 의 자리

이미지, 박스, 데이터셋

라이브러리의 이름 2950개 중 663개가 비전 쪽이다. torchvision 모양을 하고 있고, 여기 있는 이유는 하나다 — 학습에는 이미지가 텐서가 되는 자리가 필요하고, 그 자리가 바로 조용히 틀어지는 곳이다. 아래 각 절이 틀어지는 방식을 하나씩 이름 붙인다.

transforms — 이름 279

torchvision.transforms 자리. 여기서 이미지는 텐서가 아니라 (H, W, C) 배열이다. torchvision 은 PIL 이미지를 받는데 브라우저에는 PIL 이 없으니 배열이 그 자리를 대신한다. 이미지마다 텐서를 만들면 이미지마다 GPU 버퍼가 하나씩 생기고, 그건 메모리에서 무너지기 직전까지 잘 도는 것처럼 보인다.

이것들은 파이썬 쪽과 같은 규칙을 쓴다(borchvision.py). 둘이 갈라지면 같은 데이터가 어느 라이브러리로 읽었느냐에 따라 다른 값이 된다 — 타입은 못 잡고 값 비교만 보는 차이다.

v2 — 함수 68개, 클래스 134

v2 는 torchvision 이 지금 권하는 표면이고, 실체는 앞면만 다른 v1 이다. 이건 아무것도 쓰기 전에 측정했다 — 평범한 이미지에서 v2 의 변환은 v1 의 것과 마지막 비트까지 같은 값을 준다. 그래서 산술을 두 번 쓰지 않았다. v1 에 이미 있던 것은 전부 복사가 아니라 재수출이고, 클래스 쌍둥이는 v1 클래스를 상속해서 출력만 덮어쓴다.

한 쌍이 옆집과 거꾸로 답한다. v2 의 getSize[높이, 너비]를, 한 네임스페이스 건너 getImageSize[너비, 높이]를 준다. torchvision 이 일부러 뒤집고 옛 철자를 고치는 대신 폐기했다. 둘 다 여기 있고 각자 자기 순서를 지키며, 잘못 읽으면 전치된 이미지가 나오는데 그것도 학습은 된다.

ops — 이름 164

박스 기하와 그 위에 세운 손실들 — boxIou 와 generalized·distance·complete 변종, IoU 손실 셋, sigmoidFocalLoss, nms·batchedNms. 없는 것은 탐지기의 특징맵이나 예측을 필요로 하는 전부다. 이 라이브러리에는 아직 탐지기가 없고, 여기 있는 것들은 박스 하나에 숫자 넷 말고는 아무것도 필요로 하지 않는다.

나머지는 같은 기하를 이미지에 딸려 오는 것들에 적용한 것이다. 그림을 자르면 박스가 움직이고, 돌리면 마스크와 키포인트도 함께 돌아야 한다. 그래서 변환 하나마다 — affine·crop·resize·resizedCrop·rotate·perspective·elastic·pad 와 뒤집기 둘 — 대상별 커널이 하나씩 있다: rotateBoundingBoxes·rotateMask· rotateKeypoints. 개수는 거기서 나온다.

따로 있는 이유는 셋이 서로 다른 답을 내기 때문이다. 돌아간 박스는 돌아간 네 꼭짓점이 아니라 그것을 감싸는 똑바른 박스라서 커진다. 마스크는 이미지와 같은 워프를 지나되 최근접 표본을 쓴다 — 라벨을 보간하면 원래 없던 라벨이 생긴다. 화면을 벗어난 키포인트는 어떤 커널에서는 잘려 붙고 어떤 커널에서는 버려진다. 셋을 함수 하나에 맡기면 그 선택들이 안 보이게 된다.

산술은 일부러 CPU 에서 한다. 박스는 수백만이 아니라 수십 개 단위로 오고, 여기 모든 함수는 정렬하거나, 집합이 안 줄어들 때까지 반복하거나, 마스크의 범위를 읽는다 — GPU 커널이 못 하고 루프가 잘하는 모양이다. 호출마다 텐서를 한 번 되읽으며, 그래서 async 다.

datasets — 이름 18

디코더, 그리고 그것뿐이다. 데이터셋은 주소와 형식 두 가지인데, 주소 쪽 — 내려받기·캐시·체크섬 — 은 여기 없다. 내려받는 테스트 케이스는 기차에서 실패하는 테스트 케이스이기 때문이다.

형식 쪽이 조용히 틀어지는 부분이고, 이 파일의 모든 함수가 그런 것이다. 아래는 전부 잘못 읽어도 학습이 되는 데이터셋을 남긴다:

여기 없는 것

탐지기가 없으니 roiAlign 도, DeformConv2d 도, 특징 피라미드도 없다. 데이터셋 내려받기도 없다. PIL 이 없으니 그것을 필요로 하는 연산도 없다. API 레퍼런스는 빌드된 선언 파일에서 생성된다, 그러니 “이거 있나?” 에 대한 가장 확실한 답은 torchvision 의 답이 그대로 넘어온다고 가정하는 것이 아니라 거기서 찾아보는 것이다.

API 레퍼런스 보기 →