+10

[Computer Vision] Real-time object detection chỉ với 29 dòng lệnh

Real time object detection

Object Detection

Một trong những lĩnh vực quan trọng và có xu hướng phát triển mạnh mẽ của Trí tuệ nhân tạo (Artificial Intelligence) là thị giác máy (Computer Vision). Computer Vision là một lĩnh vực bao gồm các phương pháp thu nhận, xử lý ảnh kỹ thuật số, phân tích và nhận dạng các hình ảnh, phát hiện các đối tượng, tạo ảnh, siêu phân giải hình ảnh và nhiều hơn vậy. Object Detection có lẽ là khía cạnh sâu sắc nhất của thị giác máy do số lần sử dụng trong thực tế.

Object Detection đề cập đến khả năng của hệ thống máy tính và phần mềm để định vị các đối tượng trong một hình ảnh và xác định từng đối tượng. Object Detection đã được sử dụng rộng rãi để phát hiện khuôn mặt, phát hiện xe, đếm số người đi bộ, hệ thống bảo mật và xe không người lái. Có nhiều cách để nhận diện đối tượng có thể được sử dụng cũng như trong nhiều lĩnh vực thực hành. Giống như mọi công nghệ khác, một loạt các ứng dụng sáng tạo và tuyệt vời của Object Detection sẽ đến từ các lập trình viên và các nhà phát triển phần mềm.

Bắt đầu sử dụng các phương pháp nhận diện đối tượng hiện đại trong các ứng dụng và hệ thống, cũng như xây dựng các ứng dụng mới dựa trên các phương pháp này.Việc triển nhận diện đối tượng sớm liên quan đến việc sử dụng các thuật toán cổ điển, giống như các thuật toán được hỗ trợ trong OpenCV, thư viện computer vision phổ biến. Tuy nhiên, các thuật toán cổ điển này không thể đạt được hiệu suất đủ để làm việc trong các điều kiện khác nhau.

Việc áp dụng đột phát và nhanh cóng của deep learning vào năm 2012 đã đưa vào sự tồn tại các thuật toán và phương pháp phát hiện đối tượng hiện đại và chính xác cao như R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet và nhanh hơn nhưng rất chính xác như SSD và YOLO. Sử dụng các phương pháp và thuật toán này, dựa trên deep learning và cũng dựa trên việc học máy đòi hỏi rất nhiều kiến thức về toán học và việc học sâu. Có hàng triệu chuyên gia lập trình và các nhà phát triển phần mềm muốn tích hợp và tạo ra các sản phẩm mới sử dụng object detection. Nhưng công nghệ này xa tầm tay của họ và phức tạp để hiểu và sử dụng thực tế của nó.

ImageAI, một thư viện python cho phép các lập trình viên và các nhà phát triển phần mềm dễ dàng tích hợp các công nghệ thị giác máy hiện đại vào các ứng dụng hiện có và mới của họ, và chỉ cần sử dụng một vài dòng mã. ImageAI hỗ trợ một danh sách các thuật toán học máy hiện đại nhất cho việc dự đoán hình ảnh, nhận diện vật thể, phát diện video,... ( Trích dẫn từ bài viết của tác giả Nguyễn Trung Hiếu ) Tuy nhiên về phía ImageAI, trong doc git của thư viện và trong các tutorial chỉ tập trung vào cho chạy nhận diện các object với nguồn vào là video hoặc là ảnh, thật khó để tìm thấy một bài hướng dẫn (theo hiểu biết của mình 😅 )nào sử dụng ImageAI chạy real-time. Vậy nên hôm nay mình sẽ hướng dẫn các bạn làm một project real-time object detection chỉ vọn vẹn trong 29 dòng lệnh ( Mọi giải thích cụ thể từng phần, mời bạn đọc bài của anh Nguyễn Trung Hiếu )

Cài đặt

Để thực hiện nhận diện đối tượng bằng ImageAI, tất cả những gì bạn cần làm là:

  • Cài đặt python
  • Cài đặt ImageAI và phụ thuộc của nó.
  • Tải xuống file mô hình Object Detection
  • Chạy chương trình

Bây giờ, hãy bắt đầu:

  • Tải xuống và cài đặt python 3 từ https://python.org
  • Tensorflow 1.4.0 (and later versions)
    pip3 install --upgrade tensorflow
  • Numpy 1.13.1 (and later versions)
    pip3 install numpy
  • SciPy 0.19.1 (and later versions)
    pip3 install scipy
  • pip3 install opencv-python
    pip3 install opencv-python
  • Pillow
    pip3 install pillow
  • Matplotlib
    pip3 install matplotlib
  • h5py
    pip3 install h5py
  • Keras 2.x
    pip3 install keras
  • ImageAI
    pip install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl
  • Cuối cùng là tải xuống mô hình YOLOv3 sẽ được sử dụng để nhận diện các đối tượng tại đây

