ด้วยความก้าวหน้าในการเรียนรู้เชิงลึก จึงมีการนำเสนอแนวทางใหม่ๆ มากมายในการตรวจหาวัตถุ และโมเดลการตรวจจับ เช่น 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

คำอธิบายประกอบจะแสดงเป็นสีเขียวเมื่อมีจุดยึด และจะใช้สีแดงเมื่อไม่มีจุดยึด หากคำอธิบายประกอบไม่มีจุดยึด นั่นหมายความว่าคำอธิบายประกอบนั้นไม่สนับสนุนการฝึก เป็นเรื่องปกติที่คำอธิบายประกอบจำนวนเล็กน้อยจะแสดงเป็นสีแดง แต่หากคำอธิบายประกอบส่วนใหญ่หรือทั้งหมดเป็นสีแดง ก็อาจทำให้เกิดข้อกังวลได้ ปัญหาที่พบบ่อยที่สุดคือคำอธิบายประกอบมีขนาดเล็กเกินไปหรือมีรูปร่างผิดปกติเกินไป (ยืดออก)

การฝึกอบรม

หลังจากงานใหญ่และยากลำบากในการติดป้ายกำกับและแก้ไขจุดบกพร่องข้อมูลของคุณ ตอนนี้คุณสามารถเริ่มการฝึกอบรมได้ในที่สุด ก่อนที่คุณจะเริ่มต้น คุณต้องรู้ว่าคุณมีตัวเลือกบางอย่างให้เลือกซึ่งแต่ไม่จำกัดเพียง:

  1. สถาปัตยกรรม Backbone (โดยค่าเริ่มต้นจะตั้งค่าเป็น resnet50 แต่คุณสามารถใช้ resnet101, resnet152 ได้ คุณสามารถค้นหาตัวเลือกทั้งหมดที่คุณมีในไดเรกทอรี keras-retinanet/models ในพื้นที่เก็บข้อมูล)
  2. น้ำหนัก (โดยค่าเริ่มต้น ระบบจะดาวน์โหลดน้ำหนักอิมเมจเน็ตสำหรับการฝึกหากไม่ได้ระบุไว้)
  3. Epochs (โดยค่าเริ่มต้นจะตั้งไว้ที่ 50)
  4. บันทึกไดเร็กทอรีสำหรับน้ำหนักและบันทึกเทนเซอร์บอร์ดจะถูกตั้งค่าเป็นโฮมไดเร็กทอรีตามค่าเริ่มต้น แต่คุณสามารถเปลี่ยนได้เช่นกัน

คำสั่งสำหรับสิ่งสำคัญเหล่านี้ได้รับด้านล่าง:

--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 ในส่วนตัวอย่างของโน้ตบุ๊ก

อ้างอิง

  1. การสูญเสียโฟกัสสำหรับการตรวจจับวัตถุหนาแน่น
  2. Keras-retinanet