2025/7/28(월)
1.Rat Training

금일 Quinine Test를 진행했다. Quinine Test를 진행하는 이유는 각 쥐들이 Quinine을 먹고 어떠한 반응을 보이는지 알기 위해서 진행한다. 추가로 만약 quinine을 먹은 뒤 다음 trial에서 suger water를 잘 먹는지 또는 뜸을 들이면서 먹는 지를 판단하기 위해 진행한다. quinine은 2가지가 존재한다. 0.1mM 과 1mM 농도의 quinine이 존재하는데, suger water를 5 trial 진행 후 각 quinine을 0.1mL씩 reward zone에 둔다.

추가로 스톱워치로 cart 끝에서 reward를 licking하기 전까지 latency를 측정하여 latency 기록지에 기록한다. suger water를 주고 quinine을 줘야하는 trial 사이에는 알코올과 물로 reward zone을 닦아 주어야 한다.
#Rat No. 49 Group : comparison study of no reward vs negative feedback on learning Current weight : 467(+17g) Pellet/Water : 12g Experiment time : 12:00 ~ 12:30 Stage : Quinine Test
금일 49번은 quinine test에 들어가기 전에 먼저 suger water로 10 trial 적응 시간을 주었다. 처음에는 licking까지 많은 시간이 소요되었지만, 점차 latency가 줄어드는 결과를 보여주었다. 11trial 부터는 본격적으로 Quinine Test에 들어갔다. 신기하게도 처음 quinine을 먹은 trial에서 49번은 처음 licking을 한 뒤 뜸을 들였지만 다시 licking하여 quinine(0.1mM) 0.1mL를 모두 먹었다. 그 후 다음 suger water에서 latency가 줄어드는 모습은 보여주지 않고 곧장 reward zone으로 돌진했다. 다른 quinine trial은 licking을 한 번한 뒤 먹지 않고 남기는 모습을 보였다. 남기고 나서는 reward zone을 빤히 쳐다보는 모습을 보여주었다. 총 test 10trial과 main trial 29번을 진행하여 39 trial을 진행하였다. 총 suger water는 3.5mL를 먹었고, 금일 푸룻룹은 1.5개를 먹었다. 주말동안 몸무게가 증가한 것을 감안하여 금일 pellet은 12g을 주었다.

#Rat No. 50 Group : comparison study of no reward vs negative feedback on learning Current weight : 458g(+21g) , Pellet/Water :12g Experiment time : 12:40 ~ 13:10 Stage : Quinine Test
마찬가지로 50번 또한 test에 들어가기 전에 suger water로 10 trial 적응 시간을 주었다. 50번은 첫 trial 부터 reward zone을 잘 찾는 모습을 보여주었다. main test에 들어간 뒤 첫 quinine(0.1mM)를 licking 했을 때 50번은 엄청난 거부 반응을 보였다. licking 하자마자 고개를 반대로 돌렸고, reward zone 반대편을 살피는 모습을 보여주었다. 그 후 test를 진행 후 quinine(1mM) trial에서 quinine을 licking한 뒤 주변을 살피더니 quinine을 먹지 않고 reward zone에서 계속 rearing을 진행했다. 다음 quinine trial도 마찬가지로 처음 licking하고 reward zone에서 rearing을 하는 모습을 보여주었다. 아마도 50번이 49번보다 quinine의 거부반응이 더 심한 것 같다. 금일 총 test 10trial과 main test 29trial 진행하여 39 trial를 진행하였다. 그리하여 suger water는 3.5mL를 섭취하였고, 푸룻룹은 1.5개를 먹었다. 주말동안 몸무게가 증가한 것을 감안하여 금일 pellet은 12g을 부여했다.

그렇다면 main tesk를 들어가기 전에 no reward 그룹과 negative feedback을 줄 그룹을 나눠야 한다. 사실 위 quinine test의 latency를 보면 quinine을 먹은 다음 suger water trial에서 latency가 별 차이가 없는 것을 2마리 모두 확인할 수 있다. 그리하여 그룹을 나누기 위해 실험자의 주관적인 개입이 없이 공평한 방법으로 그룹을 결정하기로 하였다. 2마리 쥐들의 이름을 작성하고 핀볼을 타서 마지막에 들어오는 핀볼의 쥐가 negative feedback을 주는 쥐로 결정하기로 했다.

핀볼 결과 LE50이 quinine group(negative feedback)을 주는 그룹으로 당첨되었다. 명일 main tesk부터는 49번은 no reward 50번은 negative feedback을 주는 그룹으로 나눠 진행하겠다.

