Ước tính tư thế thời gian thực từ video bằng Python với Trí thông minh dữ liệu chuỗi khối YOLOv7 Plato. Tìm kiếm dọc. Ái.

Ước tính tư thế theo thời gian thực từ video bằng Python với YOLOv7

Giới thiệu

Phát hiện đối tượng là một lĩnh vực rộng lớn trong thị giác máy tính và là một trong những ứng dụng quan trọng hơn của thị giác máy tính “trong tự nhiên”. Từ đó, tính năng phát hiện điểm chính (thường được sử dụng để ước tính tư thế) đã được trích xuất.

Điểm chính có thể là nhiều điểm khác nhau – các bộ phận của khuôn mặt, các chi của cơ thể, v.v. Ước tính tư thế là một trường hợp đặc biệt của phát hiện điểm chính – trong đó các điểm là các bộ phận của cơ thể con người.

Ước tính tư thế là một cách sử dụng thị giác máy tính tuyệt vời, cực kỳ thú vị và thực tế. Với nó, chúng ta có thể loại bỏ phần cứng dùng để ước tính các tư thế (bộ đồ chụp chuyển động), vốn rất tốn kém và khó sử dụng. Ngoài ra, chúng tôi có thể ánh xạ chuyển động của con người với chuyển động của robot trong không gian Euclide, cho phép chuyển động của động cơ có độ chính xác cao mà không cần sử dụng bộ điều khiển, vốn thường không cho phép đạt được mức độ chính xác cao hơn. Ước tính điểm chính có thể được sử dụng để chuyển các chuyển động của chúng ta sang mô hình 3D trong AR và VR và ngày càng được sử dụng nhiều hơn để thực hiện việc đó chỉ bằng webcam. Cuối cùng – ước tính tư thế có thể giúp chúng ta trong thể thao và an ninh.

Trong hướng dẫn này, chúng tôi sẽ thực hiện ước tính tư thế theo thời gian thực từ video bằng Python, sử dụng mô hình YOLOv7 hiện đại.

Cụ thể, chúng tôi sẽ làm việc với một video về thế vận hội mùa đông 2018, được tổ chức tại PyeongChang của Hàn Quốc:

Aljona Savchenko và Bruno Massot đã có một màn trình diễn đáng kinh ngạc, bao gồm cả việc chồng cơ thể lên máy ảnh, chuyển động nhanh và xoay tròn trong không trung. Đây sẽ là một cơ hội tuyệt vời để xem cách mô hình xử lý các tình huống khó suy luận!

YOLO và ước tính tư thế

YOLO (Bạn Chỉ Nhìn Một lần) là một phương pháp luận, cũng như họ các mô hình được xây dựng để phát hiện đối tượng. Kể từ khi thành lập vào năm 2015, YOLOv1, YOLOv2 (YOLO9000) và YOLOv3 đã được đề xuất bởi (các) tác giả - và cộng đồng học sâu tiếp tục với những tiến bộ nguồn mở trong những năm tiếp tục.

Ultralytics 'YOLOv5 là kho lưu trữ phát hiện đối tượng cấp ngành, được xây dựng dựa trên phương pháp YOLO. Nó được triển khai trong PyTorch, trái ngược với C++ cho các mô hình YOLO trước đây, là nguồn mở hoàn toàn và có API mạnh mẽ và đơn giản cho phép bạn suy luận, đào tạo và tùy chỉnh dự án một cách linh hoạt. Đó là một yếu tố quan trọng mà hầu hết các nỗ lực mới nhằm cải thiện phương pháp YOLO đều dựa trên nó.

Đây là cách YOLOR (Bạn chỉ học một cách trình bày) và YOLOv7 được xây dựng dựa trên YOLOR (cùng tác giả) cũng được tạo ra!

