Ước tính tư thế/Phát hiện điểm chính với YOLOv7 trong Python PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Ước tính tư thế / Phát hiện điểm chính với YOLOv7 bằng Python

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”.

Phát hiện đối tượng không được tiêu chuẩn hóa như phân loại hình ảnh, chủ yếu là vì hầu hết các phát triển mới thường được thực hiện bởi các nhà nghiên cứu, người bảo trì và nhà phát triển riêng lẻ, thay vì các thư viện và khuôn khổ lớn. Thật khó để đóng gói các tập lệnh tiện ích cần thiết trong một khuôn khổ như TensorFlow hoặc PyTorch và duy trì các nguyên tắc API đã hướng dẫn sự phát triển cho đến nay.

Điều này làm cho việc phát hiện đối tượng hơi phức tạp hơn, thường dài dòng hơn (nhưng không phải lúc nào cũng vậy) và ít dễ tiếp cận hơn so với phân loại hình ảnh.

May mắn thay cho đại chúng - Ultralytics đã phát triển một API phát hiện đối tượng đơn giản, rất mạnh mẽ và đẹp mắt xung quanh YOLOv5 của họ, đã được các nhóm nghiên cứu và phát triển khác mở rộng thành các phiên bản mới hơn, chẳng hạn như YOLOv7.

Trong hướng dẫn ngắn này, chúng tôi sẽ thực hiện Ước tính tư thế (Phát hiện điểm chính) bằng Python, với YOLOv7 hiện đại.

Các điểm chính có thể là các đ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ể người và có thể được sử dụng để thay thế phần cứng theo dõi vị trí đắt tiền, cho phép điều khiển robot qua không trung và cung cấp năng lượng cho một kỷ nguyên mới về thể hiện bản thân của con người thông qua AR và VR.

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à lần triển khai quy mô lớn đầu tiên của YOLO trong PyTorch, giúp nó dễ tiếp cận hơn bao giờ hết, nhưng lý do chính khiến YOLOv5 có được chỗ đứng như vậy cũng là do API mạnh mẽ và đơn giản tuyệt đẹp được xây dựng xung quanh nó. Dự án loại bỏ các chi tiết không cần thiết, đồng thời cho phép khả năng tùy chỉnh, thực tế là tất cả các định dạng xuất có thể sử dụng và áp dụng các phương pháp tuyệt vời giúp toàn bộ dự án vừa hiệu quả vừa tối ưu nhất có thể.

YOLOv5 vẫn là dự án chủ yếu để xây dựng các mô hình Phát hiện Đối tượng và nhiều kho lưu trữ nhằm mục đích nâng cao phương pháp YOLO bắt đầu với YOLOv5 làm đường cơ sở và cung cấp một API tương tự (hoặc đơn giản là phân nhánh dự án và xây dựng trên nó). Đó là trường hợp của 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ả), là tiến bộ mới nhất trong phương pháp YOLO.

YOLOv7 không chỉ là một kiến ​​trúc phát hiện đối tượng - cung cấp các đầu mô hình mới, có thể xuất ra các điểm chính (bộ xương) và thực hiện phân đoạn phiên bản bên cạnh chỉ hồi quy hộp giới hạn, điều này không chuẩn với các mô hình YOLO trước đó. Điều này không có gì đáng ngạc nhiên, vì nhiều kiến ​​trúc phát hiện đối tượng đã được định vị lại cho các nhiệm vụ phân đoạn ví dụ và phát hiện điểm khóa trước đó, do kiến ​​trúc chung được chia sẻ, với các đầu ra khác nhau tùy thuộc vào tác vụ. Mặc dù điều đó không có gì đáng ngạc nhiên - 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, đã bắt đầu hoạt động tốt hơn thực tế tất cả các máy dò hai giai đoạn khác vài năm trướ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 tiếp tục và cài đặt dự án từ GitHub:

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

Điều này tạo ra một yolov7 trong thư mục làm việc hiện tại của bạn, trong đó bạn sẽ có thể tìm thấy các tệp dự án cơ bản:

%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

Lưu ý: Google Colab Notebooks đặt lại về thư mục làm việc chính trong ô tiếp theo, ngay cả sau khi gọi %cd dirname, vì vậy bạn sẽ phải tiếp tục gọi nó trong mỗi ô mà bạn muốn thực hiện một thao tác. Local Jupyter Notebooks ghi nhớ sự thay đổi, vì vậy không cần tiếp tục gọi lệnh.

Bất cứ khi nào bạn chạy mã với một bộ trọng số nhất định - chúng sẽ được tải xuống và lưu trữ trong thư mục này. Để thực hiện ước tính tư thế, chúng tôi sẽ muốn tải xuống trọng lượng cho mô hình YOLOv7 được đào tạo trước cho nhiệm vụ đó, có thể được tìm thấy trong /releases/download/ tab trên 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

