Mục lục:
- Bước 1: Giải thích kiến trúc mô hình phát hiện đối tượng
- Bước 2: Chuẩn bị Môi trường
- Bước 3: Đào tạo một mô hình phát hiện đối tượng với Keras
- Bước 4: Chuyển đổi nó sang định dạng.kmodel
- Bước 5: Chạy trên Micropython Firmware
- Bước 6: Tóm tắt
Video: Phát hiện đối tượng với bảng Sipeed MaiX (Kendryte K210): 6 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:30
Tiếp nối bài viết trước của tôi về nhận dạng hình ảnh với Sipeed MaiX Boards, tôi quyết định viết một hướng dẫn khác, tập trung vào phát hiện đối tượng. Có một số phần cứng thú vị xuất hiện gần đây với chip Kendryte K210, bao gồm Seeed AI Hat cho Edge Computing, M5StickV của M5 stack và HuskyLens của DFRobot (mặc dù cái đó có phần sụn độc quyền và được nhắm mục tiêu nhiều hơn cho người mới bắt đầu). Vì giá thành rẻ, Kendryte K210 đã thu hút mọi người, mong muốn thêm tầm nhìn máy tính vào các dự án của họ. Nhưng như thường lệ với các sản phẩm phần cứng của Trung Quốc, sự hỗ trợ công nghệ vẫn thiếu và đây là điều mà tôi đang cố gắng cải thiện với các bài viết và video của mình. Nhưng hãy nhớ rằng tôi không thuộc nhóm nhà phát triển Kendryte hoặc Sipeed và không thể trả lời tất cả các câu hỏi liên quan đến sản phẩm của họ.
Với ý nghĩ đó, hãy bắt đầu! Chúng ta sẽ bắt đầu với tổng quan ngắn (và đơn giản hóa) về cách hoạt động của các mô hình CNN nhận dạng đối tượng.
CẬP NHẬT THÁNG 5/2020: Thấy bài viết và video của tôi về Phát hiện đối tượng bằng bảng K210 vẫn rất phổ biến và nằm trong số các kết quả hàng đầu trên YouTube và Google, tôi quyết định cập nhật bài viết để bao gồm thông tin về aXeleRate, khung dựa trên Keras cho AI trên Cạnh tôi phát triển. aXeleRate, về cơ bản, dựa trên bộ sưu tập các tập lệnh mà tôi đã sử dụng để đào tạo các mô hình nhận dạng hình ảnh / phát hiện đối tượng - được kết hợp thành một khuôn khổ duy nhất và được tối ưu hóa cho quy trình làm việc trên Google Colab. Nó thuận tiện hơn để sử dụng và cập nhật nhiều hơn.
Đối với phiên bản cũ của bài viết, bạn vẫn có thể xem trên steemit.com.
Bước 1: Giải thích kiến trúc mô hình phát hiện đối tượng
Các mô hình nhận dạng hình ảnh (hoặc phân loại hình ảnh) lấy toàn bộ hình ảnh làm đầu vào và xuất ra danh sách các xác suất cho mỗi lớp mà chúng tôi đang cố gắng nhận ra. Nó rất hữu ích nếu đối tượng mà chúng ta quan tâm chiếm một phần lớn của hình ảnh và chúng ta không quan tâm nhiều đến vị trí của nó. Nhưng điều gì sẽ xảy ra nếu dự án của chúng tôi (ví dụ, camera theo dõi khuôn mặt) yêu cầu chúng tôi không chỉ có kiến thức về loại đối tượng trong ảnh mà còn cả tọa độ của nó. Và dự án yêu cầu phát hiện nhiều đối tượng (ví dụ như đếm) thì sao?
Đây là lúc các Mô hình Phát hiện Đối tượng có ích. Trong bài viết này, chúng tôi sẽ sử dụng kiến trúc YOLO (bạn chỉ nhìn một lần) và tập trung giải thích về cơ chế bên trong của kiến trúc cụ thể này.
Chúng tôi đang cố gắng xác định những đối tượng nào hiện diện trong hình và tọa độ của chúng là gì. Vì máy học không phải là phép thuật và không phải là "máy tư duy", mà chỉ là một thuật toán sử dụng số liệu thống kê để tối ưu hóa chức năng (mạng thần kinh) nhằm giải quyết tốt hơn một vấn đề cụ thể. Chúng tôi cần diễn giải vấn đề này để làm cho nó "tối ưu hóa" hơn. Một cách tiếp cận ngây thơ ở đây là có thuật toán giảm thiểu sự mất mát (chênh lệch) giữa dự đoán của nó và tọa độ chính xác của đối tượng. Điều đó sẽ hoạt động khá tốt, miễn là chúng ta chỉ có một đối tượng trong ảnh. Đối với nhiều đối tượng, chúng tôi thực hiện một cách tiếp cận khác - chúng tôi thêm lưới và làm cho mạng của chúng tôi dự đoán sự hiện diện (hoặc vắng mặt) của (các) đối tượng trong mỗi lưới. Nghe có vẻ tuyệt vời, nhưng vẫn để lại quá nhiều sự không chắc chắn cho mạng - làm thế nào để xuất dự đoán và phải làm gì khi có nhiều đối tượng có tâm bên trong một ô lưới? Chúng ta cần thêm một ràng buộc nữa - được gọi là neo. Neo là kích thước ban đầu (chiều rộng, chiều cao) một số trong số đó (gần nhất với kích thước đối tượng) sẽ được thay đổi kích thước thành kích thước đối tượng - sử dụng một số đầu ra từ mạng nơ-ron (bản đồ tính năng cuối cùng).
Vì vậy, đây là chế độ xem cấp cao nhất về những gì đang xảy ra khi mạng nơ-ron kiến trúc YOLO thực hiện phát hiện đối tượng trên hình ảnh. Theo các tính năng được phát hiện bởi mạng trình trích xuất tính năng, đối với mỗi ô lưới, một tập hợp các dự đoán được thực hiện, bao gồm độ lệch neo, xác suất neo và lớp neo. Sau đó, chúng tôi loại bỏ các dự đoán với xác suất thấp và thì đấy!
Bước 2: Chuẩn bị Môi trường
aXeleRate dựa trên dự án tuyệt vời của penny4860, máy dò chữ số SVHN yolo-v2. aXeleRate đưa việc triển khai trình dò tìm YOLO trong Keras này lên một cấp độ tiếp theo và sử dụng hệ thống cấu hình thuận tiện của nó để thực hiện đào tạo và chuyển đổi các mạng nhận dạng hình ảnh / phát hiện đối tượng và phân đoạn hình ảnh với nhiều phần phụ trợ khác nhau.
Có hai cách để sử dụng aXeleRate: chạy cục bộ trên máy Ubuntu hoặc trong Google Colab. Để chạy trong Google Colab, hãy xem ví dụ sau:
Sổ tay Colab phát hiện đối tượng PASCAL-VOC
Việc đào tạo cục bộ mô hình của bạn và xuất nó để sử dụng với tăng tốc phần cứng cũng dễ dàng hơn nhiều.
Tải xuống trình cài đặt tại đây.
Sau khi cài đặt xong, hãy tạo một môi trường mới:
conda create -n yolo python = 3,7
Hãy kích hoạt môi trường mới
conda kích hoạt yolo
Một tiền tố trước trình bao bash của bạn sẽ xuất hiện với tên của môi trường, cho biết rằng bạn hiện đang làm việc trong môi trường đó.
Cài đặt aXeleRate trên máy cục bộ của bạn với
pip cài đặt git +
Và sau đó chạy điều này để tải xuống các tập lệnh mà bạn sẽ cần để đào tạo và suy luận:
git clone
Bạn có thể chạy các bài kiểm tra nhanh với tests_training.py trong thư mục aXeleRate. Nó sẽ chạy đào tạo và suy luận cho từng loại mô hình, lưu và chuyển đổi các mô hình được đào tạo. Vì nó chỉ được đào tạo trong 5 kỷ nguyên và tập dữ liệu rất nhỏ, bạn sẽ không thể có được các mô hình hữu ích, nhưng tập lệnh này chỉ có nghĩa là để kiểm tra xem không có lỗi.
Bước 3: Đào tạo một mô hình phát hiện đối tượng với Keras
Bây giờ chúng ta có thể chạy một tập lệnh đào tạo với tệp cấu hình. Vì việc triển khai trình dò đối tượng YOLO của Keras khá phức tạp, thay vì giải thích mọi đoạn mã liên quan, tôi sẽ giải thích cách định cấu hình đào tạo và cũng mô tả các mô-đun có liên quan, trong trường hợp bạn muốn tự mình thực hiện một số thay đổi đối với chúng.
Hãy bắt đầu với một ví dụ về đồ chơi và huấn luyện một máy dò racoon. Có một tệp cấu hình bên trong thư mục / config, raccoon_detector.json. Chúng tôi chọn MobileNet7_5 làm kiến trúc (trong đó 7_5 là tham số alpha của việc triển khai Mobilenet ban đầu, kiểm soát độ rộng của mạng) và 224x224 làm kích thước đầu vào. Hãy xem các thông số quan trọng nhất trong cấu hình:
Loại là giao diện người dùng của mô hình - Bộ phân loại, Bộ phát hiện hoặc SegnetArchitecture là phần phụ trợ của mô hình (trình trích xuất tính năng)
- Full Yolo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
Để biết thêm thông tin về neo, vui lòng đọc tại đây
Nhãn là các nhãn có trong tập dữ liệu của bạn. QUAN TRỌNG: Vui lòng liệt kê tất cả các nhãn có trong tập dữ liệu.
object_scale xác định mức phạt bao nhiêu để phạt dự đoán sai về độ tin cậy của các trình dự đoán đối tượng
no_object_scale xác định mức phạt bao nhiêu để phạt dự đoán sai về độ tin cậy của những người dự đoán không phải đối tượng
coord_scale xác định mức phạt bao nhiêu để xử phạt các dự đoán sai vị trí và kích thước (x, y, w, h)
class_scale xác định mức độ phạt khi dự đoán sai lớp
augumentation - tăng cường hình ảnh, thay đổi kích thước, dịch chuyển và làm mờ hình ảnh để tránh trang bị quá mức và có nhiều sự đa dạng hơn trong tập dữ liệu.
train_times, validation_times - số lần lặp lại tập dữ liệu. Hữu ích nếu bạn có tăng cường
được kích hoạt
first_trainable_layer - cho phép bạn cố định các lớp nhất định nếu bạn đang sử dụng mạng tính năng được đào tạo trước
Bây giờ chúng ta cần tải xuống tập dữ liệu mà tôi đã chia sẻ trên Google Drive của mình (tập dữ liệu gốc), là tập dữ liệu phát hiện racoon, chứa 150 hình ảnh được chú thích.
Đảm bảo thay đổi các dòng trong tệp cấu hình (train_image_folder, train_annot_folder) cho phù hợp và sau đó bắt đầu đào tạo bằng lệnh sau:
python axelerate / train.py -c configs / raccoon_detector.json
train.py đọc cấu hình từ tệp.json và huấn luyện mô hình bằng tập lệnh axelerate / network / yolo / yolo_frontend.py. yolo / backend / loss.py là nơi chức năng mất mát tùy chỉnh được triển khai và yolo / backend / network.py là nơi mô hình được tạo (đầu vào, trình trích xuất tính năng và các lớp phát hiện được ghép lại với nhau). axelerate / mạng / common_utils / fit.py là tập lệnh triển khai quy trình đào tạo và axelerate / mạng / common_utils / feature.py chứa các trình trích xuất tính năng. Nếu bạn định sử dụng mô hình được đào tạo với chip K210 và phần sụn Micropython, do giới hạn bộ nhớ, bạn có thể chọn giữa MobileNet (2_5, 5_0 và 7_5) và TinyYolo, nhưng tôi thấy MobileNet cho độ chính xác phát hiện tốt hơn.
Vì nó là một ví dụ đồ chơi và chỉ chứa 150 hình ảnh về gấu trúc, nên quá trình đào tạo sẽ diễn ra khá nhanh, ngay cả khi không có GPU, mặc dù độ chính xác sẽ kém xa. Đối với dự án liên quan đến công việc, tôi đã đào tạo một máy dò biển báo giao thông và một máy dò số, cả hai bộ dữ liệu đều bao gồm hơn một vài nghìn ví dụ đào tạo.
Bước 4: Chuyển đổi nó sang định dạng.kmodel
Với aXeleRate, việc chuyển đổi mô hình được thực hiện tự động - đây có lẽ là điểm khác biệt lớn nhất so với phiên bản cũ của các tập lệnh đào tạo! Thêm vào đó, bạn nhận được các tệp mô hình và biểu đồ đào tạo được lưu gọn gàng trong thư mục dự án. Ngoài ra, tôi cũng thấy rằng độ chính xác của vaiidation đôi khi không đưa ra được ước tính về hiệu suất thực của mô hình để phát hiện đối tượng và đây là lý do tại sao tôi thêm mAP làm số liệu xác thực cho các mô hình phát hiện đối tượng. Bạn có thể đọc thêm về mAP tại đây.
Nếu mAP, độ chính xác trung bình trung bình (chỉ số xác thực của chúng tôi) không cải thiện trong 20 kỷ, thì quá trình đào tạo sẽ ngừng sớm. Mỗi khi mAP được cải thiện, mô hình sẽ được lưu trong thư mục dự án. Sau khi quá trình đào tạo kết thúc, aXeleRate tự động chuyển đổi mô hình tốt nhất sang các định dạng được chỉ định - bạn có thể chọn, "tflite", "k210" hoặc "edgetpu" kể từ bây giờ.
Bây giờ đến bước cuối cùng, thực sự chạy mô hình của chúng tôi trên phần cứng Sipeed!
Bước 5: Chạy trên Micropython Firmware
Có thể chạy suy luận với mô hình phát hiện đối tượng của chúng tôi với mã C, nhưng để thuận tiện, chúng tôi sẽ sử dụng phần mềm Micropython và MaixPy IDE để thay thế.
Tải xuống MaixPy IDE từ đây và vi chương trình cơ sở từ đây. Bạn có thể sử dụng tập lệnh python kflash.py để ghi chương trình cơ sở hoặc tải xuống công cụ flash GUI riêng biệt tại đây.
Sao chép model.kmodel vào thư mục gốc của thẻ SD và lắp thẻ SD vào Sipeed Maix Bit (hoặc thiết bị K210 khác). Ngoài ra, bạn có thể ghi.kmodel vào bộ nhớ flash của thiết bị. Tập lệnh ví dụ của tôi đọc.kmodel từ bộ nhớ flash. Nếu bạn đang sử dụng thẻ SD, vui lòng thay đổi dòng này
task = kpu.load (0x200000)
đến
task = kpu.load ("/ sd / model.kmodel")
Mở MaixPy IDE và nhấn nút kết nối. Mở tập lệnh raccoon_detector.py từ thư mục example_scripts / k210 / detector và nhấn nút Bắt đầu. Bạn sẽ thấy một luồng trực tiếp từ máy ảnh với các hộp bao quanh … chà, gấu trúc. Bạn có thể tăng độ chính xác của mô hình bằng cách cung cấp thêm các ví dụ đào tạo, nhưng hãy nhớ rằng đó là mô hình nhỏ cổ tích (1,9 M) và nó sẽ gặp khó khăn khi phát hiện các vật thể nhỏ (do độ phân giải thấp).
Một trong những câu hỏi tôi nhận được trong nhận xét cho bài viết trước của tôi về nhận dạng hình ảnh là làm thế nào để gửi kết quả phát hiện qua UART / I2C đến thiết bị khác được kết nối với bảng phát triển Sipeed. Trong kho lưu trữ github của tôi, bạn sẽ có thể tìm thấy một tập lệnh mẫu khác, raccoon_detector_uart.py, (bạn đoán nó) phát hiện gấu trúc và gửi tọa độ của các hộp giới hạn qua UART. Hãy nhớ rằng các chân được sử dụng cho giao tiếp UART là khác nhau của các bo mạch khác nhau, đây là điều bạn cần tự kiểm tra trong tài liệu.
Bước 6: Tóm tắt
Kendryte K210 là một con chip vững chắc cho thị giác máy tính, linh hoạt, mặc dù có bộ nhớ hạn chế. Cho đến nay, trong các hướng dẫn của tôi, chúng tôi đã đề cập đến việc sử dụng nó để nhận dạng các đối tượng tùy chỉnh, phát hiện các đối tượng tùy chỉnh và chạy một số tác vụ thị giác máy tính dựa trên OpenMV. Tôi biết thực tế là nó cũng thích hợp để nhận dạng khuôn mặt và với một số mày mò, nó sẽ có thể thực hiện phát hiện tư thế và phân đoạn hình ảnh (bạn có thể sử dụng aXeleRate để đào tạo mô hình phân đoạn ngữ nghĩa, nhưng tôi chưa triển khai suy luận với K210). Vui lòng xem xét các vấn đề về kho lưu trữ aXeleRate và thực hiện PR nếu bạn nghĩ rằng có một số cải tiến mà bạn có thể đóng góp!
Dưới đây là một số bài viết tôi đã sử dụng để viết hướng dẫn này, hãy xem nếu bạn muốn tìm hiểu thêm về phát hiện đối tượng với mạng thần kinh:
Bộ phát hiện đối tượng hộp có giới hạn: hiểu YOLO, Bạn Chỉ Nhìn Một lần
Hiểu YOLO (thêm toán học)
Hướng dẫn nhẹ nhàng về cách Bản địa hóa đối tượng YOLO hoạt động với Keras (Phần 2)
Phát hiện đối tượng trong thời gian thực với YOLO, YOLOv2 và bây giờ là YOLOv3
Hy vọng bạn có thể sử dụng kiến thức bạn có bây giờ để xây dựng một số dự án tuyệt vời với thị giác máy! Bạn có thể mua bảng Sipeed ở đây, chúng là một trong những lựa chọn rẻ nhất có sẵn cho ML trên hệ thống nhúng.
Thêm tôi trên LinkedIn nếu bạn có bất kỳ câu hỏi nào và đăng ký kênh YouTube của tôi để nhận thông báo về các dự án thú vị hơn liên quan đến học máy và người máy.
Đề xuất:
Phát hiện đối tượng Raspberry Pi: 7 bước
Phát hiện đối tượng trên Raspberry Pi: Hướng dẫn này cung cấp hướng dẫn từng bước về cách thiết lập API phát hiện đối tượng của TensorFlow trên Raspberry Pi. Bằng cách làm theo các bước trong hướng dẫn này, bạn sẽ có thể sử dụng Raspberry Pi của mình để thực hiện phát hiện đối tượng trên video trực tiếp từ P
Theo dõi đối tượng dựa trên phát hiện màu: 10 bước
Theo dõi đối tượng dựa trên phát hiện màu: Câu chuyện Tôi thực hiện dự án này để tìm hiểu cách xử lý hình ảnh bằng Raspberry PI và mở CV. Để làm cho dự án này thú vị hơn, tôi đã sử dụng hai động cơ Servo SG90 và gắn camera trên đó. Một động cơ được sử dụng để di chuyển theo chiều ngang và động cơ thứ hai được sử dụng để di chuyển theo chiều dọc
PHÁT HIỆN ĐỐI TƯỢNG RASPBERRY PI Pi VỚI NHIỀU MÁY ẢNH: 3 bước
RASPBERRY PI Pi PHÁT HIỆN ĐỐI TƯỢNG VỚI NHIỀU MÁY ẢNH: Tôi sẽ giữ phần giới thiệu ngắn gọn, vì chính tiêu đề đã gợi ý mục đích chính của phần hướng dẫn là gì. Trong hướng dẫn từng bước này, tôi sẽ giải thích cho bạn cách kết nối nhiều máy ảnh như cam 1-pi và ít nhất một máy ảnh USB hoặc 2 máy ảnh USB.
Phát hiện đối tượng W / Dragonboard 410c hoặc 820c Sử dụng OpenCV và Tensorflow.: 4 bước
Phát hiện đối tượng W / Dragonboard 410c hoặc 820c Sử dụng OpenCV và Tensorflow: Hướng dẫn này mô tả cách cài đặt OpenCV, Tensorflow và các khung học máy cho Python 3.5 để chạy ứng dụng Phát hiện Đối tượng
Phát hiện đối tượng trực quan bằng máy ảnh (TfCD): 15 bước (với hình ảnh)
Phát hiện đối tượng trực quan bằng máy ảnh (TfCD): Dịch vụ nhận thức có thể nhận dạng cảm xúc, khuôn mặt của người hoặc các vật thể đơn giản hiện vẫn đang ở giai đoạn phát triển ban đầu, nhưng với máy học, công nghệ này đang ngày càng phát triển. Chúng ta có thể mong đợi thấy nhiều điều kỳ diệu này hơn trong