YOLOv7 không chỉ là một kiến ​​trúc phát hiện đối tượng – nó còn cung cấp các đầu mô hình mới, có thể xuất ra các điểm chính (bộ khung) và thực hiện phân đoạn phiên bản bên cạnh việc chỉ hồi quy hộp giới hạn, vốn không phải là tiêu chuẩn với các mô hình YOLO trước đây. Điều này không có gì đáng ngạc nhiên vì trước đó, nhiều kiến ​​trúc phát hiện đối tượng cũng đã được tái sử dụng cho các nhiệm vụ phân đoạn phiên bản và phát hiện điểm chính, do kiến ​​trúc chung được chia sẻ, với các đầu ra khác nhau tùy thuộc vào nhiệm vụ.

Mặc dù điều đó không có gì đáng ngạc nhiên – việc hỗ trợ phân đoạn phiên bản và phát hiện điểm chính có thể sẽ trở thành tiêu chuẩn mới cho các mô hình dựa trên YOLO, vốn đã bắt đầu hoạt động tốt hơn hầu hết các trình phát hiện hai giai đoạn khác cách đây vài năm về cả độ chính xác và tốc độ.

Điều này làm cho phân đoạn cá thể và phát hiện keypoint nhanh hơn bao giờ hết, với kiến ​​trúc đơn giản hơn so với bộ phát hiện hai giai đoạn.

Bản thân mô hình đã được tạo ra thông qua những thay đổi về kiến ​​trúc, cũng như tối ưu hóa các khía cạnh của quá trình đào tạo, được gọi là “bag-of-freebies”, giúp tăng độ chính xác mà không làm tăng chi phí suy luận.

Cài đặt YOLOv7

Hãy bắt đầu bằng cách sao chép kho lưu trữ để lấy mã nguồn:

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

Bây giờ chúng ta hãy chuyển sang yolov7 thư mục chứa dự án và xem nội dung:

%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

Lưu ý: đang gọi !cd dirname chuyển bạn vào một thư mục trong ô đó. Đang gọi %cd dirname cũng di chuyển bạn vào một thư mục trên các ô sắp tới và giữ bạn ở đó.

Giờ đây, YOLO được coi là một công cụ phát hiện đối tượng và không cung cấp trọng số ước tính tư thế theo mặc định. Chúng tôi sẽ muốn tải xuống các trọng số và tải một phiên bản mô hình cụ thể từ chúng. Các trọng số có sẵn trên cùng một kho lưu trữ GitHub và cũng có thể dễ dàng tải xuống thông qua 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

Sau khi tải xuống, chúng tôi có thể nhập các thư viện và phương thức trợ giúp mà chúng tôi sẽ sử dụng:

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

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Tuyệt vời! Hãy bắt đầu tải mô hình và tạo tập lệnh cho phép bạn suy ra các tư thế từ video bằng YOLOv7 và OpenCV.

Ước tính tư thế theo thời gian thực với YOLOv7

