본문 바로가기
What I Learned

[WIL] Day 7

by 케찹이 2023. 5. 14.
반응형

 

<computer vision>

https://aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&aihubDataSe=realm&dataSetSn=59

해당 웹페이지에서 반려동물 행동데이터셋을 확보. 제목은 “반려동물 구분을 위한 동물 영상”인데 데이터보면 고양이랑 강아지 행동 분류 데이터임. 

여기서 어노테이션이 나는 바운딩박스 밖에 없는 줄 알았는데 여기는 몇가지 key point로 어노테이션을 해주었음. 

 

json파일이 주어졌는데 기존에 사용하던 Yolov5에서는 keypoint detection을 지원하지 않는듯 하다.

그래서 Yolov7-pose(이것도 오픈소스 제작한듯) 활용을 해서 yolo format으로 먼저 바꿔야할듯 하다.

Yolov7-pose 제작자분 설명 링크: https://www.youtube.com/watch?v=OP-oiDsEVzc

 

일단 영상 초반에는 cocoAnnoation tool사용 방법을 가르켜준다. 뭐 영상 설명대로 하면 되겠지만 나는 이미 keypoint 정보를 포함한 json format파일을 가지고 있다. 

그러고 나서 json format을 yolo형식으로 바꾸는 것을 알려주는데 중요한 것은 최종적으로 바뀐 yolo format의 형식이다. 최종적인 yolo format은 다음과 같다. 

 

<클라스ID> <바운딩박스X>  <바운딩박스Y> <바운딩박스W> <바운딩박스H> <키포1X> <키포1Y> 2 <키포2X> <키포2Y> 2 ….

 

그래서 이런 형식으로 바꾸고 뒤의 부분을 따라가면 되는데 이렇게 바꾸기전에 드는 문제 2가지.

  1. 키포인트가 null일때 잘 될까?
  2. 정규화 어떻게 함? 

 

일단 키포인트가 null일때는 제쳐두고 정규화를 어떻게 헸는지 살펴보자. 

일단 바운딩박스에 대한 normalize값은 다음과 같다. 

Normalized(X) = X/Image_Width

Normalized(Y) = Y/Image_Height

Normalized(w) = w/Image_Width

Normalized(h) = h/Image_Height

 

Normalized(kX) = kX / image_width

Normalized(kY) = kY / image_height

 

그리고 내 데이터의 클래스 id도 다시 살펴보자. 

가이드라인에 따라 개와 고양이의 행동은 각 13개, 12개가 있음. 그치만 위 포맷에서는 이를 따로 나누지 않아 그냥 총 25개 클래스 있는걸로 정하겠음.

0: (개) 머리를 앞으로 들이댐

1: (개) 두 앞발을 들어 올림

2: (개) 앞발 하나를 들어 올림

3:  (개) 몸을 턴다

4: (개) 엎드리기(몸체를 낮게 유지)

5: (개) 배와 목을 보여주며 누움

6: (개) 꼬리를 위로 올리고 흔듦

7: (개) 빙글빙글 돈다

8: (개) 마운팅

9: (개) 꼬리가 아래로 향함

10: (개) 앉기

11: (개) 몸을 긁음

12: (개) 걷거나 뜀

13: (고) 납작 엎드림

14:(고) 발을 숨기고 웅크리고 앉음

15: (고) 그루밍함

16: (고) 좌우로 뒹굴음

17: (고) 머리를 들이댐

18: (고) 배를 보임

19: (고) 꼬리를 흔든다

20: (고) 앞발로 꾹꾹 누름

21: (고) 허리를 아치로 세움

22: (고) 옆으로 누워 있음

23: (고) 팔을 뻗어 휘적거림

24: (고) 걷거나 뜀

 

이제 해야될게 제공하는 모든 데이터를 다운받고 주어진 json format을 yolo format으로 변환하는 작업읋 할것.

주어진 json format의 파일에서 필요한 값은 metadata안의 action. Height, width. frame_number, keypoints값들, 그리고 bounding_box값들이다. 

문제점들. 각 파일을 들어가서 들어가서 json파일들어가서 여기 있는거 다 스크랩하고 이거하고 저거하고 이러면 컴퓨터 안터질까? 잘돌아가긴 할까 코드가???

 

  1. 일단 코드에서 각 폴더를 뒤져서 json파일들 내용을 스크랩하는걸 만듬. 다만 각 텍스트 파일이름을 아직 지정을 안해줌.
  2.  

json 형식 예시:

{
"file_video": "20201029/cat-footpush-000231.mp4", 

"metadata": { 

"seq": 231,
"species": "CAT",
"action": "앞발로 꾹꾹 누름", 

"location": "실내", 

"height": 1280, 

"width": 720, 

"duration": 18.276151, 

"animal": { 

"breed": "코리안 숏헤어", 

"gender": "MALE", 

"age": 2, 

"neuter": "Y" 

}, 

"owner": {
"pain": "N", 

"disease": "N", 

"emotion": "편안/안정", 

"situation": "편안히 쓰다듬어 줄 때", 

"animalCount": 1 

}, 

"inspect": { 

"action": "앞발로 꾹꾹 누름", 

"painDisease": "N", 

"abnormalAction": "N", 

"emotion": "편안/안정" 

} 

}, 

"annotations": [ 

{ 

"frame_number": 187,
"frame_url": "https://dashboard.datamaker.io/media/task/raw_data/a9288d61-b6e6- 4932-bf0d-34ee50c17085.jpg", 

"timestamp": 9389, 

"keypoints": { 

"1": { 

"x": 380, 

"y": 583 

}, 

"2": {
"x": 384, 

"y": 484 

}, 

"3": null, 

"4": null, 

"5": null, 

"6": { 

"x": 341, 

"y": 633 

}, 

"7": {
"x": 465, 

"y": 627 

}, 

"8": {
"x": 275, 

"y": 834 

}, 

"9": null, 

"10": null, 

"11": null, 

"12": null, 

"13": null, 

"14": { 

"x": 647, 

"y": 538 

}, 

"15": null 

}, 

"bounding_box": { 

"x": 223, 

"y": 367, 

"width": 496, 

"height": 512 

} 

}, 

 

] 

} 

 

  • 정규화 아직 안시켰고
  • 만들어낸 파일 이름 아직 안정함. -> 비디오의 이름이랑 프레임 값 저장을 아직 안함. 주어진 파일에서는 각 이미지들이 다른 이름의 폴더에 저장이 되어있고 같은 frame값과 timestamp값을 가져서 폴더안의 사진이름은 다르지만 다른 폴더와는 이름이 겹침. ㅈ됨. 그래서 비디오 이름도 스크랩해야됨.  

일단 이전까지 한거 잘되는지 테스트부터 해봐야됨. (Ok 테스트 잘 됐음)

 

그럼 일단은 정규화를 시켜보자. (다함)

 

앞으로 해야할것:

  1. 만들어진 yolo 텍스트 파일 이름 정해주기, 동시에 기존 이미지 이름 바꾸기
  2. Key point null값에 대한 대응책…

 

잠깐 실제 데이터에서 json이름이 다르다. ㅈ됨. 

반응형

'What I Learned' 카테고리의 다른 글

[WIL] Day 9  (1) 2023.05.16
[WIL] Day 8  (0) 2023.05.14
[WIL] Day 6  (0) 2023.05.13
[WIL] Day 5  (0) 2023.05.12
[WIL] Day 4  (0) 2023.05.10

댓글