종종 긴 횡단보도나 교차로를 신호등 시간 내에 이동하지 못하시거나, 이동하시는데 위험한 상황을 격으시는 교통약자분들을 본 적이 있었다. 이런 경험을 없애고 교통약자분들도 안전한 야외활동을 할 수 있도록 도와주자는 생각으로 이번 프로젝트를 진행하였다. 처음 시작할 때의 목표는 대표적인 교통약자분들을 모두 인식하여 도움을 주자는 생각을 하였지만, 부족한 데이터로 인해 낮은 정확도를 보일 바에는 우선 많은 데이터를 가져올 수 있는 label만 가지고 모델을 구성해보자는 목표를 변경하여 진행했다.
프로젝트 목표
휠체어와 목발 이용자들이 횡단보도를 이동하면 카메라가 인식하여, 신호등 시간을 추가시키도록 도와주자.
프로젝트 계획
1. 휠체어와 목발 데이터를 google에서 크롤링한다.
2. 이미지 데이터에 인식할 물체에 라벨링 작업을 진행하였다.
3. 크롤링한 데이터로 부족할 것이 분명하니, agumentation을 진행한다.
4. yolo v5 모델에 데이터를 넣어 결과를 확인해 본다.
5. 결과값이 아쉽다면, 데이터를 다시 정제하거나, 모델 파라미터를 바꾼 후 진행해본다.(반복)
6. 실제 유튜브 영상에서도 잘 인식하는지, 그리고 webcam에서도 인식을 잘하는 지 확인해본다.
** 이전 글까지는 augmentation을 진행하였다. **
이번 글에서는 yolo v5 모델 선정이유, 결과 도출 실제 영상에서 인식 진행을 설명하겠다.
지금부터는 colab을 사용하여 분석을 진행하였다.
colab에서는 런타임이 있어 초기화가 자주되기때문에, google drive를 활용하여 data를 저장해두는 방법이 있다.
아래 코드로 활용 가능하다.
from google.colab import drive
drive.mount('/content/drive')
Yolo v5 model
local을 활용하여 yolo v5의 git 사이트를 불러온다.
%cd /content
!git clone https://github.com/ultralytics/yolov5.git
git 사이트에 있는 requirements.txt에는 이 모델을 분석하기 위한 패키지들이 들어가 있다.
그렇게 pip를 통해서 requirements.txt를 읽고 안에 있는 패키지들을 install한다.
%cd /content/yolov5/
!pip install -r requirements.txt
Yolo v5 Dataset 구성 - yaml 파일 제작
학습할 데이터의 경로, 클래스 갯수 그리고 종류를 적어 놓는 yaml 파일을 제작해야한다.
- train : 학습 데이터 폴더 경로
- val : 검증 데이터 폴더 경로
- nc : 학습할 클래스 갯수
- names : 학습할 클래스 이름들
%cat /content/drive/MyDrive/dataset/data.yaml
Yolo v5 Dataset 불러오기
이전 글에서 labeling하고 augmentation한 이미지와 좌표(txt파일)을 불러와서 각 해당 변수에 할당 시키고
둘의 파일 개수가 동일한지 확인해봤다.
%cd /
from glob import glob
img_list = glob('/content/drive/MyDrive/dataset/export/images/*.jpg')
print(len(img_list))
#출력값 : 674
%cd /
from glob import glob
label_list = glob('/content/drive/MyDrive/dataset/export/labels/*.txt')
print(len(label_list))
#출력값 : 674
Yolo v5 train_test data 분류
우선 validation과 train 데이터를 3:7로 분리해줬다.
그 후, validation에서 5:5로 validation과 test데이터를 나눴다.
validation을 따로 생성한 이유는,
- 최대한 test데이터를 건들지 않고 validation데이터를 활용해서 학습한 후, test 데이터로 평가해보기 위해서다.
from sklearn.model_selection import train_test_split
train_img_list, val_img_list = train_test_split(img_list, test_size = 0.3, random_state = 123)
val_img_list, test_img_list = train_test_split(val_img_list, test_size = 0.5, random_state = 123)
print(len(train_img_list), len(val_img_list), len(test_img_list))
train 과 val, test의 txt 파일에 위 img_list에 있는 파일 이름들을 문자열로 다 넣어준다.
with open("/content/drive/MyDrive/dataset/train.txt", 'w') as f:
f.write('\n'.join(train_img_list) + '\n')
with open("/content/drive/MyDrive/dataset/val.txt", 'w') as f:
f.write('\n'.join(val_img_list) + '\n')
with open("/content/drive/MyDrive/dataset/test.txt", 'w') as f:
f.write('\n'.join(test_img_list) + '\n')
train 과 val, test가 분리되어 txt파일이 형성되었기 때문에,
yolo model에 투입될 dataset의 구성이 적혀있는 yaml 파일을 불러와서 수정해줘야한다.
import yaml
with open("/content/drive/MyDrive/dataset/data.yaml", 'r') as f:
data = yaml.full_load(f)
print(data)
data['train'] = '/content/drive/MyDrive/dataset/train.txt'
data['val'] = '/content/drive/MyDrive/dataset/val.txt'
data['test'] = '/content/drive/MyDrive/dataset/test.txt'
with open("/content/drive/MyDrive/dataset/data.yaml", 'w') as f:
yaml.dump(data, f)
print(data)
Yolo v5 modeling
Yolo model의 원리
- 예측할 이미지를 grid size로 나눠주고, 나눠진 이미지들의 각 confidence score들을 계산해가면서,
기존 boundary boxes와 비슷한지와, 객체가 존재할 가능성을 convolution layer를 계속해서 통과하면서 loss값이 최소화되는 부분을 추출하는 model이다.
모델을 돌릴때는, image size와 batch size, epochs 크기, data 경로, Configuration yaml 파일, weights를 저장할 파일, result를 저장할 곳을 지정해서 입력해준다.
%cd /content/yolov5/
!python train.py --img 416 --batch 16 --epochs 50 --data /content/drive/MyDrive/dataset/data.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name crutches_yolov5s_results
그렇게 모델을 진행하면,
위와 같은 결괏값이 나온다.
휠체어의 precision과 recall 값이 조금 부족하다는 것을 확인 할 수 있다.
mAP@.5는 IoU값이 0.5 이상인 것들의 mAP값을 말하는 것이고,
mAO@.5:.95는 IoU값이 0.5부터 0.95 사이인 것들의 mAP값을 말한다.
조금 부족한 결괏값을 보여준다.
데이터를 다시 수집하고 증강시켜서 모델을 돌려봤다.
휠체어의 precision과 recall 값이 많이 좋아졌음을 확인할 수 있고,
mAP의 값들도 상당히 좋은 성장을 보여줬다.
tensorboard를 통해서 model의 epochs별 평가지표값들(mAP, loss, precision, recall 등)의 변화를 확인할 수 있다.
%load_ext tensorboard
%tensorboard --logdir /content/yolov5/runs/
Yolo v5 result
해당 모델의 결괏값을 crutches_yolov5s_results 파일에 저장했기 때문에
파일 하나를 열어서 확인해보자.
이제 yolov5 기능중에 source를 조절해가며 webcam을 사용할 수 있고, youtube도 사용 가능하다.
아래 코드는 webcam을 사용하는 코드다.
!python /content/drive/MyDrive/yolov5/detect.py --weights /content/drive/MyDrive/yolov5/runs/train/crutches_yolov5s_results/weights/best.pt --conf 0.3 --source 0
webcam을 활용해서 휠체어와 목발을 들고 확인해보는 것이 좋겠지만, 휠체어와 목발을 구하기 힘들어서
youtube에 있는 영상을 활용해서 모델 결과를 체크해봤다.
나쁘지 않은 결과를 확인할 수 있었다.
'Data_study > DATA_PROJECT' 카테고리의 다른 글
[Project] 휠체어 목발 이용자 인식 yolo v5 - 1(수집,증강) (0) | 2022.08.20 |
---|---|
[Project] kaggle_compitition : Digit Recognizer (0) | 2022.07.10 |
[Project] 사용자가 원하는 노트북 스펙 비교 분석 (0) | 2022.06.25 |