Deep Learning

Yolo V5 Training with CrowdHuman Dataset

해시브라우니 2024. 2. 14. 02:10

벌써 Yolo에 관한 5번째 포스팅이네요.

이번엔 저희 프로젝트 주제인 가려짐에 강인한 Yolo를 구현하기 위해 가려진 물체가 존재하는 Dataset을 찾아서 적용하였습니다. 

적용할 Dataset은 CrowdHuman Dataset이고, 아래 링크를 참고 해주세요

https://www.crowdhuman.org/

 

CrowdHuman Dataset

Volume, density and diversity of different human detection datasets. For fair comparison, we only show the statistics of training subset. Comparison of the visible ratio between our CrowdHuman and CityPersons dataset. Visible Ratio is defined as the ratio

www.crowdhuman.org

또 Annotation이 어떤 형식인지 찾아봐야했습니다.

Annotation은 Yolo는 txt형태인걸 지금까지 해왔으니 알 수 있고, 새로운 데이터의 annotation은 odgt파일 인것을 확인할 수 있습니다.

odgt파일을 txt형태로 변경해주는 code를 찾았고 그걸 적용했습니다. (감사합니다)

https://github.com/yaluruns/CrowdHuman2YOLOformat

 

GitHub - yaluruns/CrowdHuman2YOLOformat: convert CrowdHuman .odgt file to YOLO label format

convert CrowdHuman .odgt file to YOLO label format - yaluruns/CrowdHuman2YOLOformat

github.com

코드를 먼저 수정할 부분은 수정하였습니다. 45번째 line이 원본 코드인데 이 부분에선 현재 디렉토리에서 image폴더/.. 등등 사전에 작성한 분의 경로로 되어 있기 때문에 유사하게 저의 경로에 맞도록 변경하였습니다.

그 이후는 동일합니다.

그러면 기존에 odgt파일이 txt로 변경되는 것을 확인할 수 있습니다.

odgt to yolo txt

이렇게 Train과 Validation set을 모두 준비하여 학습 Dataset을 마련합니다. 구조는 Yolo와 동일한 구조로,

├── Crowdhuman
  └── images
    └── train
    	val
    
  └── labels
    └── train
    	val

 

위와 같이 꾸렸습니다.

학습을 위해선 yaml파일의 생성도 필요하고, 사용되는 class는 총 2개임을 인지한채로 생성을 시작합니다. coco.yaml의 구성을 참고해 train과 val경로를 정하였구요.

 

이게 끝입니다. 간단하죠?

그럼 yaml파일 생성도 다했고, Data도 준비가 다 되었으니 시험삼아 학습을 진행해보도록 합시다.

제가 적용한 Augmentation은 기존에 구현해봤던 Gridmask를 사용하고, Cutout은 사용하지 않는 방향으로 학습을 진행할 것입니다. Batch size는 몰랐는데 -1을 입력시 가장 최적화된 batch size를 적용해준다고 합니다. 그래서 이번엔 batchsize를 계산에 맡겼습니다. 

python train.py --batch-size -1 --img 640 --epochs 1 --data crowdhuman.yaml --weights '' --cfg yolov5n.yaml --device 0

 

그랬더니 batchsize를 105로 잡아주더라구요. 기존에 한게 16인가 32인가 그런데 이게 과연 좋은 건지는 어느게 더 괜찮은지는 맞춰놓고 해봐야할 것 같습니다. 

그래서 1번 돌려본 결과 중간에 Warning이 발생하는 것도 확인했고 

yolov5_project\datasets\crowdhuman\images\train\273275,1104c1000d6cced60.jpg: ignoring corrupt image/label: negative label values [   -0.00625    -0.01875]

 

이런 것같이 label좌표가 음수인 부분이 있는데 여기서 이 부분을 어떻게 처리하는지 그 부분을 다음번에 한번 생각해봐야할 것 같습니다. -라함은 이미지를 넘는다는 얘기같은데 그럼 전부 0으로 처리해주는지? 가 제 생각입니다. 그래서 1에폭에 약 8분이라는 시간이 걸리고 잘 돌아갔는지 확인해본 결과?

 

잘 들어간 것을 확인할 수 있습니다! (label도 그렇고 gridmask도 그렇고)

성공적으로 Crowdhuman dataset으로 학습 시험을 마쳤으니 실제로 100Epoch정도를 돌려서 진행을 해보고, Cutout으로도 같은 과정을 해서 결과를 비교해보도록 하겠습니다. 

아마 그 글이 Yolo에 대한 마지막 글이 될 것 같네요.