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개
디코더, 그리고 그것뿐이다. 데이터셋은 주소와 형식 두 가지인데, 주소 쪽 — 내려받기·캐시·체크섬 — 은 여기 없다. 내려받는 테스트 케이스는 기차에서 실패하는 테스트 케이스이기 때문이다.
형식 쪽이 조용히 틀어지는 부분이고, 이 파일의 모든 함수가 그런 것이다. 아래는 전부 잘못 읽어도 학습이 되는 데이터셋을 남긴다:
- STL-10 은 열 우선으로 저장되고 라벨이 1 부터 시작한다. 전치를 건너뛰면 모든 그림이 돌아간 채로 나온다 — 그래도 그림이다.
- MovingMNIST 의 split 은 클립이 아니라 프레임을 자른다. 클립을 자르는 리더는 랭크는 맞고 개수는 절반인 결과를 낸다.
- FER2013 은 픽셀을 셀 안에 정수 문자열로 넣어두고, 배치가 두 가지다.
여기 없는 것
탐지기가 없으니 roiAlign 도, DeformConv2d 도, 특징 피라미드도
없다. 데이터셋 내려받기도 없다. PIL 이 없으니 그것을 필요로 하는 연산도 없다.
API 레퍼런스는 빌드된 선언 파일에서 생성된다, 그러니
“이거 있나?” 에 대한 가장 확실한 답은 torchvision 의 답이 그대로
넘어온다고 가정하는 것이 아니라 거기서 찾아보는 것이다.