Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?

Chúng ta hãy sử dụng thuật toán Hog ​​được triển khai trong OpenCV để phát hiện mọi người trong thời gian thực trong luồng video!

Giới thiệu

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ư trong thời gian thực (nó sẽ phụ thuộc vào mức độ nhanh của 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 học tập sâu để phát hiện các đối tượng trong một hình ảnh. Đối với điều này, chúng tôi đã sử dụng một mạng lưới 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 loại (người, xe hơi, xe tải, cây chậu, hươu cao cổ, ...).

Yolov3 là thuật toán phát hiện đối tượng tiên tiến: Nó rất chính xác và nhanh chóng khi được đánh giá trên GPU mạnh mẽ, 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 ms để 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 ít hơn, để có thể xử lý các luồng video ở 24 hình ảnh / s.

Ngoài ra, các máy trạm học sâu mạnh mẽ rất tốn kém, và chúng tiêu thụ rất nhiều sức mạnh. Vì vậy, chúng chắc chắn 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 nhà nhỏ đang hoạt động mọi lúc.

Vì vậy, ở đây, chúng tôi sẽ không làm bất kỳ học tập sâu nào. 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 và cho học máy;
  • Cách viết một kịch bản 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, với thuật toán Hog ​​(biểu đồ của độ dốc định hướng);
  • Hog hoạt động như thế nào.

Cài đặt OpenCV

OpenCV là thư viện tầm nhìn máy tính 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 thiết 3D
  • Phân tích video
  • Phát hiện đối tượng
  • Hình ảnh khâu để tạo ra toàn cảnh
  • ...

Bạn có thể bắt đầu với hướng dẫn OpenCV, và cũng có một cái nhìn về blog rất đẹp từ Adrian Rosebrock. Đó thực sự là nơi tôi lần đầu tiên liên lạc với OpenCV!

Vì vậy, hãy cài đặt công cụ. Hôm nay chúng tôi 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 này.

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 nhập:

conda install opencv numpy matplotlib

Nếu không, chỉ cần sử dụng Navigator Anaconda.

Truy cập webcam của bạn

Đọc từ webcam của bạn rất dễ dàng với OpenCV, chỉ cần viết tập lệnh sau và chạy nó bằng 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:

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?

Bây giờ chúng ta hãy thử và thao tác với luồng video. Video được đọc từng khung hình, vì vậy chúng tôi có thể chỉnh sửa khung trước khi hiển thị nó. 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)

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?

Người phát hiện

OpenCV có tính năng triển khai cho một phương pháp phát hiện con người rất nhanh, được gọi là HOG (biểu đồ của độ dốc định hướng).

Phương pháp này được đào tạo để phát hiện người đi bộ, người chủ yếu đứng lên 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 tôi sẽ thử. Sửa đổi tập lệnh 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ờ chạy tập lệnh.

Với các tham số này, 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 rằng máy dò hoạt động tốt hơn nếu người đó không quá gần với máy ảnh. Nếu người đó gần, một số hộp chồng chéo 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 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 một luồng video và bạn có thể dừng ở đây nếu bạn 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ó bằng các thuật ngữ đơ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 đào trong các tài liệu tham khảo của bài viết này, và đặc biệt là bài viết bán kết này về nhận dạng cử chỉ tay.

Bạn cũng có thể có một cái nhìn về bài viết blog tốt đẹp này.

Để hiểu làm thế nào Hog (biểu đồ của độ dốc định hướng) hoạt động, trước tiên cần phải hiểu độ dốc là gì và biểu đồ là gì. Histograms of Oriented Gradients ) works, it's necessary to first understand what is a gradient, and what is an histogram.

Độ dốc là gì?

Đối với hàm 1D F tùy thuộc vào biến X, độ dốc 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 độ dố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à độ dốc là một hằng số.

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?
f (x) = x và đạo hàm của nó, f '(x) = 1

Nếu bây giờ chúng ta xem xét f (x) = x^2, đạo hàm là f (x) = 2x. Đối với x0, đạo hàm là dương và chức năng đang tăng lên. Đối với x = 0, đạo hàm là 0. Điều này có nghĩa là độ dốc cục bộ là 0. Nói cách khác, ở đây, hàm là phẳng cục bộ.

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?
f (x) = x^2 và đạo hàm của nó, f '(x) = 2x

