티스토리 뷰

DL

[DL] Yolo일지

PeonyF 2023. 4. 14. 12:56
반응형
  • yolo v3 github있는걸로 한번 해봤을때 주황버섯인형이 사람으로 가끔 나온다.

  • 핸드폰 화면을 비줘서 했을때 판정을 한다

  • 정확도가 좀 떨어지는것같아서 yolov3에서 yolov5로 변경하고 진행했다.

→ \yolov5\data\coco128 의 class의 nc수와 names 변경 및 data path변경

 

  •  학습을 되었지만 detect 데이터셋을 물고기를 가져와야하나 잘못 가지고 와서 detect하고 있었다..

 → weight가 초기에 yolov5s로 세팅이 되어있어서 학습된 최고의 weight 결과값인 best.pt를 넣어서 진행해야함.(학습시킬때마다 학습시킨 최적의 가중치가  다를 수 있으므로 매번 해당 학습 결과 폴더(exp)에서 가져와야한다.)

 

  • detect dataset은 물고기인데, 실제 탐지는 기존 yolo모델로 되었다 (펭귄을 person으로 나온다니 충격)

        →  weight를 학습한 best 가중치로 가져와야하는데 실수로 yolov5s로 넣었다..(위의 실수와 같음 위: detect의 가중치 안바꿈, 아래: train의 가중치 안바꿈)

  • 학습 후 detect시 아무런 결과값이 출력되지 않아 확인해보니 source 경로를 잘못잡았었다.  
      data/images -> data/images/train2017/valid

 

  •  학습을 했을때 detect 정확도가 높지 않았다.

  • 아래와 같은 조치를 취함

weight : yolov5s →yolov5l : 모델이 깊고 복잡하다는건(l가 제일 복잡) 그만큼 많은 데이터를 필요,성능 우수할 수 있으나 우리가 적정량의 데이터를 가지고 적정한 퀴즈를 푼다 했을때 꼭 무겁고 큰 구조만 좋은게 아니여서 s,m,l 모델들을 모두 돌려봄

  • yolo v5는 s, m, l, x의 4가지 버전이 있음
  • s가 가장 가벼운 모델
  • x가 가장 무거운 모델
  • 당연히 s가 성능이 제일 낮지만 FPS가 가장 높고, x가 성능이 제일 높지만 FPS는 가장 낮습니다.
  • 자세히 보는 만큼 느리고 대충 보는만큼 빠르다

Gpu의 한계때문에 아래와 같이 train의 setting 변경 

epochs : 300 -> 100
batch size : 16 →8 (batch size는 train시에 속도가 느려서 하는것, detect는 상관없다(한잘씩 프레임 단위로 추론하기 때문)
image size : 640 -> 320 (이미지 size가 640 해상도가 클수록 -> 모델 학습 증가, 판단 증가 but 속도 느려짐)

 

 

+ detect는 이미지 사이즈와 관련있어서 320x320(320x320x3 = 307200 -> 640x640(640x640x3 채널 = 1228800) 변경시 속도가 느려진다.
+ train의 목표: 좋은 가중치를 구해서 모델에 넣는다.

 

 새로운 custom data로 변경 결과내용

Data양이 적어서 정확도가 떨어진다고 판단, 새로운 custom data로 변경함. 2576개 train image, 736개 validataion image. 

*특이 사항

2차 시도(회사) :  epoch:200 image size:320 batchsize: 16 (train : 16, val:16) → 정확도가 이전보다 높아졌지만, 여전히 잘못 탐지하는 부분들이 있음
161x16=2576 ,23x16 = 368 -> val의 batchsize가 안맞는다.
*batch size가 validation에 안맞는이유 : yolo의 경우 multiple gpu를 사용하기때문에 홀수일 경우를 비추천한다고 한다. 버그인줄알고 찾던 내 하루가 날라갔다.. 
(https://github.com/ultralytics/yolov5/issues/2491)
그래서 validation시 "
batch_size = batch_size // WORLD_SIZE * 2" 로 해서 2를 한번 더 나눠주기 때문에 validation이 /2가 된 상태에서 진행.(실제로는 모두 학습함).
but 왜 train은 "batch_size = batch_size // WORLD_SIZE * 2"을 따르지 않는지 질문할 예정

 

   Epoch   gpu_mem       box       obj       cls    labels  img_size
   199/199        0G   0.03224   0.05265   0.05606        27       320: 100%|██████████| 161/161 [18:19<00:00,  6.83s/it]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 23/23 [01:33<00:00,  4.06s/it]
                 all        736        738      0.971      0.959      0.979      0.676
                 cat        736        251      0.993      0.968      0.984      0.759
                 dog        736        487      0.949       0.95      0.974      0.594

*Best 결과 값

5차 시도 :  epoch:300 image size:320 batch size: 32 (train : 32, val:32) :세세한것까지 잡음. 학습제일 잘된것같다.

   Epoch   gpu_mem       box       obj       cls    labels  img_size
   299/299        0G   0.02592   0.04432    0.0248        41       320: 100%|██████████| 81/81 [17:36<00:00, 13.05s/it]
               Class     Images     Labels          P          R     mAP@.5 mAP@.5:.95: 100%|██████████| 12/12 [01:34<00:00,  7.87s/it]
                 all        736        738       0.99      0.966      0.986      0.756
                 cat        736        251          1      0.976      0.986      0.828
                 dog        736        487      0.981      0.957      0.986      0.684

 

*결과에 대한 생각 및 조사

  1. loss값에 대한 표에서 train,val의 표가 꼭 겹치지 않아도 과적합이 아니다. → 결과값에 있는 epoch 100을 제외한 표들은 모두 데이터가 잘나왔다라는 뜻
  2. P,PR,R의 커브가 ㄱ 로 바로 떨어지는것은 epoch이 적어서 lr이 빠르게 학습했기 때문이다. → epoch이 300대로 늘어났을 경우에는 원만한 커브 모양이 나옴
  3. detect의 결과가 이상할 경우 image의 label이 잘 되어있는지 얼굴이 명확하지 않는 것들은 해당 image를 제거하는게 좋다.
  4. 0.83등 높은 수치로 detect하기 때문에 좋은 결과. 다만 %로 값을 바꾸면 좋을꺼같다.
  5. 1번같이 여러개가 나오는건 학습이 너무 자잘하게 이뤄져서이다. (맞는지 재확인 필요)
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함