1.Rat Training

#Rat No. 49 Group : comparison study of no reward vs negative feedback on learning Current weight : 445g(-6g) Pellet/Water : g Experiment time : 09:30 ~ 10:00 Stage : Familiarization - DAY 1

금일 49번은 T maze에서의 familiarization에 들어갔다. 실험실 방 내에서 white noise를 키고 towel handling을 10분 진행 후 T maze에서 5분동안 적응 시간을 준 뒤 suger water를 T maze 곳곳에 흩뿌려 주었다. 처음 경험하는 T maze라 많이 경계할 줄 알았지만, 크게 경계심을 가지지는 않았다. 5분동안 T maze를 관찰하며 적응을 가졌다. 실험 시작 14분에 얼굴을 처음으로 T maze위에서 그루밍 하였다.(T maze에서는 4분) 그 후 suger water를 뿌려주었는데, 뿌려주자 마자 49번은 첫 번째 방울을 찾아 먹고 그 후 계속 suger water을 찾아 먹기 시작했다. 17분과 23분에 T maze 위에서 몸과 얼굴을 그루밍 했다. 9mL를 시작 20분만에 모두 찾아 먹어 1mL를 더 주었다. 마지막 1mL는 조금씩 많이 주어 더 49번이 더 활동 할 수 있도록 유도했다. 실험 시작 25분만에 11mL 모두 섭취 완료하였다. 49번은 T maze에서 경로를 벗어나는 일도 없었고, suger water를 잘 찾는 모습 또한 보여주었다. 금일 suger water은 11mL(towel : 1mL, maze : 10mL)를 먹었고, 프룻룹은 3개를 먹었다. 실험 마지막에는 cage에 스스로 들어가는 모습까지 보여주었다.

Rat No. 50

Group : comparison study of no reward vs negative feedback on learning Current weight : 430g(-8g), Pellet/Water : Experiment time : 10:10 ~ 10:40 Stage : Familiarization - DAY 1

50번 또한 마찬가지로 T maze에서의 familiarization에 들어갔다. towel handling을 10분 진행 후 T maze에서 5분동안 적응 시간을 준 뒤 suger water를 T maze 곳곳에 흩뿌려 주었다. 초반 T maze 5분의 적응 시간에서 50번은 여러 장소를 많이 돌아다니는 모습을 보여주었다. 그 후 suger water를 뿌려주었는데, 처음에는 찾아먹는 모습을 보여주지 않았다. 실험자가 손가락으로 가르켜주니 그때부터 suger water을 혼자 찾아먹기 시작했다.(이후로 끝까지 혼자 찾아서 먹는 모습을 보여줬다.) 실험 시작 13분만에 T maze 위에서 처음으로 얼굴과 몸을 그루밍 하였다. 그 후 23분에 몸과 얼굴을 그루밍하는 모습을 한 번더 보여주었다. 50번 또한 motivation이 좋아서 1mL를 더 투여했다. 실험 23분만에 11mL를 모두 섭취했다. 마지막으로 cage를 손가락으로 가르키니 알아서 들어가는 모습까지 보여주었다. 금일 푸룻룹은 2개를 먹었고, suger water은 11mL(towel : 1mL. maze 10mL)를 먹었다.

금일 진행한 49,50의 familiarization 실험 사진이다. 생각했던 것 보다 2마리 모두 suger water를 너무 잘 찾아 주었다. start box에서 나오지 않는 모습도 없었고, suger water를 적극적으로 찾는 모습을 많이 보여주었다.

추가적으로 familiarization 과정을 선배님께서 정리해서 주셨다. familiarization 과정이 생각해야 될 것이 많아 한번 정리하고 넘어가는 것이 좋을 것 같아 정리를 해보았다.

  1. maze를 청소한다. (조명 on) - 벽면까지 꼼꼼하게 청소

  2. reword, towel, timer를 준비한다.

  3. 저울을 준비한다. (알콜로 청소)

  4. white noise를 킨다.(리모컨 -> 삼각형 버튼, 재생버튼을 누른다.)

  5. DVR 녹화를 클릭한다.

  6. 무게를 잰 쥐를 실험방으로 옮긴다.

  7. 문을 닫고 커튼을 친 뒤 towel handling을 10분 진행한다.

  8. 5분동안 reward 없이 maze를 탐색하게 둔다.

  9. reword를 바닥에 흩 뿌려준다. (maze위를 최대한 돌아다닐 수 있게 여러곳에 뿌릴 것)

  10. 종료되면 커튼을 열고 문을 연다.

  11. 쥐를 데리고 나와 저울에 넣고 cage에 이동시킨다.

  12. DVR off/ white noise off

  13. maze를 물 분무기로 닦은 뒤 알코올로 닦아준다.

  14. 마지막으로 모든 뒷 정리 후 등불을 꺼준다.

위 과정으로 familiarization이 이루어진다. 챙겨야 할 것이 많아 familiarization 또한 루틴을 만들어 그대로 지켜야 할 것 같다. 놓칠 수 있다고 생각한 것은 14번인 등불 끄기이다. 등불이 정말 약해서 켜있는지 꺼있는지 놓칠 수 있기 때문에 꼭 마지막에 등불을 꺼줘야겠다고 생각했다.

2. DLC project

batch size를 올려 DLC의 학습 속도를 올리려고 계속 시도했다. 하지만 현재 환경에서 batch size를 1에서 올리려고 해도 올라가지 않고, 학습이 중간에 error가 발생했다. (batch size = 정해진 시간내 받을 수 있는 데이터 양) batch size를 올려야만 현재 multi gpu 환경(RTX 3090 2개)을 효과적으로 쓸 수 있기 때문에 방법을 찾을 수 밖에 없었다.