Tuyệt vời, chúng tôi đã tải xuống yolov7-w6-pose.pt tập tin weights, có thể được sử dụng để tải và xây dựng lại một mô hình được đào tạo để ước lượng tư thế.

Đang tải Mô hình ước tính tư thế YOLOv7

Hãy nhập các thư viện mà chúng ta sẽ cần để thực hiện ước tính tư thế:

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 đủ đơn giản - YOLOv7 được triển khai với PyTorch. Các utils.datasets, utils.generalutils.plots mô-đun đến từ dự án YOLOv7 và cung cấp cho chúng tôi các phương pháp giúp xử lý trước và chuẩn bị đầu vào cho mô hình để chạy suy luận. Trong số đó có letterbox() để đệm hình ảnh, non_max_supression_keypoint() để chạy thuật toán Siêu biểu thức Không Tối đa trên đầu ra ban đầu của mô hình và để tạo ra một đầu ra rõ ràng cho phần diễn giải của chúng tôi, cũng như output_to_keypoint()plot_skeleton_kpts() các phương pháp để thực sự thêm các điểm chính vào một hình ảnh nhất định, sau khi chúng được dự đoán.

Chúng tôi có thể tải mô hình từ tệp trọng lượng với torch.load(). Hãy tạo một hàm để kiểm tra xem GPU có sẵn không, tải mô hình, đặt nó ở chế độ suy luận và di chuyển nó sang GPU nếu có:

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

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ó!

Với mô hình được tải, hãy tạo một run_inference() phương thức chấp nhận một chuỗi trỏ đến một tệp trên hệ thống của chúng tôi. Phương thức sẽ đọc hình ảnh bằng OpenCV (cv2), đệm nó bằng letterbox(), áp dụng các phép biến đổi cho nó và biến nó thành một đợt (mô hình được đào tạo và mong đợi các đợt, như thường lệ):

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

Ở đây, chúng tôi đã trả lại hình ảnh đã biến đổi (vì chúng tôi muốn trích xuất bản gốc và vẽ biểu đồ trên đó) và các kết quả đầu ra của mô hình. Các kết quả đầu ra này chứa 45900 dự đoán quan trọng, hầu hết đều trùng lặp. Chúng tôi sẽ muốn áp dụng Biểu thức không tối đa cho các dự đoán thô này, giống như với các dự đoán Phát hiện đối tượng (trong đó nhiều hộp giới hạn được dự đoán và sau đó chúng được "thu gọn" với một số độ tin cậy và ngưỡng IoU). Sau khi giải nén, chúng ta có thể vẽ từng điểm chính trên hình ảnh gốc và hiển thị nó:

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

Bây giờ, đối với một số hình ảnh đầu vào, chẳng hạn như karate.jpg trong thư mục làm việc chính, chúng ta có thể chạy suy luận, thực hiện Biểu thức không tối đa và vẽ biểu đồ kết quả với:

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

Kết quả này trong:

Đây là một hình ảnh khá khó để suy luận! Hầu hết cánh tay phải của người tập ở bên phải bị ẩn và chúng ta có thể thấy rằng mô hình suy ra rằng nó bị ẩn và ở bên phải cơ thể, thiếu rằng khuỷu tay bị cong và một phần của cánh tay ở phía trước . Người thực hành ở bên trái, được nhìn thấy rõ ràng hơn, được suy luận chính xác, ngay cả với một chân ẩn.

Thực tế là - một người ngồi ở phía sau, gần như hoàn toàn vô hình trước máy ảnh tư thế của họ dường như được ước lượng chính xác, chỉ dựa trên vị trí của hông khi ngồi xuống. Công việc tuyệt vời thay mặt cho mạng lưới!

Kết luận

Trong hướng dẫn này - chúng tôi đã giới thiệu sơ lược về YOLOv7, tiến bộ mới nhất trong dòng YOLO, được xây dựng dựa trên YOLOR và cung cấp thêm khả năng phân đoạn phiên bản và phát hiện điểm khóa ngoài khả năng phát hiện đối tượng tiêu chuẩn của hầu hết các mô hình dựa trên YOLO .

Sau đó, chúng tôi đã xem xét cách chúng tôi có thể tải xuống các tệp trọng lượng đã phát hành, tải chúng vào để xây dựng mô hình và thực hiện suy luận ước tính tư thế cho con người, mang lại kết quả ấn tượng.

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ế/Phát hiện điểm chính với YOLOv7 trong Python PlatoBlockchain Data Intelligence. 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