Nhận dạng khuôn mặt với Python và Cython . ...
Làm thế nào để giữ được code dễ hiểu của python nhưng lại có tốc độ cao gần như C++? Xử lý một khuôn mặt đã khó, rồi phải đưa khuôn mặt ấy vào để xác định cảm xúc. Làm sao với phần cứng chỉ dùng cpu có thể xử lý nhiều khuôn mặt trong cùng một lúc?
Bạn có nhìn thấy cái gì sai ở đây không?
Mục lục
1. Giới thiệu và cài đặt Cython
2. Lý thuyết về Hàng đợi - Queue
3. Lý thuyết về đa luồng - multithreading
4. Mã lập trình và giải thích
5. Kết luận
1. Giới thiệu và cài đặt Cython
Nếu bạn muốn code cú pháp dễ dàng như Python và hiệu suất cao như C thì Cython là lựa chọn của bạn. Bạn có thể sử dụng Cython để viết các extention C cho Python. Code Python của bạn sẽ được dịch sang code C/C++ và được tối ưu hóa. Nó sẽ cung cấp cho bạn hiệu suất cao và bạn có thể sử dụng nó trong các dự án Python của mình.
Ví dụ:
Kết quả Cython chạy nhanh hơn Python cả trục lần :» Trích betterprogramming.pub
Vì đã có rất nhiều bên mô tả và code Cython rồi, bạn có thể tham khảo ở đây:
- Cython - Cách Để Code Python Chạy Nhanh Hơn
- Cython: Python chạy nhanh như C
- Hướng dẫn Cython cơ bản cách chuyển code python thành code c/c++
2. Lý thuyết về Hàng đợi - Queue
Hàng đợi (queue) là một cấu trúc dữ liệu hoạt động theo cơ chế FIFO (First In First Out), tạm dịch là “vào trước ra trước”. Có nghĩa là phần tử nào được thêm hàng đợi trước thì sẽ được lấy ra trước.
# Python program to
# demonstrate queue implementation
# using collections.dequeue
from collections import deque
# Initializing a queue
q = deque()
# Adding elements to a queue
q.append('a')
q.append('b')
q.append('c')
print("Initial queue")
print(q)
# Removing elements from a queue
print("\nElements dequeued from the queue")
print(q.popleft())
print(q.popleft())
print(q.popleft())
print("\nQueue after removing elements")
print(q)
# Uncommenting q.popleft()
# will raise an IndexError
# as queue is now empty
Nguyên tắc đơn giản của hàng đợi là ai vào quán trà sữa trước thì sẽ được mua trước, ai vô sau thì mua sau.
Initial queue
deque(['a', 'b', 'c'])
Elements dequeued from the queue
a
b
c
Queue after removing elements
deque([])
Chúng ta sẽ ứng dụng queue bằng cách sẽ cắt tất cả khuôn mặt trong từng frame hình vào queue để xử lý.
3. Lý thuyết về đa luồng - multithreading
Nói về cấu trúc máy tính : Thread là một đơn vị cơ bản trong CPU. Một luồng sẽ chia sẻ với các luồng khác trong cùng process về thông tin data, các dữ liệu của mình. Việc tạo ra thread giúp cho các chương trình có thể chạy được nhiều công việc cùng một lúc. Đa luồng có rất công dụng vô cùng hữu ích thích hợp cho những tác vụ chạy ngầm không cần quan tâm chính xác thời gian hoàn thành.
Đơn giản, ngày nay, công xưởng bạn có nhiều công nhân. Mỗi công nhân có thể làm nhiều việc. Thay vì chạy python, trong cùng một thời điểm bạn chỉ có thể sử dụng một công nhân duy nhất để làm một công việc duy nhất. Cho dù công nhân đó có to khỏe thế nào, khi giao một đống công việc cũng không thể nhanh được.
4. Mã lập trình và giải thích
5. Kết luận
Tạo một ứng dụng không khó, nhưng để đáp ứng được tốc độ xử lý, độ chính xác và mức độ sử dụng resource thì cần phải tối ưu nhiều thứ:
- Giảm nhẹ kích thước mô hình thông qua: Quantization và compress mô hình.
- Optimize lại code: do Cython chạy cùng python thôi nên ghi phân luồng và queue không thật sự là phân luồng cà queue giống C++ hoặc JAVA được.
- Chuyển từ single-thread sang multi-thread.
- Allocate lại tài nguyên như CPU, Memory.
- Đặc biệt là các ứng dụng trên python thì tối ưu tốc độ xử lý là một challenge bởi python bị ràng buộc bởi cơ chế GIL (Global Interpreter Lock). Tức là nó chỉ cho phép một thread hoạt động truy suất và chỉnh sửa bộ nhớ tại một thời điểm. Do đó python không tận dụng được các tính toán đa luồng. Tuy nhiên ở python 3.2 trở đi thì python đã bắt đầu hỗ trợ đa luồng.
Về mặt thời gian phát triển phần mềm thì Python luôn trong top 5 các ngôn ngữ nhanh nhất.
Nhưng vì tránh cho người dùng phải đối mặt với con trỏ hay quản lý bộ nhớ động,… đã làm tốc độ thực thi của python giảm đi đáng kể.
Cython đã là một vị cứu cánh. Bạn chỉ cần thay đổi 20% đoạn mã code của bạn để nâng 80% hiệu suất tổng thể. Vì có khá ít blog Việt nam nói chuyên sâu về Cython. Nên mình ít để ví dụ hoặc tutorial cho các bạn được.
(〜 ̄▽ ̄)〜 Trong tương lai mình sẽ viết thêm về Cython. Các bạn chú ý đón xem nhé!! 〜( ̄▽ ̄〜)
Bài viết liên quan
Đặt câu hỏi đúng thời 4 chấm 0. Gemini, chat gpt,... !! [Phần 2] Thấu hiểu "Prompt" - Chìa khóa mở ra sức mạnh AI!
34 minutes to read
34 minutes to read
Thay vì hỏi “Hãy kể cho tôi nghe về Paris,” bạn có thể hỏi “Mô tả phong cách kiến trúc của tháp Eiffel.” - prompt của bạn càng chính xác...
Giao tiếp thông minh với AI: Bí quyết đặt câu hỏi hiệu quả cho ChatGPT & Gemini [Phần 1.1]
6 minutes to read
6 minutes to read
Nghệ thuật đặt câu hỏi, Bí quyết khai thác tối đa ChatGPT & Gemini
Đặt câu hỏi đúng thời 4 chấm 0. Gemini, chat gpt,... !! [Phần 4] Thấu hiểu "Prompt" - Chìa khóa mở ra sức mạnh AI!
33 minutes to read
33 minutes to read
Hãy tưởng tượng ChatGPT như một "đầu bếp AI" siêu đẳng, có thể giúp bạn hiện thực hóa mọi ý tưởng ẩm thực, dù là phức tạp nhất!
"Một người đàn ông không dành thời gian cho gia đình, không bao giờ có thể trở thành đàn ông thực sự."
Bạn có thể vào đây để xem "kẻ dại khờ" chia sẻ cảm nhận về những cuốn sách mà kẻ đó cho là hay!
Chúc một buổi sáng vui vẻ!!👨🚀
Anh hàng xóm
'Anh hàng xóm' là blog phi lợi nhuận, miễn phí - Sự ủng hộ của bạn luôn là điều quan trọng giúp blog tồn tại cùng với đó là phát triển mạnh mẽ hơn nữa. Bạn có thể ủng hộ cho blogヾ (⌐ ■ _ ■) ノ ♪