Use isso: https://github.com/facebookresearch/maskrcnn-benchmark

Exemplo de saída de E2E_MASK_RCNN-R-101-FPN_2X usando o peso pré-traido do Detectro.

Exemplo de saída correspondente da Detectron.

Exemplo de saída de E2E_KEYPONT_RCNN-R-50-FPN_S1X usando o peso pré-traido do Detectro.
Este código segue a arquitetura de implementação do Detectron. Apenas parte da funcionalidade é suportada. Verifique esta seção para obter mais informações.
Com este código, você pode ...
Este repositório é originalmente construído no Jwyang/Faster-rcnn.pytorch. No entanto, após muitas modificações, a estrutura muda muito e agora é mais semelhante à Detectron. Eu deliberadamente faço de tudo semelhante ou idêntico à implementação da Detectron, de modo a reproduzir o resultado diretamente de arquivos de peso pré -arraigados oficiais.
Esta implementação tem os seguintes recursos:
É um código pytorch puro . Obviamente, existem algum código CUDA.
Ele suporta treinamento em lote de várias imagens .
Ele suporta o treinamento de GPUs múltiplos .
Ele suporta três métodos de pool . Observe que apenas o Align do ROI é revisado para corresponder à implementação no CAFFE2. Então, use -o.
É eficiente em memória . Para lotes de dados, existem duas tecnologia disponíveis para reduzir o uso da memória: 1) agrupamento de aspectos : imagens de grupo com proporção semelhante em um lote 2) Cropping de aspecto : imagens de culturas que são muito longas. O agrupamento de aspectos é implementado no Detectron, por isso é usado para padrão. Cropping de aspecto é a idéia de Jwyang/Faster-rcnn.pytorch, e não é usada para inadimplência.
Além disso, implemento um módulo nn.DataParallel personalizado que permite diferentes tamanho de blob em lote em diferentes GPUs. Verifique minha seção NN.DataParallelel para obter mais detalhes sobre isso.
Clone o repo:
git clone https://github.com/roytseng-tw/mask-rcnn.pytorch.git
Testado em Python3.
Compilar o código CUDA:
cd lib # please change to this directory
sh make.sh
Se você estiver usando GPUs Volta, descompor esta linha em lib/mask.sh e lembre -se de adiar uma barra de barra na linha acima. CUDA_PATH Padrões para /usr/loca/cuda . Se você deseja usar uma biblioteca CUDA em um caminho diferente, altere essa linha de acordo.
Ele compilará todos os módulos que você precisa, incluindo NMS, ROI_POOING, ROI_CROP e ROI_ALIGN. (Na verdade, a GPU NMS nunca é usada ...)
Observe que, se você usar CUDA_VISIBLE_DEVICES para definir GPUs, verifique se pelo menos uma GPU está visível ao compilar o código.
Crie uma pasta de dados sob o repo,
cd {repo_root}
mkdir data
Coco : Baixe as imagens e anotações do Coco do site Coco.
E certifique -se de colocar os arquivos como a seguinte estrutura:
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
├── ...
Baixe as anotações Coco Mini daqui. Observe que o Minival é exatamente equivalente ao recém -definido Val Set 2017. Da mesma forma, a União do ValminusMinival e o trem de 2014 são exatamente equivalentes ao conjunto de trens de 2017.
Sinta -se à vontade para colocar o conjunto de dados em qualquer lugar que desejar e, em seguida, link suave o conjunto de dados sob a data/ pasta:
ln -s path/to/coco data/coco
Recomendar colocar as imagens em um SSD para possível melhor desempenho de treinamento
Eu uso pesos de imageneta de imagenet da Caffe para as redes de backbone.
Faça o download e coloque -os no {repo_root}/data/pretrained_model .
Você pode o seguinte comando para baixar todos eles:
argparse_color_formater , colorama , requests python tools/download_imagenet_weights.py
NOTA : Os pesos pré -representados de cafe têm um desempenho um pouco melhor do que o pytorch pré -treinado. Sugira usar modelos de cafe -tenei com o link acima para reproduzir os resultados. A propósito, o Detectron também usa pesos pré -terenciados da Caffe.
Se você deseja usar modelos pré-treinados do Pytorch, lembre-se de transpor imagens de BGR para RGB e também use o mesmo pré-processamento de dados (média e normalização de menos), conforme usado no modelo pré-traido Pytorch.
Além de usar os pesos pré -tenhados para o RESNET acima, você também pode usar os pesos do Detectron alterando a linha correspondente no arquivo de configuração do modelo da seguinte forma:
RESNETS:
IMAGENET_PRETRAINED_WEIGHTS: 'data/pretrained_model/R-50.pkl'
R-50-GN.PKL e R-101-GN.PKL são necessários para GN_BaseLines.
X-101-32X8D.PKL, X-101-64X4D.PKL e X-152-32X8D-In5k.pkl são necessários para os backbones do RESNEXT.
Não altere nada nos arquivos de configuração fornecidos (configs/**/xxxx.yml), a menos que você saiba o que está fazendo
Use a variável de ambiente CUDA_VISIBLE_DEVICES para controlar quais GPUs usarem.
batch_size: NUM_GPUS x TRAIN.IMS_PER_BATCH
EFFEFTIL_BATCH_SIZE: Batch_size x iter_size
mudança de algo: new value of something / old value of something
As opções de configuração a seguir serão ajustadas automaticamente de acordo com as configurações de treinamento reais: 1) Número de GPUs NUM_GPUS , 2) Tamanho do lote por gpu TRAIN.IMS_PER_BATCH , 3) período de atualização iter_size
SOLVER.BASE_LR : ajuste diretamente propotional à mudança de batch_size.SOLVER.STEPS , SOLVER.MAX_ITER : Ajuste inversamente propotional à mudança de eficaz_batch_size.Veja o máscara-rcnn com o backbone RES50, por exemplo.
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}
Use --bs para substituir o tamanho do lote padrão a um valor adequado que se encaixa nas suas GPUs. Simliar para --nw , número de encadeamentos de carregadores de dados Padrões para 4 em config.py.
Especifique —-use_tfboard para registrar as perdas no Tensorboard.
Nota : Use --dataset keypoints_coco2017 ao treinar para o KeyPoint-RCNN.
--iter_size Como em Caffe, atualize a rede uma vez ( optimizer.step() ) todas as iterações iter_size (para frente + para trás). Dessa forma, de ter um tamanho de lote eficaz maior para o treinamento. Observe que a contagem de etapas é aumentada apenas após a atualização da rede.
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 padrões para 1.
python tools/train_net_step.py ... --load_ckpt {path/to/the/checkpoint}
ou usando o arquivo de ponto de verificação da 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
Ao retomar o treinamento, a contagem de etapas e o estado do otimizador também serão restaurados do ponto de verificação. Para o otimizador SGD, o estado do otimizador contém o momento para cada parâmetro treinável.
Nota : --resume ainda não foi suportado para --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 para evitar salvar qualquer ponto de verificação ou log. python train_net_step.py --help
Em resumo, use train_net_step.py .
In train_net_step.py :
SOLVER.LR_POLICY: steps_with_decay é suportado. (Depreciado) em train_net.py Algumas opções de configuração não têm efeitos e vale a pena notar:
SOLVER.LR_POLICY , SOLVER.MAX_ITER , SOLVER.STEPS , SOLVER.LRS : Por enquanto, a política de treinamento é controlada por esses argumentos da linha de comando:
--epochs : Quantas épocas para treinar. Uma época significa uma viagem por todos os conjuntos de treinamento. Padrões para 6.--lr_decay_epochs : épocas para deteriorar a taxa de aprendizado. A decaimento acontece no início de uma época. A época é indexada em 0. Padrões para [4, 5]. Para mais argumentos da linha de comando, consulte python train_net.py --help
SOLVER.WARM_UP_ITERS , SOLVER.WARM_UP_FACTOR , SOLVER.WARM_UP_METHOD : o aquecimento do treinamento não é suportado.
Por exemplo, teste Mask-rcnn no Coco2017 Val Set
python tools/test_net.py --dataset coco2017 --cfg config/baselines/e2e_mask_rcnn_R-50-FPN_1x.yaml --load_ckpt {path/to/your/checkpoint}
Use --load_detectron para carregar o ponto de verificação do Detectron. Se várias GPUs estiverem disponíveis, adicione --multi-gpu-testing .
Especifique uma diretiva de saída diferente, use --output_dir {...} . Padrões para {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 Padrões para infer_outputs .
Espinha dorsal:
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_pody, fpn_ResNet152_conv5_body . fpn_ResNet152_conv5_P2only_body Cabeça da caixa: ResNet_roi_conv5_head , roi_2mlp_head , roi_Xconv1fc_head , roi_Xconv1fc_gn_head
Máscara da máscara: mask_rcnn_fcn_head_v0upshare , mask_rcnn_fcn_head_v0up , mask_rcnn_fcn_head_v1up , mask_rcnn_fcn_head_v1up4convs , mask_rcnn_fcn_head_v1up4convs_gn
Cabeça dos pontos -chave: roi_pose_head_v1convX
Nota : A nomeação é semelhante à usada no Detectron. Basta remover qualquer add_ para anteceder.
Apenas Coco é apoiado por enquanto. No entanto, toda a implementação da biblioteca do conjunto de dados é quase idêntica aos do Detectron, por isso deve ser fácil adicionar mais conjuntos de dados suportados pela Detectron.
Arquitetura Arquivos de configuração específicos são colocados em configurações. O arquivo de configuração geral lib/core/config.py possui quase todas as opções com os mesmos valores padrão que no Detectron's , por isso é fácil transformar as configurações específicas da arquitetura do Detectron.
Algumas opções do Detectron não são usadas porque as funcionalidades correspondentes ainda não foram implementadas. Por exemplo, o aumento de dados no teste.
MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS = True : se deve carregar pesos com pré -terenciado.RESNETS.IMAGENET_PRETRAINED_WEIGHTS = '' : caminho para pesos residuais de rede pré -traida. Se começar com '/' , ele é tratado como um caminho absoluto. Caso contrário, trate como um caminho relativo para ROOT_DIR .TRAIN.ASPECT_CROPPING = False , TRAIN.ASPECT_HI = 2 , TRAIN.ASPECT_LO = 0.5 : Opções para o corte de aspectos para restringir a faixa de proporção de imagem.RPN.OUT_DIM_AS_IN_DIM = True , RPN.OUT_DIM = 512 , RPN.CLS_ACTIVATION = 'sigmoid' : o implemento oficial do RPN possui os mesmos canais de recursos e saída de saída e use sigmoid como a função de ativação para a previsão da classe BG/BG. Na implementação de Jwyang, ele corrige o número do canal de saída para 512 e usa o Softmax como função de ativação.MODEL.NUM_CLASSES . Ele será definido de acordo com o conjunto de dados especificado por --dataset .TRAIN.WEIGHTS , TRAIN.DATASETS and TEST.DATASETSMODEL.CONV_BODY , FAST_RCNN.ROI_BOX_HEAD ...), remova add_ na string se existe.RESNETS.IMAGENET_PRETRAINED_WEIGHTS apontando para o arquivo de peso pré -treinado. Caso contrário, set MODEL.LOAD_IMAGENET_PRETRAINED_WEIGHTS como False .OUTPUT_DIR: . Na última linhaNUM_GPUS no arquivo de configuração. É usado para inferir o tamanho do lote original para treinamento, e a taxa de aprendizado será escalada linearmente de acordo com a mudança de tamanho do lote. O ajuste adequado da taxa de aprendizado é importante para o treinamento com diferentes tamanhos de lote.RESNETS.USE_GN: True . Benchmark.md