อังกฤษ | 中文
พื้นที่เก็บข้อมูลอย่างเป็นทางการสำหรับกระดาษด้านวิดีโอความละเอียดสูงที่แข็งแกร่งพร้อมคำแนะนำชั่วคราว RVM ได้รับการออกแบบมาโดยเฉพาะสำหรับการปูวิดีโอของมนุษย์ที่แข็งแกร่ง ต่างจากโมเดลประสาทที่มีอยู่ซึ่งประมวลผลเฟรมเป็นรูปภาพอิสระ RVM ใช้โครงข่ายประสาทที่เกิดซ้ำเพื่อประมวลผลวิดีโอที่มีหน่วยความจำชั่วคราว RVM สามารถทำการแมตต์แบบเรียลไทม์บนวิดีโอใดๆ โดยไม่ต้องป้อนข้อมูลเพิ่มเติม บรรลุ 4K 76FPS และ HD 104FPS บน GPU Nvidia GTX 1080 Ti โครงการนี้ได้รับการพัฒนาโดย ByteDance Inc.
[03 พ.ย. 2021] แก้ไขข้อผิดพลาดใน train.py
[16 กันยายน 2021] รหัสได้รับการเผยแพร่อีกครั้งภายใต้ใบอนุญาต GPL-3.0
[25 ส.ค. 2021] มีการเผยแพร่ซอร์สโค้ดและโมเดลที่ได้รับการฝึกล่วงหน้าแล้ว
[27 ก.ค. 2021] WACV 2022 ยอมรับกระดาษแล้ว
ชมวิดีโอ showreel (YouTube, Bilibili) เพื่อดูประสิทธิภาพของโมเดล
ฟุตเทจทั้งหมดในวิดีโอมีอยู่ใน Google Drive
การสาธิตเว็บแคม: เรียกใช้โมเดลแบบเรียลไทม์ในเบราว์เซอร์ของคุณ เห็นภาพสถานะที่เกิดซ้ำ
Colab Demo: ทดสอบโมเดลของเรากับวิดีโอของคุณเองด้วย GPU ฟรี
เราขอแนะนำรุ่น MobileNetv3 สำหรับกรณีการใช้งานส่วนใหญ่ รุ่น ResNet50 เป็นรุ่นที่มีขนาดใหญ่กว่าและมีการปรับปรุงประสิทธิภาพเล็กน้อย โมเดลของเรามีอยู่ในกรอบการอนุมานที่หลากหลาย ดูเอกสารการอนุมานสำหรับคำแนะนำเพิ่มเติม
กรอบ | ดาวน์โหลด | หมายเหตุ |
ไพทอร์ช | rvm_mobilenetv3.pth rvm_resnet50.pth | ตุ้มน้ำหนักอย่างเป็นทางการสำหรับ PyTorch หมอ |
ทอร์ชฮับ | ไม่มีอะไรให้ดาวน์โหลด | วิธีที่ง่ายที่สุดในการใช้โมเดลของเราในโปรเจ็กต์ PyTorch ของคุณ หมอ |
ทอร์ชสคริปต์ | rvm_mobilenetv3_fp32.torchscript rvm_mobilenetv3_fp16.torchscript rvm_resnet50_fp32.torchscript rvm_resnet50_fp16.torchscript | หากอนุมานบนมือถือ ให้พิจารณาส่งออกโมเดลเชิงปริมาณ int8 ด้วยตัวคุณเอง หมอ |
สสส | rvm_mobilenetv3_fp32.onnx rvm_mobilenetv3_fp16.onnx rvm_resnet50_fp32.onnx rvm_resnet50_fp16.onnx | ทดสอบบนรันไทม์ ONNX ด้วยแบ็คเอนด์ CPU และ CUDA โมเดลที่ให้มาใช้ Opset 12. Doc, ผู้ส่งออก |
เทนเซอร์โฟลว์ | rvm_mobilenetv3_tf.zip rvm_resnet50_tf.zip | TensorFlow 2 โมเดลที่บันทึกไว้ หมอ |
TensorFlow.js | rvm_mobilenetv3_tfjs_int8.zip | รันโมเดลบนเว็บ การสาธิต, รหัสเริ่มต้น |
CoreML | rvm_mobilenetv3_1280x720_s0.375_fp16.mlรุ่น rvm_mobilenetv3_1280x720_s0.375_int8.mlรุ่น rvm_mobilenetv3_1920x1080_s0.25_fp16.mlรุ่น rvm_mobilenetv3_1920x1080_s0.25_int8.mlรุ่น | CoreML ไม่รองรับความละเอียดแบบไดนามิก ความละเอียดอื่นๆ สามารถส่งออกได้ด้วยตัวเอง โมเดลต้องใช้ iOS 13+ s หมายถึง downsample_ratio หมอผู้ส่งออก |
ทุกรุ่นมีอยู่ใน Google Drive และ Baidu Pan (รหัส: gym7)
ติดตั้งการพึ่งพา:
pip ติดตั้ง -r Requirements_inference.txt
โหลดโมเดล:
นำเข้า torchfrom โมเดล นำเข้า MattingNetworkmodel = MattingNetwork('mobilenetv3').eval().cuda() # หรือ "resnet50"model.load_state_dict(torch.load('rvm_mobilenetv3.pth'))
ในการแปลงวิดีโอ เรามี API การแปลงแบบง่าย:
จากการอนุมานนำเข้า Convert_videoconvert_video(model, # Model, can be on any devices (cpu or cuda).input_source='input.mp4', # A file video or an image sequence directory.output_type='video', # Choose "video" " หรือ "png_sequence"output_composition='com.mp4', # File path if video; directory path if png sequence.output_alpha="pha.mp4", # [ไม่บังคับ] เอาท์พุต Raw alpha Predict.output_foreground="fgr.mp4", # [ไม่บังคับ] เอาท์พุต Raw Foreground Predict.output_video_mbps=4, # เอาท์พุตวิดีโอ mbps ไม่จำเป็นสำหรับ png sequence.downsample_ratio=None, # A ไฮเปอร์พารามิเตอร์ ปรับหรือใช้ None สำหรับ auto.seq_chunk=12, # ประมวลผล n เฟรมพร้อมกันเพื่อการขนานที่ดีขึ้น)
หรือเขียนรหัสอนุมานของคุณเอง:
จาก torch.utils.data นำเข้า DataLoader จาก torchvision.transforms นำเข้า ToTensor จาก inference_utils นำเข้า VideoReader, VideoWriterreader = VideoReader('input.mp4', แปลง=ToTensor())writer = VideoWriter('output.mp4', frame_rate=30)bgr = ไฟฉาย .tensor([.47, 1, .6]).ดู(3, 1, 1).cuda() # Green background.rec = [None] * 4 # Initial recurrent state.downsample_ratio = 0.25 # ปรับตามวิดีโอของคุณด้วย torch.no_grad():for src ใน DataLoader(reader): # RGB tensor ทำให้เป็นมาตรฐานเป็น 0 ~ 1.fgr, pha, *rec = model(src.cuda(), *rec, downsample_ratio) # วนรอบการเกิดซ้ำ state.com = fgr * pha + bgr * (1 - pha) # ผสมกับพื้นหลังสีเขียว writer.write(com) # เขียนเฟรม
โมเดลและ API ตัวแปลงมีให้ใช้งานผ่าน TorchHub เช่นกัน
# โหลด model.model = torch.hub.load("PeterL1n/RobustVideoMatting", "mobilenetv3") # หรือ "resnet50"# Converter API.convert_video = torch.hub.load("PeterL1n/RobustVideoMatting", "converter")
โปรดดูเอกสารประกอบการอนุมานสำหรับรายละเอียดเกี่ยวกับไฮเปอร์พารามิเตอร์ downsample_ratio
อาร์กิวเมนต์ตัวแปลงเพิ่มเติม และการใช้งานขั้นสูงเพิ่มเติม
โปรดดูเอกสารการฝึกอบรมเพื่อฝึกอบรมและประเมินโมเดลของคุณเอง
ความเร็ววัดด้วย inference_speed_test.py
เพื่อใช้อ้างอิง
จีพียู | ดีประเภท | เอชดี (1920x1080) | 4K (3840x2160) |
---|---|---|---|
RTX3090 | FP16 | 172 เฟรมต่อวินาที | 154 เฟรมต่อวินาที |
RTX 2060 ซุปเปอร์ | FP16 | 134 เฟรมต่อวินาที | 108 เฟรมต่อวินาที |
GTX1080TI | FP32 | 104 เฟรมต่อวินาที | 74 เฟรมต่อวินาที |
หมายเหตุ 1: HD ใช้ downsample_ratio=0.25
, 4K ใช้ downsample_ratio=0.125
การทดสอบทั้งหมดใช้ชุดงานขนาด 1 และชิ้นเฟรม 1
หมายเหตุ 2: GPU ก่อนสถาปัตยกรรมทัวริงไม่รองรับการอนุมาน FP16 ดังนั้น GTX 1080 Ti จึงใช้ FP32
หมายเหตุ 3: เราวัดเฉพาะปริมาณงานของเทนเซอร์เท่านั้น สคริปต์การแปลงวิดีโอที่ให้มาใน repo นี้คาดว่าจะช้ากว่ามาก เนื่องจากไม่ได้ใช้การเข้ารหัส/ถอดรหัสวิดีโอด้วยฮาร์ดแวร์ และไม่มีการถ่ายโอนเทนเซอร์บนเธรดแบบขนาน หากคุณสนใจที่จะใช้การเข้ารหัส/ถอดรหัสวิดีโอด้วยฮาร์ดแวร์ใน Python โปรดดูที่ PyNvCodec
ซานชวน หลิน
ลินจี้ หยาง
อิมราน ซาเลมี
สมยดิพ เส็งคุปตะ
NCNN C++ Android (@FeiGeChuanShu)
lite.ai.toolkit (@DefTruth)
Gradio เว็บสาธิต (@AK391)
การสาธิต Unity Engine พร้อม NatML (@nsuite)
MNN C++ สาธิต (@DefTruth)
การสาธิต TNN C++ (@DefTruth)