YOLOv7 PlatoBlockchain 데이터 인텔리전스를 사용하여 Python의 비디오에서 실시간 포즈 추정. 수직 검색. 일체 포함.

YOLOv7을 사용하여 Python의 비디오에서 실시간 포즈 추정

개요

물체 감지는 컴퓨터 비전의 큰 분야이며 "야생에서" 컴퓨터 비전의 더 중요한 응용 프로그램 중 하나입니다. 여기에서 키포인트 감지(포즈 추정에 자주 사용됨)가 추출되었습니다.

키포인트는 얼굴의 일부, 신체의 팔다리 등 다양한 포인트가 될 수 있습니다. 포즈 추정은 포인트가 인체의 일부인 키포인트 감지의 특별한 경우입니다.

포즈 추정은 컴퓨터 비전의 놀랍고 매우 재미있고 실용적인 사용법입니다. 이를 통해 비용이 많이 들고 다루기 힘든 포즈(모션 캡처 슈트)를 추정하는 데 사용되는 하드웨어를 없앨 수 있습니다. 또한 인간의 움직임을 유클리드 공간에서 로봇의 움직임에 매핑할 수 있어 일반적으로 더 높은 수준의 정밀도를 허용하지 않는 컨트롤러를 사용하지 않고도 정밀한 모터 움직임을 가능하게 합니다. 키포인트 추정은 우리의 움직임을 AR 및 VR의 3D 모델로 변환하는 데 사용할 수 있으며 웹캠만으로 그렇게 하는 데 점점 더 많이 사용되고 있습니다. 마지막으로 - 포즈 추정은 스포츠와 보안에 도움이 될 수 있습니다.

이 가이드에서는 최신 YOLOv7 모델을 사용하여 Python의 비디오에서 실시간 포즈 추정을 수행합니다.

특히, 우리는 한국의 평창에서 개최된 2018년 동계 올림픽의 비디오로 작업할 것입니다.

Aljona Savchenko와 Bruno Massot는 카메라에 겹쳐진 몸, 빠른 유체 움직임, 공중 회전 등 놀라운 연기를 선보였습니다. 모델이 추론하기 어려운 상황을 어떻게 처리하는지 확인할 수 있는 놀라운 기회가 될 것입니다!

YOLO와 포즈 추정

YOLO (너는 한 번만 본다) 방법론이자 객체 감지를 위해 구축된 모델 제품군입니다. 2015년에 시작된 이래로 YOLOv1, YOLOv2(YOLO9000) 및 YOLOv3은 같은 저자에 의해 제안되었으며 딥 러닝 커뮤니티는 오픈 소스 발전을 계속해 왔습니다.

울트라리틱스의 YOLOv5 YOLO 방식을 기반으로 구축된 산업 등급의 객체 감지 저장소입니다. 이전 YOLO 모델의 C++와 달리 PyTorch에서 구현되며 완전히 오픈 소스이며 프로젝트를 유연하게 추론, 교육 및 사용자 지정할 수 있는 아름답고 간단하고 강력한 API를 제공합니다. 이것은 YOLO 방법을 개선하려는 대부분의 새로운 시도가 그 위에 구축되는 필수 요소입니다.

이것은 어떻게 YOLOR (당신은 오직 하나의 표현을 배웁니다) 그리고 YOLOR(동일 작가) 위에 구축된 YOLOv7도 생성되었습니다!

YOLOv7은 단순한 객체 감지 아키텍처가 아닙니다. 이전 YOLO 모델에서는 표준이 아니었던 경계 상자 회귀 외에 키포인트(골격)를 출력하고 인스턴스 분할을 수행할 수 있는 새로운 모델 헤드를 제공합니다. 이는 작업에 따라 출력이 다른 공유 일반 아키텍처로 인해 많은 객체 감지 아키텍처가 인스턴스 분할 및 키포인트 감지 작업을 위해 더 일찍 용도가 변경되었기 때문에 놀라운 일이 아닙니다.

