ด้วยความก้าวหน้าในการเรียนรู้เชิงลึก จึงมีการนำเสนอแนวทางใหม่ๆ มากมายในการตรวจหาวัตถุ และโมเดลการตรวจจับ เช่น YOLO(คุณดูเพียงครั้งเดียว) ล้าสมัยไปแล้ว
โมเดลการตรวจจับวัตถุ เช่น SNIPER, Retinanet และ Trident ได้ออกจาก Faster-RCNNและ YOLOข้างหลังไกลมาก
โพสต์ดีๆ เพื่อทำความเข้าใจเบื้องต้นเกี่ยวกับวิธีการทำงานของ Retinanet มีให้ดูได้ ที่นี่
รหัส
พื้นที่เก็บข้อมูลที่คุณต้องดาวน์โหลดคือ fizyr/keras-retinanet ฉันได้ทดสอบรหัสนี้ทั้งบน Ubuntu และ Windows
สำหรับผู้ใช้ Windows คุณจะต้องติดตั้งสภาพแวดล้อม Anaconda และจะต้องมีเครื่องมือ Microsoft Visual Basic C++
หลังจากดาวน์โหลดพื้นที่เก็บข้อมูลแล้ว ให้ไปที่เทอร์มินัล Anaconda ใน Windows หรือเทอร์มินัลใน Ubuntu แล้วไปที่โฟลเดอร์ที่เก็บและพิมพ์:
$ pip install . --user
บรรทัดนี้จะติดตั้งแพ็คเกจ keras-retinanet ในเครื่องคอมพิวเตอร์ของคุณ
หมายเหตุ: กระบวนการติดตั้งแพ็คเกจนี้จะต้องดำเนินการทุกครั้งที่มีการเปลี่ยนแปลงในไฟล์โค้ดจริง
คุณจะสามารถเข้าถึงคำสั่งต่อไปนี้บนเทอร์มินัลของคุณหลังจากติดตั้งแพ็คเกจ:
retinanet-train retinanet-evaluate retinanet-debug retinanet-convert-model
คำอธิบายประกอบ
จำเป็นต้องมีไฟล์ CSV สองไฟล์ อันแรกประกอบด้วยเส้นทาง กล่องขอบเขต และชื่อคลาสของแต่ละรูปภาพ ไฟล์ที่สองควรมีเฉพาะชื่อคลาสและการแมปเท่านั้น
ไฟล์ CSV ที่มีคำอธิบายประกอบควรมีหนึ่งคำอธิบายประกอบต่อบรรทัด รูปภาพที่มีกรอบล้อมรอบหลายกล่องควรใช้หนึ่งแถวต่อกรอบล้อมรอบ โปรดทราบว่าการจัดทำดัชนีสำหรับค่าพิกเซลเริ่มต้นที่ 0 รูปแบบที่คาดหวังของแต่ละบรรทัดคือ:
path/to/image.jpg,x1,y1,x2,y2,class_name
รูปภาพบางรูปอาจไม่มีวัตถุที่มีป้ายกำกับ หากต้องการเพิ่มรูปภาพเหล่านี้ไปยังชุดข้อมูลเป็นตัวอย่างเชิงลบ ให้เพิ่มคำอธิบายประกอบโดยที่ x1, y1, x2, y2 และ class_name ว่างเปล่าทั้งหมด:
path/to/image.jpg,,,,,
ตัวอย่างเต็มจะเป็น:
/data/imgs/img_001.jpg,837,346,981,456,cow
/data/imgs/img_002.jpg,215,312,279,391,cat
/data/imgs/img_002.jpg,22,5,89,84,bird
/data/imgs/img_003.jpg,,,,,
ชื่อคลาสไปยังไฟล์การแมป ID ควรมีหนึ่งการแมปต่อบรรทัด แต่ละบรรทัดควรใช้รูปแบบต่อไปนี้:
class_name,id
การจัดทำดัชนีสำหรับคลาสเริ่มต้นที่ 0 อย่ารวมคลาสพื้นหลังเนื่องจากเป็นนัย
ตัวอย่างเช่น:
cow,0
cat,1
bird,2
ฉันใช้ labelImg เพื่อทำคำอธิบายประกอบในรูปแบบ pascal voc xml ก่อน จากนั้นจึงแปลงเป็น txt โดยใช้ สคริปต์ นี้ เพียงเปลี่ยนชื่อ .txt เป็น .csv เพื่อให้เป็นรูปแบบ csv
การดีบัก
ก่อนที่คุณจะเริ่มการฝึกอบรม คุณต้องตรวจสอบว่าคำอธิบายประกอบที่คุณทำถูกต้องหรือไม่ คุณสามารถทำได้โดยพิมพ์ข้อความต่อไปนี้ในเทอร์มินัล:
$ retinanet-debug csv path/to/annotation.csv path/to/classes.csv
คำอธิบายประกอบจะแสดงเป็นสีเขียวเมื่อมีจุดยึด และจะใช้สีแดงเมื่อไม่มีจุดยึด หากคำอธิบายประกอบไม่มีจุดยึด นั่นหมายความว่าคำอธิบายประกอบนั้นไม่สนับสนุนการฝึก เป็นเรื่องปกติที่คำอธิบายประกอบจำนวนเล็กน้อยจะแสดงเป็นสีแดง แต่หากคำอธิบายประกอบส่วนใหญ่หรือทั้งหมดเป็นสีแดง ก็อาจทำให้เกิดข้อกังวลได้ ปัญหาที่พบบ่อยที่สุดคือคำอธิบายประกอบมีขนาดเล็กเกินไปหรือมีรูปร่างผิดปกติเกินไป (ยืดออก)
การฝึกอบรม
หลังจากงานใหญ่และยากลำบากในการติดป้ายกำกับและแก้ไขจุดบกพร่องข้อมูลของคุณ ตอนนี้คุณสามารถเริ่มการฝึกอบรมได้ในที่สุด ก่อนที่คุณจะเริ่มต้น คุณต้องรู้ว่าคุณมีตัวเลือกบางอย่างให้เลือกซึ่งแต่ไม่จำกัดเพียง:
- สถาปัตยกรรม Backbone (โดยค่าเริ่มต้นจะตั้งค่าเป็น resnet50 แต่คุณสามารถใช้ resnet101, resnet152 ได้ คุณสามารถค้นหาตัวเลือกทั้งหมดที่คุณมีในไดเรกทอรี keras-retinanet/models ในพื้นที่เก็บข้อมูล)
- น้ำหนัก (โดยค่าเริ่มต้น ระบบจะดาวน์โหลดน้ำหนักอิมเมจเน็ตสำหรับการฝึกหากไม่ได้ระบุไว้)
- Epochs (โดยค่าเริ่มต้นจะตั้งไว้ที่ 50)
- บันทึกไดเร็กทอรีสำหรับน้ำหนักและบันทึกเทนเซอร์บอร์ดจะถูกตั้งค่าเป็นโฮมไดเร็กทอรีตามค่าเริ่มต้น แต่คุณสามารถเปลี่ยนได้เช่นกัน
คำสั่งสำหรับสิ่งสำคัญเหล่านี้ได้รับด้านล่าง:
--backbone --weights --epochs --snapshot-path --tensorboard-dir
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานของคำสั่งเหล่านี้และตัวเลือกเพิ่มเติมที่คุณมี โปรดดูที่ไฟล์ keras-retinanet/bin/train.py ในพื้นที่เก็บข้อมูล
ตัวอย่างพื้นฐานเกี่ยวกับวิธีการใช้งานสิ่งเหล่านี้กับคำสั่ง retinanet-train คือ:
retinanet-train --backbone resnet101 --weights path/to/weights.h5 --epochs 100 --snapshot-path path/to/save/dir --tensorboard-dir path/to/tensorboard/dir csv path/to/annotations.csv path/to/classes.csv
มันดูซับซ้อนมากฉันเดา….
ในการลองครั้งแรก ให้ปล่อยให้ทุกอย่างเป็นไปตามค่าเริ่มต้น เพียงใช้สิ่งนี้:
retinanet-train csv path/to/annotations.csv path/to/classes.csv
คุณอาจต้องการเปลี่ยนไดเร็กทอรีบันทึกสำหรับตุ้มน้ำหนักและเทนเซอร์บอร์ด สำหรับสิ่งนี้เพียงแค่ใช้
retinanet-train --snapshot-path path/to/save/dir --tensorboard-dir path/to/tensorboard/dir csv path/to/annotations.csv path/to/classes.csv
หมายเหตุ: ไม่มีการเพิ่มการโทรกลับสำหรับการหยุดก่อนเวลาหรือ csvlogger คุณต้องเพิ่มมันเองในไฟล์ train.py
การดำเนินการนี้จะดาวน์โหลดตุ้มน้ำหนักแม่เหล็กสำหรับ resnet50 ก่อน จากนั้นจึงเริ่มการฝึกของคุณ
เพื่อผลลัพธ์ที่ดีกว่า ขอแนะนำให้คุณใช้ตุ้มน้ำหนักที่ผ่านการฝึกอบรมแล้วบนชุดข้อมูล COCO ที่มีแบ็คโบน resnet50 ซึ่งมีอยู่ที่ ลิงก์ นี้
การอนุมาน
ขั้นตอนการฝึกของ keras-retinanet ใช้ได้กับ โมเดลการฝึก เวอร์ชันเหล่านี้เป็นเวอร์ชันแยกส่วนเมื่อเปรียบเทียบกับ โมเดลการอนุมาน และมีเพียงเลเยอร์ที่จำเป็นสำหรับการฝึกเท่านั้น (ค่าการถดถอยและการจัดหมวดหมู่) หากคุณต้องการอนุมานบนโมเดล (ดำเนินการตรวจจับวัตถุบนรูปภาพ) คุณต้องแปลงโมเดลที่ได้รับการฝึกเป็นโมเดลอนุมาน ทำได้ดังนี้:
retinanet-convert-model /path/to/training/model.h5 /path/to/save/inference/model.h5
หลังจากแปลงโมเดลแล้ว นำทางไปยังโฟลเดอร์ตัวอย่างในพื้นที่เก็บข้อมูลและเปิดสมุดบันทึก
แทนที่ model_path ด้วยพาธไปยังโมเดลที่แปลงแล้ว หากคุณไม่ได้ใช้ resnet50 เป็นแบ็คโบน อย่าลืมเปลี่ยนแบ็คโบนด้วย
model_path = os.path.join('..', 'snapshots', 'resnet50_coco_best_v2.1.0.h5') # load retinanet model model = models.load_model(model_path, backbone_name='resnet50')
นอกจากนี้ยังมีตัวแปร label_to_names ซึ่งเป็นพจนานุกรมที่ใช้แมปคลาสต่างๆ
labels_to_names = { 0: ‘person’, 1: 'bat'}
เปลี่ยนตามจำนวนคลาสที่คุณมี
หลังจากนี้ สิ่งที่เหลืออยู่คือกำหนดเส้นทางไปยังรูปภาพทดสอบของคุณในส่วน Run Detection ในส่วนตัวอย่างของโน้ตบุ๊ก