ใช้สิ่งนี้แทน: https://github.com/facebookresearch/maskrcnn-benchmark

ตัวอย่างเอาท์พุทของ E2E_MASK_RCNNN-R-101-FPN_2X โดยใช้น้ำหนักที่ถูกกำหนดไว้

ตัวอย่างที่สอดคล้องกันเอาท์พุทจาก detectron

ตัวอย่างเอาท์พุทของ E2E_KEYPOINT_RCNNN-R-50-FPN_S1X โดยใช้น้ำหนักที่ถูกกำหนดไว้
รหัสนี้เป็นไปตามสถาปัตยกรรมการใช้งานของ Detectron รองรับเพียงส่วนหนึ่งของฟังก์ชั่นเท่านั้น ตรวจสอบส่วนนี้สำหรับข้อมูลเพิ่มเติม
ด้วยรหัสนี้คุณสามารถ ...
ที่เก็บนี้สร้างขึ้นบน jwyang/faster-rcnn.pytorch อย่างไรก็ตามหลังจากการดัดแปลงหลายครั้งโครงสร้างจะเปลี่ยนไปมากและตอนนี้มันคล้ายกับ Detectron มากขึ้น ฉันจงใจทำทุกอย่างที่คล้ายคลึงกันหรือเหมือนกับการใช้งานของ Detectron เพื่อที่จะทำซ้ำผลลัพธ์โดยตรงจากไฟล์น้ำหนักที่ได้รับการปรับแต่งอย่างเป็นทางการ
การใช้งานนี้มีคุณสมบัติดังต่อไปนี้:
มันเป็นรหัส pytorch บริสุทธิ์ แน่นอนว่ามีรหัส CUDA อยู่บ้าง
รองรับการฝึกอบรมแบทช์หลายภาพ
รองรับการฝึกอบรม GPU หลายครั้ง
รองรับวิธีการรวมสามวิธี ขอให้สังเกตว่ามีการแก้ไขเฉพาะ ROI เท่านั้นที่จะตรงกับการใช้งานใน Caffe2 ดังนั้นใช้มัน
มันเป็นหน่วยความจำที่มีประสิทธิภาพ สำหรับการแบตช์ข้อมูลมีสอง techiniques ที่มีอยู่เพื่อลดการใช้หน่วยความจำ: 1) การจัดกลุ่มด้าน : ภาพกลุ่มที่มีอัตราส่วนภาพที่คล้ายกันในชุด 2) การปลูกพืช: ภาพการครอบตัด ที่ยาวเกินไป การจัดกลุ่มแบบมีการใช้งานใน Detectron ดังนั้นจึงใช้เป็นค่าเริ่มต้น การปลูกพืชเป็นแนวคิดจาก Jwyang/Faster-rcnn.pytorch และไม่ได้ใช้เป็นค่าเริ่มต้น
นอกจากนั้นฉันใช้โมดูล nn.DataParallel ที่กำหนดเองซึ่งช่วยให้ขนาด batch blob ที่แตกต่างกันใน GPU ที่แตกต่างกัน ตรวจสอบส่วน nn.dataparallel ของฉันสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้
โคลน repo:
git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git
ทดสอบภายใต้ Python3
รวบรวมรหัส CUDA:
cd lib # please change to this directory
sh make.sh
หากคุณกำลังใช้ Volta GPUs ให้อ่านบรรทัดนี้ใน lib/mask.sh และอย่าลืมโพสต์แบ็คสแลชที่บรรทัดด้านบน CUDA_PATH ค่าเริ่มต้นเป็น /usr/loca/cuda หากคุณต้องการใช้ไลบรารี CUDA บนเส้นทางที่แตกต่างกันให้เปลี่ยนบรรทัดนี้ตามนั้น
มันจะรวบรวมโมดูลทั้งหมดที่คุณต้องการรวมถึง NMS, ROI_POOING, ROI_CROP และ ROI_ALIGN (จริง ๆ แล้ว GPU NMS ไม่เคยใช้ ... )
โปรดทราบว่าหากคุณใช้ CUDA_VISIBLE_DEVICES เพื่อตั้งค่า GPU ให้ตรวจ สอบให้แน่ใจว่ามี GPU อย่างน้อยหนึ่ง GPU เมื่อรวบรวมรหัส
สร้างโฟลเดอร์ข้อมูลภายใต้ repo
cd {repo_root}
mkdir data
Coco : ดาวน์โหลดภาพ Coco และคำอธิบายประกอบจากเว็บไซต์ Coco
และตรวจสอบให้แน่ใจว่าได้วางไฟล์เป็นโครงสร้างต่อไปนี้:
coco
├── annotations
| ├── instances_minival2014.json
│ ├── instances_train2014.json
│ ├── instances_train2017.json
│ ├── instances_val2014.json
│ ├── instances_val2017.json
│ ├── instances_valminusminival2014.json
│ ├── ...
|
└── images
├── train2014
├── train2017
├── val2014
├──val2017
├── ...
ดาวน์โหลดคำอธิบายประกอบ Coco Mini จากที่นี่ โปรดทราบว่า Minival นั้นเทียบเท่ากับชุด Val 2017 ที่กำหนดไว้เมื่อเร็ว ๆ นี้ ในทำนองเดียวกันสหภาพของ Valminusminival และรถไฟ 2014 นั้นเทียบเท่ากับชุดรถไฟ 2017
อย่าลังเลที่จะวางชุดข้อมูลในสถานที่ที่คุณต้องการจากนั้นเชื่อมโยงชุดข้อมูลใต้ data/ โฟลเดอร์:
ln -s path/to/coco data/coco
แนะนำให้วางภาพบน SSD เพื่อประสิทธิภาพการฝึกที่ดีขึ้น
ฉันใช้ Imagenet น้ำหนักที่ได้รับการฝึกฝนจากคาเฟอีนสำหรับเครือข่ายกระดูกสันหลัง
ดาวน์โหลดและใส่ลงใน {repo_root}/data/pretrained_model
คุณสามารถคำสั่งต่อไปนี้เพื่อดาวน์โหลดทั้งหมด:
argparse_color_formater , colorama , requests python tools/download_imagenet_weights.py
หมายเหตุ : น้ำหนักที่ได้รับการฝึกฝนมาจากคาเฟอีนมีประสิทธิภาพที่ดีกว่าเล็กน้อยกว่า Pytorch pretrained แนะนำให้ใช้โมเดลที่ผ่านการฝึกฝนคาเฟอีนจากลิงค์ด้านบนเพื่อทำซ้ำผลลัพธ์ โดยวิธีการที่ Detectron ยังใช้น้ำหนักที่ได้รับการดูแลจากคาเฟอีน
หากคุณต้องการใช้โมเดลที่ผ่านการฝึกอบรมล่วงหน้าของ Pytorch โปรดอย่าลืมเปลี่ยนภาพจาก BGR เป็น RGB และใช้การประมวลผลข้อมูลแบบเดียวกัน (ลบค่าเฉลี่ยและปกติ) ตามที่ใช้ในโมเดล Pytorch pretrained
นอกเหนือจากการใช้น้ำหนักที่ได้รับการฝึกฝนสำหรับ resnet ด้านบนแล้วคุณยังสามารถใช้น้ำหนักจาก detectron ได้โดยการเปลี่ยนบรรทัดที่เกี่ยวข้องในไฟล์กำหนดค่าโมเดลดังต่อไปนี้:
RESNETS:
IMAGENET_PRETRAINED_WEIGHTS: 'data/pretrained_model/R-50.pkl'
R-50-GN.PKL และ R-101-GN.PKL เป็นสิ่งจำเป็นสำหรับ GN_BASELINES
X-101-32x8d.pkl, X-101-64x4d.pkl และ X-152-32x8d-in5k.pkl เป็นสิ่งจำเป็นสำหรับ resnext backbones
อย่าเปลี่ยนแปลงอะไรในไฟล์ config ที่ให้มา (configs/**/xxxx.yml) เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่
ใช้ตัวแปรสภาพแวดล้อม CUDA_VISIBLE_DEVICES เพื่อควบคุม GPU ที่จะใช้
batch_size: NUM_GPUS x TRAIN.IMS_PER_BATCH
มีประสิทธิภาพ _batch_size: batch_size x iter_size
การเปลี่ยนแปลงของ somethining: new value of something / old value of something
ตัวเลือกการกำหนดค่าต่อไปนี้จะถูกปรับ โดยอัตโนมัติ ตามการตั้งค่าการฝึกอบรมจริง TRAIN.IMS_PER_BATCH 1) จำนวน GPUs NUM_GPUS , 2) iter_size แบทช
SOLVER.BASE_LR : ปรับ propotional โดยตรงกับการเปลี่ยนแปลงของ batch_sizeSOLVER.STEPS , SOLVER.MAX_ITER : ปรับ propotional แบบผกผันกับการเปลี่ยนแปลงของ effect_batch_sizeใช้ MASK-RCNN ด้วย Res50 Backbone
python tools/train_net_step.py --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --use_tfboard --bs {batch_size} --nw {num_workers}
ใช้ --bs เพื่อเขียนทับขนาดแบทช์เริ่มต้นเป็นค่าที่เหมาะสมที่เหมาะกับ GPU ของคุณ Simliar สำหรับ --nw จำนวนเธรดข้อมูลตัวโหลดเริ่มต้นเป็น 4 ใน config.py
ระบุ —-use_tfboard เพื่อบันทึกการสูญเสียบน tensorboard
หมายเหตุ : ใช้ --dataset keypoints_coco2017 เมื่อฝึกอบรมสำหรับ keypoint-rcnn
--iter_size เช่นเดียวกับในคาเฟอีนอัพเดทเครือข่ายหนึ่งครั้ง ( optimizer.step() ) ทุก iter_size ซ้ำ (ไปข้างหน้า + ย้อนกลับ) วิธีนี้จะมีขนาดแบทช์ที่มีประสิทธิภาพมากขึ้นสำหรับการฝึกอบรม โปรดสังเกตว่าการนับขั้นตอนจะเพิ่มขึ้นหลังจากการอัปเดตเครือข่ายเท่านั้น
python tools/train_net_step.py --dataset coco2017 --cfg configs/baselines/e2e_mask_rcnn_R-50-C4.yml --bs 4 --iter_size 4
iter_size ค่าเริ่มต้นเป็น 1
python tools/train_net_step.py ... --load_ckpt {path/to/the/checkpoint}
หรือใช้ไฟล์จุดตรวจสอบของ Detectron
python tools/train_net_step.py ... --load_detectron {path/to/the/checkpoint}
python tools/train_net_step.py ... --load_ckpt {path/to/the/checkpoint} --resume
เมื่อกลับมาฝึกอบรม ต่อการนับจำนวนขั้นตอน และ สถานะเครื่องมือเพิ่มประสิทธิภาพ จะได้รับการกู้คืนจากจุดตรวจ สำหรับ SGD Optimizer สถานะ Optimizer จะมีโมเมนตัมสำหรับพารามิเตอร์ที่สามารถฝึกอบรมได้แต่ละตัว
หมายเหตุ : --resume ยังไม่ได้รับการสนับสนุนสำหรับ --load_detectron
python tools/train_net_step.py ... --no_save --set {config.name1} {value1} {config.name2} {value2} ...
python tools/train_net_step.py ... --no_save --set DEBUG True
--no_save เพื่อหลีกเลี่ยงการบันทึกจุดตรวจสอบหรือการบันทึก python train_net_step.py --help
ในระยะสั้นให้ใช้ train_net_step.py
ใน train_net_step.py :
SOLVER.LR_POLICY: steps_with_decay (เลิกใช้แล้ว) ใน train_net.py ตัวเลือกการกำหนดค่าบางตัวไม่มีผลกระทบและการสังเกตที่คุ้มค่า:
SOLVER.LR_POLICY , SOLVER.MAX_ITER , SOLVER.STEPS , SOLVER.LRS : สำหรับตอนนี้นโยบายการฝึกอบรมถูกควบคุมโดยอาร์กิวเมนต์บรรทัดคำสั่งเหล่านี้:
--epochs : มีกี่ยุคที่จะฝึกฝน ยุคหนึ่งหมายถึงการเดินทางผ่านชุดฝึกอบรมทั้งหมด ค่าเริ่มต้นเป็น 6--lr_decay_epochs : EPOCHS เพื่อสลายอัตราการเรียนรู้ การสลายตัวเกิดขึ้นในช่วงเริ่มต้นของยุค Epoch เป็น 0-edexed ค่าเริ่มต้นเป็น [4, 5] สำหรับอาร์กิวเมนต์บรรทัดคำสั่งเพิ่มเติมโปรดดูที่ python train_net.py --help
SOLVER.WARM_UP_ITERS , SOLVER.WARM_UP_FACTOR , SOLVER.WARM_UP_METHOD : ไม่รองรับการฝึกอบรมการอุ่นเครื่อง
ตัวอย่างเช่น Test Mask-RCNN ในชุด Coco2017 Val
python tools/test_net.py --dataset coco2017 --cfg config/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml --load_ckpt {path/to/your/checkpoint}
ใช้ --load_detectron เพื่อโหลดจุดตรวจสอบของ Detectron หากมี GPU หลายตัวให้เพิ่ม --multi-gpu-testing
ระบุ directry เอาต์พุตที่แตกต่างกัน, ใช้ --output_dir {...} ค่าเริ่มต้นเป็น {the/parent/dir/of/checkpoint}/test
python tools/infer_simple.py --dataset coco --cfg cfgs/baselines/e2e_mask_rcnn_R-50-C4.yml --load_ckpt {path/to/your/checkpoint} --image_dir {dir/of/input/images} --output_dir {dir/to/save/visualizations}
--output_dir ค่าเริ่มต้นเป็น infer_outputs
กระดูกสันหลัง:
ResNet50_conv4_body , ResNet50_conv5_body , ResNet101_Conv4_Body , ResNet101_Conv5_Body , ResNet152_Conv5_Body[fpn_]ResNet101_Conv4_Body , [fpn_]ResNet101_Conv5_Body , [fpn_]ResNet152_Conv5_Bodyfpn_ResNet50_conv5_body , fpn_ResNet50_conv5_P2only_body , fpn_ResNet101_conv5_body , fpn_ResNet101_conv5_P2only_body , fpn_ResNet152_conv5_body fpn_ResNet152_conv5_P2only_body หัวกล่อง: ResNet_roi_conv5_head , roi_2mlp_head , roi_Xconv1fc_head , roi_Xconv1fc_gn_head
mask_rcnn_fcn_head_v1up4convs Head: mask_rcnn_fcn_head_v0upshare , mask_rcnn_fcn_head_v0up , mask_rcnn_fcn_head_v1up , mask_rcnn_fcn_head_v1up4convs_gn
หัว Keypoints: roi_pose_head_v1convX
หมายเหตุ : การตั้งชื่อคล้ายกับที่ใช้ใน detectron เพียงลบ add_ ล่วงหน้า
ตอนนี้ได้รับการสนับสนุน Coco เท่านั้น อย่างไรก็ตามการใช้งานชุดข้อมูลทั้งหมดนั้นเกือบจะเหมือนกับ Detectron ดังนั้นจึงควรเพิ่มชุดข้อมูลเพิ่มเติมที่สนับสนุนโดย Detectron
ไฟล์การกำหนดค่าเฉพาะสถาปัตยกรรมจะอยู่ภายใต้การกำหนดค่า ไฟล์การกำหนดค่าทั่วไป lib/core/config.py มีตัวเลือกเกือบทั้งหมดที่มีค่าเริ่มต้นเช่นเดียวกับใน Detectron ดังนั้นจึงง่ายที่จะแปลงการกำหนดค่าเฉพาะสถาปัตยกรรมจาก Detectron
ตัวเลือกบางอย่างจาก detectron ไม่ได้ใช้ เนื่องจากฟังก์ชันที่สอดคล้องกันยังไม่ได้ใช้งาน ตัวอย่างเช่นการเพิ่มข้อมูลในการทดสอบ
MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS = True : ไม่ว่าจะโหลด imagenet น้ำหนักที่ได้รับการปรับสภาพหรือไม่RESNETS.IMAGENET_PRETRAINED_WEIGHTS = '' : เส้นทางสู่น้ำหนักเครือข่ายที่เหลืออยู่ก่อน หากเริ่มต้นด้วย '/' แสดงว่าเป็นเส้นทางที่แน่นอน มิฉะนั้นให้ถือว่าเป็นเส้นทางที่สัมพันธ์กับ ROOT_DIRTRAIN.ASPECT_CROPPING = False , TRAIN.ASPECT_HI = 2 , TRAIN.ASPECT_LO = 0.5 : ตัวเลือกสำหรับการปลูกพืชเพื่อ จำกัด ช่วงอัตราส่วนภาพRPN.OUT_DIM_AS_IN_DIM = True , RPN.OUT_DIM = 512 , RPN.CLS_ACTIVATION = 'sigmoid' : การใช้งานอย่างเป็นทางการของ RPN มีช่องสัญญาณอินพุตและเอาต์พุตเหมือนกันและใช้ sigmoid เป็นฟังก์ชั่นการเปิดใช้งานสำหรับการทำนายคลาส FG/BG ในการใช้งานของ Jwyang จะแก้ไขหมายเลขช่องสัญญาณเอาต์พุตเป็น 512 และใช้ SoftMax เป็นฟังก์ชั่นการเปิดใช้งานMODEL.NUM_CLASSES มันจะถูกตั้งค่าตามชุดข้อมูลที่ระบุโดย --datasetTRAIN.WEIGHTS , TRAIN.DATASETS และ TEST.DATASETSMODEL.CONV_BODY , FAST_RCNN.ROI_BOX_HEAD ... ), ลบ add_ ในสตริงถ้ามีอยู่RESNETS.IMAGENET_PRETRAINED_WEIGHTS ชี้ไปที่ไฟล์น้ำหนักที่ถูกปรับสภาพ ถ้าไม่ตั้งค่า MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS เป็น FalseOUTPUT_DIR: . ที่บรรทัดสุดท้ายNUM_GPUS ในไฟล์กำหนดค่า มันใช้เพื่ออนุมานขนาดแบทช์ดั้งเดิมสำหรับการฝึกอบรมและอัตราการเรียนรู้จะถูกปรับขนาดเชิงเส้นตามการเปลี่ยนแปลงขนาดแบทช์ การปรับอัตราการเรียนรู้ที่เหมาะสมเป็นสิ่งสำคัญสำหรับการฝึกอบรมที่มีขนาดแบทช์ที่แตกต่างกันRESNETS.USE_GN: True Benchmark.md