놀라운 일이 아니지만 인스턴스 분할 및 키포인트 감지 지원은 YOLO 기반 모델의 새로운 표준이 될 가능성이 높습니다. YOLO 기반 모델은 정확도와 속도 면에서 XNUMX년 전에 거의 모든 다른 XNUMX단계 감지기를 능가하기 시작했습니다.

이를 통해 XNUMX단계 감지기보다 간단한 아키텍처로 인스턴스 분할 및 키포인트 감지를 그 어느 때보다 빠르게 수행할 수 있습니다.

모델 자체는 추론 비용을 증가시키지 않으면서 정확도를 높인 "공짜 가방"이라고 불리는 교육 측면의 최적화와 아키텍처 변경을 통해 생성되었습니다.

YOLOv7 설치

소스 코드를 확보하기 위해 리포지토리를 복제하여 시작하겠습니다.

! git clone https://github.com/WongKinYiu/yolov7.git

이제 다음으로 이동합시다. yolov7 프로젝트가 포함된 디렉토리 및 내용을 살펴보십시오.

%cd yolov7
!ls
/content/yolov7
cfg	   figure      output.mp4	 test.py       
data	   hubconf.py  paper		 tools
deploy	   inference   README.md	 train_aux.py
detect.py  LICENSE.md  requirements.txt  train.py
export.py  models      scripts		 utils

참고 : 호출 !cd dirname 해당 셀의 디렉토리로 이동합니다. 부름 %cd dirname 다가오는 셀의 디렉토리로 이동하고 거기에 유지합니다.

이제 YOLO는 객체 감지기를 의미하며 기본적으로 포즈 추정 가중치와 함께 제공되지 않습니다. 가중치를 다운로드하고 그로부터 구체적인 모델 인스턴스를 로드하려고 합니다. 가중치는 동일한 GitHub 리포지토리에서 사용할 수 있으며 CLI를 통해 쉽게 다운로드할 수도 있습니다.

! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  153M  100  153M    0     0  23.4M      0  0:00:06  0:00:06 --:--:-- 32.3M

다운로드가 완료되면 사용할 라이브러리와 도우미 메서드를 가져올 수 있습니다.

import torch
from torchvision import transforms

from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts

import matplotlib.pyplot as plt
import cv2
import numpy as np

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

엄청난! 모델을 로드하고 YOLOv7 및 OpenCV를 사용하여 비디오에서 포즈를 유추할 수 있는 스크립트를 만들어 보겠습니다.

YOLOv7을 사용한 실시간 포즈 추정

먼저 다운로드한 가중치에서 모델을 로드하는 메서드를 만들어 보겠습니다. 사용 가능한 장치(CPU 또는 GPU)를 확인합니다.

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def load_model():
    model = torch.load('yolov7-w6-pose.pt', map_location=device)['model']
    
    model.float().eval()

    if torch.cuda.is_available():
        
        
        model.half().to(device)
    return model

model = load_model()

GPU가 있는지 여부에 따라 반정밀도를 켭니다(사용 float16 대신 float32 작업에서) 추론을 훨씬 더 빠르게 만듭니다. 작은 비디오에서 실행되지 않는 한 CPU는 전력이 부족할 수 있으므로 실시간 속도를 위해 GPU에서 이 작업을 수행하는 것이 좋습니다.

추론을 실행하기 위한 convinence 메소드를 작성해 봅시다. 우리는 이미지를 NumPy 배열로 받아들일 것입니다(나중에 비디오를 읽는 동안 전달할 것이기 때문입니다). 먼저 다음을 사용하여 letterbox() 기능 – 비디오의 크기를 조정하고 모델이 작업할 수 있는 모양으로 채웁니다. 이것은 결과 비디오의 모양(해상도)일 필요도 없고 그렇지 않을 수도 있습니다!

그런 다음 변환을 적용하고 이미지를 절반 정밀도로 변환하고(GPU를 사용할 수 있는 경우) 일괄 처리하고 모델을 통해 실행합니다.

