• 카테고리

    질문 & 답변
  • 세부 분야

    컴퓨터 비전

  • 해결 여부

    미해결

YOLO v3 탐지 큰 이미지에 적용

21.08.16 22:19 작성 조회수 797

0

안녕하세요. 이전에 항공사진에서 나무를 찾는 프로젝로 질문을 드렸었는데요.
제가 사용한 이미지는 23160*28750 크기의 .tiff 파일로, 해당 이미지를 500*500 크기의 이미지로 자른 뒤,
그 중 약 50여개의 분할된 이미지로부터 CVAT을 활용해 class : tree 에 대한 annotation을 약 300개 만든 후 train 하였습니다.
500*500으로 자른 이미지에 inference 했을 땐, 일부 탐지에 성공하였으나, 원본 이미지 (23160*28750) 에 사용 시, 하나도 탐지해내지 못했습니다.
이처럼 해상도의 차이가 큰 이미지에 적용할 때 탐지가 되지 않는 이유는 무엇인가요?
그리고 해결방안이 있는지도 여쭤봅니다. 감사합니다 :)
※코드는 'yolov3_train_incredibles.ipynb' 코드를 활용하여 작동하였습니다.

답변 1

답변을 작성해보세요.

0

안녕하십니까, 

오, 이렇게 큰 이미지도 있군요. 제가 이렇게 큰 이미지를 적용해 본적은 없지만,

먼저 23k x 28k 이미지를 500x500 이미지를 잘랐다는 것이 crop 을 이용해서 특정 부분만 도려 내었다는 건가요? 아님 23k x28k 이미지 전체를 resize해서 500x500 이미지로 만들었다는 것인가요? 

만약 resize로 23k x 28k 를 500x500 이미지를 줄였다면 Detect할 Object가 상당히 작아져서 Detect가 잘 안될 것 같습니다만(일부 검출이 되었다고 하신걸로 봐서는 crop 등으로 특정 부분만 도려낸것 아닌가 생각해 봅니다)

마찬가지로 원본 이미지 23k x 28k 이미지를 아래 명령어로 학습 시키면 자동으로 이미지를 640x640으로 resize하기 때문에 Detect 할 Object가 너무 작아져서 Detect가 잘 안될 것으로 생각됩니다.  

cd /content/yolov3; python train.py --img 640 --batch 8 --epochs 150 --data /content/incredibles/incredibles.yaml --weights yolov3.pt \

                                    --project=/mydrive/ultra_workdir --name incredibles --exist-ok 
어떻게 500x500 이미지를 적용한 것인지, 원본 이미지는 어떻게 적용한 것인지 상세히 기술 부탁드립니다.

redsharks님의 프로필

redsharks

질문자

2021.08.17

네 원본이미지를 500*500 크기의 개별 이미지로 크롭하였고, 그 결과 2천개 이상의 개별 .tif 파일이 생성되었습니다.

트레이닝은 크롭된 500*500 크기의 약 60여개의 이미지들(전체 중 일부)에 CVAT을 사용해 200개 이상의 annotation을 설정한 뒤 진행하였습니다.

그리고 test를 위해 사용한 원본이미지(23k * 28k)에 선생님이 써놓아주신 코드를 실행하였습니다.

그러면 말씀대로라면, 테스트 코드 실행 시 640 대신 28k 이상의 값을 입력 후 실행해야 하는건가요?

28k 정도의 큰 이미지를 감당할 GPU 메모리가 있을지 모르겠습니다. 

img는 1280 또는 2560 정도로 설정하시고, batch는 1로, 그리고 epochs는 30 정도로 해서 학습을 시켜 보시지요. 

--img 1280 --batch 1 --epochs 30

redsharks님의 프로필

redsharks

질문자

2021.08.17

네 선생님 그럼 500*500으로 잘린 이미지를 train 시에는 

cd /content/yolov3; python train.py --img 1280 --batch 1 --epochs 30 --data /content/incredibles/incredibles.yaml --weights yolov3.pt \

다음과 같은 코드를 사용하고, 

디텍트 할 때에는, 원본이미지(origin.tif)를 사용해 다음과 같은 코드를 실행해보면 되는걸까요?

아니면, 원본이미지도 특정크기로 자른 뒤 해당 개별이미지마다 디텍트를 실행하면 될까요?

!cd /content/yolov3;python detect.py --source /content/gdrive/MyDrive/origin.tif \
                           --weights /content/result/ortho/weights/best.pt --conf 0.3 \
                           --project=/content/gdrive/MyDrive/result --name=run_image --exist-ok --line-thickness 2

원래 제 의견은 원본 이미지를 학습시 img 1028 을 권장 드린것 입니다만,,, 위에서 적어 주신대로도 한번 학습해 보시기 바랍니다. 

그리고 detect시 원본 이미지를 특정 크기로 자르면, 원래 detect하려는 이미지가 원본인데, 목적하시려는 바와 다르지 않을까 싶습니다.  detect 시에는 자동으로 detect 하려는 이미지를 학습된 network 크기로 resize합니다.