이번 포스팅에서는 부트캠프에서 진행했던
yolov5를 이용해서 저희 학생 인원들 얼굴 인식을 진행했던 미니 팀프로젝트에 대한
진행 과정을 써보려고 합니다.
1. 프로젝트 목표 설정
먼저 저희 팀에서 주제를 선정한 이유는
영상, 이미지 분야에서 많이 쓰여 궁금했던
yolo object detecting 기술에 대해서 이해하고 분석하기 위해서였습니다.
목표한 사람 얼굴 클래스는
저희 반 인원의 13개와
이 클래스에 포함되지 않는 얼굴인
'unknown' 까지 14개입니다.
1. 반 인원 12명의 얼굴 Detecting
2. Confidence score 0.7 이상
3. mAP 0.9 이상
을 최종 목표로 잡고 프로젝트를 실시했습니다.
(해당 기준 수치는 이전 포스팅인
yolo 논문리뷰글에 설명되어 있습니다.)
https://aigaeddo.tistory.com/47
[논문 리뷰] You Only Look Once: Unified, Real-Time Object Detection (yolov1)
논문: You Only Look Once : Unified, Real-Time Object Detection : https://arxiv.org/pdf/1506.02640.pdf 이번 포스팅에서는 yolov1 에 대한 논문 리뷰를 해보려고 합니다. 학원에서 진행한 미니 프로젝트인 yolov1~yolov5 까지
aigaeddo.tistory.com
2. 자료 수집 및 학습
프로젝트 시작에 앞서 공유 문서를 만들어
다양한 자료를 수집하고 공유했습니다.
서로 yolov1~ v4 논문 자료를 리뷰하며
학습했습니다.
3. 데이터 준비
데이터는 직접 인원의 얼굴을 수시로 촬영하며(,,!)
총 400개를 수집했습니다.
이후 라벨링 처리와 증폭을 통해
이미지, 라벨링 데이터를 1200개 생성해주었습니다.
참고)
데이터 준비는 yolov5 를 제작한 ultralytics 페이지의
create labels 파트를 참고했습니다.
https://docs.ultralytics.com/ko/yolov5/tutorials/train_custom_data/#12-create-labels
사용자 지정 데이터 훈련
YOLOv5 을 사용하여 사용자 지정 데이터 세트에서 데이터를 훈련하는 방법을 알아보세요. 이미지 수집 및 정리, 라벨링, 모델 훈련 및 배포에 대한 간단하고 업데이트된 가이드입니다.
docs.ultralytics.com
3- 1. 라벨링
Ultralytics 페이지에서는
Roboflow 홈페이지 이용해서 라벨링을 추천하고 있습니다.
하지만, 초상권이 있는 얼굴을
라벨링 한 데이터가 페이지에 남거나
Public 하게 공개하고 싶지 않아
로컬에서 labelImg 툴을 이용해서 라벨링 하기로 결정했습니다.
라벨링은 한글이나 영어가 아닌 숫자로 진행하였습니다.
https://github.com/HumanSignal/labelImg
GitHub - HumanSignal/labelImg: LabelImg is now part of the Label Studio community. The popular image annotation tool created by
LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio, the open source ...
github.com
위의 git 주소를 들어가면 페이지 우측 하단에
Releases 가 보이고 해당 버전을 누르면 zip파일을 다운 받을 수 있습니다.
window zip 파일 압축을 풀게되면 labelImg를 exe 형태의
툴로서 실행 할 수 있습니다.
자세한 사용법은 해당 게시물을 참고해주세요.
https://velog.io/@kimsoohyun/YOLO-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%9D%BC%EB%B2%A8%EB%A7%81%EC%9D%84-%EC%9C%84%ED%95%9C-labelImg-%EC%82%AC%EC%9A%A9%EB%B2%95
YOLO 이미지 라벨링을 위한 labelImg 사용법
labelImg를 이용해 YOLO 이미지 라벨링하기
velog.io
3- 2. 증폭
이미지 뿐만 아니라 라벨링 값도 함께 변경하기 위해
"imgaug" 툴을 사용했습니다.
https://github.com/aleju/imgaug
GitHub - aleju/imgaug: Image augmentation for machine learning experiments.
Image augmentation for machine learning experiments. - aleju/imgaug
github.com
라이브러리를 설치해서 import해서 사용했고
이미지 증폭 코드를 작성해서 사용했습니다.
import imgaug as ia
from imgaug import augmenters as iaa
import numpy as np
import cv2
import os
from imgaug.augmentables.bbs import BoundingBox, BoundingBoxesOnImage
GENERATE_COUNT = 3 #증폭 이미지 배수 (5배수로)
def read_yolo_format(file_path, image_shape):
with open(file_path, 'r') as file:
lines = file.readlines()
boxes = []
for line in lines:
class_id, x_center, y_center, width, height = map(float, line.split())
x1 = int((x_center - width / 2) * image_shape[1])
y1 = int((y_center - height / 2) * image_shape[0])
x2 = int((x_center + width / 2) * image_shape[1])
y2 = int((y_center + height / 2) * image_shape[0])
boxes.append(BoundingBox(x1=x1, y1=y1, x2=x2, y2=y2, label=class_id))
return BoundingBoxesOnImage(boxes, shape=image_shape)
# 증폭 정책 설정 - 증폭 변경 필수.
seq = iaa.Sequential([
iaa.SomeOf((0, 8), [
iaa.Affine(rotate=(-25, 25), scale=(0.8, 1.2)),
iaa.Fliplr(0.5),
iaa.Sometimes(
0.5,
iaa.GaussianBlur(sigma=(0, 0.5))),
iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5),
iaa.Multiply((0.8, 1.2)),
iaa.LinearContrast((0.8, 1.3)),
iaa.Crop(percent=(0, 0.1)),
iaa.Pad(percent=(0, 0.1), pad_mode="edge"),
iaa.Affine(
scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
rotate=(-25, 25),
shear=(-8, 8)
)
], random_order=True)
])
# 이미지와 라벨 파일 경로 설정 - 경로 변경 필수
image_folder = "C:/miniproj_yolov5/3.develop/imgGen/images/"
images_dest_folder = "C:/miniproj_yolov5/3.develop/imgGen/generatedImg/new"
labels_dest_folder = "C:/miniproj_yolov5/3.develop/imgGen/generatedImg/new"
# 이미지 파일 목록 가져오기
image_files = [f for f in os.listdir(image_folder) if f.endswith('.jpg')]
# 증폭 및 저장
for image_file in image_files:
# 이미지와 라벨 파일 경로
image_path = os.path.join(image_folder, image_file)
label_path = os.path.join(image_folder, image_file.replace('.jpg', '.txt'))
# 이미지와 라벨 읽기
image = cv2.imread(image_path)
image_bbs = read_yolo_format(label_path, image.shape)
for i in range(GENERATE_COUNT):
# 이미지 증폭
image_aug, bbs_aug = seq(image=image, bounding_boxes=image_bbs)
# image_aug = bbs_aug.draw_on_image(image_aug, size=2) # 바운드박스를 이미지 내에 그림
new_image_file = f"{image_file.split('.')[0]}_{i+1}.jpg"
new_label_file = f"{image_file.replace('.jpg', '')}_{i+1}.txt"
# 증폭된 이미지와 라벨 저장
cv2.imwrite(os.path.join(images_dest_folder, new_image_file), image_aug)
with open(os.path.join(labels_dest_folder, new_label_file), 'w') as file:
for bb in bbs_aug.bounding_boxes:
x_center = (bb.x1 + bb.x2) / 2 / image_aug.shape[1]
y_center = (bb.y1 + bb.y2) / 2 / image_aug.shape[0]
width = (bb.x2 - bb.x1) / image_aug.shape[1]
height = (bb.y2 - bb.y1) / image_aug.shape[0]
file.write(f"{int(bb.label)} {x_center} {y_center} {width} {height}\n")
회전, 반전등을 적용해 3배 증폭을 적용하였습니다.
+ 파일명 일괄 정리
파일명 정리하고 싶어 powershell을 사용했습니다.
powershell을 켜고 아래를 입력해서 파일을 순서대로 동일한 파일명 형식으로 저장해줬습니다.
#이미지 이름 일괄 변경
> cd 이미지들어있는폴더명
> $i=1; Get-ChildItem *.jpg | ForEach-Object { Rename-Item $_ -NewName ("image{0}.jpg" -f $i++) }
#라벨 이름 일괄 변경
> cd 라벨이있는폴더명
> $i=1; Get-ChildItem *.txt | ForEach-Object { Rename-Item $_ -NewName ("image{0}.txt" -f $i++) }
4. 전이학습 시나리오 계획
공식문서에서는 최고의 훈련의 결과를 위해서는 클래스(라벨)당 1500 이상의 이미지,
인스턴스당 10000개 이상의 인스턴스를 권장하고 있었습니다.
https://docs.ultralytics.com/ko/yolov5/tutorials/tips_for_best_training_results/
최고의 훈련 결과를 위한 팁
종합 가이드는 YOLOv5 시스템을 훈련하여 최상의 mAP를 얻는 방법에 대한 인사이트를 제공합니다. 마스터 데이터 세트 준비, 모델 선택, 훈련 설정 등을 다룹니다.
docs.ultralytics.com
해당 기준에 비교해 저희의 1200개 데이터셋이 터무니없이
부족하다고 판단하였고,
전이학습을 진행하기로 결심하였습니다.
해당 시나리오를 검토해, 전이학습 중 fine_tunning을 진행하기로 했고
fine_tunning에는 WIDER face dataset을 3만개 이미지, 39만개의 얼굴을 훈련한
Face-Detection이라는 pretrained 파일을 선택했습니다.
https://github.com/miladsoltany/Face-Detection
GitHub - miladsoltany/Face-Detection: Face detection using yolov5
Face detection using yolov5. Contribute to miladsoltany/Face-Detection development by creating an account on GitHub.
github.com
(face detection에 최적화된 몇가지 깃저장소도 발견했으나,
라벨의 형태가 다르며
yolov5에서 훈련된 pretrained 파일을 호환하며 사용할 수 없어
사용하지 않았습니다. 하지만 관심 있으실 분들이 있으실 것 같아 첨부드립니다.)
https://github.com/hinetabi/yolov5_face_detection
GitHub - hinetabi/yolov5_face_detection: Face detection using Yolov5 Model and Wider Face dataset
Face detection using Yolov5 Model and Wider Face dataset - hinetabi/yolov5_face_detection
github.com
https://github.com/deepcam-cn/yolov5-face
GitHub - deepcam-cn/yolov5-face: YOLO5Face: Why Reinventing a Face Detector (https://arxiv.org/abs/2105.12931) ECCV Worksh
YOLO5Face: Why Reinventing a Face Detector (https://arxiv.org/abs/2105.12931) ECCV Workshops 2022) - deepcam-cn/yolov5-face
github.com
https://github.com/elyha7/yoloface
GitHub - elyha7/yoloface: Yolov5 Face Detection
Yolov5 Face Detection. Contribute to elyha7/yoloface development by creating an account on GitHub.
github.com
다음 포스팅에서
선택한 pretrained 가중치를 사용한 yolov5 훈련 진행과
결과 도출의 과정을 이어서 설명하겠습니다.
틀린점이 있다면 지적 부탁드립니다.
'인공지능 개발하기 > AI Projects' 카테고리의 다른 글
[Gemma2 모델을 이용한 유튜브 실시간 채팅 요약 프로젝트] 3) Flask를 이용한 Web Service 제공 (1) | 2024.10.02 |
---|---|
[Gemma2 모델을 이용한 유튜브 실시간 채팅 요약 프로젝트] 2) Chat Summarization with LLM (0) | 2024.10.02 |
[Gemma2 모델을 이용한 유튜브 실시간 채팅 요약 프로젝트] 1) YouTube Live Chat Crawling (1) | 2024.10.02 |
[YOLOv5 프로젝트] 특정 사람 얼굴 인식하기(2) (1) | 2024.03.30 |