Mục lục:

Phát hiện đối tượng với bảng Sipeed MaiX (Kendryte K210): 6 bước
Phát hiện đối tượng với bảng Sipeed MaiX (Kendryte K210): 6 bước

Video: Phát hiện đối tượng với bảng Sipeed MaiX (Kendryte K210): 6 bước

Video: Phát hiện đối tượng với bảng Sipeed MaiX (Kendryte K210): 6 bước
Video: Object Detection With Sipeed MaiX Boards(Kendryte K210) 2024, Tháng mười một
Anonim
Image
Image

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

Giải thích kiến trúc mô hình phát hiện đối tượng
Giải thích kiến trúc mô hình phát hiện đối tượng
Giải thích kiến trúc mô hình phát hiện đối tượng
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

Chuẩn bị môi trường
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

Đào tạo một mô hình phát hiện đối tượng với Keras
Đà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

Chuyển đổi nó sang định dạng.kmodel
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

Chạy trên chương trình cơ sở Micropython
Chạy trên chương trình cơ sở Micropython

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: