สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
เนื่องจากเป็นความต่อเนื่องของบทความก่อนหน้าของฉันเกี่ยวกับการจดจำรูปภาพด้วย Sipeed MaiX Boards ฉันจึงตัดสินใจเขียนบทช่วยสอนอื่นโดยเน้นที่การตรวจจับวัตถุ มีฮาร์ดแวร์ที่น่าสนใจปรากฏขึ้นเมื่อเร็ว ๆ นี้ด้วยชิป Kendryte K210 รวมถึง Seeed AI Hat สำหรับ Edge Computing, M5StickV ของ M5 stack และ HuskyLens ของ DFRobot (แม้ว่าจะมีเฟิร์มแวร์ที่เป็นกรรมสิทธิ์และมีเป้าหมายมากกว่าสำหรับผู้เริ่มต้นทั้งหมด) เนื่องจากราคาถูก Kendryte K210 จึงดึงดูดผู้คนที่ต้องการเพิ่มการมองเห็นด้วยคอมพิวเตอร์ในโครงการของพวกเขา แต่ตามปกติสำหรับผลิตภัณฑ์ฮาร์ดแวร์ของจีน การสนับสนุนด้านเทคนิคยังขาดหายไป และนี่คือสิ่งที่ฉันพยายามปรับปรุงกับบทความและวิดีโอของฉัน แต่อย่าลืมว่าฉันไม่ได้อยู่ในทีมนักพัฒนาของ Kendryte หรือ Sipeed และไม่สามารถตอบคำถามทั้งหมดที่เกี่ยวข้องกับผลิตภัณฑ์ของพวกเขาได้
โดยที่ในใจเรามาเริ่มกันเลย! เราจะเริ่มด้วยภาพรวมสั้นๆ (และแบบง่าย) เกี่ยวกับวิธีการทำงานของแบบจำลอง CNN ของการรู้จำวัตถุ
อัปเดตพฤษภาคม 2020: เมื่อเห็นว่าบทความและวิดีโอของฉันเกี่ยวกับ Object Detection ด้วยบอร์ด K210 ยังคงได้รับความนิยมอย่างมาก และท่ามกลางผลลัพธ์อันดับต้นๆ บน YouTube และ Google ฉันจึงตัดสินใจอัปเดตบทความเพื่อรวมข้อมูลเกี่ยวกับ aXeleRate ซึ่งเป็นเฟรมเวิร์กตาม Keras สำหรับ AI บน ขอบที่ฉันพัฒนา โดยพื้นฐานแล้ว aXeleRate อิงจากคอลเล็กชันของสคริปต์ที่ฉันใช้สำหรับฝึกโมเดลการจดจำภาพ/การตรวจจับวัตถุ - รวมกันเป็นเฟรมเวิร์กเดียวและปรับให้เหมาะสมสำหรับเวิร์กโฟลว์ใน Google Colab สะดวกในการใช้งานและเป็นปัจจุบันมากขึ้น
สำหรับบทความเวอร์ชันเก่า คุณยังสามารถดูได้ใน steemit.com
ขั้นตอนที่ 1: อธิบายสถาปัตยกรรมแบบจำลองการตรวจจับวัตถุ
โมเดลการรู้จำรูปภาพ (หรือการจัดหมวดหมู่รูปภาพ) ใช้รูปภาพทั้งหมดเป็นอินพุตและเอาต์พุตรายการความน่าจะเป็นสำหรับแต่ละคลาสที่เราพยายามจดจำ มีประโยชน์มากหากวัตถุที่เราสนใจครอบครองพื้นที่ส่วนใหญ่ของภาพ และเราไม่สนใจตำแหน่งของวัตถุมากนัก แต่ถ้าโครงการของเรา (เช่น กล้องติดตามใบหน้า) ต้องการให้เรามีความรู้เกี่ยวกับประเภทของวัตถุในภาพเท่านั้น แต่ยังรวมถึงพิกัดด้วย แล้วโปรเจ็กต์ที่ต้องการการตรวจจับวัตถุหลายชิ้น (เช่น การนับ) ล่ะ?
นี่คือเวลาที่โมเดลการตรวจจับวัตถุมีประโยชน์ ในบทความนี้ เราจะใช้สถาปัตยกรรม YOLO (คุณดูเพียงครั้งเดียว) และเน้นคำอธิบายเกี่ยวกับกลไกภายในของสถาปัตยกรรมเฉพาะนี้
เรากำลังพยายามกำหนดว่าวัตถุใดอยู่ในภาพและพิกัดของวัตถุนั้นคืออะไร เนื่องจากแมชชีนเลิร์นนิงไม่ใช่เวทมนตร์และไม่ใช่ "เครื่องคิด" แต่เป็นเพียงอัลกอริทึมที่ใช้สถิติเพื่อเพิ่มประสิทธิภาพฟังก์ชัน (โครงข่ายประสาทเทียม) เพื่อแก้ปัญหาเฉพาะได้ดียิ่งขึ้น เราจำเป็นต้องถอดความปัญหานี้เพื่อให้ "เหมาะสม" มากขึ้น แนวทางที่ไร้เดียงสาในที่นี้คือการใช้อัลกอริธึมเพื่อลดการสูญเสีย (ความแตกต่าง) ระหว่างการทำนายและพิกัดที่ถูกต้องของวัตถุ วิธีนี้ใช้ได้ดีทีเดียว ตราบใดที่เรามีวัตถุเพียงชิ้นเดียวในภาพ สำหรับหลายออบเจ็กต์ เราใช้แนวทางที่แตกต่างกัน - เราเพิ่มกริดและทำให้เครือข่ายของเราคาดการณ์การมีอยู่ (หรือไม่มี) ของออบเจกต์ในแต่ละกริด ฟังดูดีมาก แต่ก็ยังทิ้งความไม่แน่นอนไว้มากเกินไปสำหรับเครือข่าย - จะส่งออกการทำนายได้อย่างไรและจะทำอย่างไรเมื่อมีวัตถุหลายชิ้นที่มีจุดศูนย์กลางภายในเซลล์กริดเดียว เราจำเป็นต้องเพิ่มข้อจำกัดอีกหนึ่งข้อ - ที่เรียกว่าจุดยึด จุดยึดคือขนาดเริ่มต้น (ความกว้าง ความสูง) ซึ่งบางส่วน (ใกล้กับขนาดวัตถุที่สุด) จะถูกปรับขนาดให้เป็นขนาดวัตถุ โดยใช้ผลลัพธ์บางส่วนจากโครงข่ายประสาทเทียม (แผนที่คุณลักษณะขั้นสุดท้าย)
นี่คือมุมมองระดับบนสุดเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อโครงข่ายประสาทเทียมของสถาปัตยกรรม YOLO ทำการตรวจจับวัตถุบนภาพ ตามคุณลักษณะที่ตรวจพบโดยเครือข่ายตัวแยกคุณลักษณะ สำหรับแต่ละเซลล์กริด จะมีการสร้างชุดการคาดคะเน ซึ่งรวมถึงออฟเซ็ตจุดยึด ความน่าจะเป็นของจุดยึด และระดับของจุดยึด จากนั้นเราละทิ้งการคาดคะเนที่มีความน่าจะเป็นต่ำและ voila!
ขั้นตอนที่ 2: เตรียมสิ่งแวดล้อม
aXeleRate ขึ้นอยู่กับโครงการที่ยอดเยี่ยมโดย penny4860, SVHN yolo-v2 ตัวตรวจจับหลัก aXeleRate นำการใช้งานเครื่องตรวจจับ YOLO ใน Keras ไปสู่อีกระดับ และใช้ระบบการกำหนดค่าที่สะดวกเพื่อดำเนินการฝึกอบรมและแปลงการจดจำภาพ/การตรวจจับวัตถุและเครือข่ายการแบ่งส่วนภาพด้วยแบ็กเอนด์ต่างๆ
To เป็นสองวิธีในการใช้ aXeleRate: ทำงานบนเครื่อง Ubuntu หรือใน Google Colab สำหรับการทำงานใน Google Colab ให้ดูตัวอย่างนี้:
สมุดบันทึก Colab การตรวจจับวัตถุ PASCAL-VOC
การฝึกโมเดลของคุณภายในเครื่องและการส่งออกเพื่อใช้กับการเร่งความเร็วด้วยฮาร์ดแวร์ก็ง่ายขึ้นเช่นกันในตอนนี้ เราขอแนะนำให้คุณติดตั้งการพึ่งพาที่จำเป็นทั้งหมดในสภาพแวดล้อมของ Anaconda เพื่อแยกโปรเจ็กต์ของคุณออกจากผู้อื่นและหลีกเลี่ยงความขัดแย้ง
ดาวน์โหลดตัวติดตั้งได้ที่นี่
หลังจากการติดตั้งเสร็จสมบูรณ์ ให้สร้างสภาพแวดล้อมใหม่:
conda create -n yolo python=3.7
มาเปิดใช้งานสภาพแวดล้อมใหม่กันเถอะ
conda เปิดใช้งาน yolo
คำนำหน้าก่อน bash shell ของคุณจะปรากฏขึ้นพร้อมกับชื่อของสภาพแวดล้อม ซึ่งบ่งชี้ว่าขณะนี้คุณทำงานอยู่ในสภาพแวดล้อมนั้น
ติดตั้ง aXeleRate บนเครื่องท้องถิ่นของคุณด้วย
pip ติดตั้ง git+https://github.com/AIWintermuteAI/aXeleRate
จากนั้นรันสิ่งนี้เพื่อดาวน์โหลดสคริปต์ที่คุณต้องการสำหรับการฝึกอบรมและการอนุมาน:
โคลน git
คุณสามารถเรียกใช้การทดสอบอย่างรวดเร็วด้วย tests_training.py ในโฟลเดอร์ aXeleRate จะทำการฝึกและการอนุมานสำหรับโมเดลแต่ละประเภท บันทึกและแปลงโมเดลที่ได้รับการฝึก เนื่องจากเป็นเพียงการฝึกอบรมสำหรับ 5 ยุคและชุดข้อมูลมีขนาดเล็กมาก คุณจะไม่สามารถรับโมเดลที่มีประโยชน์ได้ แต่สคริปต์นี้มีไว้สำหรับการตรวจสอบว่าไม่มีข้อผิดพลาดเท่านั้น
ขั้นตอนที่ 3: ฝึกโมเดลการตรวจจับวัตถุด้วย Keras
ตอนนี้เราสามารถเรียกใช้สคริปต์การฝึกอบรมด้วยไฟล์การกำหนดค่าได้ เนื่องจากการใช้ Keras ของเครื่องตรวจจับวัตถุ YOLO นั้นค่อนข้างซับซ้อน แทนที่จะอธิบายโค้ดที่เกี่ยวข้องทุกส่วน ฉันจะอธิบายวิธีกำหนดค่าการฝึกอบรมและอธิบายโมดูลที่เกี่ยวข้องด้วย ในกรณีที่คุณต้องการทำการเปลี่ยนแปลงบางอย่างด้วยตนเอง
เริ่มจากตัวอย่างของเล่นและฝึกเครื่องตรวจจับแรคคูน มีไฟล์ปรับแต่งในโฟลเดอร์ /config raccoon_detector.json เราเลือก MobileNet7_5 เป็นสถาปัตยกรรม (โดยที่ 7_5 เป็นพารามิเตอร์อัลฟ่าของการใช้งาน Mobilenet ดั้งเดิม ควบคุมความกว้างของเครือข่าย) และ 224x224 เป็นขนาดอินพุต มาดูพารามิเตอร์ที่สำคัญที่สุดในการกำหนดค่ากันดีกว่า:
ประเภทคือส่วนหน้าของรุ่น - Classifier, Detector หรือ SegnetArchitecture เป็นรุ่นแบ็กเอนด์ (ตัวแยกคุณลักษณะ)
- Yolo แบบเต็ม - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับจุดยึด โปรดอ่านที่นี่
ป้ายกำกับคือป้ายกำกับในชุดข้อมูลของคุณ สำคัญ: โปรดระบุป้ายกำกับทั้งหมดที่อยู่ในชุดข้อมูล
object_scale กำหนดจำนวนเงินที่จะลงโทษการทำนายที่ผิดพลาดของความมั่นใจของผู้ทำนายวัตถุ
no_object_scale กำหนดจำนวนเงินที่จะลงโทษการทำนายที่ผิดพลาดของความเชื่อมั่นของผู้ทำนายที่ไม่ใช่วัตถุ
coord_scale กำหนดจำนวนเงินที่จะลงโทษการทำนายตำแหน่งและขนาดที่ไม่ถูกต้อง (x, y, w, h)
class_scale กำหนดจำนวนเงินที่จะลงโทษการทำนายคลาสที่ไม่ถูกต้อง
การเสริม - การเสริมภาพ การปรับขนาด การขยับและการเบลอของภาพ เพื่อป้องกันการจัดวางมากเกินไปและมีความหลากหลายมากขึ้นในชุดข้อมูล
train_times, validation_times - ทำซ้ำชุดข้อมูลกี่ครั้ง มีประโยชน์ถ้าคุณมีการเสริม
เปิดใช้งาน
first_trainable_layer - ให้คุณหยุดเลเยอร์บางเลเยอร์ได้ หากคุณใช้เครือข่ายฟีเจอร์ที่ได้รับการฝึกมาล่วงหน้า
ตอนนี้ เราต้องดาวน์โหลดชุดข้อมูล ซึ่งฉันแชร์บน Google ไดรฟ์ (ชุดข้อมูลดั้งเดิม) ซึ่งเป็นชุดข้อมูลการตรวจจับแรคคูนซึ่งมีรูปภาพที่มีคำอธิบายประกอบ 150 รูป
ตรวจสอบให้แน่ใจว่าได้เปลี่ยนบรรทัดในไฟล์การกำหนดค่า (train_image_folder, train_annot_folder) ตามลำดับ จากนั้นเริ่มการฝึกด้วยคำสั่งต่อไปนี้:
หลาม axelerate/train.py -c configs/raccoon_detector.json
train.py อ่านการกำหนดค่าจากไฟล์.json และฝึกโมเดลด้วยสคริปต์ axelerate/networks/yolo/yolo_frontend.py yolo/backend/loss.py คือที่ที่ฟังก์ชันการสูญเสียที่กำหนดเองถูกใช้งาน และ yolo/backend/network.py เป็นที่ที่โมเดลถูกสร้างขึ้น (อินพุต ตัวแยกคุณลักษณะ และเลเยอร์การตรวจจับรวมกัน) axelerate/networks/common_utils/fit.py เป็นสคริปต์ที่ใช้กระบวนการฝึกอบรมและ axelerate/networks/common_utils/feature.py มีตัวแยกคุณลักษณะ หากคุณต้องการใช้โมเดลที่ผ่านการฝึกอบรมกับชิป K210 และเฟิร์มแวร์ Micropython เนื่องจากข้อจำกัดด้านหน่วยความจำ คุณสามารถเลือกระหว่าง MobileNet(2_5, 5_0 และ 7_5) กับ TinyYolo แต่ฉันพบว่า MobileNet ให้ความแม่นยำในการตรวจจับที่ดีกว่า
เนื่องจากเป็นตัวอย่างของเล่นและมีแรคคูนเพียง 150 รูป กระบวนการฝึกจึงค่อนข้างเร็ว แม้ไม่มี GPU แม้ว่าความแม่นยำจะห่างไกลจากตัวเอกก็ตาม สำหรับโครงการที่เกี่ยวข้องกับงาน ฉันได้ฝึกเครื่องตรวจจับป้ายจราจรและตัวตรวจจับตัวเลข ชุดข้อมูลทั้งสองรวมตัวอย่างการฝึกอบรมกว่าสองสามพันตัวอย่าง
ขั้นตอนที่ 4: แปลงเป็น.kmodel Format
ด้วย aXeleRate การแปลงโมเดลจะดำเนินการโดยอัตโนมัติ - นี่อาจเป็นข้อแตกต่างที่ใหญ่ที่สุดจากสคริปต์การฝึกอบรมเวอร์ชันเก่า! นอกจากนี้ คุณยังได้รับไฟล์โมเดลและกราฟการฝึกอบรมที่บันทึกไว้อย่างเรียบร้อยในโฟลเดอร์โปรเจ็กต์ นอกจากนี้ ฉันยังพบว่าบางครั้งความแม่นยำของ vaiidation ล้มเหลวในการประมาณประสิทธิภาพจริงของโมเดลสำหรับการตรวจจับวัตถุ และนี่คือสาเหตุที่ฉันเพิ่ม mAP เป็นเมตริกการตรวจสอบความถูกต้องสำหรับโมเดลการตรวจจับวัตถุ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ mAP ได้ที่นี่
หาก mAP ความแม่นยำเฉลี่ย (ตัวชี้วัดการตรวจสอบของเรา) ไม่ดีขึ้นสำหรับ 20 ยุค การฝึกอบรมจะหยุดก่อนเวลาอันควร ทุกครั้งที่ mAP ดีขึ้น โมเดลจะถูกบันทึกไว้ในโฟลเดอร์โปรเจ็กต์ หลังจากการฝึกสิ้นสุดลง aXeleRate จะแปลงโมเดลที่ดีที่สุดเป็นรูปแบบที่ระบุโดยอัตโนมัติ - คุณสามารถเลือก "tflite", "k210" หรือ "edgepu" ได้ ณ ตอนนี้
มาถึงขั้นตอนสุดท้ายแล้ว รันโมเดลของเราบนฮาร์ดแวร์ Sipeed!
ขั้นตอนที่ 5: เรียกใช้บนเฟิร์มแวร์ Micropython
เป็นไปได้ที่จะเรียกใช้การอนุมานด้วยโมเดลการตรวจจับวัตถุของเราด้วยรหัส C แต่เพื่อความสะดวก เราจะใช้เฟิร์มแวร์ Micropython และ MaixPy IDE แทน
ดาวน์โหลด MaixPy IDE จากที่นี่ และเฟิร์มแวร์ micropython จากที่นี่ คุณสามารถใช้สคริปต์หลาม kflash.py เพื่อเบิร์นเฟิร์มแวร์หรือดาวน์โหลดเครื่องมือแฟลช GUI แยกต่างหากได้ที่นี่
คัดลอก model.kmodel ไปยังรูทของการ์ด SD และใส่การ์ด SD ลงใน Sipeed Maix Bit (หรืออุปกรณ์ K210 อื่นๆ) หรือคุณสามารถเบิร์น.kmodel ลงในหน่วยความจำแฟลชของอุปกรณ์ สคริปต์ตัวอย่างของฉันอ่าน.kmodel จากหน่วยความจำแฟลช หากคุณกำลังใช้การ์ด SD โปรดเปลี่ยนบรรทัดนี้
งาน = kpu.load(0x20000)
ถึง
งาน = kpu.load("/sd/model.kmodel")
เปิด MaixPy IDE แล้วกดปุ่มเชื่อมต่อ เปิดสคริปต์ raccoon_detector.py จากโฟลเดอร์ example_scripts/k210/detector แล้วกดปุ่ม Start คุณควรจะเห็นสตรีมแบบสดจากกล้องที่มีกล่องล้อมรอบ … เอาล่ะ แรคคูน คุณสามารถเพิ่มความแม่นยำของแบบจำลองได้โดยการให้ตัวอย่างการฝึกเพิ่มเติม แต่พึงระลึกไว้เสมอว่านี่คือโมเดลแฟรี่ขนาดเล็ก (1.9 M) และจะมีปัญหาในการตรวจจับวัตถุขนาดเล็ก (เนื่องจากความละเอียดต่ำ)
หนึ่งในคำถามที่ฉันได้รับในความคิดเห็นในบทความก่อนหน้าของฉันเกี่ยวกับการจดจำภาพคือวิธีการส่งผลการตรวจจับผ่าน UART/I2C ไปยังอุปกรณ์อื่นๆ ที่เชื่อมต่อกับบอร์ดพัฒนา Sipeed ในที่เก็บ github ของฉัน คุณจะสามารถค้นหาตัวอย่างสคริปต์อื่น raccoon_detector_uart.py ซึ่ง (คุณเดาได้) ตรวจพบแรคคูนและส่งพิกัดของกล่องล้อมรอบผ่าน UART โปรดทราบว่าพินที่ใช้สำหรับการสื่อสาร UART นั้นแตกต่างจากบอร์ดต่างๆ นี่คือสิ่งที่คุณต้องตรวจสอบตัวเองในเอกสารประกอบ
ขั้นตอนที่ 6: สรุป
Kendryte K210 เป็นชิปที่มั่นคงสำหรับการมองเห็นด้วยคอมพิวเตอร์ มีความยืดหยุ่น แม้ว่าจะมีหน่วยความจำจำกัด จนถึงตอนนี้ ในบทช่วยสอนของฉัน เราได้กล่าวถึงการใช้มันเพื่อจดจำวัตถุที่กำหนดเอง ตรวจจับวัตถุที่กำหนดเอง และเรียกใช้งานการมองเห็นคอมพิวเตอร์ที่ใช้ OpenMV ฉันรู้ดีว่ามันยังเหมาะสำหรับการจดจำใบหน้าและด้วยการแก้ไขบางอย่าง ควรจะเป็นไปได้ที่จะทำการตรวจจับท่าทางและการแบ่งส่วนภาพ (คุณสามารถใช้ aXeleRate เพื่อฝึกโมเดลการแบ่งส่วนความหมาย แต่ฉันยังไม่ได้ใช้การอนุมานกับ K210). อย่าลังเลที่จะดูปัญหาพื้นที่เก็บข้อมูล aXeleRate และทำการประชาสัมพันธ์หากคุณคิดว่ามีการปรับปรุงบางอย่างที่คุณสามารถมีส่วนร่วมได้!
นี่คือบทความบางส่วนที่ฉันใช้ในการเขียนบทช่วยสอนนี้ ดูว่าคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการตรวจจับวัตถุด้วยโครงข่ายประสาทเทียมหรือไม่:
เครื่องตรวจจับวัตถุกล่องล้อมรอบ: ทำความเข้าใจ YOLO คุณดูเพียงครั้งเดียว
ทำความเข้าใจ YOLO (คณิตศาสตร์มากขึ้น)
คำแนะนำเล็กน้อยเกี่ยวกับวิธีการทำงานของ YOLO Object Localization กับ Keras (ตอนที่ 2)
การตรวจจับวัตถุแบบเรียลไทม์ด้วย YOLO, YOLOv2 และตอนนี้คือ YOLOv3
หวังว่าคุณจะสามารถใช้ความรู้ที่คุณมีเพื่อสร้างโปรเจ็กต์ที่ยอดเยี่ยมด้วยแมชชีนวิชั่น! คุณสามารถซื้อบอร์ด Sipeed ได้ที่นี่ ซึ่งเป็นตัวเลือกที่ถูกที่สุดสำหรับ ML บนระบบฝังตัว
เพิ่มฉันใน LinkedIn หากคุณมีคำถามใดๆ และสมัครรับข้อมูลจากช่อง YouTube ของฉัน เพื่อรับการแจ้งเตือนเกี่ยวกับโครงการที่น่าสนใจอื่นๆ ที่เกี่ยวข้องกับแมชชีนเลิร์นนิงและวิทยาการหุ่นยนต์