Data Mavericks

[YOLOv7 사용법] YOLOv7 Custom.ver 설치&실행 (egg.2) 본문

CI

[YOLOv7 사용법] YOLOv7 Custom.ver 설치&실행 (egg.2)

권동동 2023. 7. 13. 16:16

 

https://github.com/WongKinYiu/yolov7

 

GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time

Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors - GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of...

github.com

 

git clone https://github.com/WongKinYiu/yolov7.git

위 git을 터미널에 쳐서 설치

 

YOLOv7(yolov7.pt) 와 yolov7_training.pt도 git에서 다운 받아줌

처음 git한 파일에 압출 풀어주기

 

# COCO 2017 dataset http://cocodataset.org
# download command/URL (optional)
download: bash ./scripts/get_coco.sh
train: data/train.txt
val: data/valid.txt
test: #./coco/test-dev2017.txt
# 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794
# number of classes
nc: 3
# class names
names: [ 'egg', 'fried_egg', 'boiled_egg' ]

 

customdataset이기 때문에 새로운 yaml파일 생성하여 custom.yaml 생성

nc : class 개수와 names 수정

 

train.txt(학습할 사진 위치 저장)와 valid.txt(test해볼 사진 위치 저장)를 생성

data는 egg라벨링 이전 포스트에서 라벨링한 eggs를 사용함

 

# parameters
nc: 3 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple

# anchors
anchors:
  - [12, 16, 19, 36, 40, 28] # P3/8
  - [36, 75, 76, 55, 72, 146] # P4/16
  - [142, 110, 192, 243, 459, 401] # P5/32

# yolov7 backbone
backbone:
  # [from, number, module, args]
  - [-1, 1, Conv, [32, 3, 1]] # 0
  - [-1, 1, Conv, [64, 3, 2]] # 1-P1/2
  - [-1, 1, Conv, [64, 3, 1]]
  - [-1, 1, Conv, [128, 3, 2]] # 3-P2/4
  - [-1, 1, Conv, [64, 1, 1]]
  - [-2, 1, Conv, [64, 1, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [[-1, -3, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [256, 1, 1]] # 11
  - [-1, 1, MP, []]
  - [-1, 1, Conv, [128, 1, 1]]
  - [-3, 1, Conv, [128, 1, 1]]
  - [-1, 1, Conv, [128, 3, 2]]
  - [[-1, -3], 1, Concat, [1]] # 16-P3/8
  - [-1, 1, Conv, [128, 1, 1]]
  - [-2, 1, Conv, [128, 1, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [[-1, -3, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [512, 1, 1]] # 24
  - [-1, 1, MP, []]
  - [-1, 1, Conv, [256, 1, 1]]
  - [-3, 1, Conv, [256, 1, 1]]
  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, -3], 1, Concat, [1]] # 29-P4/16
  - [-1, 1, Conv, [256, 1, 1]]
  - [-2, 1, Conv, [256, 1, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [[-1, -3, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [1024, 1, 1]] # 37
  - [-1, 1, MP, []]
  - [-1, 1, Conv, [512, 1, 1]]
  - [-3, 1, Conv, [512, 1, 1]]
  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, -3], 1, Concat, [1]] # 42-P5/32
  - [-1, 1, Conv, [256, 1, 1]]
  - [-2, 1, Conv, [256, 1, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [[-1, -3, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [1024, 1, 1]] # 50

# yolov7 head
head:
  - [-1, 1, SPPCSPC, [512]] # 51
  - [-1, 1, Conv, [256, 1, 1]]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [37, 1, Conv, [256, 1, 1]] # route backbone P4
  - [[-1, -2], 1, Concat, [1]]
  - [-1, 1, Conv, [256, 1, 1]]
  - [-2, 1, Conv, [256, 1, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [256, 1, 1]] # 63
  - [-1, 1, Conv, [128, 1, 1]]
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [24, 1, Conv, [128, 1, 1]] # route backbone P3
  - [[-1, -2], 1, Concat, [1]]
  - [-1, 1, Conv, [128, 1, 1]]
  - [-2, 1, Conv, [128, 1, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [-1, 1, Conv, [64, 3, 1]]
  - [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [128, 1, 1]] # 75
  - [-1, 1, MP, []]
  - [-1, 1, Conv, [128, 1, 1]]
  - [-3, 1, Conv, [128, 1, 1]]
  - [-1, 1, Conv, [128, 3, 2]]
  - [[-1, -3, 63], 1, Concat, [1]]
  - [-1, 1, Conv, [256, 1, 1]]
  - [-2, 1, Conv, [256, 1, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [-1, 1, Conv, [128, 3, 1]]
  - [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [256, 1, 1]] # 88
  - [-1, 1, MP, []]
  - [-1, 1, Conv, [256, 1, 1]]
  - [-3, 1, Conv, [256, 1, 1]]
  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, -3, 51], 1, Concat, [1]]
  - [-1, 1, Conv, [512, 1, 1]]
  - [-2, 1, Conv, [512, 1, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [-1, 1, Conv, [256, 3, 1]]
  - [[-1, -2, -3, -4, -5, -6], 1, Concat, [1]]
  - [-1, 1, Conv, [512, 1, 1]] # 101
  - [75, 1, RepConv, [256, 3, 1]]
  - [88, 1, RepConv, [512, 3, 1]]
  - [101, 1, RepConv, [1024, 3, 1]]
  - [[102, 103, 104], 1, IDetect, [nc, anchors]] # Detect(P3, P4, P5)

위와 같이 yolov7-custom.yaml도 생성해준다

위의 nc값만 주의

 

터미널 창에

python train.py --workers 8 --device 0 --batch-size 8 --data data/custom.yaml --img 512 512 --cfg cfg/training/yolov7-custom.yaml --weights 'yolov7_training.pt' --name yolov7-custom --hyp data/hyp.scratch.custom.yaml

하면 끝

 

TypeError: No loop matching the specified signature and casting was found for ufunc greater

발생시 혹은 그냥 안되면

pip install --upgrade numpy==1.23.5

numpy버전을 지정해주면 해결된다

 

 

정상적으로 실행

학습 후 저장된 결과의 경로가 출력된 모습

python3 detect.py --weights runs/train/yolov7-custom2/weights/best.pt --conf 0.25 --img-size 640 --source data/img/1.jpg

를 터미널에 입력해주면

 

위치를 반환해주는데 해당위치로 간다면

 

학습 시키지 않은 이미지도 넣어보겠다

 

python3 detect.py --weights runs/train/yolov7-custom2/weights/best.pt --conf 0.25 --img-size 640 --source data/img/valid/ --save-txt --save-conf --exist-ok --name result

를 터미널에 입력

 

위치를 반환하는데 해당 위치로 가보면

3가지 유형 다 잘 나오는 모습을 확인할 수 있다