def run_inference(image):
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    if torch.cuda.is_available():
      image = image.half().to(device)
    
    image = image.unsqueeze(0) 
    with torch.no_grad():
      output, _ = model(image)
    return output, image

모델의 예측과 이미지를 텐서로 반환합니다. 이것은 "거친" 예측입니다. 여기에는 겹치는 많은 활성화가 포함되어 있으며 Non-Max Supression을 사용하여 "정리"하고 이미지 자체에 예측된 골격을 플로팅합니다.

def draw_keypoints(output, image):
  output = non_max_suppression_kpt(output, 
                                     0.25, 
                                     0.65, 
                                     nc=model.yaml['nc'], 
                                     nkpt=model.yaml['nkpt'], 
                                     kpt_label=True)
  with torch.no_grad():
        output = output_to_keypoint(output)
  nimg = image[0].permute(1, 2, 0) * 255
  nimg = nimg.cpu().numpy().astype(np.uint8)
  nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
  for idx in range(output.shape[0]):
      plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)

  return nimg

이것들이 제자리에 있으면 우리의 일반적인 흐름은 다음과 같을 것입니다:

img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)

이를 실시간 비디오 설정으로 변환하려면 OpenCV를 사용하여 비디오를 읽고 모든 프레임에 대해 이 프로세스를 실행합니다. 또한 각 프레임에서 비디오로 인코딩된 새 파일에 프레임을 씁니다. 이렇게 하면 추론을 실행하고 표시하고 쓸 때 프로세스가 느려질 수 있습니다. 따라서 새 파일을 생성하고 루프에서 파일에 쓰는 것을 방지하여 추론 및 표시 속도를 높일 수 있습니다.

def pose_estimation_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            output, frame = run_inference(frame)
            frame = draw_keypoints(output, frame)
            frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
            out.write(frame)
            cv2.imshow('Pose estimation', frame)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

XNUMXD덴탈의 VideoWriter 출력 파일 이름, FourCC(비디오를 인코딩하는 데 사용되는 코덱을 나타내는 XNUMX개의 코덱 코드), 프레임 속도 및 튜플의 해상도와 같은 여러 매개변수를 허용합니다. 비디오를 추측하거나 크기를 조정하지 않기 위해 우리는 원본 비디오의 너비와 높이를 사용했습니다. VideoCapture 너비, 높이, 총 프레임 수 등과 같은 비디오 자체에 대한 데이터를 포함하는 인스턴스

이제 모든 입력 비디오에서 메서드를 호출할 수 있습니다.

pose_estimation_video('../ice_skating.mp4')

