Phát hiện đối tượng RetinaNet với PyTorch và torchvision PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Phát hiện đối tượng RetinaNet với PyTorch và đèn pin

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”. Về một mặt, nó có thể được sử dụng để xây dựng các hệ thống tự động điều hướng các tác nhân thông qua các môi trường - có thể là robot thực hiện nhiệm vụ hoặc ô tô tự lái, nhưng điều này đòi hỏi sự giao thoa với các lĩnh vực khác. Tuy nhiên, phát hiện bất thường (chẳng hạn như sản phẩm bị lỗi trên một đường thẳng), định vị đối tượng trong ảnh, phát hiện khuôn mặt và nhiều ứng dụng khác của phát hiện đối tượng có thể được thực hiện mà không giao nhau giữa các trường khác.

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. Một trong những lợi ích chính của việc ở trong hệ sinh thái là nó cung cấp cho bạn một cách để không phải tìm kiếm thông tin hữu ích về các phương pháp, công cụ và phương pháp tiếp cận tốt để sử dụng. Với tính năng phát hiện đối tượng - hầu hết phải nghiên cứu nhiều hơn về cảnh quan của hiện trường để có được độ bám tốt.

Phát hiện đối tượng với RetinaNet của PyTorch/TorchVision

torchvision là dự án Thị giác máy tính của PyTorch và nhằm mục đích giúp việc phát triển các mô hình CV dựa trên PyTorch trở nên dễ dàng hơn bằng cách cung cấp các tập lệnh chuyển đổi và tăng cường, một vườn thú mô hình với các trọng số, bộ dữ liệu và tiện ích được đào tạo trước có thể hữu ích cho người thực hành.

Mặc dù vẫn đang trong giai đoạn thử nghiệm và còn rất nhiều thử nghiệm – torchvision cung cấp một API phát hiện đối tượng tương đối đơn giản với một số mô hình để lựa chọn:

  • R-CNN nhanh hơn
  • RetinaNet
  • FCOS (Mạng Retina phức hợp hoàn toàn)
  • SSD (xương sống VGG16… yike)
  • SSDLite (xương sống MobileNetV3)

Mặc dù API không bóng bẩy hoặc đơn giản như một số API của bên thứ ba khác, nhưng đây là điểm khởi đầu rất tốt cho những ai vẫn muốn sự an toàn khi ở trong hệ sinh thái mà họ quen thuộc. Trước khi tiếp tục, hãy đảm bảo bạn đã cài đặt PyTorch và Torchvision:

$ pip install torch torchvision

Hãy tải một số chức năng tiện ích, chẳng hạn như read_image(), draw_bounding_boxes()to_pil_image() để giúp đọc, vẽ và xuất hình ảnh dễ dàng hơn, tiếp theo là nhập RetinaNet và các trọng số được đào tạo trước của nó (MS COCO):

from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import retinanet_resnet50_fpn_v2, RetinaNet_ResNet50_FPN_V2_Weights

import matplotlib.pyplot as plt

RetinaNet sử dụng xương sống ResNet50 và Mạng Kim tự tháp Tính năng (FPN) trên đó. Mặc dù tên của lớp dài dòng nhưng nó biểu thị kiến ​​trúc. Hãy tìm nạp một hình ảnh bằng cách sử dụng requests thư viện và lưu nó dưới dạng tệp trên ổ đĩa cục bộ của chúng tôi:

import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)

img = read_image("obj_det.jpeg")

Với một hình ảnh đã có sẵn – chúng ta có thể khởi tạo mô hình và trọng số của mình:

weights = RetinaNet_ResNet50_FPN_V2_Weights.DEFAULT
model = retinanet_resnet50_fpn_v2(weights=weights, score_thresh=0.35)

model.eval()

preprocess = weights.transforms()

Sản phẩm score_thresh đối số xác định ngưỡng mà tại đó một đối tượng được phát hiện là đối tượng của một lớp. Theo trực giác, đó là ngưỡng tin cậy và chúng tôi sẽ không phân loại một đối tượng thuộc về một lớp nếu mô hình có độ tin cậy dưới 35% rằng nó thuộc về một lớp.

Hãy xử lý trước hình ảnh bằng cách sử dụng các phép biến đổi từ trọng số của chúng tôi, tạo một lô và chạy suy luận:

batch = [preprocess(img)]
prediction = model(batch)[0]

Thế thôi, của chúng tôi prediction từ điển chứa các lớp và vị trí đối tượng được suy ra! Bây giờ, các kết quả không hữu ích lắm đối với chúng tôi trong biểu mẫu này – chúng tôi sẽ muốn trích xuất các nhãn liên quan đến siêu dữ liệu từ các trọng số và vẽ các hộp giới hạn, việc này có thể được thực hiện thông qua draw_bounding_boxes():

labels = [weights.meta["categories"][i] for i in prediction["labels"]]

box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                          labels=labels,
                          colors="cyan",
                          width=2, 
                          font_size=30,
                          font='Arial')

im = to_pil_image(box.detach())

fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()

Kết quả này trong:

RetinaNet thực sự đã phân loại người nhìn trộm phía sau xe! Đó là một sự phân loại khá khó khăn.

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

Bạn có thể chuyển RetinaNet sang FCOS (RetinaNet hoàn toàn phức hợp) bằng cách thay thế retinanet_resnet50_fpn_v2 với fcos_resnet50_fpn, và sử dụng FCOS_ResNet50_FPN_Weights trọng lượng:

from torchvision.io.image import read_image
from torchvision.utils import draw_bounding_boxes
from torchvision.transforms.functional import to_pil_image
from torchvision.models.detection import fcos_resnet50_fpn, FCOS_ResNet50_FPN_Weights

import matplotlib.pyplot as plt
import requests
response = requests.get('https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg')
open("obj_det.jpeg", "wb").write(response.content)

img = read_image("obj_det.jpeg")
weights = FCOS_ResNet50_FPN_Weights.DEFAULT
model = fcos_resnet50_fpn(weights=weights, score_thresh=0.35)
model.eval()

preprocess = weights.transforms()
batch = [preprocess(img)]
prediction = model(batch)[0]

labels = [weights.meta["categories"][i] for i in prediction["labels"]]

box = draw_bounding_boxes(img, boxes=prediction["boxes"],
                          labels=labels,
                          colors="cyan",
                          width=2, 
                          font_size=30,
                          font='Arial')

im = to_pil_image(box.detach())

fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(im)
plt.show()

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

Phát hiện đối tượng RetinaNet với PyTorch và torchvision 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

Kết luận

Phát hiện đối tượng là một lĩnh vực quan trọng của Thị giác máy tính và đáng tiếc là lĩnh vực này ít có khả năng tiếp cận hơn mức cần thiết.

Trong hướng dẫn ngắn này, chúng ta đã xem xét cách torchvision, gói Computer Vision của PyTorch, giúp thực hiện phát hiện đối tượng trên hình ảnh dễ dàng hơn bằng cách sử dụng RetinaNet.

Dấu thời gian:

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