- vừa được xem lúc

[Computer Vision] Object Detection (nhận diện vật thể) chỉ với 10 dòng code sử dụng ImageAI

0 0 81

Người đăng: Nguyễn Trung Hiếu

Theo Viblo Asia

Object Detection

Một trong những lĩnh vực quan trọng 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,...

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à:

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

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

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

Mọi thứ đã sẵn sàng, tạo một tệp python là ObjectDetection.py. Sao chép file mô hình RetinaNet và hình ảnh mà bạn muốn phát hiện vào thư mục chứa file ObjectDetection.py.

Nhập vào file ObjectDetection.py đoạn mã sau:

from imageai.Detection import ObjectDetection
import os execution_path = os.getcwd()
detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))
for eachObject in detections: print(eachObject["name"] + " : " + eachObject["percentage_probability"] )

Ba dòng đầu tiên, đã import lớp ImageAI Object Detection ở dòng đầu tiên, dòng thứ 2 là import lớp python os và xác định một biến để giữ đường dẫn đến thư mục chứa file python của chúng ta. Tệp mô hình RetinaNet và hình ảnh nằm ở dòng thứ ba

from imageai.Detection import ObjectDetection
import os execution_path = os.getcwd()

Tiếp 5 dòng mã sau, chúng ta đã định nghĩa lớp object detection trong dòng đầu, thiết lập kiểu mô hình cho RetinaNet trong dòng thứ hai, thiết lập đường dẫn của mô hình RetinaNet trong dòng thứ ba, load mô hình vào lớp object detection ở trong dòng thứ tư, sau đó ta gọi hàm detection và được phân tích cú pháp trong đường dẫn hình ảnh đầu vào và đường dẫn hình ảnh đầu ra trong dòng thứ năm.

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg")

Trong hai dòng mã cuối, ta lặp qua tất cả các kết quả được trả về bởi hàm detector.detectObjectsFromImage trong dòng đầu tiên, sau đó in ra tên và xác suất phần trăm của mô hình trên từng đối tượng được phát hiện trong hình ảnh trong dòng thứ hai.

for eachObject in detections: print(eachObject["name"] + " : " + eachObject["percentage_probability"] )

ImageAI hỗ trợ nhiều tùy chỉnh mạnh mẽ của quá trình nhận diện đối tượng. Một trong số đó là khả năng trích xuất hình ảnh của từng đối tượng được phát hiện trong hình ảnh. Bằng cách thêm tham số extract_detected_objects=True vào hàm detectObjectsFromImage. Lớp object detection sẽ tạo một thư mục cho các đối tượng hình ảnh, trích xuất từng ảnh, lưu từng ảnh vào thư mục mới.

detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"), extract_detected_objects=True)

Hình ảnh ban đầu:

Sau quá trình Object Detection:

Sau khi ta thêm tham số extract_detected_objects=True vào hàm detectObjectsFromImage, sẽ tạo thêm một thư mục, rích xuất từng ảnh, lưu từng ảnh vào thư mục mới.

Một vài hình ảnh được trích xuất có trong thư mục:

Tương tự, ta cũng có thể nhận diện các vật thể qua video sử dụng Video Object Detection có hỗ trợ trong thư viện ImageAI.

from imageai.Detection import VideoObjectDetection
import os execution_path = os.getcwd() detector = VideoObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel() video_path = detector.detectObjectsFromVideo(input_file_path=os.path.join(execution_path, "traffic.mp4"), output_file_path=os.path.join(execution_path, "traffic_detected") , frames_per_second=20, log_progress=True)
print(video_path)

Không chèn được video nên mình đưa link vậy ?)

Đầu vào video:

Đầu ra video:


ImageAI cung cấp nhiều tính năng hữu ích cho việc triển khai khả năng tùy chỉnh và triển khai việc nhận diện đối tượng. Một vài tính năng được hỗ trợ là:

  • Adjusting Minimum Probability: Theo mặc định, các đối tượng được phát hiện có tỷ lệ phần trăm xác suất nhỏ hơn 50 sẽ không được hiển thị hoặc báo cáo. Bạn có thể tăng giá trị này cho các trường hợp chắc chắn cao hoặc giảm giá trị cho các trường hợp mà tất cả các đối tượng có thể cần được phát hiện.
  • Custom Objects Detection: Sử dụng lớp CustomObject được cung cấp, bạn có thể yêu cầu lớp phát hiện báo cáo các phát hiện trên một hoặc một số đối tượng duy nhất.
  • Detection Speeds: Bạn có thể giảm thời gian cần thiết để phát hiện một hình ảnh bằng cách đặt tốc độ của tốc độ phát hiện thành 'fast', 'faster' và 'fastest'.
  • Input Types: Bạn có thể chỉ định và phân tích cú pháp trong đường dẫn tệp tới hình ảnh, mảng Numpy hoặc luồng tệp của hình ảnh làm hình ảnh đầu vào.
  • Output Types: Bạn có thể chỉ định rằng hàm detectObjectsFromImage sẽ trả về hình ảnh dưới dạng một tệp hoặc mảng Numpy.

Tham khảo

https://github.com/OlafenwaMoses/ImageAI

https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 502

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 376

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 701

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 335

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 421

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 414