Mọi thứ đã sẵn sàng, bây giờ hãy tạo một tệp tin python là <file name>.py . Sao chép file mô hình yolo.h5 và hình ảnh mà bạn muốn phát hiện vào thư mục chứa file bạn đã tạo.

file vừa tạo phải chung thư mục với file yolo

Nhập vào file đã tạo dòng mã sau:

# Thêm thư viện vào
from imageai.Detection import ObjectDetection
import os
import cv2

# cài đặt
execution_path = os.getcwd()
detector = ObjectDetection()
detector.setModelTypeAsYOLOv3()
custom_objects = detector.CustomObjects(person=True) # tùy chỉnh các vật thể muốn nhận diện tại đây theo công thức <tên vật thể> = True
detector.setModelPath(os.path.join(execution_path , "yolo.h5"))
detector.loadModel(detection_speed="fastest") # tùy chỉnh các mô hình tốc độ nhận diện từ "normal"(default), "fast", "faster" , "fastest" and "flash"

# chạy
vs = cv2.VideoCapture(0)
while True:
    check, frame = vs.read()
    cv2.imwrite("imageinp.jpg", frame)
    detections = detector.detectCustomObjectsFromImage(custom_objects=custom_objects, input_image=os.path.join(execution_path , "imageinp.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"), minimum_percentage_probability=20)
    for eachObject in detections:
        print(eachObject["name"] , " : ", eachObject["percentage_probability"], " : ", eachObject["box_points"] )
        print("--------------------------------")
    img = cv2.imread('imagenew.jpg')
    cv2.imshow('frame', img)
    key = cv2.waitKey(1)
    if key == ord("q"):
            break
cv2.destroyAllWindows()
vs.stop()

Ý tưởng

Ý tưởng của đoạn code này nằm ở chỗ sử dụng việc nhận diện từng tấm ảnh của ImageAI nhưng được kết hợp với opencv liên tục chụp lấy các khung ảnh và lưu vào một file, file này sau đó được truyền vào trong hàm detector.detectCustomObjectsFromImage để nhận diện rồi trả đầu ra là file ảnh mới, file này lại được opencv liên tục gọi show lên. Vì thế nên tốc độ mô hình càng chậm thì sẽ dẫn đến việc các ảnh load không mượt mà, khuyến nghị nên chọn faster để đảm bảo vừa nhanh, vừa nhận diện ổn (trong đoạn code trên để tăng độ mượt, mình đã đẩy lên fastest nên khi các bạn chạy sẽ thấy có vài vật thể bị nhận diện sai). Đến đây là kết thúc, hy vọng qua bài viết đầu tay đơn giản của mình sẽ giúp ích được các bạn hoặc đem lại sự giải trí sau những giờ code căng thẳng 😆 , chúc các bạn thành công 😘 .


All rights reserved

Bình luận

Đăng nhập để bình luận
Avatar

output

Avatar
@letangphuquy
thg 10 31, 2019 12:24 CH

hay quá anh ơi ❤️

Avatar

Thanks em nha 😘 ủng hộ anh hỉ, chạy bị lỗi gì anh giúp nhé😁

Avatar
@skyfury2651
thg 11 13, 2019 6:38 SA
Avatar
@hoahiep
thg 11 21, 2019 4:33 SA

anh ơi tensorflow 2.0 tthi2 nó ko chạy được?

Avatar

Bạn dùng tensorflow '1.14.0' để ổn định nhất nhé

Avatar
@Linh_Chi
thg 2 26, 2020 9:13 SA

Chào anh, em muốn đếm số người xuất hiện trên real time thì phải làm sao ạ. Mong a phản hồi, xin cảm ơn.

Xem thêm (5)
Avatar

Nếu vậy thì bạn cần gán id cho mỗi face bạn quét được, lưu nó lại, sau đó qua frame sau bạn có thể dùng nhiều cách như check xem có object (face đã lưu) có trong frame mới ko, hoặc muốn chắc hơn bạn có thể dùng cosine similarity các face để check xem faces ở frame đã có trong list face được lưu lại chưa

Avatar
@Linh_Chi
thg 3 19, 2020 7:59 SA

Dạ đúng rồi anh, nhưng em đang gặp khó trong việc đếm, em gán id từng face qua các frame nhưng nó chỉ đếm được các frame trong từng frame chứ không đếm được tất cả. Em sẽ thử theo cách của anh là check xem face trong các frame. Cảm ơn anh nhiều.

Avatar
+10
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí