Phát hiện người vào và người ra với python
Hôm nay, chúng tôi sẽ viết một chương trình có thể phát hiện mọi người trong luồng video, gần như theo thời gian thực (nó sẽ phụ thuộc vào tốc độ CPU của bạn. ) Show
Trong bài viết của tôi về phát hiện đối tượng với darknet, chúng ta đã thấy cách sử dụng deep learning để phát hiện đối tượng trong ảnh. Đối với điều này, chúng tôi đã sử dụng mạng thần kinh YOLOv3, được đào tạo trước để phát hiện và xác định các đối tượng trong 80 danh mục (người, ô tô, xe tải, chậu cây, hươu cao cổ,. ) YOLOv3 là thuật toán phát hiện đối tượng tiên tiến nhất. Nó rất chính xác và nhanh chóng khi được đánh giá trên GPU mạnh, so với các thuật toán khác Tuy nhiên, ngay cả với GeForce GTX 1080 Ti, phải mất 200 mili giây để phát hiện các đối tượng trong một hình ảnh. Và để phát hiện thời gian thực, người ta cần giảm xuống 40 ms/hình ảnh hoặc thấp hơn để có thể xử lý luồng video ở 24 hình ảnh/s Ngoài ra, các máy trạm deep learning mạnh mẽ thường đắt tiền và tiêu tốn nhiều năng lượng. Vì vậy, chúng chắc chắn là không đủ nếu mục tiêu của bạn là xây dựng một hệ thống giám sát gia đình nhỏ hoạt động mọi lúc Vì vậy, ở đây, chúng ta sẽ không học sâu. Thay vào đó, chúng tôi sẽ sử dụng các công cụ học máy đơn giản có thể được đánh giá rất nhanh trên CPU Trong bài đăng này, bạn sẽ học
Cài đặt OpenCVOpenCV là thư viện thị giác máy tính mã nguồn mở và nó siêu mạnh. Dưới đây là một vài điều ngẫu nhiên mà bạn có thể làm với nó
Bạn có thể bắt đầu với hướng dẫn OpenCV và cũng có thể xem blog rất hay từ Adrian Rosebrock. Đó thực sự là nơi lần đầu tiên tôi tiếp xúc với OpenCV Vì vậy, hãy cài đặt công cụ. Hôm nay chúng ta sẽ cài đặt nó thông qua Anaconda. Tôi cho rằng bạn đã cài đặt anaconda cho python 3. X. Nếu không, bạn có thể làm theo các hướng dẫn sau Thêm các gói sau vào anaconda. opencv numpy matplotlib Nếu bạn biết cách sử dụng dòng lệnh, bạn có thể cài đặt chúng bằng cách gõ conda install opencv numpy matplotlib Nếu không, chỉ cần sử dụng bộ điều hướng anaconda Truy cập webcam của bạnĐọc từ webcam của bạn thật dễ dàng với OpenCV, chỉ cần viết đoạn mã sau và chạy nó với python import numpy as np import cv2 cv2.startWindowThread() cap = cv2.VideoCapture(0) while(True): # reading the frame ret, frame = cap.read() # displaying the frame cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): # breaking the loop if the user types q # note that the video window must be highlighted! break cap.release() cv2.destroyAllWindows() # the following is necessary on the mac, # maybe not on other platforms: cv2.waitKey(1) Bạn sẽ thấy một cửa sổ bật lên với hình ảnh từ webcam của bạn Bây giờ, hãy thử và thao tác với luồng video. Video được đọc từng khung hình nên chúng ta có thể chỉnh sửa khung hình trước khi hiển thị. Thêm các dòng sau trước khi hiển thị khung # turn to greyscale: frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) # apply threshold. all pixels with a level larger than 80 are shown in white. the others are shown in black: ret,frame = cv2.threshold(frame,80,255,cv2.THRESH_BINARY) phát hiện ngườiOpenCV có tính năng triển khai phương pháp phát hiện con người rất nhanh, được gọi là HOG (Histograms of Oriented Gradients) Phương pháp này được đào tạo để phát hiện người đi bộ, phần lớn là người đứng và có thể nhìn thấy đầy đủ. Vì vậy, đừng mong đợi nó hoạt động tốt trong các trường hợp khác Trước khi thảo luận về phương pháp này, chúng ta sẽ thử. Sửa đổi kịch bản của bạn như sau # import the necessary packages import numpy as np import cv2 # initialize the HOG descriptor/person detector hog = cv2.HOGDescriptor() hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) cv2.startWindowThread() # open webcam video stream cap = cv2.VideoCapture(0) # the output will be written to output.avi out = cv2.VideoWriter( 'output.avi', cv2.VideoWriter_fourcc(*'MJPG'), 15., (640,480)) while(True): # Capture frame-by-frame ret, frame = cap.read() # resizing for faster detection frame = cv2.resize(frame, (640, 480)) # using a greyscale picture, also for faster detection gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) # detect people in the image # returns the bounding boxes for the detected objects boxes, weights = hog.detectMultiScale(frame, winStride=(8,8) ) boxes = np.array([[x, y, x + w, y + h] for (x, y, w, h) in boxes]) for (xA, yA, xB, yB) in boxes: # display the detected boxes in the colour picture cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2) # Write the output video out.write(frame.astype('uint8')) # Display the resulting frame cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # When everything done, release the capture cap.release() # and release the output out.release() # finally, close the window cv2.destroyAllWindows() cv2.waitKey(1) Bây giờ hãy chạy tập lệnh Với các tham số này, việc phát hiện được thực hiện gần như trong thời gian thực trên máy của tôi. Bạn sẽ thấy máy dò hoạt động tốt hơn nếu người đó không ở quá gần máy ảnh. Nếu người đó ở gần, một số hộp chồng lên nhau thường được hiển thị Tuy nhiên, hiệu suất này là quá đủ cho một hệ thống giám sát gia đình nhỏ, đây sẽ là chủ đề của một bài báo trong tương lai HOG hoạt động như thế nào?Bạn đã có thể phát hiện mọi người trong luồng video và bạn có thể dừng tại đây nếu muốn Nhưng nếu bạn muốn biết thuật toán hoạt động như thế nào, hãy đọc tiếp, tôi đã cố gắng giải thích nó một cách đơn giản Hiệu suất của thuật toán HOG được hiển thị trong bài báo gốc của Dalal và Triggs. Tuy nhiên, để thực sự hiểu cách thức hoạt động của thuật toán, tôi đã phải tìm hiểu các tài liệu tham khảo của bài báo này và đặc biệt là bài báo chuyên đề này về nhận dạng cử chỉ tay Bạn cũng có thể xem bài viết blog hay này Để hiểu cách thức hoạt động của HOG ( Histograms of Oriented Gradients ), trước tiên cần hiểu gradient là gì và biểu đồ tần số là gì Độ dốc là gì?Đối với hàm 1D f phụ thuộc vào biến x, gradient chỉ đơn giản là đạo hàm của hàm. Tại một điểm nhất định, đạo hàm cho hệ số góc cục bộ của hàm Ví dụ: hãy xem xét hàm f(x) = x. Đạo hàm của hàm này là f'(x) = 1. Vì vậy, hàm này là một đường thẳng và đạo hàm của nó là một hằng số, có nghĩa là hệ số góc là một hằng số Nếu bây giờ chúng ta xét f(x) = x^2, thì đạo hàm là f(x) = 2x. Đối với x < 0, đạo hàm âm và hàm số đang giảm. Với x>0, đạo hàm dương và hàm số tăng. Với x = 0, đạo hàm bằng 0. Điều này có nghĩa là độ dốc địa phương là 0. Nói cách khác, ở đây, hàm phẳng cục bộ Ở dạng 2D, trong mặt phẳng (x,y), hàm của x và y là một mặt cho độ cao tại mọi điểm. Độ dốc là tổng quát của đạo hàm. tại một điểm (x,y) đã cho, độ dốc được định hướng theo hướng có độ dốc lớn nhất và độ lớn của nó là độ dốc của mặt phẳng tiếp tuyến với bề mặt tại điểm này. Đây là một minh họa từ bài viết trên wikipedia Hãy trở lại với trường hợp của chúng ta. Trong ảnh đen trắng, mức thang độ xám tương tự như độ cao và độ dốc là thước đo mức độ thay đổi nhanh như thế nào và hướng của sự thay đổi. Một cạnh trong ảnh (chuyển đổi đen sang trắng) dẫn đến một dải màu lớn vuông góc với cạnh, từ trắng sang đen. Trong một bức ảnh màu, người ta có thể tính toán độ dốc cho từng cấp độ màu và e. g. lấy độ dốc tối đa trên ba cấp độ màu Vậy tại sao các gradient được cho là có định hướng? . Nó chỉ có nghĩa là phương pháp này theo dõi hướng dốc và nó tạo nên một từ viết tắt hay, HOG một biểu đồ là gì?Biểu đồ là một cấu trúc dữ liệu được sử dụng để nén dữ liệu và biểu thị phân phối xác suất của nó. Một biểu đồ có thể có nhiều chiều nhưng trong thực tế, biểu đồ 1D và 2D thường được sử dụng nhất. Trong HOG, độ dốc được lưu trữ trong biểu đồ 1D, vì vậy hãy tập trung vào đó Lấy một mảng các giá trị. [1, 1. 5, 2. 2, 3. 5, 3. 5, 3. 6, 4. 1] Chúng tôi xác định biểu đồ bằng cách mô tả các thùng của nó. Các thùng là các giỏ đếm số mục nhập có giá trị nằm trong phạm vi thùng Bạn có thể nhập cái này vào ipython để xem biểu đồ import numpy as np import matplotlib.pyplot as plt values = [1.1, 1.5, 2.2, 3.5, 3.5, 3.6, 4.1] plt.hist(values, bins=4, range=(1,5)) plt.show() Bạn nhận được biểu đồ này Cũng có thể cân từng giá trị. Khi giá trị đi vào biểu đồ, đóng góp của nó vào thùng được cho bởi trọng số, theo mặc định là 1. Đây là một biểu đồ có trọng số import numpy as np import matplotlib.pyplot as plt values = [1.1, 1.5, 2.2, 3.5, 3.5, 3.6, 4.1] weights = [1., 1., 3., 1.2, 1.4, 1.1, 0.2] plt.hist(values, bins=4, range=(1,5), weights=weights) plt.show() Biểu đồ của các gradient định hướngÝ tưởng cơ bản của phương pháp là như sau
Điểm cuối cùng là chủ đề của phần tiếp theo. Ở đây, hãy xem biểu đồ của các gradient định hướng được xây dựng như thế nào cho một ô nhất định, với một ví dụ nhỏ import numpy as np import matplotlib.pyplot as plt import cv2 cell = np.array([ [0, 1, 2, 5, 5, 5, 5, 5], [0, 0, 1, 4, 4, 5, 5, 5], [0, 0, 1, 3, 4, 5, 5, 5], [0, 0, 0, 1, 2, 3, 5, 5], [0, 0, 0, 0, 1, 2, 5, 5], [0, 0, 0, 0, 0, 1, 3, 5], [0, 0, 0, 0, 0, 0, 2, 5], [0, 0, 0, 0, 0, 0, 1, 3], ],dtype='float64') # compute the gradients in the x and y directions: gradx = cv2.Sobel(cell, cv2.CV_64F,1,0,ksize=1) grady = cv2.Sobel(cell, cv2.CV_64F,0,1,ksize=1) # compute the magnitude and angle of the gradients norm, angle = cv2.cartToPolar(gradx,grady,angleInDegrees=True) plt.figure(figsize=(10,5)) # display the image plt.subplot(1,2,1) plt.imshow(cell, cmap='binary', origin='lower') # display the magnitude of the gradients: plt.subplot(1,2,2) plt.imshow(norm, cmap='binary', origin='lower') # and superimpose an arrow showing the gradient # magnitude and direction: q = plt.quiver(gradx, grady, color='blue') plt.savefig('gradient.png') plt.show() Bạn nhận được các lô sau. Chúng tôi thấy rằng trong biểu đồ gradient, các bề mặt phẳng biến mất và cạnh có thể nhìn thấy rõ ràng Cuối cùng chúng ta hãy vẽ biểu đồ của các gradient định hướng plt.hist(angle.reshape(-1), weights=norm.reshape(-1), bins=20, range=(0,360)) plt.show() Trong biểu đồ này, 0 tương ứng với độ dốc đi về bên phải. Chỉ có một mũi tên đi xuống, được hiển thị trong thùng [270;290[ Nếu một số pixel trong ô có độ dốc với hướng giống nhau, thì chúng đóng góp vào cùng một thùng. Ngoài ra, độ dốc lớn đóng góp nhiều hơn. Vì vậy, Đỉnh ở phía bên phải tương ứng với cạnh hiển thị trong ô Lập biểu đồ độ dốc theo cách này giúp dễ dàng nhận ra các cạnh trong ô Bây giờ biểu đồ này dành cho một ô. Chúng ta cần một thủ tục để phân tích tất cả các ô trong cửa sổ phát hiện hiện tại để tìm xem cửa sổ đó có chứa người hay không Đặt tất cả các ô lại với nhau trong một bộ phân loại học máyChúng tôi có một HOG cho mỗi ô trong cửa sổ phát hiện. Tất cả các HOG được nối thành một dãy số lớn. Ví dụ: nếu cửa sổ phát hiện có 8x16 = 128 ô và mỗi HOG có 20 ngăn, chúng tôi sẽ có 2560 giá trị Về nguyên tắc, bất kỳ loại phân loại học máy nào cũng có thể được sử dụng để đưa ra quyết định (có người hay không?) dựa trên các giá trị này Tuy nhiên, vì có rất nhiều kích thước (trong ví dụ của chúng tôi là 2560) và số lượng hình ảnh có sẵn cho quá trình đào tạo không lớn lắm, Dalal và Triggs đã quyết định sử dụng Máy Vector Hỗ trợ (SVM) (máy tuyến tính). Đó cũng là những gì đang được thực hiện trong triển khai OpenCV của HOG Để giải thích về SVM, cần phải sử dụng các công cụ toán học nâng cao và điều này nằm ngoài phạm vi của blog này. Nhưng nếu bạn quan tâm và đang ở trình độ thạc sĩ về toán hoặc vật lý, bạn có thể theo dõi bài giảng tuyệt vời này của Andrew Ng (không dành cho người yếu tim. ) Và bây giờ?Trong bài đăng này, bạn đã học được cách
Bạn cũng đã học cách HOG hoạt động Đọc thêm về nhận dạng hình ảnhXin vui lòng cho tôi biết những gì bạn nghĩ trong các ý kiến. Tôi sẽ cố gắng và trả lời tất cả các câu hỏi Và nếu bạn thích bài viết này, bạn có thể đăng ký vào danh sách gửi thư của tôi để được thông báo về các bài đăng mới (tôi hứa không quá một thư mỗi tuần. ) Làm cách nào để phát hiện con người trong Python?Python - OpenCV & PyQT5 cùng nhau . Nhập thư viện cần thiết. . Đọc hình ảnh đầu vào bằng cv2. . Khởi tạo một đối tượng mô tả HOG hog = cv2. . Phát hiện con người trong hình ảnh đầu vào bằng cách sử dụng hog. . Lặp lại tất cả những người được phát hiện trong ảnh và vẽ các hình chữ nhật bao quanh những người được phát hiện trong ảnh gốc bằng cách sử dụng cv2 Thuật toán tốt nhất để phát hiện đối tượng là gì?Các thuật toán phát hiện đối tượng phổ biến nhất. Các thuật toán phổ biến được sử dụng để thực hiện phát hiện đối tượng bao gồm mạng nơ-ron tích chập (R-CNN, Mạng nơ-ron tích chập dựa trên khu vực), R-CNN nhanh và YOLO (Bạn chỉ nhìn một lần). The R-CNN's are in the R-CNN family, while YOLO is part of the single-shot detector family.
Phát hiện và đếm con người là gì?Trong hệ thống này, người dùng phải tải lên hình ảnh hoặc video để phát hiện con người . Để phát hiện con người trong thời gian thực, có thể sử dụng webcam. Sau đó, số lượng người được đếm sẽ được hiển thị trong khi phát hiện.
Làm thế nào để phát hiện một người?Các công nghệ hiện đại được đề xuất hoặc triển khai cho cảm biến của con người bao gồm. . cảm biến âm thanh Nhận dạng hình ảnh của hình dạng con người máy dò hồng ngoại Gạch lát sàn nhạy cảm với áp lực ra-đa cảm biến hóa học Phát hiện tín hiệu điện thoại di động, máy tính, Bluetooth hoặc Wi-Fi của một thiết bị được cho là thuộc quyền sở hữu của một người |