본문 바로가기
모각코

[모각코] 물랑룽즈 - 5차

by 솔이당 2024. 2. 2.

퍼듀 프로젝트

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