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! Show
Giới thiệuHô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ài đặt OpenCVOpenCV 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ó:
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: 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) Người phát hiệnOpenCV 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ố. f (x) = x và đạo hàm của nó, f '(x) = 1Nế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ộ. f (x) = x^2 và đạo hàm của nó, f '(x) = 2xTrong 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: Độ 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: 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()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:
Đ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õ. 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()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ọcChú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:
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
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(). |