Đếm số đối tượng trong ảnh python

Đếm đối tượng

Đếm số đối tượng bằng Python-OpenCV

điều kiện tiên quyết

  • OpenCV. Nó là một công cụ tuyệt vời để xử lý hình ảnh và thực hiện các tác vụ thị giác máy tính
  • Cái gối. Đó là Thư viện hình ảnh Python (PIL), bổ sung hỗ trợ cho việc mở, thao tác và lưu hình ảnh
  • tkinter. Nó là thư viện GUI tiêu chuẩn cho Python

Đang làm việc

bước 1. Nhập hình ảnh bằng opencv

Đếm số đối tượng trong ảnh python

bước 2. Thao tác hình ảnh

  • Tỷ lệ xám
  • làm mờ
  • Tìm ra các cạnh
  • Tính toán bộ đếm trong hình ảnh
  • in ra kết quả

Đếm số đối tượng trong ảnh python

Hãy xem xét một tình huống mà bạn đang tiến hành khảo sát một khu vực bờ biển. Bạn muốn hiểu liệu việc xây dựng một bến tàu khác có phù hợp hay không để đảm bảo rằng các bến cảng hiện tại không bị quá tải vào ban ngày. Đây là một vấn đề có thể được giải quyết với thị giác máy tính

Với thị giác máy tính, bạn có thể xác định các đối tượng khác nhau trong một hình ảnh. Sau đó, bạn có thể sử dụng mã để đếm số lượng phiên bản của một đối tượng nhất định trong một hình ảnh

Trong hướng dẫn này, chúng ta sẽ nói về cách đếm số lượng vật thể xuất hiện trong hình ảnh trên không của đường bờ biển. Chúng tôi sẽ đếm từng loại đối tượng riêng biệt để chúng tôi có thể xem có bao nhiêu thuyền và ván trượt phản lực trong một hình ảnh

Không chần chừ thêm nữa, chúng ta hãy bắt đầu

Cách đếm đối tượng trong một hình ảnh bằng Python

Để đếm các đối tượng trong một hình ảnh, trước tiên chúng ta cần một danh sách chứa tất cả các dự đoán được trả về bởi mô hình thị giác máy tính. Chúng tôi sẽ sử dụng mô hình Hàng hải trên không được lưu trữ trên Roboflow, nhưng bạn có thể sử dụng bất kỳ mô hình nào bạn muốn

Mô hình của chúng tôi dự đoán

  1. thuyền
  2. ô tô
  3. bến tàu
  4. Ván trượt phản lực
  5. thang máy

Trước khi chúng tôi bắt đầu, hãy đảm bảo rằng bạn có một danh sách gọi là "dự đoán" trong mã của bạn có chứa danh sách từ điển. Mỗi từ điển nên chứa tên của một lớp dự đoán và bất kỳ thông tin phụ trợ nào mà bạn có thể muốn tham khảo (i. e. tọa độ của một dự đoán)

Dưới đây là danh sách dự đoán ví dụ