Trong 2D, trong mặt phẳng (x, y), một hàm của x và y là một bề mặt cho độ cao ở mọi điểm. Độ dốc là sự khái quát hóa của đạo hàm: Tại một điểm (x, y) đã cho, độ dốc được định hướng theo hướng của độ dốc tối đa và cường độ 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. Dưới đây là một minh họa từ bài viết của Wikipedia:

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?
Độ dốc của hai chức năng 2D. Trong trường hợp cụ thể này, càng đen, chức năng càng lớn. Ở trung tâm củ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 trường hợp của chúng tôi. Trong một bức tranh đen trắng, mức độ Greyscale tương tự như độ cao và độ dốc là thước đo mức độ thay đổi và hướng của sự thay đổi nhanh như thế nào. Một cạnh trong bức tranh (chuyển đổi màu đen sang trắng) dẫn đến một độ dốc lớn vuông góc với rìa, từ trắng sang đen. Trong một bức tranh màu, người ta có thể tính toán một gradient cho mỗi mức màu và ví dụ: Lấy độ dốc tối đa trên ba mức màu.

Vậy tại sao các gradient được cho là được định hướng? Một gradient luôn được định hướng. Nó chỉ có nghĩa là phương pháp theo dõi hướng gradient, và nó tạo thành một từ viết tắt tốt, hog.

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 kích thước 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 điều đó.

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ố lượng mục 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:

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?
Một biểu đồ với 4 thùng. Thùng thứ nhất có hai mục nhập (1.1, 1.5), mục nhập thứ hai (2.2), ba mục thứ ba (3,5, 3.5, 3.6) và mục nhập cuối cùng (4.1)

Cũng có thể cân nặng từng giá trị. Khi giá trị đi vào biểu đồ, đóng góp của nó vào thùng được đưa ra bởi trọng lượng, là 1 theo mặc định. Đâ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()

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?
Một biểu đồ có trọng số.

Biểu đồ của độ dốc đị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. detection window of varying size.
  • Đối với từng vị trí và kích thước của cửa sổ phát hiện, cửa sổ được chia nhỏ trong 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ủa cánh tay hoặc đỉnh đầu. cells. The cells are in practice relatively small: they typically contain only a small part of the person to be detected, maybe the side of an arm, or the top of the head.
  • Trong mỗi ô, một gradient được tính toán cho mỗi pixel và độ dốc được sử dụng để lấp đầy biểu đồ: giá trị là góc của gradient và trọng lượng là độ lớn của gradient. gradient is computed for each pixel, and the gradients are used to fill an histogram: the value is the angle of the gradient, and the weight is the magnitude of the gradient.
  • Biểu đồ của tất cả các ô được đặt cùng nhau và đưa vào một bộ phân biệt máy học để 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, chúng ta hãy xem biểu đồ của độ dốc định hướng được xây dựng cho một ô nhất định như thế nào, 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 ta thấy rằng trong âm mưu gradient, các bề mặt phẳng biến mất và cạnh có thể nhìn thấy rõ.

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?
Trái: Dữ liệu hình ảnh ô. Phải: độ dốc tương ứng; Độ dốc được biểu thị bằng một mũi tên và độ dốc độ dốc cũng được hiển thị dưới dạng bản đồ màu Greyscale.

Cuối cùng hãy vẽ biểu đồ biểu đồ của độ dốc định hướng:

plt.hist(angle.reshape(-1), weights=norm.reshape(-1), bins=20, range=(0,360))
plt.show()

Hướng dẫn how does python detect human image? - python phát hiện hình ảnh con người như thế nào?
Biểu đồ của góc độ dốc. Mỗi mục được tính theo trọng số của độ dốc

Trong biểu đồ này, 0 tương ứng với độ dốc đi 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 có hướng tương tự, chúng sẽ đó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 có thể nhìn thấy trong ô.

Biểu đồ các độ 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 là cho một tế bào duy nhất. Chúng tôi cần một quy trình để phân tích tất cả các ô trong cửa sổ phát hiện hiện tại để tìm hiểu xem cửa sổ có chứa một người hay không.

Đặt tất cả các tế bào lại với nhau trong một trình phân loại máy học

Chúng tôi có một con lợn cho mỗi ô trong cửa sổ phát hiện. Tất cả các con lợn được nối thành một loạt các số lớn. Ví dụ: nếu cửa sổ phát hiện có 8x16 = 128 ô và mỗi tế bào có 20 thùng, chúng ta sẽ kết thúc với 2560 giá trị.