그러면 OpenCV 창이 열리고 추론이 실시간으로 표시됩니다. 또한, 그것은 비디오 파일을 작성합니다 yolov7 디렉토리(우리는 cd'd):

YOLOv7 PlatoBlockchain 데이터 인텔리전스를 사용하여 Python의 비디오에서 실시간 포즈 추정. 수직 검색. 일체 포함.

참고 : GPU가 어려움을 겪고 있거나 이와 같은 모델의 결과를 워크플로의 중요한 측면으로 지연이 있는 응용 프로그램에 포함하려는 경우 비디오를 더 작게 만들고 더 작은 프레임에서 작업하십시오. 이것은 풀 HD 1920×1080 비디오이며 대부분의 가정용 시스템에서 빠르게 실행할 수 있어야 하지만 시스템에서 제대로 작동하지 않으면 이미지를 더 작게 만드십시오.

결론

이 가이드에서는 YOLO 메서드인 YOLOv7과 YOLO와 객체 감지, 포즈 추정 및 인스턴스 분할 간의 관계를 살펴보았습니다. 그런 다음 프로그래밍 방식 API를 사용하여 YOLOv7을 쉽게 설치하고 작업하는 방법을 살펴보고 결과를 더 쉽게 추론하고 표시할 수 있는 몇 가지 간편 방법을 만들었습니다.

마지막으로 OpenCV를 사용하여 비디오를 열고 YOLOv7로 추론을 실행하고 실시간으로 포즈 추정을 수행하는 기능을 만들어 결과 비디오를 전체 해상도 및 로컬 디스크에 30FPS로 저장했습니다.

더 나아가기 – 컴퓨터 비전을 위한 실용적인 딥 러닝

당신의 호기심 많은 성격이 당신을 더 멀리 가고 싶게 만드나요? 다음을 확인하는 것이 좋습니다. 코스: “파이썬을 이용한 컴퓨터 비전을 위한 실용적인 딥러닝”.

YOLOv7 PlatoBlockchain 데이터 인텔리전스를 사용하여 Python의 비디오에서 실시간 포즈 추정. 수직 검색. 일체 포함.

또 다른 컴퓨터 비전 과정?

우리는 MNIST 숫자나 MNIST 패션의 분류를 하지 않을 것입니다. 그들은 오래전에 자신의 역할을 다했습니다. 고급 블랙박스 아키텍처가 성능 부담을 짊어지게 하기 전에 너무 많은 학습 리소스가 기본 데이터 세트와 기본 아키텍처에 집중하고 있습니다.

우리는 집중하고 싶다 신비화, 실용적인 사항, 이해, 직관실제 프로젝트. 배우고 싶다 방법 당신은 변화를 만들 수 있습니다? 우리는 뇌가 이미지를 처리하는 방식부터 유방암에 대한 연구 수준의 딥 러닝 분류기를 작성하고 "환각"하는 딥 러닝 네트워크에 이르기까지, 실제 작업을 통해 원리와 이론을 가르치고, 컴퓨터 비전을 해결하기 위해 딥러닝을 적용하는 전문가가 되기 위한 노하우와 도구.

안에 무엇입니까?

  • 비전의 첫 번째 원칙과 컴퓨터가 "보는" 방법을 가르칠 수 있는 방법
  • 컴퓨터 비전의 다양한 작업 및 응용
  • 작업을 더 쉽게 만들어줄 무역 도구
  • 컴퓨터 비전용 데이터세트 찾기, 생성 및 활용
  • 컨볼루션 신경망의 이론과 응용
  • 데이터 세트의 도메인 이동, 동시 발생 및 기타 편향 처리
  • Transfer Learning 및 다른 사람의 교육 시간 및 계산 리소스를 귀하의 이익을 위해 활용
  • 최첨단 유방암 분류기 구축 및 교육
  • 주류 아이디어에 건강한 회의론을 적용하고 널리 채택된 기술의 의미를 이해하는 방법
  • t-SNE 및 PCA를 사용하여 ConvNet의 "개념 공간" 시각화
  • 기업이 더 나은 결과를 얻기 위해 컴퓨터 비전 기술을 사용하는 방법에 대한 사례 연구
  • 적절한 모델 평가, 잠재 공간 시각화 및 모델의 관심 식별
  • 도메인 연구 수행, 자체 데이터 세트 처리 및 모델 테스트 설정
  • 최첨단 아키텍처, 아이디어의 진행, 독창적인 요소 및 구현 방법
  • KerasCV – 최첨단 파이프라인 및 모델 생성을 위한 WIP 라이브러리
  • 논문을 구문 분석하고 읽고 직접 구현하는 방법
  • 용도에 따른 모델 선택
  • 엔드 투 엔드 머신 러닝 파이프라인 만들기
  • Faster R-CNN, RetinaNets, SSD 및 YOLO를 통한 물체 감지에 대한 풍경 및 직관
  • 인스턴스 및 시맨틱 분할
  • YOLOv5를 사용한 실시간 객체 인식
  • YOLOv5 객체 감지기 훈련
  • KerasNLP(업계 최강의 WIP 라이브러리)를 사용하여 Transformers 작업
  • Transformer를 ConvNet과 통합하여 이미지 캡션 생성
  • Deepdream
  • 컴퓨터 비전을 위한 딥 러닝 모델 최적화

타임 스탬프 :

더보기 스택카부스