먼저 batch size를 올리면 학습이 되지 않는 이유에 대해 파악했다. 필자의 생각으로는 labeling한 데이터가 적어 batch size를 올리면 학습이 너무 빨리 끝나 loss된 data가 많아 학습이 안되는 줄 알았다. 그리하여 원래 200개였던, labeling 데이터를 1000개로 늘렸다. 1000개 labeling된 data를 학습에 진행해 보니, 마찬가지로 학습이 진행되지 않았다. 그리하여 error가 생긴 conda cmd 창을 하나씩 읽어보며 분석했다.

error의 답은 이러했다. ‘해상도가 너무 높다.’ 원본 파일 즉 학습을 시기키 위해 사용한 영상의 크기는 해상도가 1920x1080이었다.

해상도가 너무 높기 때문에 batch size를 아무리 높여도 하드웨어적인 문제로 data를 받을 수 없는 상황인 것이다. 해결하기 위해서는 원본파일의 해상도를 낮추거나, 아니면 크기를 지정해 주어 지정한 위치에서 labeling을 인식하게 정해주어야 한다. 먼저 크기를 조정하는 방법에는 2가지가 존재했다.

scale과 crop인데 scale은 사진 전체의 크기를 조절해준다고 이해하면 되고, crop은 1920x1080에서 원하는 위치를 지정해 자르는 것이라고 생각하면 된다. 필자는 영상의 모든 데이터 즉 전체화면이 학습되는 것이 더 이점이 있다고 판단하여 scale을 진행했다.

config.yaml file에 global_scale을 추가해 1920x1080을 scale 값을 0.5를 주어 960x540으로 크기를 줄였다.

그 후 batch size로 테스트를 진행했다. 32부터 16, 8을 적용하여 학습이 진행되는지 테스트를 해 보았는데, batch size가 8에서 학습이 시작되는 단계로 넘어갔다. 환경 특성 상 multi gpu를 사용하기 때문에 batch size를 8보다 더 이상으로 높혀야 장점을 발휘할 수 있는 것인데, 8이 한계인 것은 많은 데이터를 학습시키기에는 좋지 못한 선택이라 생각했다. 그리하여 구글링을 하던 도중

on the inference speed and video-compression robustness of DeepLabCut의 제목의 paper을 발견했다. paper의 내용을 요약해 보자면,

ffmpeg으로 영상의 용량을 압축시켜도 DLC에서 학습한 데이터는 원본 영상 학습과 차이가 거의 없다라는 내용이다. figA 를 보면 ffmpeg을 사용하여 영상을 압축시켜 pixel을 낮추었다. 그 후 fig B는 각 영상에서 쥐의 코를 labeling한 데이터를 시각화 한 것이다. 보라색이 원본영상이며, 위로 올라갈 수록 압축을 진행한 영상이다. 원본영상에서의 학습 데이터는 jitter가 거의 없는 것이 당연하다. 파란색 혹은 초록색까지는 jitter가 거의 없는 모습을 보여준다. fig C는 원본 영상에서의 label 위치와 각 압축한 영상의 label 위치의 차이를 평균을 구해 나타낸 것이다. 원본 영상인 보라색은 차이가 거의 없다. 하지만 파란색, 초록색 영상도 평균의 차이가 거의 없는 것을 볼 수 있다. 이를 통해 알 수 있는 사실은, 영상 코덱의 압축을 어느 순간까지 진행해도 DLC는 학습 데이터를 원본 영상 데이터와 거의 비슷하게 학습한다는 것이다. 코덱 압축을 진행한다면, 영상의 크기도 작아져 batch size를 더 높게 설정해 학습의 시간을 크게 줄일 수 있고, 영상의 용량이 줄기 때문에 하드디스크의 용량또한 효율적으로 사용할 수 있다. 추가적으로 paper의 1저자가 DLC 총괄 개발자이기 때문에 paper의 데이터는 충분히 신뢰할 수 있다고 판단했다.

실제로 여러 os 환경 및 gpu 환경에서 test를 진행한 데이터이다. x축인 batch size가 증가할 수록 y축인 fps 즉 데이터를 처리하는 속도가 높아진다. batch size가 증가할 수록 fps도 증가하기 때문에, 빠른 학습을 하기 위해서는 batch size를 올리는 것은 필수다. 추가적으로 필자가 현재 사용하고 있는 환경은 3090이 2개인 multi gpu 환경이기 때문에 위 그래프는 batch size가 64가 최대이지만 코덱 압축을 어느정도 진행한다면, 126, 258까지 batch size를 설정할 수 있을 것이라 생각한다. 그렇다면 코덱 압축을 어떻게 해야하나?

이 paper에 설명되어있다. 예전 필자가 확장자명을 변경할 때 사용했었다. ffmpeg을 사용하여 압축을 진행하는 것인데 ffmpeg은 저번에 .sec 확장자를 DLC에 넣기 위해 .mp4로 변경할 때 사용했었다. ffmpeg 명령어중 -crf뒤의 숫자를 넣어 원하는 압축값을 설정할 수 있다. 저자는 여기서 100,50,45,40,35,30,37,25… 로 압축을 진행하여 테스트를 진행했다. 필자는 명일부터 이 crf를 사용하여 코덱 압축을 진행 후 DLC에 넣어 batch size가 몇 까지 올라가는지 확인해보는 test를 진행해 보려고 한다.