- Thành phần bắt buộc
- YOLO
- Cài đặt OpenCV trong Raspberry Pi
- Cài đặt các Gói bắt buộc khác trong Raspberry Pi
- Giải thích chương trình
- Thử nghiệm Dự án Máy dò Khoảng cách Xã hội
Vào thời của Covid-19, Cân bằng xã hội là một cách hiệu quả để làm chậm quá trình lây truyền vi rút truyền nhiễm. Người dân được khuyến cáo nên hạn chế tối đa việc tiếp xúc với nhau để giảm thiểu nguy cơ lây bệnh qua đường tiếp xúc trực tiếp. Duy trì khoảng cách an toàn là một thách thức đối với nhiều nơi như nhà máy, ngân hàng, xe buýt hoặc nhà ga, v.v.
Vì vậy, để tiếp tục các dự án an toàn Corona trước đây của chúng tôi như Máy làm vệ sinh tự động và giám sát nhiệt độ không tiếp xúc, ở đây chúng tôi sẽ xây dựng một hệ thống Máy dò khoảng cách xã hội sử dụng OpenCV và Raspberry Pi. Chúng tôi sẽ sử dụng các trọng số của Thuật toán phát hiện đối tượng YOLO v3 với mô-đun Deep Neural Network.
Raspberry Pi luôn là một lựa chọn tốt cho các dự án xử lý Hình ảnh vì nó có nhiều bộ nhớ và tốc độ hơn các bộ điều khiển khác. Trước đây chúng tôi đã sử dụng Raspberry Pi cho một số dự án xử lý hình ảnh phức tạp như phát hiện mốc khuôn mặt và ứng dụng nhận dạng khuôn mặt.
Thành phần bắt buộc
- Raspberry Pi 4
Ở đây chúng ta chỉ cần RPi 4 với OpenCV được cài đặt trên đó. OpenCV được sử dụng ở đây để xử lý hình ảnh kỹ thuật số. Các ứng dụng phổ biến nhất của Xử lý hình ảnh kỹ thuật số là phát hiện đối tượng, Nhận dạng khuôn mặt và bộ đếm người.
YOLO
YOLO (Bạn Chỉ Nhìn Một Lần) là mạng nơ-ron Convolution thông minh (CNN) để phát hiện đối tượng trong thời gian thực. YOLOv3, biến thể mới nhất của thuật toán phát hiện đối tượng, YOLO có thể nhận dạng 80 đối tượng khác nhau trong hình ảnh và video, tốc độ siêu nhanh và có độ chính xác tuyệt vời. Thuật toán áp dụng một mạng nơ-ron duy nhất cho toàn bộ hình ảnh, sau đó tách hình ảnh thành các vùng và tính toán các hộp ranh giới và xác suất cho từng vùng. Mô hình YOLO cơ sở có thể xử lý hình ảnh trong thời gian thực với tốc độ 45 khung hình / giây. Mô hình YOLO vượt trội hơn tất cả các phương pháp phát hiện khác như SSD và R-CNN.
Có thể tải xuống mô hình YOLOV3 mà chúng tôi sẽ sử dụng trong dự án này từ đây.
Cài đặt OpenCV trong Raspberry Pi
Trước khi cài đặt OpenCV và các phụ thuộc khác, Raspberry Pi cần được cập nhật đầy đủ. Sử dụng các lệnh dưới đây để cập nhật Raspberry Pi lên phiên bản mới nhất:
sudo apt-get cập nhật
Sau đó, sử dụng các lệnh sau để cài đặt các phụ thuộc cần thiết để cài đặt OpenCV trên Raspberry Pi của bạn.
sudo apt-get install libhdf5-dev -y sudo apt-get install libhdf5-serial-dev –y sudo apt-get install libatlas-base-dev –y sudo apt-get install libjasper-dev -y sudo apt-get install libqtgui4 –Y sudo apt-get install libqt4-test –y
Cuối cùng, cài đặt OpenCV trên Raspberry Pi bằng các lệnh dưới đây.
pip3 cài đặt opencv-Contrib-python == 4.1.0.25
Nếu bạn chưa quen với OpenCV, hãy xem các hướng dẫn OpenCV trước đây của chúng tôi với Raspberry pi:
- Cài đặt OpenCV trên Raspberry Pi bằng CMake
- Nhận dạng khuôn mặt thời gian thực với Raspberry Pi và OpenCV
- Nhận dạng biển số bằng Raspberry Pi và OpenCV
- Ước tính quy mô đám đông bằng OpenCV và Raspberry Pi
Chúng tôi cũng đã tạo một loạt các hướng dẫn OpenCV bắt đầu từ cấp độ người mới bắt đầu.
Cài đặt các Gói bắt buộc khác trong Raspberry Pi
Trước khi lập trình máy dò khoảng cách Raspberry Pi for Social, hãy cài đặt các gói bắt buộc khác.
Cài đặt imutils: imutils được sử dụng để thực hiện các chức năng xử lý hình ảnh thiết yếu như dịch, xoay, thay đổi kích thước, tạo bộ xương và hiển thị hình ảnh Matplotlib dễ dàng hơn với OpenCV. Sử dụng lệnh dưới đây để cài đặt imutils:
pip3 cài đặt imutils
Giải thích chương trình
Mã hoàn chỉnh được đưa ra ở cuối trang. Ở đây chúng tôi đang giải thích các phần quan trọng của mã để giải thích rõ hơn.
Vì vậy, khi bắt đầu mã, hãy nhập tất cả các thư viện bắt buộc sẽ được sử dụng trong dự án này.
import numpy as np import cv2 import imutils import os
Hàm Check () dùng để tính khoảng cách giữa hai đối tượng hoặc hai điểm trong một khung hình của video. Điểm a và b biểu thị hai đối tượng trong khung. Hai điểm này được sử dụng để tính toán Khoảng cách Euclid giữa các đối tượng.
def Kiểm tra (a, b): dist = ((a - b) ** 2 + 550 / ((a + b) / 2) * (a - b) ** 2) ** 0,5 hiệu chuẩn = (a + b) / 2 nếu 0 <dist <0,25 * hiệu chuẩn: trả về Đúng khác: trả về Sai
Chức năng thiết lập được sử dụng để thiết lập đường dẫn cho các trọng số YOLO, tệp cfg, tệp tên COCO. mô-đun os.path được sử dụng để thao tác tên đường dẫn chung. mô-đun os.path.join () là một mô-đun con của os.path và được sử dụng để tham gia một hoặc nhiều thành phần đường dẫn một cách thông minh. Phương thức cv2.dnn.readNetFromDarknet () được sử dụng để tải các trọng số đã lưu vào mạng. Sau khi tải các trọng số, trích xuất danh sách tất cả các lớp được sử dụng trong mạng bằng mô hình net.getLayerNames .
def Thiết lập (yolo): global neural_net, ln, LABELS weights = os.path.sep.join () config = os.path.sep.join () labelPath = os.path.sep.join () LABELS = open (labelPath).read (). strip (). split ("\ n") neural_net = cv2.dnn.readNetFromDarknet (config, weights) ln = neural_net.getLayerNames () ln = - 1] cho tôi trong neural_net.getUnconnectedOutLayers ()]
Bên trong chức năng xử lý hình ảnh, chúng tôi lấy một khung video duy nhất và sau đó xử lý nó để phát hiện khoảng cách xã hội giữa mọi người trong đám đông. Trong hai dòng đầu tiên của hàm, ban đầu chúng ta đặt kích thước của khung video (W, H) là (Không có, Không có). Trong dòng tiếp theo, chúng tôi sử dụng phương thức cv2.dnn.blobFromImage () để tải các khung hình theo lô và chạy chúng qua mạng. Hàm blob thực hiện phép trừ trung bình, chia tỷ lệ và hoán đổi kênh trên khung.
(H, W) = (Không có, Không có) frame = image.copy () nếu W là Không hoặc H là Không: (H, W) = frame.shape blob = cv2.dnn.blobFromImage (frame, 1 / 255.0, (416, 416), swapRB = True, crop = False) neural_net.setInput (blob) starttime = time.time () layerOutputs = neural_net.osystem (ln)
Các kết quả đầu ra của lớp từ YOLO bao gồm một tập hợp các giá trị. Các giá trị này giúp chúng ta xác định đối tượng nào thuộc lớp nào . Chúng tôi lặp lại mọi đầu ra trong layerOutputs và khi chúng tôi phát hiện mọi người, chúng tôi đặt nhãn lớp là "người". Từ mỗi lần phát hiện, chúng tôi nhận được một hộp giới hạn cung cấp cho chúng tôi tâm X, tâm Y, Chiều rộng và Chiều cao của hộp để phát hiện trong đầu ra:
điểm = phát hiện maxi_class = np.argmax (điểm) độ tin cậy = điểm nếu LABELS == "người": nếu độ tin cậy> 0,5: hộp = phát hiện * np.array () (centerX, centerY, width, height) = box.astype ("int") x = int (centerX - (width / 2)) y = int (centerY - (height / 2)) outline.append () confidences.append (float (trust))
Sau đó, tính khoảng cách giữa tâm của hộp hiện tại với tất cả các hộp khác được phát hiện. Nếu các hộp giới hạn gần nhau, thì hãy thay đổi trạng thái thành true.
for i in range (len (center)): for j in range (len (center)): close = Kiểm tra (center, center) if close: pair.append (, center]) status = True status = True index = 0
Trong các dòng tiếp theo, hãy vẽ một hình chữ nhật xung quanh người bằng cách sử dụng kích thước hộp mà chúng tôi nhận được từ mô hình, sau đó kiểm tra xem hộp đó là an toàn hay không an toàn. Nếu khoảng cách giữa các hộp gần nhau thì hộp có màu đỏ, còn hộp có màu xanh lục.
(x, y) = (outline, outline) (w, h) = (outline, outline) if status == True: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 150), 2) trạng thái elif == Sai: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
Bây giờ bên trong chức năng vòng lặp , chúng tôi đang đọc mọi khung hình của video và sau đó xử lý từng khung hình để tính toán khoảng cách giữa các người.
ret, frame = cap.read () nếu không ret: break current_img = frame.copy () current_img = imutils.resize (current_img, width = 480) video = current_img.shape frameno + = 1 nếu (frameno% 2 == 0 hoặc frameno == 1): Thiết lập (yolo) ImageProcess (current_img) Frame = processingImg
Trong các dòng tiếp theo, sử dụng hàm cv2.VideoWriter () để lưu trữ video đầu ra tại vị trí được chỉ định bởi opname mà chúng tôi đã xác định trước đó.
nếu create là None: fourcc = cv2.VideoWriter_fourcc (* 'XVID') create = cv2.VideoWriter (opname, fourcc, 30, (Frame.shape, Frame.shape), True) create.write (Frame)
Thử nghiệm Dự án Máy dò Khoảng cách Xã hội
Khi mã của bạn đã sẵn sàng, hãy mở một thiết bị đầu cuối Pi và điều hướng đến thư mục dự án. Mã, mô hình Yolo và video demo phải nằm trong cùng một thư mục như hình dưới đây.
Bạn có thể tải xuống thư mục YoloV3 từ đây, video từ Pexels và sao chép mã Python được cung cấp bên dưới, và đặt chúng vào cùng một thư mục như được hiển thị ở trên.
Khi bạn đang ở trong thư mục dự án, hãy thực thi lệnh sau để bắt đầu mã:
python3 detector.py
Tôi đã thử mã này trên một ví dụ video lấy từ Pexels. Đối với tôi, FPS rất chậm và mất khoảng 10 đến 11 phút để xử lý toàn bộ video.
Thay vì sử dụng video, bạn thậm chí có thể kiểm tra mã này bằng Máy ảnh Raspberry Pi bằng cách thay thế cv2.VideoCapture (đầu vào) bằng cv2.VideoCapture (0) ở dòng thứ 98 của mã. Tìm hiểu thêm về cách sử dụng PiCamera với Raspberry Pi theo liên kết.
Đây là cách bạn có thể sử dụng OpenCV với Raspberry Pi để phát hiện các vi phạm gây mất tập trung xã hội. Video đầu ra và mã được cung cấp bên dưới: