fastai vision tutorial/ Points
Biwi Kinect Head Pose Dataset를 통해서 사진의 points를 예측하고자 한다.
데이터셋을 제공하는 웹사이트에 의하면 image파일과 관련된 pose text file은 location of the center of the head를 설명해준다고 한다.
(머리의 중심점의 위치, 밑에 6번 코드를 보면 그 중심점을 추출할 수 있는 코드가 있다.)
1.path = untar_data(URLs.BIWI_HEAD_POSE)
path.ls()
사람들의 사진이 들어있는 24개의 폴더가 있다.
그리고 일치하는 obj 파일이 들어있다.
2.(path/'01').ls()
이 코드를 통해서 01에 해당하는 폴더를 살펴보면 rgb.jpg와 pose_txt파일을 확인할 수 있다.
여기서 get_image_files를 통해서 쉽게 이미지 파일만을 가져올 수 있다. (재귀적이라서 모두 가져온다)
3. img_files = get_image_files(path)
가져온 이미지 파일의 이름을 연관된 pose file로 전환할 수 있다.
4.def imgTopose(x): return Path(f'{str(x)[:-7]}pose.txt')
imgTopose(img_files[0]) -> pose파일의 경로가 리턴된다.
또 나온 정규식 ... 끝나고 정리해보자.
5.image = PILImage.create(img_files[0])
image.shape
image.to_thumb(160)
파이썬에서 PILImage클래스를 사용하면 이미지를 볼 수 있다.
이미지를 create메소드로 열어서 shape메소드를 사용하면 크기가 나오고 to_thumb나 show를 사용하면 이미지를 볼 수 있다.
6. cal = np.genfromtxt(path/'01'/'rgb.cal', skip_footer = 6)
머리 중심점을 추출하는 함수이다.
skip_footer = The number of lines to skip at the end of the file.
(참조. np.genfromtxt메소드에 관한 설명)
python의 read, readline보다 numpy가 column별로 구분해줘서 자주 사용한다고 한다.
텍스트 파일을 열어준다. 꿀팁(np.genfromtxt?) 이 있으니 꼭 보도록 하자.
7.cal = np.genfromtxt(path/'01'/'rgb.cal', skip_footer=6)
def get_ctr(f):
ctr = np.genfromtxt(img2pose(f), skip_header=3)
c1 = ctr[0] * cal[0][0]/ctr[2] + cal[0][2]
c2 = ctr[1] * cal[1][1]/ctr[2] + cal[1][2]
return tensor([c1,c2])
-> 이해x
이전 차원이 모이면 차원이 높아진다.
*tensor : 데이터의 배열로 2차원인 행렬 이상부터 텐서라고 말한다.
8. biwi = DataBlock(
blocks = (ImageBlock, PointBlock),
get_items = get_image_files,
get_y = get_ctr,
splitter = FuncSplitter(lambda o: o.parent.name == '13'),
batch_tfms = [*aug_transforms(size = (240,320)),
Normalize.from_stats(*imagenet_status)]
)
라벨링을 하기 위해서 DataBlock의 get_y에 get_ctr 함수를 넘겨준다.
splitter의 경우 랜덤으로 해서는 안되고, 하나의 폴더에는 한명의 사람에 대한 사진만 있으므로 주의해야한다.
기존과 다르게 pointBlock 타입이 추가되었는데 라벨이 좌표로 표현되기 때문이다.
이미지와 좌표에 똑같이 augmentation을 해야한다.
9.dls = biwi.dataloaders(path)
dls.show_batch(max_n = 9, figsize = (8,6))
데이터를 모두 준비했다.
10.learn = cnn_learner(dls, resnet18, y_range = (-1, 1))
11.learn.lr_find()
12.learn.fine_tune(1,5e-3)
13.learn.show_results()
tutorial 끝!!