🔴 공부할 영상 및 링크주소
- 🟠 DNN, CNN, YOLO, ResNET
https://www.youtube.com/watch?v=HAhMy6St7oc- 🟡 YOLO ver_4 인공지능 주차장 차단기 만들기 + 번호판 인식
https://www.youtube.com/watch?v=mmFrZV1iH0c- 🟢 YOLO ver_5 학습 튜토리얼
https://www.youtube.com/watch?v=T0DO1C8uYP8- 🔵 YOLO ver_7 딥러닝 영상분류/영상인식
https://www.youtube.com/watch?v=c18ILApJ1OU- 🟣 YOLO ver_7 상위버전
https://github.com/WongKinYiu/yolov7
🟢 YOLO ver_5 학습 튜토리얼 (1)
◾ 준비사항
- Yolo 데이터 셋 형태 (선행 지식)
- Yolo v5 커스텀 데이터셋 학습 (득템 가능 지식)
- Colab (필요한 아이템)
🟢 YOLO ver_5 학습 튜토리얼 (2-1)
◾ 데이터-셋
(1) roboflow 사이트 접속
https://public.roboflow.com/
(2) Object detection 클릭
(3) Pistols Dataset > 2973 images 클릭
(4) Format에서 YOLO v5 PyTorch 선택 > show download code 클릭 > continue
(5) "GPU를 사용할 수 있도록 환경 변경하기" 구글로 로그인 후 colab 접속 > 위 상단 메뉴에서 런타임 > 런타임 유형변경 > 노트설정: 하드웨어 가속기를 GPU 선택 > 저장
🟢 YOLO ver_5 학습 튜토리얼 (2-2)
◾ (1) 코드 작성 : 파일 압축풀기# 파일 압축 풀기 !curl -L "https://public.roboflow.ai/ds/WKkUorQ71T?key=wIBAdyawPa" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip
🟢 YOLO ver_5 학습 튜토리얼 (2-3)
◾ (2) images & labels 확인
- 왼쪽에 export > images를 클릭하면 권총 이미지를 확인할 수 있다
- 왼쪽에 export > labels를 클릭하면 권총 이미지에 대한 레이블을 확인 할 수 있다
- 레이블은 class x y width height로 값이 지정되어 있다
🟢 YOLO ver_5 학습 튜토리얼 (2-4)
◾ (3) 왼쪽 폴더 창에서 dataset 폴더 생성 > export 폴더, REASME.dataset, REASME.roboflow, data.yaml 파일 옮기기
🟢 YOLO ver_5 학습 튜토리얼 (2-5)
◾ (4) YOLO ver_5를 깃 클론에서 받는다# git clone에서 yolov5를 받는다 %cd /content !git clone https://github.com/ultralytics/yolov5.git
- yolov5 폴더가 생성된 것을 확인할 수 있다
🟢 YOLO ver_5 학습 튜토리얼 (2-6)
◾ (5) yolov5를 위한 패키지 설치하기# yolov5 디렉토리로 이동 %cd /content/yolov5/ # yolov5를 위한 패키지 설치하기 !pip install -r requirements.txt
🟢 YOLO ver_5 학습 튜토리얼 (2-7)
◾ (6) 데이터 셋 yaml 파일 확인# 데이터 셋 (data.yaml)이 어떤 것을 포함하고 있는지 확인 %cat /content/dataset/data.yaml # nc = class의 개수 # names = class의 이름 # train & val & nc & names를 지정해줘야 하는데, 경로가 잘못 되어있어 수정이 필요하다
🟢 YOLO ver_5 학습 튜토리얼 (2-8)
◾ (7) 이미지 장수 확인# 디렉토리를 루트로 변경 %cd / # glob 패키지 import 하기 from glob import glob # 모든 이미지를 가져오기 img_list = glob('/content/dataset/export/images/*.jpg') # 이미지는 총 2971장 print(len(img_list))
🟢 YOLO ver_5 학습 튜토리얼 (2-9)
◾ (8) train & val 나누기 & 개수 확인# train & val 나누기 위해 모듈 import from sklearn.model_selection import train_test_split # train_test_split() --> trainset(80%) & testset(20%)로 나눈다 train_img_list, val_img_list = train_test_split(img_list, test_size=0.2, random_state=2000) # train_img_list(2376) & val_img_list(595) 개수 출력 print(len(train_img_list), len(val_img_list))
🟢 YOLO ver_5 학습 튜토리얼 (2-10)
◾ (9) train_img & val_img의 경로를 txt 파일로 저장# train_img의 경로를 txt 파일로 저장 with open('/content/dataset/train.txt', 'w') as f: f.write('\n'.join(train_img_list) + '\n') # 리스트로 되어 있으니 join 하기 # val_img의 경로를 txt 파일로 저장 with open('/content/dataset/val.txt', 'w') as f: f.write('\n'.join(val_img_list) + '\n')
🟢 YOLO ver_5 학습 튜토리얼 (2-11)
◾ (10) train & val 이미지 경로 변경# yaml 모듈 import import yaml # 아래의 파일을 오픈해서 읽어주기 with open('/content/dataset/data.yaml', 'r') as f: data = yaml.safe_load(f) # load로 하면 에러발생하여 safe_load로 작성함 print(data) data['train'] = '/content/dataset/train.txt' data['val'] = '/content/dataset/val.txt' with open('/content/dataset/data.yaml', 'w') as f: yaml.dump(data, f) print(data) # 원래는 train/images 였는데, content/dataset/train.txt로 변경됨 # 원래는 val/images 였는데, content/dataset/val.txt로 변경됨
🟢 YOLO ver_5 학습 튜토리얼 (2-13)
◾ (12) 이미지 training(훈련)# yolov5 설치한 곳으로 가기 %cd /content/yolov5/ # train 시켰던 파일로 가서 실행 # img = 416 사이즈, batch = 16, epochs = 50번 # cfg 모델의 구조를 나타냄 (위치 : yolo5 > models > yolov5l-가장큼/yolov5m-중간크기/yolov5s-작음/yolov5x-가장작음) !python train.py --img 416 --batch 16 --epochs 50 --data /content/dataset/data.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name gun_yolov5s_results
- yolo5 > runs > gun_yolov5s_results > test_batch0_pred.jpg를 클릭
- test_batch의 예측데이터 이미지를 볼 수 있다
🟢 YOLO ver_5 학습 튜토리얼 (2-14)
◾ (13) 텐서보드로 학습 결과 보기# 텐서보드로 학습 결과 보기 %load_ext tensorboard %tensorboard --logdir /content/yolov5/runs/
- 텐서보드 학습 결과 확인 (그래프)
🟢 YOLO ver_5 학습 튜토리얼 (2-15)
◾ (14) 테스트 데이터로 추론하기# 테스트 데이터로 추론하기 from IPython.display import Image import os val_img_path = val_img_list[4] !python detect.py --weights /content/yolov5/runs/exp0_gun_yolov5s_results/weights/best_gun_yolov5s_results.pt --img 416 --conf 0.5 --source "{val_img_path}" Image(os.path.join('/content/yolov5/inference/output', os.path.basename(val_img_path)))