영어 | 중국어
시간적 지침을 사용한 견고한 고해상도 비디오 매트(Robust High-Resolution Video Matting with Temporal Guidance) 논문의 공식 저장소입니다. RVM은 강력한 휴먼 비디오 매트를 위해 특별히 설계되었습니다. 프레임을 독립적인 이미지로 처리하는 기존 신경 모델과 달리 RVM은 순환 신경망을 사용하여 시간 기억으로 비디오를 처리합니다. RVM은 추가 입력 없이 모든 비디오에 대해 실시간으로 매팅을 수행할 수 있습니다. Nvidia GTX 1080 Ti GPU에서 4K 76FPS 및 HD 104FPS를 달성합니다. 이 프로젝트는 ByteDance Inc.에서 개발되었습니다.
[2021년 11월 3일] train.py의 버그가 수정되었습니다.
[2021년 9월 16일] 코드가 GPL-3.0 라이선스에 따라 다시 릴리스되었습니다.
[2021년 8월 25일] 소스 코드와 사전 학습된 모델이 게시되었습니다.
[2021년 7월 27일] 논문은 WACV 2022에서 승인됩니다.
쇼릴 영상(YouTube, Bilibili)을 통해 모델의 퍼포먼스를 확인해보세요.
영상 속 모든 영상은 구글 드라이브에서 보실 수 있습니다.
웹캠 데모: 브라우저에서 실시간으로 모델을 실행해 보세요. 반복 상태를 시각화합니다.
Colab 데모: 무료 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 양자화 모델을 직접 내보내는 것을 고려하세요. 의사 |
ONNX | rvm_mobilenetv3_fp32.onnx rvm_mobilenetv3_fp16.onnx rvm_resnet50_fp32.onnx rvm_resnet50_fp16.onnx | CPU 및 CUDA 백엔드를 사용하여 ONNX 런타임에서 테스트되었습니다. 제공되는 모델은 opset 12. Doc, Importer를 사용합니다. |
텐서플로우 | 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.mlmodel rvm_mobilenetv3_1920x1080_s0.25_fp16.ml모델 rvm_mobilenetv3_1920x1080_s0.25_int8.mlmodel | CoreML은 동적 해상도를 지원하지 않습니다. 다른 해상도는 직접 내보낼 수 있습니다. 모델에는 iOS 13 이상이 필요합니다. s downsample_ratio 나타냅니다. 의사, 수출업자 |
모든 모델은 Google Drive 및 Baidu Pan(코드: gym7)에서 사용할 수 있습니다.
종속성을 설치합니다.
pip 설치 -r 요구사항_inference.txt
모델을 로드합니다:
import torchfrom 모델 import MattingNetworkmodel = MattingNetwork('mobilenetv3').eval().cuda() # 또는 "resnet50"model.load_state_dict(torch.load('rvm_mobilenetv3.pth'))
비디오를 변환하기 위해 우리는 간단한 변환 API를 제공합니다:
from inference import Convert_videoconvert_video(model, # 모델은 모든 장치(cpu 또는 cuda)에 있을 수 있습니다.input_source='input.mp4', # 비디오 파일 또는 이미지 시퀀스 디렉터리.output_type='video', # "video" 선택 " 또는 "png_sequence"output_composition='com.mp4', # 비디오인 경우 파일 경로, png 시퀀스.output_alpha="pha.mp4"인 경우 디렉터리 경로, # [선택 사항] 원시 알파 예측을 출력합니다.output_foreground="fgr.mp4", # [선택 사항] 원시 전경 예측을 출력합니다.output_video_mbps=4, # 비디오 mbps를 출력합니다. png 시퀀스에는 필요하지 않습니다.downsample_ratio=None, # 하이퍼파라미터 auto.seq_chunk=12에 대해 None을 조정하거나 사용합니다. # 더 나은 병렬성을 위해 한 번에 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]).view(3, 1, 1).cuda() # 녹색 background.rec = [None] * 4 # 초기 recurrent states.downsample_ratio = 0.25 # video.with torch.no_grad():for src in DataLoader(reader)에 따라 조정: # RGB 텐서 0 ~ 1.fgr로 정규화됨, pha, *rec = model(src.cuda(), *rec, downsample_ratio) # 주기 the recurrent states.com = fgr * pha + bgr * (1 - pha) # 녹색 배경으로 합성. writer.write(com) # 프레임을 씁니다.
모델 및 변환기 API는 TorchHub를 통해서도 사용할 수 있습니다.
# 모델 로드 = torch.hub.load("PeterL1n/RobustVideoMatting", "mobilenetv3") # 또는 "resnet50"# 변환기 API.convert_video = torch.hub.load("PeterL1n/RobustVideoMatting", "converter")
downsample_ratio
하이퍼파라미터, 추가 변환기 인수 및 고급 사용법에 대한 자세한 내용은 추론 문서를 참조하세요.
자신의 모델을 학습하고 평가하려면 학습 문서를 참조하세요.
속도는 참고용으로 inference_speed_test.py
로 측정됩니다.
GPU | d유형 | HD(1920x1080) | 4K(3840x2160) |
---|---|---|---|
RTX 3090 | FP16 | 172FPS | 154FPS |
RTX 2060 슈퍼 | FP16 | 134FPS | 108FPS |
GTX 1080Ti | FP32 | 104FPS | 74FPS |
참고 1: HD는 downsample_ratio=0.25
사용하고, 4K는 downsample_ratio=0.125
사용합니다. 모든 테스트에서는 배치 크기 1과 프레임 청크 1을 사용합니다.
참고 2: Turing 아키텍처 이전의 GPU는 FP16 추론을 지원하지 않으므로 GTX 1080 Ti는 FP32를 사용합니다.
참고 3: 텐서 처리량만 측정합니다. 이 저장소에 제공된 비디오 변환 스크립트는 하드웨어 비디오 인코딩/디코딩을 활용하지 않고 병렬 스레드에서 텐서 전송이 수행되지 않기 때문에 훨씬 느릴 것으로 예상됩니다. Python에서 하드웨어 비디오 인코딩/디코딩을 구현하는 데 관심이 있다면 PyNvCodec을 참조하세요.
린 산촨
양린지에
임란 살레미
수미야딥 센굽타
NCNN C++ 안드로이드(@FeiGeChuanShu)
lite.ai.toolkit(@DefTruth)
Gradio 웹 데모(@AK391)
NatML을 사용한 Unity 엔진 데모(@nsuite)
MNN C++ 데모(@DefTruth)
TNN C++ 데모(@DefTruth)