Python PlatoBlockchain Data Intelligence에서 YOLOv7을 사용한 포즈 추정/키포인트 감지. 수직 검색. 일체 포함.

Python에서 YOLOv7을 사용한 포즈 추정/키포인트 감지

개요

물체 감지는 컴퓨터 비전의 넓은 분야이며 "야생에서" 컴퓨터 비전의 더 중요한 응용 프로그램 중 하나입니다.

객체 감지는 이미지 분류만큼 표준화되지 않았습니다. 새로운 개발의 대부분은 일반적으로 대규모 라이브러리 및 프레임워크가 아닌 개별 연구원, 유지 관리자 및 개발자가 수행하기 때문입니다. TensorFlow나 PyTorch와 같은 프레임워크에 필요한 유틸리티 스크립트를 패키징하고 지금까지 개발을 안내한 API 지침을 유지하는 것은 어렵습니다.

이로 인해 객체 감지가 이미지 분류보다 다소 더 복잡하고 일반적으로 더 장황하고(항상 그런 것은 아님) 접근하기 어렵습니다.

대중에게 다행스럽게도 Ultralytics는 다른 연구 개발 팀이 YOLOv5과 같은 최신 버전으로 확장한 YOLOv7를 중심으로 간단하고 매우 강력하며 아름다운 객체 감지 API를 개발했습니다.

이 짧은 가이드에서는 최신 YOLOv7을 사용하여 Python에서 포즈 추정(키포인트 감지)을 수행합니다.

키포인트는 얼굴의 일부, 신체의 팔다리 등 다양한 포인트가 될 수 있습니다. 포즈 추정은 포인트가 인체의 일부인 키포인트 감지의 특별한 경우이며 값비싼 위치 추적 하드웨어를 대체하는 데 사용할 수 있습니다. OTA(over-the-air) 로봇 제어를 가능하게 하고 AR 및 VR을 통해 인간의 자기 표현의 새로운 시대를 열 수 있습니다.

YOLO와 포즈 추정

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

울트라리틱스의 YOLOv5 는 PyTorch에서 YOLO를 대규모로 구현하여 그 어느 때보다 접근성을 높였지만 YOLOv5가 이러한 기반을 얻게 된 주된 이유는 YOLOvXNUMX를 중심으로 구축된 아름답고 간단하고 강력한 API이기도 합니다. 이 프로젝트는 불필요한 세부 사항을 추상화하면서 사용자 정의 가능성, 거의 모든 사용 가능한 내보내기 형식을 허용하고 전체 프로젝트를 최대한 효율적이고 최적으로 만드는 놀라운 방법을 사용합니다.

YOLOv5는 여전히 객체 감지 모델을 구축하는 주요 프로젝트이며 YOLO 방법을 발전시키는 것을 목표로 하는 많은 리포지토리는 YOLOv5를 기준으로 시작하고 유사한 API를 제공합니다(또는 단순히 프로젝트를 분기하여 그 위에 구축). 의 경우가 그러하다 YOLOR (당신은 오직 하나의 표현을 배웁니다) YOLO 방법론의 최신 발전인 YOLOR(동일 저자) 위에 구축된 YOLOv7.

YOLOv7은 단순한 객체 감지 아키텍처가 아닙니다. 새로운 모델 헤드를 제공하여 키포인트(스켈레톤)를 출력하고 이전 YOLO 모델에서는 표준이 아니었던 바운딩 박스 회귀 외에 인스턴스 분할을 수행할 수 있습니다. 작업에 따라 출력이 다른 공유 일반 아키텍처로 인해 많은 객체 감지 아키텍처가 인스턴스 분할 및 키포인트 감지 작업을 위해 이전에도 용도가 변경되었기 때문에 이는 놀라운 일이 아닙니다. 놀라운 일이 아니지만 인스턴스 분할 및 키포인트 감지 지원은 YOLO 기반 모델의 새로운 표준이 될 가능성이 높습니다. 이 모델은 몇 년 전부터 거의 모든 다른 XNUMX단계 감지기를 능가하기 시작했습니다.

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

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

YOLOv7 설치

계속해서 GitHub에서 프로젝트를 설치해 보겠습니다.

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

이렇게하면 yolov7 기본 프로젝트 파일을 찾을 수 있는 현재 작업 디렉토리 아래의 디렉토리:

%cd yolov7
!ls

/Users/macbookpro/jup/yolov7
LICENSE.md       detect.py        models           tools
README.md        export.py        paper            train.py
cfg              figure           requirements.txt train_aux.py
data             hubconf.py       scripts          utils
deploy           inference        test.py

참고 : Google Colab 노트북은 호출 후에도 다음 셀의 기본 작업 디렉터리로 재설정됩니다. %cd dirname, 따라서 작업을 수행하려는 각 셀에서 계속 호출해야 합니다. 로컬 Jupyter 노트북은 변경 사항을 기억하므로 명령을 계속 호출할 필요가 없습니다.