{'predictions': [{'x': 127.0, 'y': 566.0, 'width': 78.0, 'height': 104.0, 'confidence': 0.8159579038619995, 'class': 'dock'}, {'x': 1200.0, 'y': 475.5, 'width': 52.0, 'height': 85.0, 'confidence': 0.7788712978363037, 'class': 'dock''}]

Hãy đếm tất cả các trường hợp của các đối tượng nói trên trong hình ảnh này

Đếm số đối tượng trong ảnh python

Chúng ta có thể viết một hàm Python đếm số lần mỗi lớp xuất hiện trong danh sách

def count_instances(predictions: dict) -> dict:
    classes = {}

    for bounding_box in predictions['predictions']:
        if bounding_box['class'] in classes:
            classes[bounding_box['class']] += 1
        else:
            classes[bounding_box['class']] = 1

    return classes
    
inference.save("aerial_with_bounding_boxes.jpg")

Trong chức năng này, chúng ta tạo một từ điển có tên là “classes”. Sau đó, chúng tôi lặp lại từng dự đoán. Đối với mỗi lớp, chúng tôi thêm 1 vào bộ đếm cho lớp đó trong từ điển “lớp”. Nếu lớp không có trong từ điển, lớp được thêm vào với giá trị 1

Dòng mã cuối cùng lưu các dự đoán vào một tệp để chúng tôi có thể xem chúng được vẽ. Nếu bạn không chạy mô hình Roboflow, bạn có thể nhận xét mã này

Hãy chạy mã của chúng tôi và xem điều gì sẽ xảy ra. Đầu ra sau đây được trả về

{'dock': 4, 'jetski': 1, 'lift': 5}

Từ điển này cung cấp cho chúng tôi rất nhiều thông tin. Chúng tôi có thể kết luận rằng không có chiếc thuyền nào trong hình ảnh của chúng tôi, theo mô hình của chúng tôi. Chúng ta cũng có thể thấy rằng, vào thời điểm bức ảnh được chụp, không có thuyền nào ở bến cảng. Chúng ta cũng có thể rút ra nhiều kết luận hơn

Chúng tôi đã đếm thành công số lượng đối tượng trong hình ảnh của mình

Mã của chúng tôi cũng đã vẽ các dự đoán của chúng tôi và lưu chúng vào một hình ảnh có tên là “aerial_with_bounding_boxes. jpg”. Chúng tôi có thể mở tệp này để xem mô hình của chúng tôi hoạt động như thế nào

Đếm số đối tượng trong ảnh python

Thêm logic sau khi đếm đối tượng

Chúng ta có thể thêm logic vào mã của mình để làm điều gì đó nếu số lượng đối tượng được đếm quá cao. Ví dụ: chúng tôi có thể làm cho mã của mình lưu bản ghi vào tệp CSV khi tìm thấy một bến tàu quá đông

with open("results.csv", "w+") as f:
    writer = csv.writer(f)

    writer.writerow(["class", "count", "image"])

    if results["boat"] > 0:
        writer.writerow(["boat", results["boat"], "aerial.jpeg"])

Mã này sẽ ghi một bản ghi vào tệp CSV nếu tìm thấy hơn 10 chiếc thuyền trên không. hình ảnh jpeg. Mã này có thể được điều chỉnh để hoạt động với toàn bộ thư mục hình ảnh, chạy cho từng hình ảnh và ghi nhật ký các trường hợp trong đó một thanh công cụ quá đông

Định cấu hình Mô hình (Tùy chọn)

Trong ví dụ trên, chúng tôi sử dụng dự án Hàng hải trên không được lưu trữ trên Roboflow Universe, một kho lưu trữ mở gồm hơn 110.000 bộ dữ liệu thị giác máy tính và hơn 10.000 mô hình được đào tạo

Chúng tôi có thể kiểm tra tập dữ liệu bằng cách mở dự án trong trình duyệt của mình và nhấp vào “Triển khai”. Thao tác này sẽ mở một tiện ích tương tác qua đó chúng ta có thể tương tác với mô hình của mình. Kéo hình ảnh vào mô hình để truy xuất dự đoán

0. 00

/

Chúng tôi có thể nhận dự đoán của mình bằng mã bằng cách sử dụng gói pip Roboflow. Để sử dụng gói, trước tiên hãy cài đặt gói thông qua dòng lệnh

pip install roboflow

Tiếp theo, cuộn xuống trên tab Triển khai và sao chép mã Python xuất hiện. Mã này sẽ cho phép bạn tải mô hình của mình vào chương trình Python. Mã sẽ trông như thế này

from roboflow import Roboflow

rf = Roboflow(api_key="YOUR_API_KEY")

project = rf.workspace().project("aerial-maritime")
model = project.version(22).model

Thay thế văn bản YOUR_API_KEY bằng khóa API của bạn. Điều này sẽ tự động xuất hiện trong mã trên tab Triển khai

Để truy xuất các dự đoán trên một hình ảnh, hãy sử dụng mã này

inference = model.predict("aerial.jpg", confidence=40, overlap=30)

predictions = inference.json()

Điều này trả về một đối tượng JSON của các dự đoán mà bạn có thể sử dụng trong ví dụ trước để đếm số lần mỗi lớp được xác định trong một hình ảnh xuất hiện

Phần kết luận

Trong hướng dẫn này, chúng ta đã thảo luận về cách đếm các đối tượng trong một hình ảnh bằng Python. Chúng tôi đã sử dụng một từ điển Python để đếm số lần mỗi đối tượng xuất hiện trong một hình ảnh được cung cấp. Sau đó, chúng tôi đã kết nối mã với logic để lưu bản ghi trong tệp CSV khi tìm thấy hơn 10 chiếc thuyền trong một hình ảnh, đó là tín hiệu cho thấy một khu vực của bờ biển có thể cần một bến tàu khác

Xử lý hình ảnh để đếm đối tượng là gì?

Nói chung, xử lý hình ảnh được coi là bất kỳ hình thức xử lý tín hiệu nào với đầu vào hình ảnh, chẳng hạn như khung ảnh hoặc video. Vấn đề đếm trong xử lý hình ảnh/video là ước tính số lượng đối tượng trong một hình ảnh tĩnh hoặc khung hình video .

Làm cách nào để phát hiện đối tượng trong hình ảnh Python?

Để thực sự phát hiện các đối tượng, bạn cần phải gọi phương thức detectObjectsFromImage() . Chuyển đường dẫn tệp của hình ảnh đầu vào của bạn đến thông số “input_image” và đường dẫn đến hình ảnh đầu ra (hình ảnh này sẽ chứa đối tượng được phát hiện, nhưng nó chưa tồn tại), đến thông số “output_image_path”.

Đếm đối tượng bằng thị giác máy tính là gì?

Đây là một trong những nhiệm vụ cơ bản trong thị giác máy tính. Mục tiêu của Đếm đối tượng là đếm số lượng đối tượng trong một chuỗi hình ảnh hoặc video đơn lẻ . Nó có nhiều ứng dụng trong thế giới thực như giám sát, vi sinh, ước tính mật độ đông đúc, đếm sản phẩm và giám sát lưu lượng giao thông.