Về nguyên tắc, bất kỳ loại phân loại máy học 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 (2560 trong ví dụ của chúng tôi) và số lượng hình ảnh có sẵn cho khóa đào tạo không lớn, Dalal và Triggs đã quyết định tìm máy vectơ hỗ trợ (SVM) (một tuyến tính). Đó cũng là những gì đang được thực hiện trong việc triển khai OpenCV của Hog.

Để giải thích SVM, cần phải sử dụng các công cụ toán học nâng cao và đây là phạm vi cho blog này. Nhưng nếu bạn quan tâm và đang ở cấp độ chính về toán học hoặc vật lý, bạn có thể làm theo bài giảng tuyệt vời này từ Andrew Ng (không phải vì sự yếu tim của trái 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, với thuật toán Hog ​​(biểu đồ của độ dốc định hướng)

Bạn cũng đã học được cách hoạt động của Hog.

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

  • Nhận dạng chữ số viết tay với scikit-learn: Giới thiệu đơn giản về các mạng thần kinh dày đặc và học máy, và thư viện Scikit-learn.
  • Mạng lưới thần kinh đầu tiên với Keras: cùng bài tập, lần này với Keras.
  • Điều chỉnh mạng tích chập sâu để nhận dạng hình ảnh với Keras và TensorFlow (chữ số viết tay): Tìm hiểu cách điều chỉnh các tham số của mạng tích chập để có hiệu suất tốt nhất
  • Nhận dạng hình ảnh: Chó vs mèo (92%): Phân biệt hình ảnh của chó và mèo, đặc biệt nhấn mạnh vào việc tăng dữ liệu và sự lựa chọn của trình tối ưu hóa.
  • Nhận dạng hình ảnh với học tập chuyển tiếp (98,5%): Sử dụng trạng thái của các mô hình được đào tạo trước nghệ thuật để phân loại hình ảnh dễ dàng và mạnh mẽ. Giới thiệu về mạng lưới thần kinh VGG và Resnet.
  • Phát hiện đối tượng với Darknet: Sử dụng chương trình Darknet và các mạng được đào tạo trước để tìm và xác định các đối tượng trong nhiều danh mục trong một bức tranh.

Xin vui lòng cho tôi biết những gì bạn nghĩ trong các ý kiến! Tôi sẽ thử 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 (không quá một thư mỗi tuần tôi hứa.)

Làm thế nào để Python xác định hình ảnh?

Để thực sự phát hiện các đối tượng, bạn cần 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 sang tham số Input 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), cho tham số Output_IMAGE_PATH.call the detectObjectsFromImage() method. Pass the file path of your input image to the “input_image” parameter and the path to the output image (this image will contain the detected object, but it doesn't exist yet), to the “output_image_path” parameter.

Làm thế nào để Python nhận ra khuôn mặt?

Hiểu mã..
# Nhận giá trị do người dùng cung cấp ImagePath = sys.argv [1] cascpath = sys.....
# Tạo Haar Cascade facecascade = CV2.Cascadeclassifier (Cascpath) ....
# Đọc hình ảnh hình ảnh = CV2.IMREAD (ImagePath) Gray = CV2.....
# Phát hiện các khuôn mặt trong các khuôn mặt hình ảnh = facecascade.....
In "Tìm thấy {0} khuôn mặt!".....

Làm thế nào để Python phát hiện một con mắt?

Phát hiện mặt và mắt trong Python bằng OpenCV..
OpenCV..
Thuật toán Haar Cascade ..
Bước 1: Tạo tệp Python mới bằng lệnh sau:.
Bước 2: Bây giờ trước khi bắt đầu nhập mã các mô -đun của OpenCV như sau:.
Bước 3: Các phân loại Cascade ..
Bước 4: hàm imread () ..
Bước 5: hàm cvtcolor () ..

Làm thế nào để bạn tìm thấy một người trong Python?

Đó chính xác là những gì phương thức phát hiện () của chúng tôi sẽ làm.Nó sẽ mất một khung để phát hiện một người trong đó.Tạo một hộp xung quanh một người và hiển thị khung hình..và trả lại khung với người bị ràng buộc bởi một hộp màu xanh lá cây.Tất cả mọi thứ sẽ được thực hiện bởi DetectMultiscale ().Detect() method will do. It will take a frame to detect a person in it. Make a box around a person and show the frame..and return the frame with person bounded by a green box. Everything will be done by detectMultiScale().