추가로 명일부터 진행할 main tesk의 실험 방식에 대해 수민 선배님께서 flow chart를 만들어 주셨다. 크게 추가된 점은 쥐가 왼쪽으로 간 것인지 오른쪽으로 간 것인지 실험자가 commend키를 눌러주어야 하는 것이다. 왼쪽 오른쪽을 선택하게 된다면, 프로그램에서 틀린 것인지 맞은 것인지 판단해 준다. 추가로 프로그램을 실행시키기 전에 화면을 선택해야 하는 출력이 나오는데, 필자는 zebra와 pebbles가 나오는 사진을 사용할 것이기 때문에 1을 입력하고 enter를 눌러주었다. zebra는 왼쪽으로 갔을 때 suger water를 먹을 수 있고 pebbles는 오른쪽으로 갔을 때 suger water를 먹을 수 있게 설정되어 있다. 추가로 repetition기능이 추가되었는데, 쥐가 전 trial을 실패했을 때 R을 누르면 전 trial의 화면을 똑같이 보여주는 기능이다. 위 기능은 계속 틀리게 된다면 쥐가 한 방향으로 찍는 경우가 있을 수 있기 때문에 존재한다. 실험자가 판단하여 repetition 기능을 활용해야 하는데 명일부터는 아직 사용하지 않을 것이라고 설명해 주셨다. 명일부터 main tesk를 진행해야 하기 때문에 위 flow chart를 보며 직접 T-maze 환경에서 simulation 해보며 연습하였다.
2. DLC project
5마리의 각 쥐들의 실험영상을 한꺼번에 학습시킨 프로젝트의 학습이 오늘 마무리 되었다. 다중 영상을 가지고 학습시키는 프로젝트는 하나의 영상을 가지고 처리하는 방법과는 다른 점이 존재했다. 먼저 그 다른점을 설명해 보려고 한다.
먼저 yaml file의 설정이 다르다. yaml file로 DLC내 데이터를 설정해도 되지만, 다중 영상을 처리할 때는 yaml file을 실행하여 데이터를 설정하는 것을 추천한다. 그러한 이유는 gui내에서 데이터를 설정하면 scannerror가 발생한다.

영상 1개로 만든 project의 yaml file이다. video_sets:에 영상이 1개만 들어가 있지만, 다중 영상으로 만든 project는 video_sets:에 2개 이상의 영상이 들어가 있다. yaml file 특성 상 다중 객체문을 처리하지 못 하며, 이는 DLC 객체문법의 오류로 판단된다. 이러한 이유로 ScannError가 발생한다. ScannError가 발생하게 된다면, gui가 yaml file을 인식하지 못하는 문제가 발생해, DLC에서 학습을 진행하지 못하는 문제가 발생한다. 그러기 때문에 해결책으로는 다중 영상으로 project를 만들게 되면 video_sets에 존재하는 객체들의 문법을 바꾸어 주어야 한다.

위 문법이 project를 처음 만들게 되면 생성되는 yaml file내 video_sets:의 객체이다. 오류를 해결하기 위해 위 문법을 아래의 문법으로 변경해 주어야 한다. 각 경로 사이에 (역슬래쉬)를 1개 추가해 주고 ” “(큰 따옴표)로 영상의 경로를 감싸주어야 한다. 이렇게 문법을 변경하는 이유는 ” “로 묶어 각 영상의 경로가 충돌하는 것을 방지해 주려는 것이다. 위 문법으로 바꾸어 주면 ScannError가 해결된다. 하지만 문제가 한가지 존재한다.
DLC GUI에서 yaml데이터 save를 누르면 영상의 경로가 문법을 변경하기 전으로 돌아가 자동으로 저장된다. 문법을 변경하기 전으로 돌아가기 때문에 GUI에서 다음 단계로 넘어가면 다시 ScannError가 발생한다. 이 문제를 해결하기 위해서는 GUI에서 yaml 데이터를 고치는 것이 아닌, 사용자가 직접 yaml file를 실행시켜 코드를 수정 후 저장해야 한다.
실험자는 영상을 총 5개를 넣어 test를 진행했다. 먼저 학습을 진행하기 전에 frame을 추출해 labeling 할 수 있는 데이터를 만들어야 하기 때문에 numframe2pick을 1000을 주었다. 1000을 준 이유는 각 영상에서 200개씩 frame을 추출하여 총 1000개의 frame을 추출하고 싶었기 때문이다. DLC에서 다중 영상을 넣고 numframe2pick을 총 frame 개수로 넣으면 자동으로 각 영상에서 frame을 200개씩 추출해 준다는 정보를 얻고 1000으로 진행하였다.
하지만 numframe2pick을 1000으로 진행하니 200개씩 나눠 frame 추출이 이루어지는 것이 아닌 5개의 영상 각각 1000개의 frame이 저장되었고, 또한 하나의 folder에 저장되는 것이 아닌 각 영상의 folder를 만들어 1000개의 frame이 저장되었다. 그리하여 numframe2pick을 200으로 수정하여 다시 extract frame을 진행했다.