Trước tiên hãy tạo một phương thức để tải mô hình từ các trọng số đã tải xuống. Chúng tôi sẽ kiểm tra xem chúng tôi có thiết bị nào (CPU hoặc 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()

Tùy thuộc vào việc chúng tôi có GPU hay không, chúng tôi sẽ bật tính năng bán chính xác (sử dụng float16 thay vì float32 trong hoạt động), điều này làm cho suy luận nhanh hơn đáng kể. Lưu ý rằng bạn nên thực hiện việc này trên GPU để có tốc độ thời gian thực vì CPU có thể sẽ thiếu năng lượng để thực hiện việc này trừ khi chạy trên các video nhỏ.

Hãy viết một phương pháp thuận tiện cho việc chạy suy luận. Chúng tôi sẽ chấp nhận hình ảnh dưới dạng mảng NumPy (vì đó là những gì chúng tôi sẽ chuyển chúng sau khi đọc video). Đầu tiên, sử dụng letterbox() chức năng – chúng tôi sẽ thay đổi kích thước và đệm video thành hình dạng mà mô hình có thể hoạt động. Đây không nhất thiết phải và sẽ không phải là hình dạng (độ phân giải) của video thu được!

Sau đó, chúng tôi sẽ áp dụng các phép biến đổi, chuyển đổi hình ảnh thành độ chính xác một nửa (nếu có GPU), chia khối và chạy qua mô hình:

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

Chúng tôi sẽ trả về các dự đoán của mô hình cũng như hình ảnh dưới dạng tensor. Đây là những dự đoán "thô" - chúng chứa nhiều kích hoạt chồng lên nhau và chúng tôi sẽ muốn "làm sạch chúng" bằng cách sử dụng tính năng Không tối đa hóa và vẽ sơ đồ các bộ xương được dự đoán trên chính hình ảnh:

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

Với những thứ này, quy trình chung của chúng ta sẽ như sau:

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

Để chuyển điều đó sang cài đặt video thời gian thực – chúng tôi sẽ sử dụng OpenCV để đọc video và chạy quy trình này cho mọi khung hình. Trên mỗi khung hình, chúng tôi cũng sẽ ghi khung hình đó vào một tệp mới, được mã hóa dưới dạng video. Điều này nhất thiết sẽ làm chậm quá trình khi chúng ta chạy suy luận, hiển thị và ghi nó – vì vậy bạn có thể tăng tốc độ suy luận và hiển thị bằng cách tránh tạo một tệp mới và ghi vào đó trong vòng lặp:

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()

Sản phẩm VideoWriter chấp nhận một số tham số - tên tệp đầu ra, FourCC (bốn mã codec, biểu thị codec được sử dụng để mã hóa video), tốc độ khung hình và độ phân giải dưới dạng một bộ tuple. Để không đoán hoặc thay đổi kích thước video - chúng tôi đã sử dụng chiều rộng và chiều cao của video gốc, có được thông qua VideoCapture ví dụ chứa dữ liệu về chính video, chẳng hạn như chiều rộng, chiều cao, tổng số khung hình, v.v.

Bây giờ, chúng ta có thể gọi phương thức trên bất kỳ video đầu vào nào:

pose_estimation_video('../ice_skating.mp4')

Thao tác này sẽ mở ra một cửa sổ OpenCV, hiển thị suy luận theo thời gian thực. Ngoài ra, nó sẽ ghi một tập tin video vào yolov7 thư mục (vì chúng tôi đã cd'd vào nó):

Ước tính tư thế thời gian thực từ video bằng Python với Trí thông minh dữ liệu chuỗi khối YOLOv7 Plato. Tìm kiếm dọc. Ái.

Lưu ý: Nếu GPU của bạn đang gặp khó khăn hoặc nếu bạn muốn nhúng kết quả của một mô hình như thế này vào một ứng dụng có độ trễ là một khía cạnh quan trọng của quy trình làm việc – hãy làm cho video nhỏ hơn và hoạt động trên các khung hình nhỏ hơn. Đây là video full HD 1920×1080 và có thể chạy nhanh trên hầu hết các hệ thống gia đình, nhưng nếu nó không hoạt động tốt trên hệ thống của bạn, hãy làm cho (các) hình ảnh nhỏ hơn.

Kết luận

Trong hướng dẫn này, chúng ta đã xem xét phương pháp YOLO, YOLOv7 và mối quan hệ giữa YOLO và phát hiện đối tượng, ước tính tư thế và phân đoạn đối tượng. Sau đó, chúng tôi đã xem xét cách bạn có thể dễ dàng cài đặt và làm việc với YOLOv7 bằng API có lập trình, đồng thời tạo một số phương pháp thuận tiện để suy luận và hiển thị kết quả dễ dàng hơn.

Cuối cùng, chúng tôi đã mở một video bằng OpenCV, chạy suy luận với YOLOv7 và tạo chức năng thực hiện ước tính tư thế trong thời gian thực, lưu video thu được ở độ phân giải đầy đủ và 30FPS trên ổ đĩa cục bộ của bạn.

Tiến xa hơn - Học sâu thực tế cho thị giác máy tính

Bản tính ham học hỏi của bạn khiến bạn muốn tiến xa hơn? Chúng tôi khuyên bạn nên kiểm tra Khóa học: “Học sâu thực tế cho thị giác máy tính với Python”.

Ước tính tư thế thời gian thực từ video bằng Python với Trí thông minh dữ liệu chuỗi khối YOLOv7 Plato. Tìm kiếm dọc. Ái.

Một khóa học thị giác máy tính khác?

Chúng tôi sẽ không phân loại các chữ số MNIST hoặc thời trang MNIST. Họ đã phục vụ phần của họ từ lâu lắm rồi. Quá nhiều tài nguyên học tập đang tập trung vào bộ dữ liệu cơ bản và kiến ​​trúc cơ bản trước khi để các kiến ​​trúc hộp đen nâng cao gánh vác gánh nặng về hiệu suất.

Chúng tôi muốn tập trung vào sự làm sáng tỏ, tính thực tiễn, sự hiểu biết, trực giácdự án thực tế. Muốn học làm thế nào Bạn có thể làm nên điều khác biệt? Chúng tôi sẽ đưa bạn đi từ cách bộ não của chúng ta xử lý hình ảnh để viết một bộ phân loại học sâu cấp độ nghiên cứu cho bệnh ung thư vú đến mạng lưới học tập sâu "ảo giác", dạy cho bạn các nguyên tắc và lý thuyết thông qua công việc thực tế, trang bị cho bạn bí quyết và công cụ để trở thành chuyên gia ứng dụng học sâu để giải quyết vấn đề thị giác máy tính.

Có gì bên trong?

  • Các nguyên tắc đầu tiên của tầm nhìn và cách máy tính có thể được dạy để "nhìn"
  • Các tác vụ và ứng dụng khác nhau của thị giác máy tính
  • Các công cụ giao dịch sẽ giúp công việc của bạn dễ dàng hơn
  • Tìm kiếm, tạo và sử dụng bộ dữ liệu cho thị giác máy tính
  • Lý thuyết và ứng dụng của Mạng nơ ron chuyển đổi
  • Xử lý sự thay đổi tên miền, đồng xuất hiện và các sai lệch khác trong tập dữ liệu
  • Chuyển giao Học tập và tận dụng thời gian đào tạo cũng như các tài nguyên tính toán của người khác vì lợi ích của bạn
  • Xây dựng và đào tạo một máy phân loại ung thư vú tiên tiến nhất
  • Cách áp dụng liều lượng hoài nghi lành mạnh vào các ý tưởng chủ đạo và hiểu được hàm ý của các kỹ thuật được áp dụng rộng rãi
  • Hình dung “không gian khái niệm” của ConvNet bằng t-SNE và PCA
  • Các nghiên cứu điển hình về cách các công ty sử dụng kỹ thuật thị giác máy tính để đạt được kết quả tốt hơn
  • Đánh giá mô hình thích hợp, hình dung không gian tiềm ẩn và xác định sự chú ý của mô hình
  • Thực hiện nghiên cứu miền, xử lý tập dữ liệu của riêng bạn và thiết lập các thử nghiệm mô hình
  • Các kiến ​​trúc tiên tiến, sự phát triển của các ý tưởng, điều gì làm cho chúng trở nên độc đáo và cách thực hiện chúng
  • KerasCV - một thư viện WIP để tạo các mô hình và đường ống hiện đại
  • Cách phân tích cú pháp và đọc các bài báo và tự thực hiện chúng
  • Lựa chọn mô hình tùy thuộc vào ứng dụng của bạn
  • Tạo một đường dẫn học máy từ đầu đến cuối
  • Phong cảnh và trực giác khi phát hiện đối tượng với R-CNN, RetinaNets, SSD và YOLO nhanh hơn
  • Phân đoạn phiên bản và ngữ nghĩa
  • Nhận dạng đối tượng trong thời gian thực với YOLOv5
  • Đào tạo máy dò đối tượng YOLOv5
  • Làm việc với Máy biến áp bằng KerasNLP (thư viện WIP dành cho ngành công nghiệp)
  • Tích hợp Transformers với ConvNets để tạo phụ đề cho hình ảnh
  • Ngủ sâu
  • Tối ưu hóa mô hình Deep Learning cho thị giác máy tính

Dấu thời gian:

Thêm từ xếp chồng lên nhau