Với việc xây dựng bộ máy trạng thái hữu hạn và ứng dụng thuật toán phát hiện vẫy tay và nhận điện khuôn mặt đã giúp Fuso có thể phát hiện được người vẫy tay cần hỗ trợ, di chuyển đến để nhận diện đối tượng và chào người đó bằng tên nếu đã biết trước. Mời các bạn tham khảo!
Lịch sử hình thành và phát triển của robot
Trong những năm gần đây, sự phát triển mạnh mẽ của công nghệ và thời đại 4.0 đã khiến con người ngày càng chú trọng đến tự động hóa, nhằm nâng cao hiệu quả sản xuất và đáp ứng nhu cầu cơ bản Robot đã dần được tích hợp vào các xưởng sản xuất và đời sống hàng ngày Vậy từ “robot” đã xuất hiện từ khi nào? Bài viết này sẽ cung cấp cái nhìn tổng quan về lịch sử hình thành, phát triển và những thành tựu nổi bật của robot.
Từ "robot" lần đầu tiên được sử dụng vào năm 1921 trong vở kịch "Rossum’s Universal Robots" của nhà văn nổi tiếng người Séc Karel Čapek, người có ảnh hưởng lớn trong văn học thế kỷ XX.
Từ này xuất phát từ từ “robota” mà theo tiếng địa phương nghĩa là “việc nặng nhọc” hay
Lao động cưỡng bức là một khái niệm quan trọng, bên cạnh đó, từ "robotics" cũng được sử dụng phổ biến Thuật ngữ này lần đầu tiên được giới thiệu bởi nhà văn Isaac Asimov (1920-1992) trong một câu chuyện ngắn của ông.
Trong tác phẩm "Runaround", nhà văn đã định nghĩa ba quy luật liên quan đến hành vi của robot khi tương tác với con người, được gọi là "Luật của Robotics" Cả hai thuật ngữ "robot" và "robotics" đều chỉ đến những công cụ và máy móc có khả năng thực hiện công việc một cách tự động nhằm phục vụ con người.
Robot ngày càng quan trọng trong ngành công nghiệp, thúc đẩy sản xuất qua bốn thế hệ phát triển Thế hệ 1 (1950-1967) gồm các robot như UNIMATE, được điều khiển bởi thuật toán đơn giản và không tương tác với môi trường Thế hệ 2 (1968-1977) giới thiệu robot Shakey, có khả năng thu thập thông tin từ cảm biến xung quanh Thế hệ 3 (1978-1999) với bộ điều khiển chuyên dụng và ngôn ngữ lập trình mới, cho phép tự động hóa nhiều quy trình trong dây chuyền lắp ráp, bao gồm cả robot giải trí như AIBO Cuối cùng, thế hệ 4 (2000-nay) mang đến robot với khả năng tính toán vượt trội, học hỏi và suy luận như ASIMO của Honda và robot hút bụi Roomba Sự phát triển của robot không chỉ nâng cao năng lực sản xuất mà còn cải thiện chất lượng cuộc sống hàng ngày, mở ra tiềm năng cho robot thông minh trong tương lai.
Giới thiệu bài toán
Sự phát triển của trí tuệ nhân tạo (AI) đang tạo ra một cuộc cách mạng công nghệ mới, biến những điều tưởng chừng chỉ có trong khoa học viễn tưởng thành hiện thực Năm 2011, chương trình AI Watson của IBM đã chiến thắng trong cuộc thi Jeopardy, trong khi trợ lý ảo Siri của Apple có khả năng hiểu và phản hồi chính xác yêu cầu của người dùng Công nghệ xe tự hành của các công ty như Tesla và Google đã đạt được những bước tiến đáng kể nhờ vào cảm biến và mạng nơ-ron Đặc biệt, AlphaGo của Google DeepMind đã gây chấn động khi đánh bại kỳ thủ cờ vây Lee Sedol, cho thấy sức mạnh vượt trội của AI trong lĩnh vực cờ vây Vào tháng 10 năm 2017, robot Sophia trở thành robot đầu tiên được cấp quyền công dân, với khả năng biểu hiện 62 sắc thái cảm xúc và tương tác gần giống con người Tuy nhiên, tại Việt Nam, việc sản xuất và ứng dụng robot thông minh vẫn còn hạn chế, chủ yếu trong lĩnh vực công nghiệp Robot Fuso đã được nghiên cứu và phát triển nhằm đóng góp vào sự phát triển robot trong nước, với mục tiêu tạo ra robot giống con người có khả năng làm hướng dẫn viên tại các viện bảo tàng, bệnh viện và trung tâm thương mại Robot Fuso sẽ được trang bị khả năng nhận diện cử chỉ, khuôn mặt và di chuyển linh hoạt theo yêu cầu của người dùng, với các phần mềm phân tích hình ảnh, âm thanh và xử lý chuyển động hoạt động đồng bộ qua hệ thống truyền thông của nó.
Trong bài viết này, tôi sẽ giới thiệu về hệ thống phân tích hình ảnh cho robot sử dụng ROS – Robot Operating System Hệ thống được chia thành ba mô-đun chính: đầu tiên là mô-đun xây dựng bộ máy trạng thái hữu hạn, cho phép robot giao tiếp và trao đổi dữ liệu giữa các phần khác nhau để thực hiện chức năng cụ thể, đồng thời dễ dàng mở rộng và nâng cấp; thứ hai là mô-đun nhận diện cử chỉ vẫy tay, sử dụng thuật toán OpenPose để phát hiện khung xương người và nhận diện cử chỉ; cuối cùng là mô-đun nhận dạng khuôn mặt, áp dụng thuật toán Facenet để tìm vectơ embedding, vectơ này sẽ được đưa vào mô hình SVM đã được huấn luyện để xác định danh tính người vẫy tay.
Trong quá trình xây dựng phát triển hệ thống thống phân tích hình ảnh cho robot có một số vấn đề gặp phải:
Hệ thống phân tích hình ảnh cho robot bao gồm các thuật toán đa dạng nhằm thực hiện các chức năng khác nhau trong việc trích xuất và biến đổi thông tin cần thiết Những thông tin này sẽ được cung cấp cho các bộ phận khác của robot như bộ phận điều khiển di chuyển và phân tích âm thanh Các chức năng trong hệ thống không chỉ hoạt động tuần tự mà còn có thể hoạt động song song, do đó cần xây dựng một hệ thống tổng thể để quản lý và điều khiển các thuật toán, đảm bảo tính đồng nhất trong hành động của robot Ngoài ra, khả năng phát hiện lỗi nhanh chóng và dễ dàng cũng rất quan trọng trong quá trình phát triển, vì vậy việc tích hợp bộ máy trạng thái hữu hạn vào hệ thống phân tích hình ảnh là cần thiết.
Trong quá trình tương tác với con người, robot cần phản ứng nhanh chóng để đáp ứng mệnh lệnh Do đó, các thuật toán không chỉ phải đạt độ chính xác cao mà còn cần có khả năng phản hồi nhanh Bên cạnh đó, với những giới hạn phần cứng đã được thiết lập, việc phát triển chức năng mới yêu cầu thử nghiệm nhiều thuật toán khác nhau để so sánh và tìm ra thuật toán phù hợp nhất, đồng nhất với môi trường và các thuật toán đã được cài đặt trước đó.
Bo mạch Jetson TX2, ra mắt bởi Nvidia vào tháng 3 năm 2017, sở hữu khả năng tính toán mạnh mẽ với hơn 1,3 TFLOPS, gấp đôi so với Jetson Nano Được thiết kế chủ yếu để phát triển ứng dụng trí tuệ nhân tạo, bo mạch này là nền tảng lý tưởng cho việc xây dựng robot thông minh Nvidia cũng cung cấp bộ công cụ phát triển JetPack SDK, giúp tích hợp các công cụ và thư viện cần thiết để phát triển nhanh chóng các ứng dụng AI.
TensorRT là công cụ tối ưu hiệu suất cho các mạng học sâu, hỗ trợ phân loại ảnh, phân vùng ảnh và nhận diện đối tượng cuDNN, viết tắt của CUDA Deep Neural Network, là thư viện cung cấp các thiết lập tinh chỉnh cho các quy trình như convolution, pooling, normalization và activation layer, từ đó nâng cao hiệu suất cho các ứng dụng trí tuệ nhân tạo.
CUDA là một công cụ phát triển lý tưởng cho các lập trình viên C/C++, cho phép xây dựng ứng dụng tăng tốc bởi GPU Nó cung cấp các thư viện toán học, công cụ gỡ lỗi và tối ưu hóa hiệu suất cho ứng dụng, giúp nâng cao hiệu quả phát triển phần mềm.
ComputerVision(CV): gồm có các gói, thư viện như VisionWorks, OpenCV Đây là những gói, thư viện cho thị giác máy, xử lý ảnh và học máy
Bo mạch Jetson TX2 nhỏ gọn và mạnh mẽ, tích hợp nhiều công cụ, thư viện và gói hỗ trợ phát triển ứng dụng dễ dàng Ngoài bo mạch, camera với chất lượng hình ảnh tốt là yếu tố quan trọng trong việc phân tích hình ảnh cho robot.
Camera chiều sâu RealSense D435, thuộc dòng D400 của Intel, được ra mắt vào năm 2018 So với Kinect của Microsoft, RealSense D435 có thiết kế nhỏ gọn hơn và khả năng quan sát xa hơn, với khoảng cách từ 0,11-10m, trong khi Kinect chỉ đạt từ 0,5-4,5m Phạm vi quan sát rộng rãi của RealSense D435 rất phù hợp cho các ứng dụng robot trong môi trường như phòng trưng bày hoặc viện bảo tàng Camera này cung cấp chất lượng hình ảnh tốt với độ phân giải 1920x1080 và tốc độ khung hình 30fps.
Camera RealSense bao gồm 3 ống kính: 2 camera màu ở hai bên và 1 camera hồng ngoại Hai camera màu tạo ra những bức ảnh độ sâu, trong khi camera hồng ngoại giúp cải thiện chất lượng của những bức ảnh này Thành phần chính của camera được thể hiện trong Hình 1-1.
Intel cung cấp bộ công cụ RealSense SDK 2.0, giúp người dùng dễ dàng làm việc với công nghệ RealSense Bộ công cụ này cho phép tinh chỉnh để tạo ra hình ảnh chất lượng cao phù hợp với từng môi trường, đồng thời thu thập các thông số và hình ảnh từ camera.
Những đóng góp chính
Để phát triển Fuso, luận văn tập trung vào việc xây dựng hệ thống phân tích hình ảnh trên ROS cho robot hướng dẫn viên, bao gồm ba mô-đun chính Thứ nhất, mô-đun bộ máy trạng thái hữu hạn định nghĩa các trạng thái hoạt động của robot, giúp hệ thống dễ dàng mở rộng và kiểm soát lỗi hiệu quả Thứ hai, mô-đun phát hiện người vẫy tay được xây dựng dựa trên phương pháp tìm khung xương người OpenPose Cuối cùng, mô-đun nhận dạng khuôn mặt sử dụng mô hình SVM, được huấn luyện với các vectơ embedding từ thuật toán FaceNet.
Cấu trúc luận văn
Phần còn lại của chương đầu là cấu trúc của luận văn
Chương 1: Giới thiệu vấn đề và bài toán cần giải quyết
Giới thiệu về tổng quan về robot, lịch sử hình thành và phát triển qua các thế hệ robot
Bài viết này giới thiệu về bài toán phát triển robot, đặc biệt là việc phân tích hình ảnh đầu vào cho robot Ngoài ra, các thiết bị phần cứng và thư viện hỗ trợ cần thiết để giải quyết bài toán cũng sẽ được đề cập.
Chương 2: Cơ sở lý thuyết
Chương này cung cấp kiến thức nền tảng về ROS (Robot Operating System), bao gồm các thành phần cơ bản của hệ thống và cách thức trao đổi dữ liệu giữa các Node trong ROS Tiếp theo, bài viết trình bày ý tưởng chính và phương pháp của các thuật toán SVM (Support Vector Machine), OpenPose và FaceNet.
Chương 3: Cài đặt thiết kế hệ thống
Bài viết trình bày thiết kế tổng quan hệ thống với các mô-đun nhằm phát triển bộ phân tích hình ảnh cho robot Nó đề cập đến thuật toán và cài đặt cho từng mô-đun, trong đó sử dụng OpenPose để nhận diện khung xương người và cải tiến để nhận diện hành động vẫy tay Mô-đun nhận dạng khuôn mặt áp dụng thuật toán FaceNet của Google để xác định khuôn mặt người vẫy tay Cuối cùng, bài viết cũng giới thiệu các kịch bản xây dựng để điều khiển robot.
Chương 4: Kết quả thử nghiệm, ứng dụng và tổng kết
Trong quá trình phát triển và triển khai thực tiễn, chúng tôi đã đạt được nhiều kết quả đáng ghi nhận Luận văn đã đóng góp những ý tưởng chính, tuy nhiên vẫn còn một số hạn chế chưa được giải quyết Để hướng tới tương lai, chúng tôi sẽ tiếp tục phát triển và cải thiện các vấn đề còn tồn tại.
Hệ điều hành Robot – Robot Operating System
ROS (Robot Operating System) là một hệ điều hành mã nguồn mở, cung cấp nền tảng nghiên cứu và phát triển robot, được phát triển bởi phòng nghiên cứu Willow Garage và quỹ mã nguồn mở Robotics Mặc dù không quản lý tài nguyên hay lập lịch tiến trình, ROS cung cấp lớp gửi nhận dữ liệu có cấu trúc giữa các ứng dụng, công cụ giả lập trực quan và kết nối với cộng đồng nghiên cứu robot toàn cầu Sự đóng góp từ cộng đồng, đặc biệt là các viện nghiên cứu và trường đại học hàng đầu, giúp giảm đáng kể công việc lập trình cơ bản, cho phép tập trung vào nghiên cứu chuyên sâu Ngoài ra, ROS hỗ trợ nhiều ngôn ngữ lập trình như C/C++ và Python, giúp việc tiếp cận và lập trình trở nên dễ dàng hơn.
2.1.1 Cấu trúc thư mục và các thành phần trong ROS
2.1.1.1 Cấu trúc thư mục trong ROS
Trong ROS, package là đơn vị chính tổ chức phần mềm, bao gồm các nodes, thư viện ROS, tập dữ liệu, tệp cấu hình và các dữ liệu cần thiết Mục đích của package là cung cấp chức năng cho các phần mềm khác tái sử dụng Thư mục package thường chứa tệp package manifest, message type và service type Tệp package manifest cung cấp thông tin về tên, tác giả, phiên bản và các gói phụ thuộc Message type định nghĩa cấu trúc dữ liệu cho việc gửi nhận qua topic, trong khi service type xác định cấu trúc dữ liệu cho các dịch vụ trong ROS.
2.1.1.2 Các thành phần trong ROS
Master là thành phần quan trọng trong việc quản lý kết nối giữa các nodes, giúp chúng đăng ký và trao đổi thông tin Mỗi node cần phải đăng ký với master để nhận thông tin từ các node khác, tương tự như chức năng của một máy chủ DNS Nếu không có master, các node sẽ không thể tìm thấy nhau, dẫn đến việc trao đổi thông tin không thể thực hiện.
Nodes: là đơn vị tính toán, xử lý dữ liệu và thực hiện một chức năng cụ thể nào đó
Hệ điều khiển robot thường bao gồm nhiều node chuyên biệt cho từng công việc, như node điều khiển động cơ bánh xe, node định vị và node lập kế hoạch đường đi Các node trong ROS được phát triển bằng thư viện ROS client (roscpp, rospy) và giao tiếp với nhau thông qua việc gửi nhận dữ liệu qua topic hoặc services Mỗi node có một tên duy nhất, giúp các node khác nhận diện và giao tiếp hiệu quả Ngoài ra, ROS cũng cung cấp công cụ dòng lệnh rosnode để hỗ trợ việc quản lý và tương tác với các node một cách dễ dàng.
“rosnode list” để liệt kê các node đang hoạt động trong hệ thống, hay “rosnode info node” để in những thông tin về node
Để các node có thể trao đổi dữ liệu, cần có định dạng thống nhất, và messages quy định cấu trúc dữ liệu cho việc này Mỗi message bao gồm một hoặc nhiều cặp kiểu dữ liệu và tên dữ liệu, với kiểu dữ liệu có thể là kiểu nguyên thủy đã được định nghĩa trong ROS (như bool, int8, string) hoặc kiểu do người dùng định nghĩa, tương tự như struct trong C/C++ Messages được chia thành hai dạng chính: một là message qua topic, định nghĩa trong tệp có đuôi msg, và hai là message qua service, định nghĩa trong tệp có đuôi srv, trong đó srv cũng bao gồm cấu trúc dữ liệu trả về của service Hình 2-1 và Hình 2-2 minh họa message với hình hộp chữ nhật màu cam không viền.
Các message có đuôi mở rộng msg được trao đổi giữa các node thông qua topic, với mỗi topic được định danh bằng một tên riêng và có cấu trúc định dạng message tương ứng Các node trong mạng có thể đăng ký nhận hoặc gửi thông tin từ nhiều topic khác nhau, giúp tách biệt nguồn thông tin và bộ phận sử dụng Topic hoạt động như một kênh truyền thông tin, cho phép các node kết nối để gửi và nhận thông tin miễn là chúng phù hợp với kiểu dữ liệu đã được định nghĩa.
Mô hình truyền thông tin qua topic rất linh hoạt, nhưng khi các node cần tương tác theo kiểu yêu cầu/đáp ứng (request/response), mô hình này không còn phù hợp Do đó, kiểu truyền dữ liệu service được phát triển để phục vụ cho loại tương tác này Trong mạng, một node sẽ hoạt động như một service, tiếp nhận và xử lý các yêu cầu từ các node khác Chẳng hạn, node A cung cấp dịch vụ tính tổng hai số, trong khi node B gửi yêu cầu đến node A kèm dữ liệu để tính toán và nhận kết quả trả về Thực tế, các yêu cầu thường phức tạp hơn nhiều so với ví dụ đơn giản này.
Bags là định dạng lưu trữ và phát lại dữ liệu, đóng vai trò quan trọng trong việc lưu trữ thông tin Chẳng hạn, trong phòng lab thiếu thiết bị camera, dữ liệu thu được có thể được lưu thành tệp bag, cho phép nhiều người sử dụng mà không cần thiết bị thật, hỗ trợ cho việc phát triển và kiểm thử robot.
2.1.2 Trao đổi thông tin giữa các node trong ROS
2.1.2.1 Trao đổi thông tin giữa các node qua topics Để các nodes có thể trao đổi thông tin với nhau qua topics thì các node phải khai báo với ROS master Thông thường, một node có vai trò đẩy thông tin lên topic và nhiều node sẽ đăng kí nhận thông tin từ topic đó Để một node có thể đẩy thông tin lên thì node đó cần phải đăng kí thông tin tên topic cần đẩy lên và định dạng dữ liệu đẩy lên (Ví dụ trong Python: “pub = rospy.Publisher(‘chatter’, String, queue_size)”) Trong ví dụ trên, node muốn đẩy thông tin lên topic có tên là chatter và kiểu định dạng message gửi lên là String Còn để một node có thể đăng kí thông tin thì node đó cần đăng kí tên topic nào mà muốn nhận thông tin, định dạng kiểu dữ liệu nhận về và quan trọng nhất là một hàm trả về dữ liệu khi có thông tin mới trên topic được đưa lên (Ví dụ trong Python:
Trong đoạn mã “rospy.Subscriber(‘chatter’, String, callback)”, callback là một hàm nhận dữ liệu từ topic Hình 2-1 minh họa quá trình trao đổi thông tin giữa các node thông qua các topic.
Hình 2-1-Trao đổi thông tin giữa các node qua Topic
2.1.2.2 Trao đổi thông tin giữa các node với services Để có thể trao đổi được thông tin giữa các node với services thì cần một node đóng vai trò là service để tính toán xử lý các yêu cầu từ các node khác Cũng giống như topic, node đóng vai trò là service cũng cần phải đăng kí với master tên service, kiểu dữ liệu service sẽ nhận và hàm xử lý tính toán để trả về yêu cầu (Ví dụ: “serv rospy.Service(‘add_two_ints’, AddTwoInts, handle_add_two_ints)”) Trong đó tên service là ‘add_two_ints’, kiểu dữ liệu nhận là AddTwoInts và hàm handle_add_two_ints là hàm xử lý yêu cầu và trả về dữ liệu cho các node yêu cầu Node yêu cầu cũng phải đăng kí với master (Ví dụ: “add_two_ints = rospy.ServiceProxy(‘add_two_ints’, AddTwoInts)”) và gửi lên yêu cầu như resp = add_two_ints(1, 2) Hình 2-2 mô tả quá trình trao đổi thông tin với services
Hình 2-2-Trao đổi thông tin giữa các node qua Service
Vectơ hỗ trợ hồi qui (Support Vector Machine - SVM)
2.2.1 Máy vectơ hỗ trợ hồi quy
Trong bài toán phân lớp nhị phân với hai lớp dữ liệu hoàn toàn tách biệt, có thể tìm thấy một đường thẳng, mặt phẳng hoặc siêu phẳng để phân tách chúng sao cho các điểm dữ liệu thuộc cùng một lớp nằm cùng một phía so với mặt phân tách Tuy nhiên, có vô số cách để thực hiện điều này Câu hỏi đặt ra là: đâu là mặt phân tách tốt nhất theo một tiêu chuẩn nào đó? Từ góc độ trực quan, khoảng cách từ điểm gần nhất của hai lớp tới mặt phân tách cần phải lớn nhất Đây chính là nguyên tắc cơ bản của thuật toán SVM, nhằm tìm ra mặt phân tách với lề lớn nhất, trong đó lề được định nghĩa là khoảng cách từ điểm dữ liệu gần nhất tới mặt phân tách.
Để giải bài toán phân lớp nhị phân bằng thuật toán SVM, chúng ta cần giả định một tập dữ liệu (𝑋, y) gồm các điểm dữ liệu đầu vào 𝑥 𝑖 ∈ 𝑅 và nhãn 𝑦 𝑖 ∈ {−1, 1}, trong đó 𝑦 𝑖 = 1 nếu điểm 𝑥 𝑖 thuộc lớp thứ nhất và 𝑦 𝑖 = -1 nếu thuộc lớp thứ hai Mặt phẳng phân chia hai lớp được biểu diễn bởi phương trình 𝑊 A x + 𝑏 = 0, với 𝑤 là các trọng số tương ứng với các đặc trưng của điểm dữ liệu Khoảng cách từ một điểm đến mặt phẳng phân tách được tính bằng công thức 𝑑 = |I J x K L M|.
Khoảng cách từ một điểm đến mặt phẳng có thể được tính bằng công thức 𝑑 = P K (I ‖I‖ J x K L M), trong đó lớp thứ nhất thuộc lớp dương và lớp thứ hai thuộc lớp âm.
Nếu lớp thứ nhất là lớp âm và lớp thứ hai là lớp dương, chúng ta chỉ cần đổi dấu 𝑊 và 𝑏 Khoảng cách lề của một lớp được tính bằng công thức 𝑚𝑎𝑟𝑔𝑖𝑛 = min P K (I ‖I‖ J x K L M).
O Như vậy bài toán tối ưu trong SVM chính là tìm 𝑊 và 𝑏 sao cho:
Vì có mối quan hệ 𝑊 = 𝑘 × 𝑊 và 𝑏 = 𝑘 × 𝑏 với 𝑘 > 0, mặt phân chia giữ nguyên, do đó chúng ta có thể giả định rằng 𝑦 9 (𝑊 A x 9 + 𝑏) = 1 Với những điểm gần mặt phân chia nhất, từ công thức (2.1), bài toán trở thành việc tìm kiếm.
‖I‖ O (2.2) Với điều kiện 𝑦 9 (𝑊 A x 9 + 𝑏) ≥ 1 Hay viết lại công thức (2.2) có:
Bài toán tối ưu hóa cho phép tìm ra mặt phân tách tối ưu giữa hai lớp dữ liệu, với khoảng cách lớn nhất từ điểm dữ liệu gần nhất của mỗi lớp đến mặt phân tách Tuy nhiên, sự hiện diện của nhiễu trong dữ liệu có thể làm ảnh hưởng đến kết quả tìm kiếm này Để khắc phục những nhược điểm đó, thuật toán SVM với lề mềm đã được phát triển, giúp cải thiện độ chính xác trong việc phân tách dữ liệu.
2.2.2 Lề mềm SVM (Soft margin SVM)
Trong thực tế, hiếm khi các lớp dữ liệu hoàn toàn tách biệt, thường có các điểm nhiễu gần mặt phân tách hoặc thậm chí nằm trong nửa mặt phẳng của lớp khác Những điểm nhiễu này có thể ảnh hưởng đến việc tìm kiếm nghiệm tối ưu cho bài toán SVM, đặc biệt khi hai lớp không thể phân tách tuyến tính Do đó, việc chấp nhận một số điểm nhiễu gần mặt phân tách là cần thiết để đạt được lề rộng hơn, nhưng không thể hy sinh quá nhiều điểm để có được một lề lớn Mục tiêu của SVM với lề mềm là tìm ra mặt phân cách tối ưu, đảm bảo lề cực đại với sự hy sinh tối thiểu.
Hình 2-4-Điểm nhiễu nằm gần mặt phân tách (trái) và điểm nhiễu nằm bên mặt phân tách lớp còn lại (phải)
Đo độ hi sinh 𝛿 9 được xác định cho mỗi điểm dữ liệu x 9 trong tập dữ liệu tổng thể Nếu x 9 nằm trong vùng an toàn, 𝛿 9 sẽ bằng 0 Trong trường hợp x 9 nằm trên lề nhưng không vượt qua mặt phân cách, giá trị của 𝛿 9 sẽ nằm trong khoảng từ 0 đến 1 Nếu x 9 nằm ở phía đối diện với mặt phân cách, 𝛿 9 sẽ lớn hơn 1 Do đó, với giá trị y 9 = ±1, công thức tính 𝛿 9 là |𝑊 A x 9 + 𝑏 − 𝑦 9 |.
Hàm mục tiêu không chỉ tập trung vào việc tối thiểu hóa theo công thức (2.3) mà còn cần tối thiểu hóa các 𝛿 9 nhằm giảm thiểu sự hi sinh Do đó, hàm mục tiêu được điều chỉnh như sau.
Trong bài viết này, 𝐶 được xác định là một hằng số dương, có vai trò điều chỉnh tầm quan trọng giữa khoảng cách lề cực đại và sự hy sinh Khi 𝐶 lớn, hàm mục tiêu sẽ tập trung vào việc giảm ∑ c 9d% 𝛿 9, dẫn đến 𝛿 9 nhỏ, nghĩa là không có điểm nào phải hy sinh Ngược lại, khi 𝐶 nhỏ, 𝛿 9 sẽ lớn, đồng nghĩa với sự hy sinh lớn Để xác định giá trị tối ưu của 𝐶, phương pháp kiểm định chéo (cross-validation) thường được áp dụng Tương tự như trước đó, bài toán cũng có thể được giải bằng phương pháp tối ưu để tìm ra nghiệm thỏa mãn công thức (2.4).
Thuật toán xác định khung xương người - OpenPose
OpenPose là một thuật toán tiên tiến xác định khung xương của nhiều người trong một bức ảnh, khác với các phương pháp trước đây theo hướng từ trên xuống Phương pháp này gặp phải hai nhược điểm lớn: cần biết trước số lượng người trong ảnh và độ phức tạp thời gian chạy tăng theo số lượng người Để khắc phục, OpenPose áp dụng cách tiếp cận từ dưới lên, giúp độ phức tạp thời gian không còn phụ thuộc vào số lượng người Thuật toán này xây dựng kiến trúc học mức độ liên kết giữa các khớp cơ thể thông qua các vectơ 2 chiều, mã hóa thông tin vị trí và hướng của các khớp Sau đó, nó sử dụng thuật toán tham lam để xác định cơ thể tương ứng với các khớp Nhờ những cải tiến này, OpenPose đạt được độ chính xác và thời gian xử lý vượt trội so với các thuật toán xác định khung xương trước đó.
Tác giả đã triển khai thành công các thuật toán Alphapose và HRNet trên bo mạch Jetson TX2, với kết quả được trình bày trong Hình 2-5 dưới đây.
Thuật toán Tốc độ khung hình
(fps) Độ chính xác (khuỷu tay) Độ chính xác (cổ tay)
Hình 2-5-So sánh các thuật toán với OpenPose
Việc lựa chọn thuật toán tìm khung xương người trong ảnh dựa trên ba tiêu chí chính: tốc độ khung hình, độ chính xác khửu tay và độ chính xác cổ tay Với phần cứng là bo mạch Jetson TX2, cần một mô hình thuật toán có khả năng xử lý nhanh, do đó, tốc độ khung hình sau khi xử lý được xem xét kỹ lưỡng Đặc biệt, hai vị trí khớp cổ tay và khớp khuỷu tay là yếu tố quan trọng để phát hiện hoạt động vẫy tay, vì vậy độ chính xác của chúng cần được ưu tiên Theo Hình 2-5, OpenPose thể hiện tốc độ khung hình cao hơn hai thuật toán khác và có độ chính xác tốt cho khớp cổ tay và khuỷu tay, cho thấy OpenPose là lựa chọn phù hợp cho Jetson TX2 Hơn nữa, quá trình cài đặt OpenPose cũng đơn giản hơn so với AlphaPose và HRnet, vì vậy OpenPose được chọn để phát triển mô-đun phát hiện hành động vẫy tay, sẽ được mô tả chi tiết trong mục 3.2.
2.3.2 Tổng quan phương pháp xác định khung xương người
Sơ đồ tổng quan của thuật toán OpenPose – xác định khung xương người, được mô tả qua Hình 2-6
Hình 2-6-Sơ đồ tổng quát thuật toán OpenPose
Thuật toán nhận vào một bức ảnh kích thước 𝑤 × ℎ và xác định vị trí các khớp cơ thể cho từng người trong ảnh Bức ảnh này được xử lý qua 10 lớp đầu của mạng VGG-19 đã được tinh chỉnh để trích xuất các bản đồ đặc trưng Những bản đồ đặc trưng này sau đó được đưa vào một mạng tích chập để đồng thời dự đoán các bản đồ tin cậy 𝑆 và các vectơ 2 chiều 𝐿, mã hóa mức độ liên kết giữa các khớp cơ thể Tập 𝑆 bao gồm 𝐽 bản đồ tin cậy, mỗi bản đồ tương ứng với một khớp cụ thể, như khớp cổ tay hay khớp khuỷu tay Tập 𝐿 chứa 𝐶 trường vectơ 2 chiều, trong đó mỗi vị trí trong trường vectơ là một vectơ mô tả mối liên hệ giữa các khớp.
Mỗi trường vectơ 2 chiều tương ứng với một bộ phận cơ thể, như cánh tay dưới được kết nối bởi hai khớp (khớp cổ tay và khớp khuỷu tay) Các bản đồ tin cậy 𝑆 và các trường vectơ 𝐿 sẽ được sử dụng để thuật toán tham lam suy luận và tạo ra khung xương của từng người trong bức ảnh Thông tin về khung xương mà thuật toán cung cấp sẽ hỗ trợ nhận diện hành động vẫy tay trong bài luận văn.
Thuật toán hỗ trợ nhận diện mặt người FaceNet
FaceNet, được giới thiệu bởi các kỹ sư Google vào năm 2015, là một thuật toán nhằm xây dựng không gian vectơ để ánh xạ các ảnh mặt người thành các vectơ Trong không gian này, khoảng cách giữa các vectơ biểu thị mức độ tương đồng giữa các khuôn mặt; khoảng cách nhỏ hơn giữa hai vectơ cho thấy khả năng cao chúng là của cùng một người Kiến trúc tổng quan của mạng nơ-ron FaceNet được thể hiện trong Hình 2-7.
Mô hình FaceNet sử dụng một mạng tích chập sâu để xử lý một lô ảnh đầu vào và tạo ra vectơ 128 chiều Vectơ này được chuẩn hóa thành vectơ embedding, với mục tiêu giảm khoảng cách Euclide giữa các vectơ embedding của cùng một người và tăng khoảng cách giữa các người khác nhau Để đạt được điều này, hàm mất mát bộ ba (triplet loss) được áp dụng, giúp mô hình học được sự tương đồng và khác biệt giữa các khuôn mặt Phần này sẽ tập trung vào việc xây dựng hàm mất mát bộ ba và kiến trúc mạng tích chập cần thiết để tạo ra vectơ 128 chiều.
2.4.1 Hàm mất mát bộ ba Ý tưởng đằng sau của hàm mất mát bộ ba là muốn những ảnh khuôn mặt của cùng một người sẽ gần nhau hơn so với ảnh khuôn mặt của người khác Theo Hình 2-7, nếu coi bộ mô hình mạng tích chập sâu và chuẩn hóa vectơ 𝐿2 là một hàm 𝑓 sinh ra vectơ embedding từ ảnh khuôn mặt 𝑥 ∈ ℝ u×7 thì vectơ embedding được sinh ra bởi mô hình là 𝑓(𝑥) ∈ ℝ v và vì đã chuẩn hóa 𝐿2 nên ‖𝑓(𝑥)‖ 5 = 1 Mục tiêu là muốn mô hình học được ảnh khuôn mặt của một người cụ thể 𝑥 9 w sẽ gần với tất cả các ảnh khuôn mặt còn lại của người đó 𝑥 9 x và xa ảnh khuôn mặt của người khác 𝑥 9 7 , do đó: y𝑓(𝑥 9 w ) − 𝑓2𝑥 9 x 8y 5 5 + 𝛼 < ‖𝑓(𝑥 9 w ) − 𝑓(𝑥 9 7 )‖ 5 5 , ∀ |𝑓(𝑥 9 w ), 𝑓2𝑥 9 x 8, 𝑓(𝑥 9 7 )} ∈ 𝒯 (2.5)
Trong bài viết này, 𝛼 đại diện cho khoảng cách bắt buộc giữa cặp ảnh của cùng một người và cặp ảnh của hai người khác nhau Tập bộ ba 𝒯 bao gồm các bộ ba có thể có trong tập huấn luyện, với 𝑁 là số lượng tập bộ ba Mục tiêu chính là tối thiểu hóa hàm mất mát 𝐿.
Việc tìm kiếm tất cả các bộ ba trong tập huấn luyện với dữ liệu lớn có thể tốn nhiều thời gian và gặp khó khăn trong quá trình hội tụ, do đó, cần thiết phải có một chiến lược lựa chọn bộ ba hiệu quả.
2.4.2 Chiến lược lựa chọn bộ ba
Việc chọn bộ ba ảnh khuôn mặt là rất quan trọng để mô hình huấn luyện nhanh chóng hội tụ Chiến lược này nhằm tìm bộ ba sao cho ảnh của cùng một người có sự khác biệt lớn nhất, trong khi ảnh của hai người khác nhau lại giống nhau nhất Ví dụ, việc so sánh ảnh khuôn mặt của một người khi còn nhỏ và khi trưởng thành sẽ làm tăng độ khó cho quá trình học Nếu mô hình có thể nhận diện hai khuôn mặt là của cùng một người, nó sẽ thể hiện sự thông minh vượt trội Ngược lại, việc chọn ảnh của hai người khác nhau nhưng có nhiều đặc điểm tương đồng cũng giúp cải thiện khả năng phân biệt của mô hình Công thức hóa chiến lược này, tức là lựa chọn ảnh khuôn mặt của cùng một người 𝑥 sao cho 𝑎𝑟𝑔𝑚𝑎𝑥.
K ƒ(𝑓(𝑥 9 w ) − 𝑓2𝑥 9 x 8) và ảnh khuôn mặt của người khác
Chiến lược lựa chọn bộ ba trong mô hình này giúp tối ưu hóa quá trình học tập bằng cách phân biệt và nhận diện sự tương đồng cũng như khác biệt giữa các ảnh khuôn mặt.
Để tìm kiếm ảnh khuôn mặt 𝑥9 x và 𝑥9 7 trong dữ liệu huấn luyện lớn, chi phí tính toán sẽ gia tăng do cần duyệt toàn bộ dữ liệu Nếu ảnh bị đánh sai nhãn hoặc chất lượng thấp, quá trình huấn luyện sẽ bị ảnh hưởng Để giải quyết vấn đề này, thay vì tìm kiếm trên toàn bộ dữ liệu, chỉ cần tìm trên các lô nhỏ (mini-batch) trong quá trình huấn luyện Hơn nữa, để nâng cao hiệu quả, việc chọn ảnh khuôn mặt 𝑥9 7 chỉ cần thỏa mãn điều kiện y𝑓(𝑥9 w) − 𝑓2𝑥9 x 8y 5 5 < ‖𝑓(𝑥9 w) − 𝑓(𝑥9 7)‖ 5 5 nhằm tránh hội tụ cục bộ Để thực hiện chiến lược lựa chọn bộ ba, cần có mạng tích chập sâu với nhiều cải tiến, chi tiết kiến trúc được mô tả trong Hình 2-7.
Hình 2-8-Mạng học sâu Inception ResNet V1 [19]
Hàm mất mát và chiến lược lựa chọn bộ ba là yếu tố cốt lõi của thuật toán FaceNet Tác giả đã thử nghiệm với nhiều kiến trúc mạng khác nhau để tối ưu hóa hiệu suất của thuật toán này.
Hai tác giả Zeiler và Fergus đạt độ chính xác 87%, trong khi mạng dựa trên GoogleLeNet đạt 89,4% Trong bài luận văn này, chúng tôi sử dụng mô hình đã được huấn luyện trước với kiến trúc Inception ResNet V1, đạt độ chính xác 99,65% trên tập dữ liệu LFW Kiến trúc của Inception ResNet V1 được mô tả qua Hình 2-8, bao gồm các khối Inception-resnet A.
B, C với các kích thước kernel khác nhau 1 × 1, 3 × 3 và các kernel xếp chồng nhau
Các cấu trúc (1 × 1, 3 × 3, 3 × 3), (1 × 1, 1 × 7, 7 × 1) và (1 × 1, 1 × 3, 3 × 1) cho phép mạng học đặc trưng từ các vùng ảnh có kích thước khác nhau, từ nhỏ đến lớn, tối ưu hóa khả năng thu thập thông tin Kết hợp với ý tưởng của mạng ResNet và các kết nối tắt (skip connection), mạng sâu có thể tăng độ sâu mà không gặp phải tình trạng bão hòa trong quá trình huấn luyện Ngoài ra, khối Reduction A cũng đóng vai trò quan trọng trong việc cải thiện hiệu suất của mạng.
B và Block-8 giúp tối ưu hóa mạng bằng cách giảm chiều dữ liệu, mang lại hiệu quả cao trong việc nhận diện khuôn mặt Kiến trúc Inception ResNet V1 với những ưu điểm nổi bật, phù hợp cho các bài toán nhận dạng người.
Kiến trúc tổng quan hệ thống phân tích hình ảnh
3.1.1 Các trạng thái và bộ máy trạng thái hữu hạn
Xây dựng phần mềm cho robot đòi hỏi kiến trúc rõ ràng, dễ mở rộng và dễ gỡ lỗi Robot có nhiều bộ phận cần phối hợp và trao đổi thông tin để hoàn thành nhiệm vụ Do đó, bộ máy trạng thái hữu hạn được áp dụng, với mỗi hành động của robot được định nghĩa bởi chuỗi trạng thái, mỗi trạng thái có chức năng tương ứng Việc chia nhỏ hành động giúp dễ dàng quản lý và gỡ lỗi khi có sự cố Robot được phân thành nhiều hệ thống nhỏ, mỗi hệ thống quản lý các phần khác nhau dưới dạng bộ máy trạng thái hữu hạn Các hệ thống này bao gồm quản lý âm thanh, quản lý di chuyển và quản lý màn hình tương tác Bài viết cũng sẽ trình bày kiến trúc tổng quan của hệ thống phân tích hình ảnh, bao gồm hai thành phần chính.
LogicController đóng vai trò quan trọng trong việc xử lý logic của toàn bộ hệ thống, chịu trách nhiệm gửi và nhận thông tin từ các hệ thống khác Chẳng hạn, nó truyền tải thông tin về góc và khoảng cách của người vẫy tay đến hệ thống di chuyển, giúp hệ thống tính toán và xác định lộ trình di chuyển.
StateMachine là phần mềm định nghĩa các trạng thái và sự kiện chuyển đổi trạng thái dựa trên dữ liệu nội bộ và bên ngoài hệ thống Mỗi trạng thái (State) cần được xác định qua hai hàm quan trọng: enter_state và while_state Hàm enter_state định nghĩa các công việc khởi tạo khi vào trạng thái, trong khi hàm while_state xác định các công việc cần thực hiện trong suốt thời gian ở trạng thái đó.
Để xây dựng máy trạng thái hữu hạn một cách tự động và nhanh chóng, tệp cài đặt đã được tạo ra, trong đó định nghĩa tổng quát về các trạng thái, sự kiện chuyển trạng thái, cũng như quy trình gửi, nhận dữ liệu và logic xử lý khi vào một trạng thái nhất định Những tệp này sẽ được sử dụng để tự động xây dựng StateMachine và thiết lập đường gửi nhận dữ liệu cho hệ thống.
Hình 3-1-Thành phần chính của hệ thống
Mô hình tổng quan của hệ thống được thể hiện qua Hình 3-1, trong đó StateController và LogicController đóng vai trò quan trọng Thành phần TopicIn bao gồm các topic mà hệ thống phân tích hình ảnh đăng ký để thu thập dữ liệu từ các hệ thống khác, trong khi TopicOut là thông tin được hệ thống xử lý và gửi ra bên ngoài để các hệ thống khác có thể sử dụng Chi tiết về StateController được mô tả trong Hình 3-2.
Hình 3-2-Sơ đồ chuyển trạng thái của máy trạng thái hữu hạn
Mô hình robot bao gồm bốn trạng thái chính: IDLE, HAND_WAVING, DETECT_MOTION và FACE_ID Trong trạng thái IDLE, robot lắng nghe các yêu cầu từ hệ thống khác, trong khi HAND_WAVING xử lý và tải mô hình nhận diện hành động vẫy tay Trạng thái DETECT_MOTION xác định sự chuyển động, và FACE_ID nhận diện khuôn mặt người trước robot Mỗi trạng thái cần sự kiện kích hoạt để chuyển đổi, ví dụ, sự kiện VISION_HAND_WAVING chuyển từ IDLE sang HAND_WAVING, và sau khi hoàn thành nhận diện, sự kiện VISION_EV_DONE đưa robot trở lại trạng thái IDLE Việc định nghĩa và quản lý các trạng thái giúp dễ dàng xác định công việc cần thực hiện và đơn giản hóa quá trình gỡ lỗi khi lỗi xảy ra Hơn nữa, việc mở rộng chức năng cho robot chỉ cần thêm các trạng thái mới mà không ảnh hưởng đến các chức năng đã phát triển Để xây dựng bộ máy trạng thái hữu hạn, tệp cài đặt định nghĩa các trạng thái và di chuyển trạng thái đã được tạo ra nhằm tự động hóa quá trình này.
3.1.2 Tự động xây dựng bộ máy trạng thái dựa trên tệp cài đặt
Trong quá trình phát triển, việc tự động hóa bộ máy trạng thái hữu hạn có thể được thực hiện thông qua tệp cài đặt, trong đó định nghĩa toàn bộ trạng thái và luồng di chuyển giữa các trạng thái dựa trên các sự kiện được xác định.
Hình 3-3-Thiết kế tệp cài cho việc tự động xây dựng bộ máy trạng thái hữu hạn
The file defines the initial state using the keyword "init_state," while all system states are represented by the keyword "state." Each state includes events that trigger transitions, identified by the keyword "event_id." Additionally, each state specifies two functions: "enter_state" and "exit_state."
“enter_while” sẽ được thực thi khi vào trạng thái đó Ví dụ trong trạng thái “IDLE” thì
“enter_state” sẽ ứng với hàm “enter_state_idle”, còn “enter_while” sẽ ứng với hàm
Khi hệ thống vào trạng thái "IDLE", lệnh "enter_while_idle" sẽ được thực thi Để chuyển đổi giữa các trạng thái, quá trình này được xác định thông qua từ khóa "event_id" trong tệp cài đặt Mỗi trạng thái sẽ có danh sách các trạng thái có thể chuyển tiếp.
"events_class": "VISION_CONTROLLER_EVTS",
"input_keys": ["idle_in"], "output_keys":["idle_out"],
"enter_state": "enter_state_idle", "enter_while": "enter_while_idle"},
"input_keys": ["hand_waving_in"], "output_keys":["hand_waving_out"],
"enter_state": "enter_state_hand_waving", "enter_while": "enter_while_hand_waving"},
{"id_name": "VISION_MOTION", "dst": "DETECT_MOTION", "des": ""},
{"id_name": "VISION_FACE_ID", "dst": "FACE_ID", "des": ""},
"HAND_WAVING": [{"id_name": "VISION_EV_DONE", "dst": "IDLE", "des": ""}],
Khi hệ thống ở trạng thái “DETECT_MOTION” và gặp sự kiện “VISION_FACE_ID”, nó sẽ chuyển sang trạng thái “FACE_ID” Việc định nghĩa tệp cài đặt như trong Hình 3-3 cung cấp cho nhà phát triển cái nhìn tổng quan về hệ thống và luồng di chuyển trạng thái Điều này cho phép việc thêm hoặc chỉnh sửa dễ dàng chỉ bằng cách thay đổi nội dung tệp cài đặt mà không làm ảnh hưởng đến mã lệnh đã viết trước đó Để đọc nội dung trong tệp và tự động xây dựng bộ máy trạng thái hữu hạn, các lớp đã được thiết kế như trong Hình 3-4.
Hình 3-4-Thiết kế các lớp cho việc tự động xây dựng bộ máy trạng thái hữu hạn
Lớp "State" trong bộ máy trạng thái hữu hạn định nghĩa các trạng thái khác nhau, bao gồm hai hàm chính: “ init ” và “execute” Hàm “ init ” khởi tạo đầu ra cho mỗi trạng thái, ví dụ, trạng thái “IDLE” có thể chuyển sang “VISION_MOTION” hoặc “VISION_FACE_ID”, với đầu ra là mảng chứa hai phần tử này Trong khi đó, hàm “execute” thực hiện các công việc liên quan khi hệ thống đang ở trạng thái đó, đảm bảo rằng quá trình khởi tạo diễn ra trước khi thực thi các chức năng cần thiết trong phân tích hình ảnh.
“execute” như việc tải một mô hình thì lớp “BaseState” đã được sinh ra để kế thừa lớp
“State” và cài đè lại hàm “execute”
Với 2 lớp “State” và “BaseState” đã có thể sinh ra được thực thể trạng thái, tuy nhiên để từ các trạng thái có thể di chuyển qua các trạng thái khác cần có lớp
“BaseStateController” Lớp “BaseStateController” có các hàm “ build_statemachine” và
Hàm " build_statemachine" lấy thông tin từ tệp cài đặt để tạo ra các thực thể trạng thái và chuẩn bị cho việc xây dựng trạng thái Trong khi đó, hàm "deploy" chịu trách nhiệm xây dựng luồng di chuyển trạng thái và hoàn thiện bộ máy trạng thái hữu hạn.
3.1.3 Xây dựng các lớp cho phân tích hình ảnh
Trong hệ thống phân tích hình ảnh cho robot, có ba mô hình chính: MotionDetection, HandWaving và FaceId Mô hình MotionDetection giúp phát hiện chuyển động, chuyển robot từ trạng thái ngủ sang trạng thái sẵn sàng nhận lệnh Mô hình HandWaving được sử dụng để phát hiện người đang vẫy tay, trong khi FaceId có nhiệm vụ nhận diện khuôn mặt người đứng trước robot Tất cả các mô hình này đều cần tải mô hình hoặc trả về kết quả, do đó một lớp trừu tượng đã được tạo ra để hỗ trợ quá trình này.
Hình 3-5-Mô hình kế thừa của các bài toán phân tích hình ảnh
Lớp trừu tượng VisionTask, như mô tả trong Hình 3-5, được thiết kế với ba phương thức trừu tượng mà các lớp kế thừa phải cài đặt Mỗi phương thức có nhiệm vụ cụ thể, đảm bảo tính nhất quán và hiệu quả trong việc thực hiện các tác vụ liên quan đến thị giác.
• Hàm start(): Dùng để tải mô hình và các cài đặt liên quan tới tác vụ mô hình
Mô-đun phát hiện vẫy tay
Các thuật toán hiện nay chủ yếu tập trung vào việc nhận diện cử chỉ tay trong khoảng cách gần 1-2 mét, điều này không phù hợp cho việc phát hiện vẫy tay Đặc biệt, robot hướng dẫn viên cần khả năng phát hiện người vẫy tay từ khoảng cách xa hơn, lên đến 5 mét Do đó, để phát hiện vẫy tay hiệu quả, cần sử dụng vùng ảnh rộng hơn, bao gồm cả cánh tay người.
Cử động của cánh tay sẽ được sử dụng để phát hiện cử chỉ vẫy tay thông qua thuật toán OpenPose, giúp xác định khung xương cơ thể người Thuật toán này cho phép lấy khung xương cánh tay, từ đó tính toán và nhận diện các cử chỉ vẫy tay một cách chính xác.
3.2.1 Thuật toán phát hiện vẫy tay dựa trên khung xương cánh tay
Sơ đồ tổng quan thuật toán phát hiện vẫy tay được mô tả dưới Hình 3-7
Hình 3-7-Sơ đồ tổng quan thuật toán vẫy tay
Các bức ảnh màu liên tiếp từ camera được xử lý qua thuật toán OpenPose, cho phép xác định vị trí các khớp trên cơ thể của một người.
Để phát hiện hành động vẫy tay, chúng ta chỉ tập trung vào hai khớp ở cánh tay: khớp cổ tay và khớp khuỷu Thuật toán vẫy tay sẽ sử dụng thông tin vị trí của các khớp này từ những bức ảnh liên tiếp để xác định xem có ai đang vẫy tay hay không Nếu phát hiện được, vị trí của người vẫy tay sẽ được ghi lại để phục vụ cho các phần khác Hành động vẫy tay được định nghĩa là việc đưa tay lên và di chuyển liên tục từ trái sang phải Để nhận biết hành động này, cần thỏa mãn hai điều kiện: độ mở của cánh tay phải lớn hơn một ngưỡng nhất định và việc di chuyển tay sang hai bên phải lặp lại ít nhất hai lần.
Hình 3-8-Góc tạo thành giữa cánh tay và mặt phẳng ngang khi vẫy
Khi cánh tay được nâng lên, nó tạo thành một góc 𝛼 với mặt phẳng ngang, trong đó góc này có giá trị từ 0° đến 180° và tăng dần từ trái sang phải Hiệu của hai góc 𝛼 giữa hai khung hình liên tiếp được ký hiệu là Δ ‰ Khi cánh tay di chuyển từ trái sang phải, Δ ‰ luôn lớn hơn hoặc bằng 0, vì góc 𝛼 của khung hình sau luôn lớn hơn góc 𝛼 của khung hình trước.
Khi cánh tay di chuyển từ phải sang trái, Δ ‰ ≤ 0 Việc vẫy tay sẽ diễn ra từ biên trái sang biên phải và ngược lại Để xác định vị trí của tay tại hai biên của các góc (𝛼 u97, 𝛼 uw‚), chúng ta sử dụng bất đẳng thức (3.1): Δ Š‹ướr × Δ o9ệ7 Šạ9 ≤ 0 Để tránh nhầm lẫn, giá trị 𝛼 đã bị bỏ đi trong bất đẳng thức này Bất đẳng thức (3.1) cho thấy thời điểm cánh tay đang trở về từ biên Khi Δ Š‹ướr × Δ o9ệ7 Šạ9 ≤ 0 và Δ o9ệ7 Šạ9 > 0, cánh tay ở biên trái và 𝛼 u97 sẽ được gán lại bằng 𝛼 o9ệ7 Šạ9 Ngược lại, nếu Δ Š‹ướr × Δ o9ệ7 Šạ9 ≤ 0 và Δ o9ệ7 Šạ9 < 0, cánh tay ở biên phải và 𝛼 uw‚ sẽ được gán lại bằng 𝛼 o9ệ7 Šạ9.
Khi 𝛼 uw‚ − 𝛼 u97 lớn hơn một ngưỡng 𝐶 đã được xác định, người dùng có thể vẫy tay được nửa chu kỳ Nếu hành động vẫy tay đạt đủ một chu kỳ, nó sẽ được nhận diện thành công.
Khi con người vẫy tay, họ có thể di chuyển gần robot, không chỉ đứng yên Thuật toán OpenPose trả về danh sách các người trong ảnh, với mỗi người có mảng vị trí các khớp, nhưng thứ tự danh sách giữa các khung hình có thể thay đổi Do đó, cần định danh từng người để nhận diện và phát hiện hành động vẫy tay qua các khung hình Vì nội dung giữa hai khung hình liên tiếp có sự thay đổi nhỏ, việc định danh yêu cầu tính toán giá trị trung bình 𝑥̅ = 𝑥 % + 𝑥 5 +.
Trong hình 3.9, các vị trí khớp của người được thể hiện theo trục hoành Ox Người có giá trị định danh gần nhất với giá trị của người trước đó sẽ được coi là cùng một người Việc bổ sung định danh giúp thuật toán nhận diện hành động vẫy tay ngay cả khi người đó đang di chuyển.
Hình 3-9-Định danh người qua trục hoành Ox
Mô-đun nhận dạng mặt người
Sau khi robot phát hiện người vẫy tay, nó sẽ di chuyển đến gần đối tượng Khi đến gần, hệ thống sẽ nhận diện khuôn mặt của người đó và tự động cắt vùng ảnh chứa người vẫy tay, sau đó gửi dữ liệu đến mô-đun nhận dạng khuôn mặt Sơ đồ tổng quát của mô-đun này được thể hiện trong Hình 3-10.
Hệ thống nhận dạng khuôn mặt người hoạt động bằng cách nhận đầu vào là một bức ảnh có chứa khuôn mặt và trả về tên của người trong ảnh; nếu chưa từng gặp, kết quả sẽ là giá trị “trống” Quy trình nhận dạng được chia thành hai pha: pha huấn luyện và pha triển khai Trong pha huấn luyện, dữ liệu được sử dụng để huấn luyện mô hình SVM nhận dạng khuôn mặt, trong khi pha triển khai sử dụng mô hình SVM đã được xây dựng Pha huấn luyện được minh họa bằng vùng bao quanh màu đỏ trong sơ đồ Các bước trong pha huấn luyện bao gồm việc đưa ảnh vào mô hình MTCNN để phát hiện khuôn mặt, sau đó cắt và điều chỉnh kích thước khuôn mặt để phù hợp với mô hình.
Ảnh sau khi được chỉnh sửa về kích thước 180 × 180 sẽ được đưa vào mạng FaceNet đã được huấn luyện trước để lấy vectơ embedding 128 chiều, sau đó lưu trữ vào dữ liệu để huấn luyện Tập dữ liệu này sẽ được sử dụng để huấn luyện mô hình SVM nhằm nhận dạng khuôn mặt Trong giai đoạn triển khai, quy trình cũng tương tự như trong giai đoạn huấn luyện, với ảnh được đưa qua mạng MTCNN để phát hiện khuôn mặt.
FaceNet được sử dụng để tạo ra vectơ embedding, và vectơ này sau đó được đưa vào mô hình SVM đã được huấn luyện trước để nhận diện khuôn mặt Dữ liệu về kết quả nhận diện, bao gồm cả đúng và sai, sẽ được lưu trữ nhằm cải tiến mô hình trong tương lai.
Để phát hiện khuôn mặt người, mô-đun sử dụng MTCNN, và nếu có nhiều khuôn mặt trong ảnh, MTCNN sẽ trả về một mảng chứa vị trí và kích cỡ của các khuôn mặt Cần xác định khuôn mặt của người vẫy tay trong số đó, vì robot sẽ di chuyển đến người gần nhất với tâm bức ảnh Giả sử có 𝑛 khuôn mặt được phát hiện, tọa độ và kích thước của khuôn mặt 𝑖 lần lượt là (𝑥 9 , 𝑦 9 ) và (𝑤 9 , ℎ 9 ) Tâm của khuôn mặt 𝑖 được tính bằng 𝑐𝑥 9 = ‚ K Ln 5 K và 𝑐𝑦 9 = P K Lo 5 K, trong khi tâm của ảnh tổng thể là 𝑐𝑥 = ‚Ln 5 và 𝑐𝑦 = PLo 5 Khoảng cách từ tâm ảnh khuôn mặt đến tâm ảnh tổng thể được tính bằng 𝑑 9 = √((𝑐𝑥 − 𝑐𝑥 9 )² + (𝑐𝑦 − 𝑐𝑦 9 )²) Khuôn mặt được nhận diện sẽ là khuôn mặt có khoảng cách nhỏ nhất, tức là min(𝑑 9 , 𝑑 % , … , 𝑑 7 ) Hình 3-11 minh họa cách xác định khuôn mặt ở trung tâm ảnh.
Hình 3-11-Tìm mặt người vẫy tay
Xây dựng kịch bản
Phần này mô tả các kịch bản và quy trình thực hiện thuật toán cho từng kịch bản, được trình bày tổng quát qua Hình 3-12.
Hình 3-12-Sơ đồ chuyển trạng thái qua các kịch bản
Hình 3-12 mô tả hệ thống bao gồm bộ máy trạng thái hữu hạn trên PI để điều khiển động cơ di chuyển và bộ máy trạng thái trên Jetson TX2 để phân tích hình ảnh cho robot Hai bộ máy này giao tiếp với nhau thông qua Topic, được biểu thị bằng mũi tên nét gạch đứt màu da cam Mũi tên liền màu đen chỉ ra sự kiện chuyển trạng thái nội bộ trong bộ máy trạng thái trên Jetson TX2 Chi tiết về luồng kịch bản sẽ được trình bày ở phần sau.
3.4.1 Kịch bản phát hiện người vẫy tay
Kịch bản này cho phép robot nhận diện người cần trợ giúp thông qua hành động vẫy tay Khi robot đứng yên và phát hiện chuyển động trong phạm vi quan sát, nó sẽ chú ý đến những người vẫy tay để xác định vị trí và tiến lại gần họ Các luồng trạng thái của quy trình này được mô tả chi tiết trong Hình 3.13.
Hình 3-13-Sơ đồ chuyển trạng thái qua kịch bản phát hiện người vẫy tay
Kịch bản bắt đầu khi robot khởi động các bộ phận sẵn sàng hoạt động, và bộ máy trên PI gửi thông điệp VISION_MOTION đến bộ máy trên Jetson TX2 Hình 3-13 minh họa cách thức thực hiện hoạt động chuyển trạng thái này.
1 Đầu tiên bộ máy trạng thái trên Jetson TX2 ở trạng thái IDLE nhận message VISION_MOTION từ PI
2 Bộ máy trạng thái trên Jetson TX2 chuyển trạng thái từ IDLE sang DETECT_MOTION
3 Bộ máy ở trạng thái DETECT_MOTION sẽ khởi động và chạy thuật toán phát hiện chuyển động
4 Nếu phát hiện có chuyển động thì bộ máy trạng thái sẽ gửi message VISION_HAVING_MOTION cho bộ máy trên PI và chuyển trạng thái trên Jetson TX2 từ DETECT_MOTION về lại IDLE
5 Bộ máy trên PI tiếp tục gửi message VISON_HAND_WAVING cho bộ máy trên Jetson TX2
6 Bộ máy trên Jetson TX2 chuyển trạng thái từ IDLE sang HAND_WAVING
7 Bộ máy ở trạng thái HAND_WAVING sẽ bắt đầu chạy thuật toán phát hiện người vẫy tay
8 Nếu phát hiện có người vẫy tay thì robot sẽ xác định vị trí người vẫy tay trong phòng và gửi message VISON_HAVING_WAVING cho bộ máy trên PI Đồng thời bộ máy chuyển từ trạng thái HAND_WAVING về lại trạng thái IDLE
Khi nhiều người cùng vẫy tay gọi robot thì robot sẽ ưu tiên phục vụ cho người vẫy đầu tiên
3.4.2 Kịch bản nhận diện khuôn mặt người vẫy tay
Kịch bản này cho phép robot nhận diện khuôn mặt người vẫy tay, nhằm thu thập thông tin và chào hỏi những người đã biết Nếu chưa quen, robot sẽ hỏi tên và lưu lại hình ảnh để cải thiện khả năng nhận diện sau này Sau khi người vẫy tay xuất hiện, robot sẽ xác định vị trí của họ dựa vào khoảng cách và góc giữa robot và người đó Thông tin này được gửi tới máy PI để tính toán vị trí trong bản đồ 3D, giúp robot tiếp cận người vẫy tay Khi đến gần, robot sẽ bắt đầu quá trình nhận dạng khuôn mặt, với luồng chuyển trạng thái chi tiết được mô tả trong Hình 3-14.
Hình 3-14-Sơ đồ chuyển trạng thái qua kịch bản nhận diện khuôn mặt người
3.4.2.1 Kịch bản nhận diện người vẫy tay đã biết từ trước
Kịch bản này cho phép robot nhận diện khuôn mặt của những người đã được biết đến, nhằm lấy thông tin và chào họ bằng tên Khi xác định được thông tin người vẫy tay, robot có khả năng tra cứu lịch sử phục vụ để hiểu rõ hơn về những hiện vật và thông tin mà người đó quan tâm, từ đó nâng cao chất lượng phục vụ.
Kịch bản bắt đầu khi bộ máy trên PI gửi tin nhắn VISION_FACE_ID tới bộ máy trên Jetson TX2 Như thể hiện trong Hình 3-14, các hoạt động chuyển trạng thái được thực hiện theo một quy trình cụ thể.
1 Đầu tiên bộ máy trạng thái trên Jetson TX2 nhận message VISION_FACE_ID từ PI
2 Bộ máy trạng thái trên Jetson TX2 chuyển trạng thái từ IDLE sang trạng thái FACE_ID
3 Bộ máy ở trạng thái FACE_ID sẽ chạy thuật toán nhận diện khuôn mặt
4 Nếu đã nhận diện được mặt người vẫn tay thì bộ máy gửi message EV_FACE_ID cho bộ máy trên PI và đồng thời chuyển trạng thái từ FACE_ID thành trạng thái IDLE
Mức độ chắc chắn mặt người vẫn tay nằm trong bộ dữ liệu mặt người đã gặp phải lớn hơn 50%
3.4.2.2 Kịch bản người vẫy tay là người lạ
Kịch bản này cho phép robot ghi nhớ mặt của người lạ để lần sau gặp thì robot có thể chào bằng tên
Kịch bản bắt đầu khi bộ máy trên PI gửi message VISION_FACE_ID đến bộ máy trên Jetson TX2 Hình 3-14 minh họa các hoạt động chuyển trạng thái diễn ra trong quá trình này.
1 Đầu tiên bộ máy trạng thái trên Jetson TX2 nhận message VISION_FACE_ID từ PI
2 Bộ máy trạng thái trên Jetson TX2 chuyển trạng thái từ IDLE sang trạng thái FACE_ID
3 Bộ máy ở trạng thái FACE_ID sẽ chạy thuật toán nhận diện khuôn mặt
4 Nếu không xác định được mặt người vẫn thị bộ máy gửi message EV_FACE_ID_NOT_SURE và chuyển trạng thái từ FACE_ID thành trạng thái IDLE
Các yêu cầu Ảnh mặt người lạ được lưu cho việc huấn luyện lần sau.