Chế tạo robot nhận diện vật thể chỉ với 100$ cùng TensorFlow


Hiện nay, nhận diện vật thể (Object recognition) là một trong những lĩnh vực thú vị nhất trong công nghệ machine learning. Máy tính có khả năng nhận diện khuôn mặt hoặc 1 loài mèo khá tốt, nhưng việc nhận diện các vật thể tùy ý (arbitrary objects) trong một bức ảnh lớn lại là một đỉnh cao của trí tuệ nhân tạo (AI). Machine learning vẫn phải vật lộn với những công việc đơn giản này, nhưng trong vài năm gần đây thì nó hoạt động tốt hơn hẳn.
Deep learning và public training data set mang tên ImageNet đã tạo ra những tiến triển ấn tượng trong nhận diện vật thể. TensorFlow là một framework quen thuộc có thể giúp bạn dễ dàng triển khai thuật toán deep learning trên nhiều kiến trúc khác nhau. TensorFlow tận dụng rất tốt GPU khiến việc chạy thuật toán deep learning tốt hơn.

Xây dựng robot

Tôi muốn xây dựng một con robot có khả năng nhận diện vật thể. Với nhiều năm kinh nghiệm trong lập trình máy tính (computer program) và phát triển công cụ test nên việc chuyển sang làm robot là một thách thức đối với tôi. Trong thực tế, test thiết bị đang gặp lỗi có thể gây ra cháy nhà hoặc ít nhất là nướng luôn động cơ và buộc bạn phải chờ vài ngày để sửa chữa.

Hình 1: Kiến trúc của robot nhận diện vật thể
Raspberry Pi thế hệ thứ ba là sự lựa chọn hoàn hảo cho dự án này. Trên Amazon.com bán với giá 36$, có WiFi, quad core CPU, RAM 1GB. Card microSD có giá 6$ có thể load Raspberian, hay thường biết đến là Debian. Xem overview tại hình 1 để hiểu cách các thành phần làm việc với nhau, và xem Pi ở hình 2.
 Hình 2: Raspberry Pi
Tôi thích khung gầm robot giá rẻ mà Sin Smart bán, chỉ khoảng 11$. Khung gầm này rẽ hướng khi xoay bánh xe với các tốc độ khác nhau, và nó làm điều này rất tốt (xem hình 3).
Hình 3: Khung gầm robot
Trong khi có nhiều sự lựa chọn rẻ hơn, nhưng tôi quyết định bỏ nhiều tiền để đầu tư vào Adafruit motor hat (xem hình 4). Mô tơ DC chạy mạnh hơn so với mô tơ mà Raspberry Pi cung cấp, vì vậy rất cần có thêm một controller riêng lẻ, và mô tơ Adafruit là lựa chọn tốt nhất. Sử dụng motor hat cần có mối hàn rất nhỏ, nhưng phần cứng thì rất dễ tích hợp, và Adafruit cung cấp thư viện và tutorial rất tố để điều kiên motors thông qua i2C.  Lúc đầu, tôi dùng mô tơ controller rẻ hơn, nhưng khi tình cờ thử dùng Pi thì tôi thấy nên đặt mô tơ có chất lượng tốt hơn để thay thế.\

