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

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ách cài đặt OpenCV, cung cấp các công cụ đơn giản cho đầu vào và đầu ra video cũng như cho máy học;
  • Cách viết một tập lệnh nhỏ để thực hiện phát hiện người trong luồng video từ webcam của bạn hoặc trong một trong các bộ phim của bạn bằng thuật toán HOG [Biểu đồ của các dải màu định hướng];
  • HOG hoạt động như thế nào

Cài đặt OpenCV

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

  • đầu vào và đầu ra video
  • tái tạo 3D
  • phân tích video
  • phát hiện đối tượng
  • ghép ảnh để tạo ảnh toàn cảnh
  • ...

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ười

OpenCV 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ố

f[x] = x và đạo hàm của nó, f'[x] = 1

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ộ

f[x] = x^2 và đạo hàm của nó, f'[x] = 2x

Ở 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

Độ dốc của hai chức năng 2D. Trong trường hợp cụ thể này, càng nhiều màu đen, chức năng càng lớn. Ở giữa hình ảnh bên trái, độ dốc không được hiển thị, nhưng nó sẽ bằng 0

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

Một biểu đồ với 4 thùng. Ngăn đầu tiên có hai mục [1. 1, 1. 5], mục nhập ngăn thứ hai [2. 2], thùng thứ ba ba mục [3. 5, 3. 5, 3. 6] và mục nhập thùng cuối cùng [4. 1]

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[]

Một biểu đồ có trọng số

Biểu đồ của các gradient định hướng

Ý tưởng cơ bản của phương pháp là như sau

  • Hình ảnh được quét với một cửa sổ phát hiện có kích thước khác nhau
  • Đối với mỗi vị trí và kích thước của cửa sổ phát hiện, cửa sổ được chia thành các ô. Các tế bào trong thực tế tương đối nhỏ. chúng thường chỉ chứa một phần nhỏ của người được phát hiện, có thể là một bên cánh tay hoặc đỉnh đầu
  • Trong mỗi ô, một độ dốc được tính toán cho từng pixel và độ dốc được sử dụng để điền vào biểu đồ. giá trị là góc của gradient và trọng số là độ lớn của gradient
  • Biểu đồ của tất cả các ô được tập hợp lại với nhau và được cung cấp cho bộ phân biệt học máy để quyết định xem các ô của cửa sổ phát hiện hiện tại có tương ứng với một người hay không

Đ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

Bên trái. dữ liệu hình ảnh tế bào. Đúng. độ dốc tương ứ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[]

Biểu đồ của các góc độ dốc. Mỗi mục được tính trọng số theo cường độ gradient

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áy

Chú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

  • cài đặt OpenCV
  • viết một tập lệnh nhỏ để thực hiện phát hiện con người trong luồng video từ webcam của bạn hoặc trong một trong các bộ phim của bạn bằng thuật toán HOG [Biểu đồ của các dải màu định hướng]

Bạn cũng đã học cách HOG hoạt động

Đọc thêm về nhận dạng hình ảnh

Xin 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

Chủ Đề