주어진 가중치 세트로 코드를 실행할 때마다 이 디렉토리에 다운로드되어 저장됩니다. 포즈 추정을 수행하기 위해 해당 작업에 대한 사전 훈련된 YOLOv7 모델의 가중치를 다운로드해야 합니다. 이는 아래에서 찾을 수 있습니다. /releases/download/ GitHub의 탭:

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

  % 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  3742k      0  0:00:42  0:00:42 --:--:-- 4573k

/Users/macbookpro/jup

좋아, 우리는 다운로드했습니다 yolov7-w6-pose.pt 포즈 추정을 위해 훈련된 모델을 로드하고 재구성하는 데 사용할 수 있는 weights 파일.

YOLOv7 포즈 추정 모델 로드

포즈 추정을 수행하는 데 필요한 라이브러리를 가져오겠습니다.

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

torchtorchvision 충분히 간단합니다 – YOLOv7은 PyTorch로 구현됩니다. 그만큼 utils.datasets, utils.generalutils.plots 모듈은 YOLOv7 프로젝트에서 제공되며 추론을 실행할 모델의 입력을 전처리하고 준비하는 데 도움이 되는 메서드를 제공합니다. 그 중에는 letterbox() 이미지를 패딩하려면 non_max_supression_keypoint() 모델의 초기 출력에서 ​​Non-Max Supression 알고리즘을 실행하고 해석을 위한 깨끗한 출력을 생성하고 output_to_keypoint()plot_skeleton_kpts() 키포인트가 예측되면 실제로 주어진 이미지에 키포인트를 추가하는 방법입니다.

다음을 사용하여 가중치 파일에서 모델을 로드할 수 있습니다. torch.load(). GPU를 사용할 수 있는지 확인하고, 모델을 로드하고, 추론 모드로 전환하고, 사용 가능한 경우 GPU로 이동하는 함수를 생성해 보겠습니다.

def load_model():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = torch.load('yolov7/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()

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

모델을 로드한 상태에서 run_inference() 시스템의 파일을 가리키는 문자열을 허용하는 메서드입니다. 이 메서드는 OpenCV를 사용하여 이미지를 읽습니다(cv2)로 채우십시오. letterbox(), 변환을 적용하고 배치로 전환합니다(모델은 평소와 같이 배치에 대해 학습되고 예상됨).

def run_inference(url):
    image = cv2.imread(url) 
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    
    image = image.unsqueeze(0) 
    output, _ = model(image) 
    return output, image

여기에서는 변환된 이미지(원본을 추출하고 그 위에 플롯을 원하기 때문에)와 모델의 출력을 반환했습니다. 이러한 출력에는 45900개의 키포인트 예측이 포함되며 대부분이 겹칩니다. 개체 감지 예측과 마찬가지로 이러한 원시 예측에 비최대 억제를 적용하려고 합니다(많은 경계 상자가 예측된 다음 일부 신뢰도 및 IoU 임계값이 주어지면 "축소"됨). 억제 후 원본 이미지의 각 키포인트를 플롯하고 표시할 수 있습니다.

def visualize_output(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)
    plt.figure(figsize=(12, 12))
    plt.axis('off')
    plt.imshow(nimg)
    plt.show()

이제 다음과 같은 일부 입력 이미지의 경우 karate.jpg 기본 작업 디렉토리에서 추론을 실행하고 Non-Max Supression을 수행하고 다음을 사용하여 결과를 그릴 수 있습니다.

output, image = run_inference('./karate.jpg')
visualize_output(output, image)

결과 :

이것은 추론하기 상당히 어려운 이미지입니다! 오른쪽에 있는 수련자의 오른팔 대부분이 가려져 있고, 팔꿈치가 구부러져 있고 팔의 일부가 앞쪽에 있다는 사실을 놓치고 몸의 오른쪽에 숨겨져 있다고 모델이 추론한 것을 볼 수 있습니다. . 훨씬 더 선명하게 보이는 왼쪽의 수련자는 다리를 숨긴 상태에서도 올바르게 유추됩니다.

사실, 뒤에 앉은 사람, 카메라에 거의 완전히 보이지 않음 앉아 있는 동안 엉덩이의 위치를 ​​기준으로 자세가 올바르게 추정된 것처럼 보입니다. 네트워크를 대신하여 훌륭한 작업을 수행했습니다!

결론

이 가이드에서는 YOLOR를 기반으로 구축되고 대부분의 YOLO 기반 모델의 표준 개체 감지 기능을 넘어 인스턴스 분할 및 키포인트 감지 기능을 추가로 제공하는 YOLO 제품군의 최신 발전인 YOLOv7에 대해 간략히 살펴보았습니다. .

그런 다음 릴리스된 가중치 파일을 다운로드하고 로드하여 모델을 구성하고 인간에 대한 자세 추정 추론을 수행하여 인상적인 결과를 산출하는 방법을 살펴보았습니다.

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

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

Python PlatoBlockchain Data Intelligence에서 YOLOv7을 사용한 포즈 추정/키포인트 감지. 수직 검색. 일체 포함.

또 다른 컴퓨터 비전 과정?

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

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

안에 무엇입니까?

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

타임 스탬프 :

더보기 스택카부스