Hình 4: Raspberry Pi với motor hat và camera
Camera có giá 15$ được gắn vào Raspberry Pi và cung cấp video feed real-time để phục vụ cho việc nhận diện vật thể. Có rất nhiều loại camera nhưng tôi thích những loại camera hồng ngoại có chế độ ban đêm.
Raspberry Pi cần dòng điện 2A, nhưng khi gắn loa vào thì 3A sẽ tốt hơn. Sạc pin iPhone sẽ rất thích hợp cho việc này. Sạc pin loại nhỏ thường không cho đủ ampe và có thể gây chuyện không hay, nhưng Lumsing power bank sẽ làm tốt việc này chỉ với 18$.
HC-SR04 sonar sensors có thể giúp robot tránh sự cố. Bạn có thể mua 5 cái với giá 11$.
Tôi thêm vào loa USB loại rẻ nhất và sử dụng dây zip để cột, keo nóng để dán mọi thứ lại với nhau. Ngoài ra tôi còn dùng những vật liệu của đồ điện tử để thiết kế cho con robot ngầu hơn. Thực tế tôi làm cả 2 robot (xem hình 5) vì tôi đang thử nghiệm các loại khung gầm, camera, định vị, phần mềm khác nhau.
Sau khi thiết kế xong, tôi bắt tay vào việc lập trình robot. Có rất nhiều hướng dẫn online cho Raspberry Pi. Nếu bạn dùng Linux thì cũng có nhiều tài liệu.
Để streaming camera, RPi Cam Web interface là một sự lựa chọn. Nó có khả năng cấu hình tốt và mặc định đưa bức ảnh mới nhất từ camera vào RAM disk tại /dev/shm/mjpeg/cam.jpg.
Nếu bạn muốn stream camera data đến một webpage (rất hữu ích để debug), bạn có thể cài đặt Nginx, một open source webserver/proxy cực nhanh. Tôi cấu hình Nginx để đưa request trực tiếp cho hình ảnh trong camera đến file location và mọi thứ đến webserver của tôi.
http {
   server {
      location / {
            proxy_pass http://unix:/home/pi/drive.sock;
         }
            location /cam.jpg {
                root /dev/shm/mjpeg;
         }
   }
}
Sau đó, tôi xây dựng một Python webserver đơn giản để xoay bánh xe robot dựa vào lênh keyboard được tạo cho xe điều khiển từ xa tiện lợi.

Lập trình robot

Cuối cùng đã đến lúc cài đặt TensorFlow. Có rất nhiều cách để cài đặt, nhưng TensorFlow đi cùng một makefile giúp bạn có thể phát triển nó ngay trên hệ thống. Các bước tiến hành sẽ mất vài giờ đồng hồ và phụ thuộc vào một số thứ khác.
TensorFlow đi cùng một prebuilt model gọi là “inception” có thể nhận diện vật thể. Xem thêm hướng dẫn tại đây.
Chạy tensorflow/contrib/pi_examples/label_image/gen/bin/label_image trên một hình ảnh từ camera sẽ cho ra 5 dự đoán. Mô hình làm việc khá tốt trên nhiều input, nhưng nó rõ ràng là thiếu một cảm giác về những vật nó nhìn thấy, và thiếu khá nhiều objects từ dữ liệu dùng để training. Ví dụ, nó có thể chắc chắn nhận diện được laptop của tôi ngay cả với những góc kỳ khác. Nhưng nếu tôi hướng nó về cái rổ những dây điện thì nó nhất quyết là đang nhìn thấy một máy nướng bánh bì. Nếu camera bị block, hình ảnh cho ra bị tối hoặc mờ thì nó thường sẽ cho rằng đây là loài giun tròn – đúng là thứ mà dữ liệu đã được train.
Hình 6: Robot gắn vào keyboard và monitor
Cuối cùng, tôi kết nối output đến Flite open source software package thực hiện text to speech, vì vậy robot có thể cho mọi người biết nó đang nhìn thấy gì (xem hình 6).

Kiểm thử robot

Đây là 2 con robot “nhà làm” chạy deep learning để nhận diện vật thể do tôi sáng chế.

 Kết luận

Từ năm 2003 đến 2005, tôi làm việc tại Stanford Robotics lab, nơi mà những con robot có giá lên tới hàng trăm ngàn đô la nhưng khả năng nhận diện vật thể lại không bằng robot của tôi. Tôi sẽ gắn phần mềm này vào chiếc drone của mình và sẽ không bao giờ sợ mất chìa khóa nữa.
(oreilly.com)

Share on Google Plus

About Hà Tuấn Anh

0 nhận xét:

Đăng nhận xét