numframe2pick을 200으로 주면 총 1000개의 frame이 생성되지만 각 영상의 folder로 저장되는 것은 다르지 않다. 그리하여 하나의 영상폴더로 frame을 옮겨 1개의 folder로 만들어 주어야 한다. 그 후 labeling을 진행하기 위해 label frames을 눌러 하나의 folder로 합친 frame을 골라주면 5개의 영상의 labeling을 진행할 수 있다.
학습test의 설정은 labeling의 위치는 저번 test와 똑같이 진행했으며, batch size는 scale 0.5와 crf 31을 준 영상으로 학습을 진행할 것이기 때문에 4를 주었다. 또한 저번 test와 다른 점은 쥐의 nose가 hyper drive에 가려 보이지 않는 frame에서는 nose의 labeling을 진행하지 않았다. 그러나 labeling을 진행하지 않는다면 추후 output csv file을 보았을 때 nose의 labeling이 값이 없는 데이터로 찍혀 nose 위치를 정확히 판단할 수 없었다. 자료를 찾아보니 영상에서 원하는 위치가 보이지 않아도 사용자가 추정하여 label의 위치를 찍어주면 DLC가 추론하여 위치를 설정한다고 나와있다고 하여 hyper drive에 nose가 가려도 실험자가 위치를 추정하여 nose의 labeling을 진행하기로 하였다.
이번 test는 frame이 1000개 임에도 불구하고 학습시간이 3시간 정도 밖에 걸리지 않았다. batch size를 4를 주었음에도 불구하고 빠른 속도로 학습이 끝난 원인은 더 찾아보아야 할 것 같다.

먼저 원본영상인 해상도 1920*1080과 화질 23인 영상을 input으로 넣어 labeling된 영상을 추출해 보았다. 위 사진은 15분 24초에 쥐가 크게 움직일 때의 영상이다. 보면 hyper drive의 label과 쥐의 nose가 보이지만 label이 찍혀 있지 않는 문제가 보인다. 15분 24초만 label이 손상 된 것이 아닌, 다른 부분도 label이 제대로 찍히지 않는 문제가 많았다. 학습이 잘 못 된 것일까? 그리하여 다른 쥐 영상이지만 학습 데이터와 조건이 똑같은 영상을 input으로 넣어 다시 진행해 보았다.

위 영상은 해상도 960*540 그리고 화질을 31로 인코딩한 영상을 input으로 넣어 labeling된 영상을 추출한 결과이다. 학습에 사용한 영상의 설정과 똑같은 것이다. 영상을 보면 쥐가 움직여도 4개의 label이 잘 찍혀 있고 위치를 놓치지 않고 따라가는 결과를 보여주었다. 또한 쥐의 nose가 hyper drive에 가려있는 frame또한 추론하여 찍은 결과도 보여주었다. 이러한 결과를 본다면 학습에는 문제가 없다는 것을 알 수 있었다. 그리하여 LE923_1148영상을 학습에 사용한 영상 데이터와 동일 조건으로 인코딩하여 다시 labeling 된 영상을 얻어보았다.

왼쪽이 원본 영상을 가지고 label을 추출한 결과이며 오른쪽은 학습 영상과 동일한 조건으로 인코딩하여 label 영상을 추출한 결과이다. 같은 시간대인 15분 24초를 비교해 본다면 원본 영상에서는 label이 깨진 결과를 보여주지만 학습 영상과 동일한 조건으로 인코딩한 영상은 label이 잘 따라가 주는 결과를 보여주었다. 위 시간대 뿐만 아니라 다른 시간대에서도 label이 잘 찍혀있는 결과를 보여주었다. 위 test를 통해 학습에 사용한 영상의 설정과 input에 사용할 영상의 조건을 동일하게 설정해야 정확한 label 데이터를 얻을 수 있는 것을 알 수 있었다.
화질과 scale을 줄인다면, batch size를 올려 학습의 시간을 줄일 수 있지만 정확한 데이터를 얻기 위해서는 input영상과 학습 영상의 scale과 화질이 같아야 한다는 것이다. 또한 label을 설정할 물체가 보이지 않더라도 사용자가 위치를 추정하여 labeling을 진행하고 학습시키면, DLC에서 위치를 추론하여 labeling을 진행한다는 것을 알 수 있었다.