퍼듀 프로젝트
YOLOv8 Pose Estimation
주제: Vehicle theft prevention system based on Computer vision and IoT sensors
yolov8 nano → 실시간으로 비디오를 처리하는 가장 빠른 방법
지정된 자세와 일치하는지 평가하는 데 사용하기 위해 여러 지점 사이의 여러 각도를 계산해야 함
키포인트는 관절, 랜드마크 또는 기타 특징과 같은 개체의 다양한 부분을 나타냄
2D [x, y]
from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n-pose.pt')
# Predict with the model
results = model('https://ultralytics.com/images/bus.jpg')
# Extract keypoint
result_keypoint = results.keypoints.xyn.cpu().numpy()[0]
키포인트 이름을 호출하여 x, y 좌표를 얻기 위해서는 ‘키포인트’ 속성을 가진 pydantic 클래스를 만들면 됨
from pydantic import BaseModel
class GetKeypoint(BaseModel):
NOSE: int = 0
LEFT_EYE: int = 1
RIGHT_EYE: int = 2
LEFT_EAR: int = 3
RIGHT_EAR: int = 4
LEFT_SHOULDER: int = 5
RIGHT_SHOULDER: int = 6
LEFT_ELBOW: int = 7
RIGHT_ELBOW: int = 8
LEFT_WRIST: int = 9
RIGHT_WRIST: int = 10
LEFT_HIP: int = 11
RIGHT_HIP: int = 12
LEFT_KNEE: int = 13
RIGHT_KNEE: int = 14
LEFT_ANKLE: int = 15
RIGHT_ANKLE: int = 16
# example
get_keypoint = GetKeypoint()
nose_x, nose_y = result_yolov8[get_keypoint.NOSE]
left_eye_x, left_eye_y = keypoint[get_keypoint.LEFT_EYE]
키포인트를 분류하기 위해서는 키포인트 데이터셋을 생성해야 됨
Kaggle yoga-pose-classification에 대한 공개 데이터셋 이미지를 사용하는 경우, 이 데이터셋은 Downdog, Goddess, Plank, Tree, Warrior2 5개 클래스가 존재함
x, y 좌표를 얻기 위해서는 신체 부위별 키포인트를 추출한 후 CSV 형식으로 저장
Train Classification
PyTroch 라이브러리를 사용해 키포인트에 대한 다중 클래스 분류 모델 학습을 진행한 것
class NeuralNet(nn.Module):
def __init__( self , input_size, Hidden_size, num_classes):
super (NeuralNet, self ).__init__()
self .l1 = nn.Linear(input_size, Hidden_size)
self .relu = nn.ReLU( )
self .l2 = nn.Linear(hidden_size, num_classes)
def forward( self , x):
out = self .l1(x)
out = self .relu( out )
out = self .l2( out )
return out
- self.l1 = nn.Linear(input_size, hidden_size): 입력 기능을 가져와 이를 숨겨진 레이어에 매핑하는 첫 번째 선형 레이어
- self.relu = nn.ReLU(): 요소별 ReLU 활성화를 적용하여 비선형성을 도입하는 활성화 함수
- self.l2 = nn.Linear(hidden_size, num_classes): 숨겨진 레이어를 출력 클래스에 매핑하는 두 번째 선형 레이어
- forward(self, x): 신경망의 순방향 전달을 정의
Hidden_size = 256
model = NeuralNet(X_train.shape[1], Hidden_size, len(class_weights))
- X_train.shape[1]은 훈련 데이터의 피쳐 수인 입력 크기를 나타냄
- len(class_weights)는 출력 클래스 수를 나타냄
이렇게 하면 데이터셋에서 훈련할 준비가 된 NeuralNet 모델의 인스턴스가 생성됨
learning_rate = 0.01
criterion = nn.CrossEntropyLoss(weight=torch.from_numpy(class_weights.astype(np.float32)))
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
Train a custom model
model = YOLO('yolov8n-pose.yaml') # build a new model from YAML
model = YOLO('yolov8n-pose.yaml').load('yolov8n-pose.pt') # build from YAML and transfer weight
#Train the model
model.train(data='yolov8n-pose.yaml', epochs=100, imgsz=640)
pre-trained weights로 classification 학습
# Train YOLOv5s on COCO128 for 3 epochs
!python train.py --img 640 --batch 16 --epochs 3 --data coco128.yaml --weights yolov5s.pt --cache
!python /content/yolov5/train.py --img 320 --batch 16 --epochs 30 --data /content/datasets/data.yaml --weights yolov5x.pt --name result_bong --cfg /content/yolov5/models/yolov5x.yaml
- img: 입력 이미지 크기
- batch: 배치 크기
- epochs: 학습 epoch 수 (참고: 3000개 이상이 일반적으로 사용된다고 한다...)
- data: data.yaml 파일 경로
- cfg: 모델 구성 지정
- weights: 가중치에 대한 사용자 정의 경로를 지정합니다(참고: Ultraalytics Google Drive 폴더에서 가중치를 다운로드할 수 있습니다).
- name: 모델이 저장 될 폴더 이름
- nosave: 최종 체크포인트만 저장
- cache: 더 빠른 학습을 위해 이미지를 캐시
- RuntimeError: CUDA out of memory가 뜬다면 batch 사이즈를 줄여야 됨
!python /content/yolov5/detect.py --weights /content/yolov5/runs/train/result_bong/weights/best.pt --img 320 --conf 0.5 --source /content/drive/MyDrive/img/test2.jpg
'모각코' 카테고리의 다른 글
[모각코] 물랑룽즈 - 6차 (0) | 2024.02.06 |
---|---|
[모각코] 물랑룽즈 - 4차 (0) | 2024.02.01 |
[모각코] 물랑룽즈 - 3차 (0) | 2024.01.28 |
[모각코] 물랑룽즈 - 2차 (0) | 2024.01.22 |
[모각코] 물랑룽즈 - 1차 (0) | 2024.01.14 |