Tận dụng đa xử lý với OpenCV trên mâm xôi Pi 2


7

Tôi đã từng sử dụng OpenCV trên Raspberry cho các dự án khác nhau (nhận dạng khuôn mặt, cam đồng bộ, khâu, v.v.). Tôi đã mua một quả mâm xôi Pi 2 vì những ưu điểm được đưa ra bởi cấu hình phần cứng mới.

Tuy nhiên, tôi không thể sử dụng 4 lõi để xử lý, ví dụ như khâu hình ảnh. Khi tôi thực hiện, giả sử khâu 3 hình ảnh, trong X, đồng hồ đo tải cho 25% tải (1 lõi). Khi tôi khởi chạy hai tập lệnh ghép với 2 cặp 2 ảnh, nó vẫn tải 25% cho CPU.

Điều này có thể sử dụng OpenCV và vận hành các hướng dẫn trên từng lõi hay nó cần sửa đổi các chức năng cốt lõi của OpenCV? Có thể sử dụng, ví dụ như với Python, các thư viện cho phép đa xử lý trên một số quả mâm xôi nhưng trên các lõi khác nhau của Raspberry Pi 2?


Nếu bạn đang đề cập đến các quy trình hoàn toàn riêng biệt, có vẻ giống như bạn, cuối cùng bạn sẽ có thể chạy đủ chúng để tối đa hóa tất cả bốn lõi trừ khi có một số tắc nghẽn I / O đáng kể mà tất cả chúng đều chia sẻ. Tôi không biết đủ về openCV để nói điều đó có thể là gì - nó có sử dụng GPU cho việc này không? Bạn có thể kiểm tra với một số công cụ khác (ví dụ htop) chỉ để xác nhận rằng hệ thống thực sự không tận dụng tối đa mọi thứ.
goldilocks

Câu trả lời:


3

Bạn nên kiểm tra thư viện đa xử lý . Nếu bạn có các phần của chương trình mà bạn có thể chạy song song, như xử lý nhiều hình ảnh và phát hiện khuôn mặt, bạn chỉ cần xác định một quy trình Pool. Theo mặc định, một nhóm sẽ bắt đầu nhiều tiến trình đồng thời như bạn có bộ xử lý. Bạn cũng có thể xác định kích thước nhóm và sửa thành 4.

ví dụ:

from multiprocessing import Pool
from glob import glob

def detect_face(file_name):
    ...

if __name__ == '__main__':
    with Pool() as p:
       p.map(detect_face, glob('*.jpg'))

Bạn cũng nên kiểm tra sherlock , một tập hợp các ví dụ về cách kết hợp đa xử lý và opencv.

Hạn chế:

Các thuật toán trong OpenCV tự nó không dễ dàng được thực thi trong nhiều quy trình. Vì OpenCV được viết bằng C ++, việc thực thi của chúng phụ thuộc nhiều vào việc thực hiện của chúng.


3

Nếu bạn biên dịch thư viện OpenCV với OpenMPtùy chọn kích hoạt trong tệp cmake (nó bị tắt theo mặc định), nhiều thuật toán sẽ tự động sử dụng nhiều lõi mà không cần bạn phải thay đổi bất cứ điều gì trong mã nguồn của mình. Trong trường hợp của tôi, tôi đã đạt được hiệu suất tăng tới 4,5 lần. Đúng, Raspberry Pi 2 chỉ có 4 lõi, nhưng nếu bạn thực hiện thao tác bấm số nặng, việc phân chia nhiệm vụ tốt có thể giảm đáng kể thời gian chờ đợi. Đối với các thuật toán ngắn hơn, đừng mong đợi nhiều hơn tốc độ tăng gấp 3 lần.

Hãy cẩn thận, với việc biên dịch các thư viện OpenMP, có một lỗi trong gói libpng. Nếu maketạm dừng với một lỗi vì libpngkhông thể tìm thấy zlib, một giải pháp nhanh và bẩn có thể là bạn chỉ cần sao chép nguồn zlib vào thư mục nguồn libpng (hoặc libpngtắt, nếu bạn không cần nó).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.