├── .circleci ├── config.yml ├── docker │ └── Dockerfile └── test.yml ├── .dev_scripts ├── gather_models.py └── print_registers.py ├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── 1-bug-report.yml │ ├── 2-feature-request.yml │ ├── 3-new-model.yml │ ├── 4-documentation.yml │ ├── 5-reimplementation.yml │ └── config.yml ├── pull_request_template.md └── workflows │ └── deploy.yml ├── .gitignore ├── .pre-commit-config-zh-cn.yaml ├── .pre-commit-config.yaml ├── .readthedocs.yml ├── LICENSE ├── MANIFEST.in ├── README.md ├── README_zh-CN.md ├── configs ├── _base_ │ ├── default_runtime.py │ ├── det_p5_tta.py │ └── pose │ │ └── coco.py ├── deploy │ ├── base_dynamic.py │ ├── base_static.py │ ├── detection_onnxruntime_dynamic.py │ ├── detection_onnxruntime_static.py │ ├── detection_rknn-fp16_static-320x320.py │ ├── detection_rknn-int8_static-320x320.py │ ├── detection_tensorrt-fp16_dynamic-192x192-960x960.py │ ├── detection_tensorrt-fp16_dynamic-64x64-1344x1344.py │ ├── detection_tensorrt-fp16_static-640x640.py │ ├── detection_tensorrt-int8_dynamic-192x192-960x960.py │ ├── detection_tensorrt-int8_static-640x640.py │ ├── detection_tensorrt_dynamic-192x192-960x960.py │ ├── detection_tensorrt_static-640x640.py │ └── model │ │ ├── yolov5_s-static.py │ │ └── yolov6_s-static.py ├── ppyoloe │ ├── README.md │ ├── metafile.yml │ ├── ppyoloe_l_fast_8xb20-300e_coco.py │ ├── ppyoloe_m_fast_8xb28-300e_coco.py │ ├── ppyoloe_plus_l_fast_8xb8-80e_coco.py │ ├── ppyoloe_plus_m_fast_8xb8-80e_coco.py │ ├── ppyoloe_plus_s_fast_1xb12-40e_cat.py │ ├── ppyoloe_plus_s_fast_8xb8-80e_coco.py │ ├── ppyoloe_plus_x_fast_8xb8-80e_coco.py │ ├── ppyoloe_s_fast_8xb32-300e_coco.py │ ├── ppyoloe_s_fast_8xb32-400e_coco.py │ └── ppyoloe_x_fast_8xb16-300e_coco.py ├── razor │ └── subnets │ │ ├── README.md │ │ ├── rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py │ │ ├── yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py │ │ └── yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py ├── rtmdet │ ├── README.md │ ├── cspnext_imagenet_pretrain │ │ ├── README.md │ │ ├── cspnext-s_8xb256-rsb-a1-600e_in1k.py │ │ └── cspnext-tiny_8xb256-rsb-a1-600e_in1k.py │ ├── distillation │ │ ├── README.md │ │ ├── kd_l_rtmdet_x_neck_300e_coco.py │ │ ├── kd_m_rtmdet_l_neck_300e_coco.py │ │ ├── kd_s_rtmdet_m_neck_300e_coco.py │ │ └── kd_tiny_rtmdet_s_neck_300e_coco.py │ ├── metafile.yml │ ├── rotated │ │ ├── rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py │ │ ├── rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py │ │ ├── rtmdet-r_l_syncbn_fast_2xb4-aug-100e_dota.py │ │ ├── rtmdet-r_l_syncbn_fast_coco-pretrain_2xb4-36e_dota-ms.py │ │ ├── rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py │ │ ├── rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py │ │ ├── rtmdet-r_s_fast_1xb8-36e_dota-ms.py │ │ ├── rtmdet-r_s_fast_1xb8-36e_dota.py │ │ ├── rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py │ │ └── rtmdet-r_tiny_fast_1xb8-36e_dota.py │ ├── rtmdet-ins_s_syncbn_fast_8xb32-300e_coco.py │ ├── rtmdet_l_syncbn_fast_8xb32-300e_coco.py │ ├── rtmdet_m_syncbn_fast_8xb32-300e_coco.py │ ├── rtmdet_s_syncbn_fast_8xb32-300e_coco.py │ ├── rtmdet_tiny_fast_1xb12-40e_cat.py │ ├── rtmdet_tiny_syncbn_fast_8xb32-300e_coco.py │ └── rtmdet_x_syncbn_fast_8xb32-300e_coco.py ├── yolov5 │ ├── README.md │ ├── crowdhuman │ │ ├── yolov5_s-v61_8xb16-300e_ignore_crowdhuman.py │ │ └── yolov5_s-v61_fast_8xb16-300e_crowdhuman.py │ ├── ins_seg │ │ ├── yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py │ │ ├── yolov5_ins_m-v61_syncbn_fast_8xb16-300e_coco_instance.py │ │ ├── yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py │ │ ├── yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py │ │ ├── yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py │ │ ├── yolov5_ins_s-v61_syncbn_fast_non_overlap_8xb16-300e_coco_instance.py │ │ └── yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py │ ├── mask_refine │ │ ├── yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5_m_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py │ │ └── yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py │ ├── metafile.yml │ ├── voc │ │ ├── yolov5_l-v61_fast_1xb32-50e_voc.py │ │ ├── yolov5_m-v61_fast_1xb64-50e_voc.py │ │ ├── yolov5_n-v61_fast_1xb64-50e_voc.py │ │ ├── yolov5_s-v61_fast_1xb64-50e_voc.py │ │ └── yolov5_x-v61_fast_1xb32-50e_voc.py │ ├── yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_s-v61_fast_1xb12-40e_608x352_cat.py │ ├── yolov5_s-v61_fast_1xb12-40e_cat.py │ ├── yolov5_s-v61_fast_1xb12-ms-40e_cat.py │ ├── yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py │ ├── yolov5_s-v61_syncbn_8xb16-300e_coco.py │ ├── yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py │ ├── yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_x-p6-v62_syncbn_fast_8xb16-300e_coco.py │ ├── yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py │ └── yolov5u │ │ ├── yolov5u_l_mask-refine_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_l_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_m_mask-refine_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_m_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_n_mask-refine_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_n_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_s_syncbn_fast_8xb16-300e_coco.py │ │ ├── yolov5u_x_mask-refine_syncbn_fast_8xb16-300e_coco.py │ │ └── yolov5u_x_syncbn_fast_8xb16-300e_coco.py ├── yolov6 │ ├── README.md │ ├── metafile.yml │ ├── yolov6_l_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_m_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_n_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_n_syncbn_fast_8xb32-400e_coco.py │ ├── yolov6_s_fast_1xb12-40e_cat.py │ ├── yolov6_s_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_s_syncbn_fast_8xb32-400e_coco.py │ ├── yolov6_t_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_t_syncbn_fast_8xb32-400e_coco.py │ ├── yolov6_v3_l_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_v3_n_syncbn_fast_8xb32-300e_coco.py │ ├── yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py │ └── yolov6_v3_t_syncbn_fast_8xb32-300e_coco.py ├── yolov7 │ ├── README.md │ ├── metafile.yml │ ├── yolov7_d-p6_syncbn_fast_8x16b-300e_coco.py │ ├── yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py │ ├── yolov7_e2e-p6_syncbn_fast_8x16b-300e_coco.py │ ├── yolov7_l_syncbn_fast_8x16b-300e_coco.py │ ├── yolov7_tiny_fast_1xb12-40e_cat.py │ ├── yolov7_tiny_syncbn_fast_8x16b-300e_coco.py │ ├── yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py │ └── yolov7_x_syncbn_fast_8x16b-300e_coco.py ├── yolov8 │ ├── README.md │ ├── metafile.yml │ ├── yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_l_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_m_mask-refine_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_m_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_n_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_s_fast_1xb12-40e_cat.py │ ├── yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_s_syncbn_fast_8xb16-500e_coco.py │ ├── yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py │ └── yolov8_x_syncbn_fast_8xb16-500e_coco.py └── yolox │ ├── README.md │ ├── metafile.yml │ ├── pose │ ├── yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py │ ├── yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py │ ├── yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py │ └── yolox-pose_tiny_8xb32-300e-rtmdet-hyp_coco.py │ ├── yolox_l_fast_8xb8-300e_coco.py │ ├── yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py │ ├── yolox_m_fast_8xb8-300e_coco.py │ ├── yolox_nano_fast_8xb32-300e-rtmdet-hyp_coco.py │ ├── yolox_nano_fast_8xb8-300e_coco.py │ ├── yolox_p5_tta.py │ ├── yolox_s_fast_1xb12-40e-rtmdet-hyp_cat.py │ ├── yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py │ ├── yolox_s_fast_8xb8-300e_coco.py │ ├── yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py │ ├── yolox_tiny_fast_8xb8-300e_coco.py │ └── yolox_x_fast_8xb8-300e_coco.py ├── demo ├── 15_minutes_instance_segmentation.ipynb ├── 15_minutes_object_detection.ipynb ├── boxam_vis_demo.py ├── demo.jpg ├── demo.mp4 ├── deploy_demo.py ├── dog.jpg ├── featmap_vis_demo.py ├── image_demo.py ├── large_image.jpg ├── large_image_demo.py └── video_demo.py ├── docker ├── Dockerfile └── Dockerfile_deployment ├── docs ├── README.md ├── en │ ├── Makefile │ ├── _static │ │ ├── css │ │ │ └── readthedocs.css │ │ └── image │ │ │ └── mmyolo-logo.png │ ├── advanced_guides │ │ └── cross-library_application.md │ ├── api.rst │ ├── common_usage │ │ ├── amp_training.md │ │ ├── freeze_layers.md │ │ ├── mim_usage.md │ │ ├── module_combination.md │ │ ├── ms_training_testing.md │ │ ├── multi_necks.md │ │ ├── output_predictions.md │ │ ├── plugins.md │ │ ├── resume_training.md │ │ ├── set_random_seed.md │ │ ├── set_syncbn.md │ │ ├── single_multi_channel_applications.md │ │ ├── specify_device.md │ │ └── tta.md │ ├── conf.py │ ├── get_started │ │ ├── 15_minutes_instance_segmentation.md │ │ ├── 15_minutes_object_detection.md │ │ ├── 15_minutes_rotated_object_detection.md │ │ ├── dependencies.md │ │ ├── installation.md │ │ └── overview.md │ ├── index.rst │ ├── make.bat │ ├── model_zoo.md │ ├── notes │ │ ├── changelog.md │ │ ├── code_style.md │ │ ├── compatibility.md │ │ └── conventions.md │ ├── recommended_topics │ │ ├── algorithm_descriptions │ │ │ ├── index.rst │ │ │ ├── rtmdet_description.md │ │ │ ├── yolov5_description.md │ │ │ └── yolov8_description.md │ │ ├── application_examples │ │ │ ├── index.rst │ │ │ └── ionogram_detection.md │ │ ├── complexity_analysis.md │ │ ├── contributing.md │ │ ├── dataset_preparation.md │ │ ├── deploy │ │ │ ├── easydeploy_guide.md │ │ │ ├── index.rst │ │ │ ├── mmdeploy_guide.md │ │ │ └── mmdeploy_yolov5.md │ │ ├── labeling_to_deployment_tutorials.md │ │ ├── mm_basics.md │ │ ├── model_design.md │ │ ├── replace_backbone.md │ │ ├── training_testing_tricks.md │ │ ├── troubleshooting_steps.md │ │ └── visualization.md │ ├── stat.py │ ├── switch_language.md │ ├── tutorials │ │ ├── config.md │ │ ├── custom_installation.md │ │ ├── data_flow.md │ │ ├── faq.md │ │ ├── rotated_detection.md │ │ └── warning_notes.md │ └── useful_tools │ │ ├── browse_coco_json.md │ │ ├── browse_dataset.md │ │ ├── dataset_analysis.md │ │ ├── dataset_converters.md │ │ ├── download_dataset.md │ │ ├── extract_subcoco.md │ │ ├── log_analysis.md │ │ ├── model_converters.md │ │ ├── optimize_anchors.md │ │ ├── print_config.md │ │ └── vis_scheduler.md └── zh_cn │ ├── Makefile │ ├── _static │ ├── css │ │ └── readthedocs.css │ └── image │ │ └── mmyolo-logo.png │ ├── advanced_guides │ └── cross-library_application.md │ ├── api.rst │ ├── common_usage │ ├── amp_training.md │ ├── freeze_layers.md │ ├── mim_usage.md │ ├── module_combination.md │ ├── ms_training_testing.md │ ├── multi_necks.md │ ├── output_predictions.md │ ├── plugins.md │ ├── registries_info.md │ ├── resume_training.md │ ├── set_random_seed.md │ ├── set_syncbn.md │ ├── single_multi_channel_applications.md │ ├── specify_device.md │ └── tta.md │ ├── conf.py │ ├── get_started │ ├── 15_minutes_instance_segmentation.md │ ├── 15_minutes_object_detection.md │ ├── 15_minutes_rotated_object_detection.md │ ├── article.md │ ├── dependencies.md │ ├── installation.md │ └── overview.md │ ├── index.rst │ ├── make.bat │ ├── model_zoo.md │ ├── notes │ ├── changelog.md │ ├── code_style.md │ ├── compatibility.md │ └── conventions.md │ ├── recommended_topics │ ├── algorithm_descriptions │ │ ├── index.rst │ │ ├── rtmdet_description.md │ │ ├── yolov5_description.md │ │ ├── yolov6_description.md │ │ └── yolov8_description.md │ ├── application_examples │ │ ├── index.rst │ │ └── ionogram_detection.md │ ├── complexity_analysis.md │ ├── contributing.md │ ├── dataset_preparation.md │ ├── deploy │ │ ├── easydeploy_guide.md │ │ ├── index.rst │ │ ├── mmdeploy_guide.md │ │ └── mmdeploy_yolov5.md │ ├── labeling_to_deployment_tutorials.md │ ├── mm_basics.md │ ├── model_design.md │ ├── replace_backbone.md │ ├── training_testing_tricks.md │ ├── troubleshooting_steps.md │ └── visualization.md │ ├── stat.py │ ├── switch_language.md │ ├── tutorials │ ├── config.md │ ├── custom_installation.md │ ├── data_flow.md │ ├── faq.md │ ├── rotated_detection.md │ └── warning_notes.md │ └── useful_tools │ ├── browse_coco_json.md │ ├── browse_dataset.md │ ├── dataset_analysis.md │ ├── dataset_converters.md │ ├── download_dataset.md │ ├── extract_subcoco.md │ ├── log_analysis.md │ ├── model_converters.md │ ├── optimize_anchors.md │ ├── print_config.md │ └── vis_scheduler.md ├── mmyolo ├── __init__.py ├── datasets │ ├── __init__.py │ ├── pose_coco.py │ ├── transforms │ │ ├── __init__.py │ │ ├── formatting.py │ │ ├── keypoint_structure.py │ │ ├── mix_img_transforms.py │ │ └── transforms.py │ ├── utils.py │ ├── yolov5_coco.py │ ├── yolov5_crowdhuman.py │ ├── yolov5_dota.py │ └── yolov5_voc.py ├── deploy │ ├── __init__.py │ ├── models │ │ ├── __init__.py │ │ ├── dense_heads │ │ │ ├── __init__.py │ │ │ └── yolov5_head.py │ │ └── layers │ │ │ ├── __init__.py │ │ │ └── bbox_nms.py │ └── object_detection.py ├── engine │ ├── __init__.py │ ├── hooks │ │ ├── __init__.py │ │ ├── ppyoloe_param_scheduler_hook.py │ │ ├── switch_to_deploy_hook.py │ │ ├── yolov5_param_scheduler_hook.py │ │ └── yolox_mode_switch_hook.py │ └── optimizers │ │ ├── __init__.py │ │ ├── yolov5_optim_constructor.py │ │ └── yolov7_optim_wrapper_constructor.py ├── models │ ├── __init__.py │ ├── backbones │ │ ├── __init__.py │ │ ├── base_backbone.py │ │ ├── csp_darknet.py │ │ ├── csp_resnet.py │ │ ├── cspnext.py │ │ ├── efficient_rep.py │ │ └── yolov7_backbone.py │ ├── data_preprocessors │ │ ├── __init__.py │ │ └── data_preprocessor.py │ ├── dense_heads │ │ ├── __init__.py │ │ ├── ppyoloe_head.py │ │ ├── rtmdet_head.py │ │ ├── rtmdet_ins_head.py │ │ ├── rtmdet_rotated_head.py │ │ ├── yolov5_head.py │ │ ├── yolov5_ins_head.py │ │ ├── yolov6_head.py │ │ ├── yolov7_head.py │ │ ├── yolov8_head.py │ │ ├── yolox_head.py │ │ └── yolox_pose_head.py │ ├── detectors │ │ ├── __init__.py │ │ └── yolo_detector.py │ ├── layers │ │ ├── __init__.py │ │ ├── ema.py │ │ └── yolo_bricks.py │ ├── losses │ │ ├── __init__.py │ │ ├── iou_loss.py │ │ └── oks_loss.py │ ├── necks │ │ ├── __init__.py │ │ ├── base_yolo_neck.py │ │ ├── cspnext_pafpn.py │ │ ├── ppyoloe_csppan.py │ │ ├── yolov5_pafpn.py │ │ ├── yolov6_pafpn.py │ │ ├── yolov7_pafpn.py │ │ ├── yolov8_pafpn.py │ │ └── yolox_pafpn.py │ ├── plugins │ │ ├── __init__.py │ │ └── cbam.py │ ├── task_modules │ │ ├── __init__.py │ │ ├── assigners │ │ │ ├── __init__.py │ │ │ ├── batch_atss_assigner.py │ │ │ ├── batch_dsl_assigner.py │ │ │ ├── batch_task_aligned_assigner.py │ │ │ ├── batch_yolov7_assigner.py │ │ │ ├── pose_sim_ota_assigner.py │ │ │ └── utils.py │ │ └── coders │ │ │ ├── __init__.py │ │ │ ├── distance_angle_point_coder.py │ │ │ ├── distance_point_bbox_coder.py │ │ │ ├── yolov5_bbox_coder.py │ │ │ └── yolox_bbox_coder.py │ └── utils │ │ ├── __init__.py │ │ └── misc.py ├── registry.py ├── testing │ ├── __init__.py │ └── _utils.py ├── utils │ ├── __init__.py │ ├── boxam_utils.py │ ├── collect_env.py │ ├── labelme_utils.py │ ├── large_image.py │ ├── misc.py │ └── setup_env.py └── version.py ├── model-index.yml ├── projects ├── assigner_visualization │ ├── README.md │ ├── assigner_visualization.py │ ├── configs │ │ ├── rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py │ │ ├── yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py │ │ ├── yolov7_tiny_syncbn_fast_8xb16-300e_coco_assignervisualization.py │ │ └── yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py │ ├── dense_heads │ │ ├── __init__.py │ │ ├── rtmdet_head_assigner.py │ │ ├── yolov5_head_assigner.py │ │ ├── yolov7_head_assigner.py │ │ └── yolov8_head_assigner.py │ ├── detectors │ │ ├── __init__.py │ │ └── yolo_detector_assigner.py │ └── visualization │ │ ├── __init__.py │ │ └── assigner_visualizer.py ├── easydeploy │ ├── README.md │ ├── README_zh-CN.md │ ├── backbone │ │ ├── __init__.py │ │ ├── common.py │ │ └── focus.py │ ├── bbox_code │ │ ├── __init__.py │ │ └── bbox_coder.py │ ├── deepstream │ │ ├── CMakeLists.txt │ │ ├── README.md │ │ ├── README_zh-CN.md │ │ ├── coco_labels.txt │ │ ├── configs │ │ │ ├── config_infer_rtmdet.txt │ │ │ ├── config_infer_yolov5.txt │ │ │ └── config_infer_yolov8.txt │ │ ├── custom_mmyolo_bbox_parser │ │ │ └── nvdsparsebbox_mmyolo.cpp │ │ └── deepstream_app_config.txt │ ├── docs │ │ └── model_convert.md │ ├── examples │ │ ├── config.py │ │ ├── cv2_nms.py │ │ ├── main_onnxruntime.py │ │ ├── numpy_coder.py │ │ ├── preprocess.py │ │ └── requirements.txt │ ├── model │ │ ├── __init__.py │ │ ├── backend.py │ │ ├── backendwrapper.py │ │ └── model.py │ ├── nms │ │ ├── __init__.py │ │ ├── ort_nms.py │ │ └── trt_nms.py │ └── tools │ │ ├── build_engine.py │ │ ├── export_onnx.py │ │ └── image-demo.py ├── example_project │ ├── README.md │ ├── configs │ │ └── yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py │ └── dummy │ │ ├── __init__.py │ │ └── dummy_yolov5cspdarknet.py └── misc │ ├── custom_dataset │ ├── README.md │ ├── yolov5_s-v61_syncbn_fast_1xb32-100e_cat.py │ ├── yolov6_s_syncbn_fast_1xb32-100e_cat.py │ └── yolov7_tiny_syncbn_fast_1xb32-100e_cat.py │ └── ionogram_detection │ ├── README.md │ ├── rtmdet │ ├── rtmdet_l_fast_1xb32-100e_ionogram.py │ ├── rtmdet_s_fast_1xb32-100e_ionogram.py │ └── rtmdet_tiny_fast_1xb32-100e_ionogram.py │ ├── yolov5 │ ├── yolov5_m-v61_fast_1xb32-100e_ionogram.py │ ├── yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py │ ├── yolov5_s-v61_fast_1xb96-100e_ionogram.py │ ├── yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py │ ├── yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py │ ├── yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine_albu_hsv.py │ └── yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py │ ├── yolov6 │ ├── yolov6_l_fast_1xb32-100e_ionogram.py │ ├── yolov6_m_fast_1xb32-100e_ionogram.py │ ├── yolov6_s_fast_1xb32-100e_ionogram.py │ └── yolov6_s_fast_1xb32-200e_ionogram_pre0.py │ └── yolov7 │ ├── yolov7_l_fast_1xb16-100e_ionogram.py │ ├── yolov7_tiny_fast_1xb16-100e_ionogram.py │ └── yolov7_x_fast_1xb16-100e_ionogram.py ├── pytest.ini ├── requirements.txt ├── requirements ├── albu.txt ├── build.txt ├── docs.txt ├── mminstall.txt ├── mmpose.txt ├── mmrotate.txt ├── runtime.txt ├── sahi.txt └── tests.txt ├── resources ├── mmyolo-logo.png ├── qq_group_qrcode.jpg └── zhihu_qrcode.jpg ├── setup.cfg ├── setup.py ├── tests ├── data │ ├── VOCdevkit │ │ ├── VOC2007 │ │ │ ├── Annotations │ │ │ │ └── 000001.xml │ │ │ ├── ImageSets │ │ │ │ └── Main │ │ │ │ │ ├── test.txt │ │ │ │ │ └── trainval.txt │ │ │ └── JPEGImages │ │ │ │ └── 000001.jpg │ │ └── VOC2012 │ │ │ ├── Annotations │ │ │ └── 000001.xml │ │ │ ├── ImageSets │ │ │ └── Main │ │ │ │ ├── test.txt │ │ │ │ └── trainval.txt │ │ │ └── JPEGImages │ │ │ └── 000001.jpg │ ├── coco_sample.json │ ├── coco_sample_color.json │ └── color.jpg ├── regression │ └── mmyolo.yml ├── test_datasets │ ├── __init__.py │ ├── test_transforms │ │ ├── __init__.py │ │ ├── test_formatting.py │ │ ├── test_mix_img_transforms.py │ │ └── test_transforms.py │ ├── test_utils.py │ ├── test_yolov5_coco.py │ └── test_yolov5_voc.py ├── test_deploy │ ├── conftest.py │ ├── data │ │ └── model.py │ ├── test_mmyolo_models.py │ └── test_object_detection.py ├── test_downstream │ └── test_mmrazor.py ├── test_engine │ ├── __init__.py │ ├── test_hooks │ │ ├── test_switch_to_deploy_hook.py │ │ ├── test_yolov5_param_scheduler_hook.py │ │ └── test_yolox_mode_switch_hook.py │ └── test_optimizers │ │ ├── __init__.py │ │ ├── test_yolov5_optim_constructor.py │ │ └── test_yolov7_optim_wrapper_constructor.py ├── test_models │ ├── __init__.py │ ├── test_backbone │ │ ├── __init__.py │ │ ├── test_csp_darknet.py │ │ ├── test_csp_resnet.py │ │ ├── test_efficient_rep.py │ │ ├── test_yolov7_backbone.py │ │ └── utils.py │ ├── test_data_preprocessor │ │ ├── __init__.py │ │ └── test_data_preprocessor.py │ ├── test_dense_heads │ │ ├── __init__.py │ │ ├── test_ppyoloe_head.py │ │ ├── test_rotated_rtmdet_head.py │ │ ├── test_rtmdet_head.py │ │ ├── test_yolov5_head.py │ │ ├── test_yolov6_head.py │ │ ├── test_yolov7_head.py │ │ ├── test_yolov8_head.py │ │ └── test_yolox_head.py │ ├── test_detectors │ │ └── test_yolo_detector.py │ ├── test_layers │ │ ├── __init__.py │ │ ├── test_ema.py │ │ └── test_yolo_bricks.py │ ├── test_necks │ │ ├── __init__.py │ │ ├── test_cspnext_pafpn.py │ │ ├── test_ppyoloe_csppan.py │ │ ├── test_yolov5_pafpn.py │ │ ├── test_yolov6_pafpn.py │ │ ├── test_yolov7_pafpn.py │ │ ├── test_yolov8_pafpn.py │ │ └── test_yolox_pafpn.py │ ├── test_plugins │ │ ├── __init__.py │ │ └── test_cbam.py │ ├── test_task_modules │ │ ├── __init__.py │ │ ├── test_assigners │ │ │ ├── __init__.py │ │ │ ├── test_batch_atss_assigner.py │ │ │ ├── test_batch_dsl_assigner.py │ │ │ ├── test_batch_task_aligned_assigner.py │ │ │ └── test_pose_sim_ota_assigner.py │ │ └── test_coders │ │ │ ├── __init__.py │ │ │ ├── test_distance_point_bbox_coder.py │ │ │ ├── test_yolov5_bbox_coder.py │ │ │ └── test_yolox_bbox_coder.py │ └── test_utils │ │ ├── __init__.py │ │ └── test_misc.py └── test_utils │ ├── test_collect_env.py │ └── test_setup_env.py └── tools ├── analysis_tools ├── benchmark.py ├── browse_coco_json.py ├── browse_dataset.py ├── browse_dataset_simple.py ├── confusion_matrix.py ├── dataset_analysis.py ├── get_flops.py ├── optimize_anchors.py └── vis_scheduler.py ├── dataset_converters ├── balloon2coco.py ├── dota │ ├── README.md │ ├── dota_split.py │ └── split_config │ │ ├── multi_scale.json │ │ └── single_scale.json ├── labelme2coco.py └── yolo2coco.py ├── dist_test.sh ├── dist_train.sh ├── misc ├── coco_split.py ├── download_dataset.py ├── extract_subcoco.py ├── print_config.py └── publish_model.py ├── model_converters ├── convert_kd_ckpt_to_student.py ├── ppyoloe_to_mmyolo.py ├── rtmdet_to_mmyolo.py ├── yolov5_to_mmyolo.py ├── yolov5u_to_mmyolo.py ├── yolov6_to_mmyolo.py ├── yolov6_v3_to_mmyolo.py ├── yolov7_to_mmyolo.py ├── yolov8_to_mmyolo.py └── yolox_to_mmyolo.py ├── slurm_test.sh ├── slurm_train.sh ├── test.py └── train.py /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | # this allows you to use CircleCI's dynamic configuration feature 4 | setup: true 5 | 6 | # the path-filtering orb is required to continue a pipeline based on 7 | # the path of an updated fileset 8 | orbs: 9 | path-filtering: circleci/path-filtering@0.1.2 10 | 11 | workflows: 12 | # the always-run workflow is always triggered, regardless of the pipeline parameters. 13 | always-run: 14 | jobs: 15 | # the path-filtering/filter job determines which pipeline 16 | # parameters to update. 17 | - path-filtering/filter: 18 | name: check-updated-files 19 | # 3-column, whitespace-delimited mapping. One mapping per 20 | # line: 21 | # 22 | mapping: | 23 | mmyolo/.* lint_only false 24 | requirements/.* lint_only false 25 | tests/.* lint_only false 26 | tools/.* lint_only false 27 | configs/.* lint_only false 28 | .circleci/.* lint_only false 29 | base-revision: main 30 | # this is the path of the configuration we should trigger once 31 | # path filtering and pipeline parameter value updates are 32 | # complete. In this case, we are using the parent dynamic 33 | # configuration itself. 34 | config-path: .circleci/test.yml 35 | -------------------------------------------------------------------------------- /.circleci/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG PYTORCH="1.8.1" 2 | ARG CUDA="10.2" 3 | ARG CUDNN="7" 4 | 5 | FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel 6 | 7 | # To fix GPG key error when running apt-get update 8 | RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub 9 | RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub 10 | 11 | RUN apt-get update && apt-get install -y ninja-build libglib2.0-0 libsm6 libxrender-dev libxext6 libgl1-mesa-glx 12 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | We appreciate all contributions to improve MMYOLO. Please refer to [CONTRIBUTING.md](https://github.com/open-mmlab/mmcv/blob/master/CONTRIBUTING.md) in MMCV for more details about the contributing guideline. 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/2-feature-request.yml: -------------------------------------------------------------------------------- 1 | name: 🚀 Feature request 2 | description: Suggest an idea for this project 3 | labels: [feature request] 4 | 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | Thank you for suggesting an idea to make MMYOLO better. 10 | We strongly appreciate you creating a PR to implete this feature [here](https://github.com/open-mmlab/mmyolo/pulls)! 11 | 12 | If you need our help, please fill in as much of the following form as you're able. 13 | 14 | - type: textarea 15 | attributes: 16 | label: What is the problem this feature will solve? 17 | placeholder: | 18 | E.g., It is inconvenient when \[....\]. 19 | validations: 20 | required: true 21 | 22 | - type: textarea 23 | attributes: 24 | label: What is the feature you are proposing to solve the problem? 25 | validations: 26 | required: true 27 | 28 | - type: textarea 29 | attributes: 30 | label: What alternatives have you considered? 31 | description: | 32 | Add any other context or screenshots about the feature request here. 33 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/3-new-model.yml: -------------------------------------------------------------------------------- 1 | name: "\U0001F31F New model/dataset addition" 2 | description: Submit a proposal/request to implement a new model / dataset 3 | labels: [ "New model/dataset" ] 4 | 5 | body: 6 | - type: textarea 7 | id: description-request 8 | validations: 9 | required: true 10 | attributes: 11 | label: Model/Dataset description 12 | description: | 13 | Put any and all important information relative to the model/dataset 14 | 15 | - type: checkboxes 16 | attributes: 17 | label: Open source status 18 | description: | 19 | Please provide the open-source status, which would be very helpful 20 | options: 21 | - label: "The model implementation is available" 22 | - label: "The model weights are available." 23 | 24 | - type: textarea 25 | id: additional-info 26 | attributes: 27 | label: Provide useful links for the implementation 28 | description: | 29 | Please provide information regarding the implementation, the weights, and the authors. 30 | Please mention the authors by @gh-username if you're aware of their usernames. 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/4-documentation.yml: -------------------------------------------------------------------------------- 1 | name: 📚 Documentation 2 | description: Report an issue related to https://mmyolo.readthedocs.io/en/latest/. 3 | 4 | body: 5 | - type: textarea 6 | attributes: 7 | label: 📚 The doc issue 8 | description: > 9 | A clear and concise description of what content in https://mmyolo.readthedocs.io/en/latest/ is an issue. 10 | validations: 11 | required: true 12 | 13 | - type: textarea 14 | attributes: 15 | label: Suggest a potential alternative/fix 16 | description: > 17 | Tell us how we could improve the documentation in this regard. 18 | 19 | - type: markdown 20 | attributes: 21 | value: > 22 | Thanks for contributing 🎉! 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | 3 | contact_links: 4 | - name: 💬 Forum 5 | url: https://github.com/open-mmlab/mmyolo/discussions 6 | about: Ask general usage questions and discuss with other MMYOLO community members 7 | - name: 🌐 Explore OpenMMLab 8 | url: https://openmmlab.com/ 9 | about: Get know more about OpenMMLab 10 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | Thanks for your contribution and we appreciate it a lot. The following instructions would make your pull request more healthy and more easily get feedback. If you do not understand some items, don't worry, just make the pull request and seek help from maintainers. 2 | 3 | ## Motivation 4 | 5 | Please describe the motivation for this PR and the goal you want to achieve through this PR. 6 | 7 | ## Modification 8 | 9 | Please briefly describe what modification is made in this PR. 10 | 11 | ## BC-breaking (Optional) 12 | 13 | Does the modification introduce changes that break the backward compatibility of the downstream repos? 14 | If so, please describe how it breaks the compatibility and how the downstream projects should modify their code to keep compatibility with this PR. 15 | 16 | ## Use cases (Optional) 17 | 18 | If this PR introduces a new feature, it is better to list some use cases here and update the documentation. 19 | 20 | ## Checklist 21 | 22 | 1. Pre-commit or other linting tools are used to fix potential lint issues. 23 | 2. The modification is covered by complete unit tests. If not, please add more unit tests to ensure the correctness. 24 | 3. If the modification has a potential influence on downstream projects, this PR should be tested with downstream projects, like MMDetection or MMClassification. 25 | 4. The documentation has been modified accordingly, like docstring or example tutorials. 26 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy 2 | 3 | on: push 4 | 5 | concurrency: 6 | group: ${{ github.workflow }}-${{ github.ref }} 7 | cancel-in-progress: true 8 | 9 | jobs: 10 | build-n-publish: 11 | runs-on: ubuntu-latest 12 | if: startsWith(github.event.ref, 'refs/tags') 13 | steps: 14 | - uses: actions/checkout@v2 15 | - name: Set up Python 3.7 16 | uses: actions/setup-python@v2 17 | with: 18 | python-version: 3.7 19 | - name: Install torch 20 | run: pip install torch 21 | - name: Install wheel 22 | run: pip install wheel 23 | - name: Build MMYOLO 24 | run: python setup.py sdist bdist_wheel 25 | - name: Publish distribution to PyPI 26 | run: | 27 | pip install twine 28 | twine upload dist/* -u __token__ -p ${{ secrets.pypi_password }} 29 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | formats: all 4 | 5 | python: 6 | version: 3.7 7 | install: 8 | - requirements: requirements/docs.txt 9 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include requirements/*.txt 2 | include mmyolo/VERSION 3 | include mmyolo/.mim/model-index.yml 4 | include mmyolo/.mim/demo/*/* 5 | recursive-include mmyolo/.mim/configs *.py *.yml 6 | recursive-include mmyolo/.mim/tools *.sh *.py 7 | -------------------------------------------------------------------------------- /configs/_base_/default_runtime.py: -------------------------------------------------------------------------------- 1 | default_scope = 'mmyolo' 2 | 3 | default_hooks = dict( 4 | timer=dict(type='IterTimerHook'), 5 | logger=dict(type='LoggerHook', interval=50), 6 | param_scheduler=dict(type='ParamSchedulerHook'), 7 | checkpoint=dict(type='CheckpointHook', interval=1), 8 | sampler_seed=dict(type='DistSamplerSeedHook'), 9 | visualization=dict(type='mmdet.DetVisualizationHook')) 10 | 11 | env_cfg = dict( 12 | cudnn_benchmark=False, 13 | mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0), 14 | dist_cfg=dict(backend='nccl'), 15 | ) 16 | 17 | vis_backends = [dict(type='LocalVisBackend')] 18 | visualizer = dict( 19 | type='mmdet.DetLocalVisualizer', 20 | vis_backends=vis_backends, 21 | name='visualizer') 22 | log_processor = dict(type='LogProcessor', window_size=50, by_epoch=True) 23 | 24 | log_level = 'INFO' 25 | load_from = None 26 | resume = False 27 | 28 | # Example to use different file client 29 | # Method 1: simply set the data root and let the file I/O module 30 | # automatically infer from prefix (not support LMDB and Memcache yet) 31 | 32 | # data_root = 's3://openmmlab/datasets/detection/coco/' 33 | 34 | # Method 2: Use `backend_args`, `file_client_args` in versions 35 | # before MMDet 3.0.0rc6 36 | # backend_args = dict( 37 | # backend='petrel', 38 | # path_mapping=dict({ 39 | # './data/': 's3://openmmlab/datasets/detection/', 40 | # 'data/': 's3://openmmlab/datasets/detection/' 41 | # })) 42 | 43 | backend_args = None 44 | -------------------------------------------------------------------------------- /configs/deploy/base_dynamic.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_static.py'] 2 | onnx_config = dict( 3 | dynamic_axes={ 4 | 'input': { 5 | 0: 'batch', 6 | 2: 'height', 7 | 3: 'width' 8 | }, 9 | 'dets': { 10 | 0: 'batch', 11 | 1: 'num_dets' 12 | }, 13 | 'labels': { 14 | 0: 'batch', 15 | 1: 'num_dets' 16 | } 17 | }) 18 | -------------------------------------------------------------------------------- /configs/deploy/base_static.py: -------------------------------------------------------------------------------- 1 | onnx_config = dict( 2 | type='onnx', 3 | export_params=True, 4 | keep_initializers_as_inputs=False, 5 | opset_version=11, 6 | save_file='end2end.onnx', 7 | input_names=['input'], 8 | output_names=['dets', 'labels'], 9 | input_shape=None, 10 | optimize=True) 11 | codebase_config = dict( 12 | type='mmyolo', 13 | task='ObjectDetection', 14 | model_type='end2end', 15 | post_processing=dict( 16 | score_threshold=0.05, 17 | confidence_threshold=0.005, 18 | iou_threshold=0.5, 19 | max_output_boxes_per_class=200, 20 | pre_top_k=5000, 21 | keep_top_k=100, 22 | background_label_id=-1), 23 | module=['mmyolo.deploy']) 24 | -------------------------------------------------------------------------------- /configs/deploy/detection_onnxruntime_dynamic.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_dynamic.py'] 2 | codebase_config = dict( 3 | type='mmyolo', 4 | task='ObjectDetection', 5 | model_type='end2end', 6 | post_processing=dict( 7 | score_threshold=0.05, 8 | confidence_threshold=0.005, 9 | iou_threshold=0.5, 10 | max_output_boxes_per_class=200, 11 | pre_top_k=5000, 12 | keep_top_k=100, 13 | background_label_id=-1), 14 | module=['mmyolo.deploy']) 15 | backend_config = dict(type='onnxruntime') 16 | -------------------------------------------------------------------------------- /configs/deploy/detection_onnxruntime_static.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_static.py'] 2 | codebase_config = dict( 3 | type='mmyolo', 4 | task='ObjectDetection', 5 | model_type='end2end', 6 | post_processing=dict( 7 | score_threshold=0.05, 8 | confidence_threshold=0.005, 9 | iou_threshold=0.5, 10 | max_output_boxes_per_class=200, 11 | pre_top_k=5000, 12 | keep_top_k=100, 13 | background_label_id=-1), 14 | module=['mmyolo.deploy']) 15 | backend_config = dict(type='onnxruntime') 16 | -------------------------------------------------------------------------------- /configs/deploy/detection_rknn-fp16_static-320x320.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_static.py'] 2 | onnx_config = dict( 3 | input_shape=[320, 320], output_names=['feat0', 'feat1', 'feat2']) 4 | codebase_config = dict(model_type='rknn') 5 | backend_config = dict( 6 | type='rknn', 7 | common_config=dict(target_platform='rv1126', optimization_level=1), 8 | quantization_config=dict(do_quantization=False, dataset=None), 9 | input_size_list=[[3, 320, 320]]) 10 | -------------------------------------------------------------------------------- /configs/deploy/detection_rknn-int8_static-320x320.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_static.py'] 2 | onnx_config = dict( 3 | input_shape=[320, 320], output_names=['feat0', 'feat1', 'feat2']) 4 | codebase_config = dict(model_type='rknn') 5 | backend_config = dict( 6 | type='rknn', 7 | common_config=dict(target_platform='rv1126', optimization_level=1), 8 | quantization_config=dict(do_quantization=True, dataset=None), 9 | input_size_list=[[3, 320, 320]]) 10 | -------------------------------------------------------------------------------- /configs/deploy/detection_tensorrt-fp16_dynamic-192x192-960x960.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_dynamic.py'] 2 | backend_config = dict( 3 | type='tensorrt', 4 | common_config=dict(fp16_mode=True, max_workspace_size=1 << 30), 5 | model_inputs=[ 6 | dict( 7 | input_shapes=dict( 8 | input=dict( 9 | min_shape=[1, 3, 192, 192], 10 | opt_shape=[1, 3, 640, 640], 11 | max_shape=[1, 3, 960, 960]))) 12 | ]) 13 | use_efficientnms = False # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501 14 | -------------------------------------------------------------------------------- /configs/deploy/detection_tensorrt-fp16_dynamic-64x64-1344x1344.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_dynamic.py'] 2 | backend_config = dict( 3 | type='tensorrt', 4 | common_config=dict(fp16_mode=True, max_workspace_size=1 << 32), 5 | model_inputs=[ 6 | dict( 7 | input_shapes=dict( 8 | input=dict( 9 | min_shape=[1, 3, 64, 64], 10 | opt_shape=[1, 3, 640, 640], 11 | max_shape=[1, 3, 1344, 1344]))) 12 | ]) 13 | use_efficientnms = False # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501 14 | -------------------------------------------------------------------------------- /configs/deploy/detection_tensorrt-fp16_static-640x640.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_static.py'] 2 | onnx_config = dict(input_shape=(640, 640)) 3 | backend_config = dict( 4 | type='tensorrt', 5 | common_config=dict(fp16_mode=True, max_workspace_size=1 << 30), 6 | model_inputs=[ 7 | dict( 8 | input_shapes=dict( 9 | input=dict( 10 | min_shape=[1, 3, 640, 640], 11 | opt_shape=[1, 3, 640, 640], 12 | max_shape=[1, 3, 640, 640]))) 13 | ]) 14 | use_efficientnms = False # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501 15 | -------------------------------------------------------------------------------- /configs/deploy/detection_tensorrt-int8_dynamic-192x192-960x960.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_dynamic.py'] 2 | backend_config = dict( 3 | type='tensorrt', 4 | common_config=dict( 5 | fp16_mode=True, max_workspace_size=1 << 30, int8_mode=True), 6 | model_inputs=[ 7 | dict( 8 | input_shapes=dict( 9 | input=dict( 10 | min_shape=[1, 3, 192, 192], 11 | opt_shape=[1, 3, 640, 640], 12 | max_shape=[1, 3, 960, 960]))) 13 | ]) 14 | calib_config = dict(create_calib=True, calib_file='calib_data.h5') 15 | use_efficientnms = False # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501 16 | -------------------------------------------------------------------------------- /configs/deploy/detection_tensorrt-int8_static-640x640.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_static.py'] 2 | onnx_config = dict(input_shape=(640, 640)) 3 | backend_config = dict( 4 | type='tensorrt', 5 | common_config=dict( 6 | fp16_mode=True, max_workspace_size=1 << 30, int8_mode=True), 7 | model_inputs=[ 8 | dict( 9 | input_shapes=dict( 10 | input=dict( 11 | min_shape=[1, 3, 640, 640], 12 | opt_shape=[1, 3, 640, 640], 13 | max_shape=[1, 3, 640, 640]))) 14 | ]) 15 | calib_config = dict(create_calib=True, calib_file='calib_data.h5') 16 | use_efficientnms = False # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501 17 | -------------------------------------------------------------------------------- /configs/deploy/detection_tensorrt_dynamic-192x192-960x960.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_dynamic.py'] 2 | backend_config = dict( 3 | type='tensorrt', 4 | common_config=dict(fp16_mode=False, max_workspace_size=1 << 30), 5 | model_inputs=[ 6 | dict( 7 | input_shapes=dict( 8 | input=dict( 9 | min_shape=[1, 3, 192, 192], 10 | opt_shape=[1, 3, 640, 640], 11 | max_shape=[1, 3, 960, 960]))) 12 | ]) 13 | use_efficientnms = False # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501 14 | -------------------------------------------------------------------------------- /configs/deploy/detection_tensorrt_static-640x640.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./base_static.py'] 2 | onnx_config = dict(input_shape=(640, 640)) 3 | backend_config = dict( 4 | type='tensorrt', 5 | common_config=dict(fp16_mode=False, max_workspace_size=1 << 30), 6 | model_inputs=[ 7 | dict( 8 | input_shapes=dict( 9 | input=dict( 10 | min_shape=[1, 3, 640, 640], 11 | opt_shape=[1, 3, 640, 640], 12 | max_shape=[1, 3, 640, 640]))) 13 | ]) 14 | use_efficientnms = False # whether to replace TRTBatchedNMS plugin with EfficientNMS plugin # noqa E501 15 | -------------------------------------------------------------------------------- /configs/deploy/model/yolov5_s-static.py: -------------------------------------------------------------------------------- 1 | _base_ = '../../yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' 2 | 3 | test_pipeline = [ 4 | dict(type='LoadImageFromFile', backend_args=_base_.backend_args), 5 | dict( 6 | type='LetterResize', 7 | scale=_base_.img_scale, 8 | allow_scale_up=False, 9 | use_mini_pad=False, 10 | ), 11 | dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'), 12 | dict( 13 | type='mmdet.PackDetInputs', 14 | meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 15 | 'scale_factor', 'pad_param')) 16 | ] 17 | 18 | test_dataloader = dict( 19 | dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None)) 20 | -------------------------------------------------------------------------------- /configs/deploy/model/yolov6_s-static.py: -------------------------------------------------------------------------------- 1 | _base_ = '../../yolov6/yolov6_s_syncbn_fast_8xb32-400e_coco.py' 2 | 3 | test_pipeline = [ 4 | dict(type='LoadImageFromFile', backend_args=_base_.backend_args), 5 | dict( 6 | type='LetterResize', 7 | scale=_base_.img_scale, 8 | allow_scale_up=False, 9 | use_mini_pad=False, 10 | ), 11 | dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'), 12 | dict( 13 | type='mmdet.PackDetInputs', 14 | meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 15 | 'scale_factor', 'pad_param')) 16 | ] 17 | 18 | test_dataloader = dict( 19 | dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None)) 20 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_l_fast_8xb20-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_s_fast_8xb32-300e_coco.py' 2 | 3 | # The pretrained model is geted and converted from official PPYOLOE. 4 | # https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md 5 | checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_l_imagenet1k_pretrained-c0010e6c.pth' # noqa 6 | 7 | deepen_factor = 1.0 8 | widen_factor = 1.0 9 | 10 | train_batch_size_per_gpu = 20 11 | 12 | model = dict( 13 | backbone=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | init_cfg=dict(checkpoint=checkpoint)), 17 | neck=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | ), 21 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 22 | 23 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 24 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_m_fast_8xb28-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_s_fast_8xb32-300e_coco.py' 2 | 3 | # The pretrained model is geted and converted from official PPYOLOE. 4 | # https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md 5 | checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_m_imagenet1k_pretrained-09f1eba2.pth' # noqa 6 | 7 | deepen_factor = 0.67 8 | widen_factor = 0.75 9 | 10 | train_batch_size_per_gpu = 28 11 | 12 | model = dict( 13 | backbone=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | init_cfg=dict(checkpoint=checkpoint)), 17 | neck=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | ), 21 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 22 | 23 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 24 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_plus_l_fast_8xb8-80e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py' 2 | 3 | # The pretrained model is geted and converted from official PPYOLOE. 4 | # https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md 5 | load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/ppyoloe_plus_l_obj365_pretrained-3dd89562.pth' # noqa 6 | 7 | deepen_factor = 1.0 8 | widen_factor = 1.0 9 | 10 | model = dict( 11 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | neck=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | ), 16 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 17 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_plus_m_fast_8xb8-80e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py' 2 | 3 | # The pretrained model is geted and converted from official PPYOLOE. 4 | # https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md 5 | load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/ppyoloe_plus_m_ojb365_pretrained-03206892.pth' # noqa 6 | 7 | deepen_factor = 0.67 8 | widen_factor = 0.75 9 | 10 | model = dict( 11 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | neck=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | ), 16 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 17 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_plus_x_fast_8xb8-80e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py' 2 | 3 | # The pretrained model is geted and converted from official PPYOLOE. 4 | # https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md 5 | load_from = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/ppyoloe_plus_x_obj365_pretrained-43a8000d.pth' # noqa 6 | 7 | deepen_factor = 1.33 8 | widen_factor = 1.25 9 | 10 | model = dict( 11 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | neck=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | ), 16 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 17 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_s_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_plus_s_fast_8xb8-80e_coco.py' 2 | 3 | # The pretrained model is geted and converted from official PPYOLOE. 4 | # https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md 5 | checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_s_imagenet1k_pretrained-2be81763.pth' # noqa 6 | 7 | train_batch_size_per_gpu = 32 8 | max_epochs = 300 9 | 10 | # Base learning rate for optim_wrapper 11 | base_lr = 0.01 12 | 13 | model = dict( 14 | data_preprocessor=dict( 15 | mean=[0.485 * 255, 0.456 * 255, 0.406 * 255], 16 | std=[0.229 * 255., 0.224 * 255., 0.225 * 255.]), 17 | backbone=dict( 18 | block_cfg=dict(use_alpha=False), 19 | init_cfg=dict( 20 | type='Pretrained', 21 | prefix='backbone.', 22 | checkpoint=checkpoint, 23 | map_location='cpu')), 24 | train_cfg=dict(initial_epoch=100)) 25 | 26 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 27 | 28 | optim_wrapper = dict(optimizer=dict(lr=base_lr)) 29 | 30 | default_hooks = dict(param_scheduler=dict(total_epochs=int(max_epochs * 1.2))) 31 | 32 | train_cfg = dict(max_epochs=max_epochs) 33 | 34 | # PPYOLOE plus use obj365 pretrained model, but PPYOLOE not, 35 | # `load_from` need to set to None. 36 | load_from = None 37 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_s_fast_8xb32-400e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_s_fast_8xb32-300e_coco.py' 2 | 3 | max_epochs = 400 4 | 5 | model = dict(train_cfg=dict(initial_epoch=133)) 6 | 7 | default_hooks = dict(param_scheduler=dict(total_epochs=int(max_epochs * 1.2))) 8 | 9 | train_cfg = dict(max_epochs=max_epochs) 10 | -------------------------------------------------------------------------------- /configs/ppyoloe/ppyoloe_x_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './ppyoloe_s_fast_8xb32-300e_coco.py' 2 | 3 | # The pretrained model is geted and converted from official PPYOLOE. 4 | # https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.5/configs/ppyoloe/README.md 5 | checkpoint = 'https://download.openmmlab.com/mmyolo/v0/ppyoloe/ppyoloe_pretrain/cspresnet_x_imagenet1k_pretrained-81c33ccb.pth' # noqa 6 | 7 | deepen_factor = 1.33 8 | widen_factor = 1.25 9 | 10 | train_batch_size_per_gpu = 16 11 | 12 | model = dict( 13 | backbone=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | init_cfg=dict(checkpoint=checkpoint)), 17 | neck=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | ), 21 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 22 | 23 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 24 | -------------------------------------------------------------------------------- /configs/razor/subnets/yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | 'mmrazor::_base_/nas_backbones/spos_shufflenet_supernet.py', 3 | '../../yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' 4 | ] 5 | 6 | checkpoint_file = 'https://download.openmmlab.com/mmrazor/v1/spos/spos_shufflenetv2_subnet_8xb128_in1k_flops_0.33M_acc_73.87_20211222-1f0a0b4d_v3.pth' # noqa 7 | fix_subnet = 'https://download.openmmlab.com/mmrazor/v1/spos/spos_shufflenetv2_subnet_8xb128_in1k_flops_0.33M_acc_73.87_20211222-1f0a0b4d_subnet_cfg_v3.yaml' # noqa 8 | widen_factor = 1.0 9 | channels = [160, 320, 640] 10 | 11 | _base_.nas_backbone.out_indices = (1, 2, 3) 12 | _base_.nas_backbone.init_cfg = dict( 13 | type='Pretrained', 14 | checkpoint=checkpoint_file, 15 | prefix='architecture.backbone.') 16 | nas_backbone = dict( 17 | type='mmrazor.sub_model', 18 | fix_subnet=fix_subnet, 19 | cfg=_base_.nas_backbone, 20 | extra_prefix='architecture.backbone.') 21 | 22 | _base_.model.backbone = nas_backbone 23 | _base_.model.neck.widen_factor = widen_factor 24 | _base_.model.neck.in_channels = channels 25 | _base_.model.neck.out_channels = channels 26 | _base_.model.bbox_head.head_module.in_channels = channels 27 | _base_.model.bbox_head.head_module.widen_factor = widen_factor 28 | 29 | find_unused_parameters = True 30 | -------------------------------------------------------------------------------- /configs/razor/subnets/yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | 'mmrazor::_base_/nas_backbones/attentive_mobilenetv3_supernet.py', 3 | '../../yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py' 4 | ] 5 | 6 | checkpoint_file = 'https://download.openmmlab.com/mmrazor/v1/bignas/attentive_mobilenet_subnet_8xb256_in1k_flops-0.93G_acc-80.81_20221229_200440-73d92cc6.pth' # noqa 7 | fix_subnet = 'https://download.openmmlab.com/mmrazor/v1/bignas/ATTENTIVE_SUBNET_A6.yaml' # noqa 8 | deepen_factor = 1.2 9 | widen_factor = 1 10 | channels = [40, 128, 224] 11 | mid_channels = [40, 128, 224] 12 | 13 | _base_.train_dataloader.batch_size = 16 14 | _base_.nas_backbone.out_indices = (2, 4, 6) 15 | _base_.nas_backbone.conv_cfg = dict(type='mmrazor.BigNasConv2d') 16 | _base_.nas_backbone.norm_cfg = dict(type='mmrazor.DynamicBatchNorm2d') 17 | _base_.nas_backbone.init_cfg = dict( 18 | type='Pretrained', 19 | checkpoint=checkpoint_file, 20 | prefix='architecture.backbone.') 21 | nas_backbone = dict( 22 | type='mmrazor.sub_model', 23 | fix_subnet=fix_subnet, 24 | cfg=_base_.nas_backbone, 25 | extra_prefix='backbone.') 26 | 27 | _base_.model.backbone = nas_backbone 28 | _base_.model.neck.widen_factor = widen_factor 29 | _base_.model.neck.deepen_factor = deepen_factor 30 | _base_.model.neck.in_channels = channels 31 | _base_.model.neck.out_channels = mid_channels 32 | _base_.model.bbox_head.head_module.in_channels = mid_channels 33 | _base_.model.bbox_head.head_module.widen_factor = widen_factor 34 | 35 | find_unused_parameters = True 36 | -------------------------------------------------------------------------------- /configs/rtmdet/cspnext_imagenet_pretrain/cspnext-tiny_8xb256-rsb-a1-600e_in1k.py: -------------------------------------------------------------------------------- 1 | _base_ = './cspnext-s_8xb256-rsb-a1-600e_in1k.py' 2 | 3 | model = dict( 4 | backbone=dict(deepen_factor=0.167, widen_factor=0.375), 5 | head=dict(in_channels=384)) 6 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py' 2 | 3 | # ========================modified parameters====================== 4 | data_root = 'data/split_ms_dota/' 5 | # Path of test images folder 6 | test_data_prefix = 'test/images/' 7 | # Submission dir for result submit 8 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 9 | 10 | # =======================Unmodified in most cases================== 11 | train_dataloader = dict(dataset=dict(data_root=data_root)) 12 | 13 | val_dataloader = dict(dataset=dict(data_root=data_root)) 14 | 15 | # Inference on val dataset 16 | test_dataloader = val_dataloader 17 | 18 | # Inference on test dataset and format the output results 19 | # for submission. Note: the test set has no annotation. 20 | # test_dataloader = dict( 21 | # dataset=dict( 22 | # data_root=data_root, 23 | # ann_file='', # test set has no annotation 24 | # data_prefix=dict(img_path=test_data_prefix), 25 | # pipeline=_base_.test_pipeline)) 26 | # test_evaluator = dict( 27 | # type='mmrotate.DOTAMetric', 28 | # format_only=True, 29 | # merge_patches=True, 30 | # outfile_prefix=submission_dir) 31 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_l_syncbn_fast_coco-pretrain_2xb4-36e_dota-ms.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py' 2 | 3 | load_from = 'https://download.openmmlab.com/mmyolo/v0/rtmdet/rtmdet_l_syncbn_fast_8xb32-300e_coco/rtmdet_l_syncbn_fast_8xb32-300e_coco_20230102_135928-ee3abdc4.pth' # noqa 4 | 5 | # Submission dir for result submit 6 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 7 | 8 | # Inference on test dataset and format the output results 9 | # for submission. Note: the test set has no annotation. 10 | # test_dataloader = dict( 11 | # dataset=dict( 12 | # data_root=_base_.data_root, 13 | # ann_file='', # test set has no annotation 14 | # data_prefix=dict(img_path=_base_.test_data_prefix), 15 | # pipeline=_base_.test_pipeline)) 16 | # test_evaluator = dict( 17 | # type='mmrotate.DOTAMetric', 18 | # format_only=True, 19 | # merge_patches=True, 20 | # outfile_prefix=submission_dir) 21 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota-ms.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py' 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-m_8xb256-rsb-a1-600e_in1k-ecb3bbd9.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 0.67 7 | widen_factor = 0.75 8 | 9 | # Submission dir for result submit 10 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 11 | 12 | # =======================Unmodified in most cases================== 13 | model = dict( 14 | backbone=dict( 15 | deepen_factor=deepen_factor, 16 | widen_factor=widen_factor, 17 | init_cfg=dict(checkpoint=checkpoint)), 18 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 19 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 20 | 21 | # Inference on test dataset and format the output results 22 | # for submission. Note: the test set has no annotation. 23 | # test_dataloader = dict( 24 | # dataset=dict( 25 | # data_root=_base_.data_root, 26 | # ann_file='', # test set has no annotation 27 | # data_prefix=dict(img_path=_base_.test_data_prefix), 28 | # pipeline=_base_.test_pipeline)) 29 | # test_evaluator = dict( 30 | # type='mmrotate.DOTAMetric', 31 | # format_only=True, 32 | # merge_patches=True, 33 | # outfile_prefix=submission_dir) 34 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_m_syncbn_fast_2xb4-36e_dota.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py' 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-m_8xb256-rsb-a1-600e_in1k-ecb3bbd9.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 0.67 7 | widen_factor = 0.75 8 | 9 | # Submission dir for result submit 10 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 11 | 12 | # =======================Unmodified in most cases================== 13 | model = dict( 14 | backbone=dict( 15 | deepen_factor=deepen_factor, 16 | widen_factor=widen_factor, 17 | init_cfg=dict(checkpoint=checkpoint)), 18 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 19 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 20 | 21 | # Inference on test dataset and format the output results 22 | # for submission. Note: the test set has no annotation. 23 | # test_dataloader = dict( 24 | # dataset=dict( 25 | # data_root=_base_.data_root, 26 | # ann_file='', # test set has no annotation 27 | # data_prefix=dict(img_path=_base_.test_data_prefix), 28 | # pipeline=_base_.test_pipeline)) 29 | # test_evaluator = dict( 30 | # type='mmrotate.DOTAMetric', 31 | # format_only=True, 32 | # merge_patches=True, 33 | # outfile_prefix=submission_dir) 34 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota-ms.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py' 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-s_imagenet_600e.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 0.33 7 | widen_factor = 0.5 8 | 9 | # Batch size of a single GPU during training 10 | train_batch_size_per_gpu = 8 11 | 12 | # Submission dir for result submit 13 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 14 | 15 | # =======================Unmodified in most cases================== 16 | model = dict( 17 | backbone=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | init_cfg=dict(checkpoint=checkpoint)), 21 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 22 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 23 | 24 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 25 | 26 | # Inference on test dataset and format the output results 27 | # for submission. Note: the test set has no annotation. 28 | # test_dataloader = dict( 29 | # dataset=dict( 30 | # data_root=_base_.data_root, 31 | # ann_file='', # test set has no annotation 32 | # data_prefix=dict(img_path=_base_.test_data_prefix), 33 | # pipeline=_base_.test_pipeline)) 34 | # test_evaluator = dict( 35 | # type='mmrotate.DOTAMetric', 36 | # format_only=True, 37 | # merge_patches=True, 38 | # outfile_prefix=submission_dir) 39 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_s_fast_1xb8-36e_dota.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py' 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-s_imagenet_600e.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 0.33 7 | widen_factor = 0.5 8 | 9 | # Batch size of a single GPU during training 10 | train_batch_size_per_gpu = 8 11 | 12 | # Submission dir for result submit 13 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 14 | 15 | # =======================Unmodified in most cases================== 16 | model = dict( 17 | backbone=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | init_cfg=dict(checkpoint=checkpoint)), 21 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 22 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 23 | 24 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 25 | 26 | # Inference on test dataset and format the output results 27 | # for submission. Note: the test set has no annotation. 28 | # test_dataloader = dict( 29 | # dataset=dict( 30 | # data_root=_base_.data_root, 31 | # ann_file='', # test set has no annotation 32 | # data_prefix=dict(img_path=_base_.test_data_prefix), 33 | # pipeline=_base_.test_pipeline)) 34 | # test_evaluator = dict( 35 | # type='mmrotate.DOTAMetric', 36 | # format_only=True, 37 | # merge_patches=True, 38 | # outfile_prefix=submission_dir) 39 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota-ms.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota-ms.py' 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-tiny_imagenet_600e.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 0.167 7 | widen_factor = 0.375 8 | 9 | # Batch size of a single GPU during training 10 | train_batch_size_per_gpu = 8 11 | 12 | # Submission dir for result submit 13 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 14 | 15 | # =======================Unmodified in most cases================== 16 | model = dict( 17 | backbone=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | init_cfg=dict(checkpoint=checkpoint)), 21 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 22 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 23 | 24 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 25 | 26 | # Inference on test dataset and format the output results 27 | # for submission. Note: the test set has no annotation. 28 | # test_dataloader = dict( 29 | # dataset=dict( 30 | # data_root=_base_.data_root, 31 | # ann_file='', # test set has no annotation 32 | # data_prefix=dict(img_path=_base_.test_data_prefix), 33 | # pipeline=_base_.test_pipeline)) 34 | # test_evaluator = dict( 35 | # type='mmrotate.DOTAMetric', 36 | # format_only=True, 37 | # merge_patches=True, 38 | # outfile_prefix=submission_dir) 39 | -------------------------------------------------------------------------------- /configs/rtmdet/rotated/rtmdet-r_tiny_fast_1xb8-36e_dota.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet-r_l_syncbn_fast_2xb4-36e_dota.py' 2 | 3 | checkpoint = 'https://download.openmmlab.com/mmdetection/v3.0/rtmdet/cspnext_rsb_pretrain/cspnext-tiny_imagenet_600e.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 0.167 7 | widen_factor = 0.375 8 | 9 | # Batch size of a single GPU during training 10 | train_batch_size_per_gpu = 8 11 | 12 | # Submission dir for result submit 13 | submission_dir = './work_dirs/{{fileBasenameNoExtension}}/submission' 14 | 15 | # =======================Unmodified in most cases================== 16 | model = dict( 17 | backbone=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | init_cfg=dict(checkpoint=checkpoint)), 21 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 22 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 23 | 24 | train_dataloader = dict(batch_size=train_batch_size_per_gpu) 25 | 26 | # Inference on test dataset and format the output results 27 | # for submission. Note: the test set has no annotation. 28 | # test_dataloader = dict( 29 | # dataset=dict( 30 | # data_root=_base_.data_root, 31 | # ann_file='', # test set has no annotation 32 | # data_prefix=dict(img_path=_base_.test_data_prefix), 33 | # pipeline=_base_.test_pipeline)) 34 | # test_evaluator = dict( 35 | # type='mmrotate.DOTAMetric', 36 | # format_only=True, 37 | # merge_patches=True, 38 | # outfile_prefix=submission_dir) 39 | -------------------------------------------------------------------------------- /configs/rtmdet/rtmdet-ins_s_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet_s_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | widen_factor = 0.5 4 | 5 | model = dict( 6 | bbox_head=dict( 7 | type='RTMDetInsSepBNHead', 8 | head_module=dict( 9 | type='RTMDetInsSepBNHeadModule', 10 | use_sigmoid_cls=True, 11 | widen_factor=widen_factor), 12 | loss_mask=dict( 13 | type='mmdet.DiceLoss', loss_weight=2.0, eps=5e-6, 14 | reduction='mean')), 15 | test_cfg=dict( 16 | multi_label=True, 17 | nms_pre=1000, 18 | min_bbox_size=0, 19 | score_thr=0.05, 20 | nms=dict(type='nms', iou_threshold=0.6), 21 | max_per_img=100, 22 | mask_thr_binary=0.5)) 23 | 24 | _base_.test_pipeline[-2] = dict( 25 | type='LoadAnnotations', with_bbox=True, with_mask=True, _scope_='mmdet') 26 | 27 | val_dataloader = dict(dataset=dict(pipeline=_base_.test_pipeline)) 28 | test_dataloader = val_dataloader 29 | 30 | val_evaluator = dict(metric=['bbox', 'segm']) 31 | test_evaluator = val_evaluator 32 | -------------------------------------------------------------------------------- /configs/rtmdet/rtmdet_m_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet_l_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 0.67 5 | widen_factor = 0.75 6 | 7 | # =======================Unmodified in most cases================== 8 | model = dict( 9 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 10 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 11 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 12 | -------------------------------------------------------------------------------- /configs/rtmdet/rtmdet_x_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './rtmdet_l_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 1.33 5 | widen_factor = 1.25 6 | 7 | # =======================Unmodified in most cases================== 8 | model = dict( 9 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 10 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 11 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 12 | -------------------------------------------------------------------------------- /configs/yolov5/ins_seg/yolov5_ins_n-v61_syncbn_fast_8xb16-300e_coco_instance.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py' # noqa 2 | 3 | deepen_factor = 0.33 4 | widen_factor = 0.25 5 | 6 | model = dict( 7 | backbone=dict( 8 | deepen_factor=deepen_factor, 9 | widen_factor=widen_factor, 10 | ), 11 | neck=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | ), 15 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 16 | -------------------------------------------------------------------------------- /configs/yolov5/ins_seg/yolov5_ins_s-v61_syncbn_fast_8xb16-300e_balloon_instance.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_ins_s-v61_syncbn_fast_8xb16-300e_coco_instance.py' # noqa 2 | 3 | data_root = 'data/balloon/' 4 | # Path of train annotation file 5 | train_ann_file = 'train.json' 6 | train_data_prefix = 'train/' # Prefix of train image path 7 | # Path of val annotation file 8 | val_ann_file = 'val.json' 9 | val_data_prefix = 'val/' # Prefix of val image path 10 | metainfo = { 11 | 'classes': ('balloon', ), 12 | 'palette': [ 13 | (220, 20, 60), 14 | ] 15 | } 16 | num_classes = 1 17 | 18 | train_batch_size_per_gpu = 4 19 | train_num_workers = 2 20 | log_interval = 1 21 | ##################### 22 | train_dataloader = dict( 23 | batch_size=train_batch_size_per_gpu, 24 | num_workers=train_num_workers, 25 | dataset=dict( 26 | data_root=data_root, 27 | metainfo=metainfo, 28 | data_prefix=dict(img=train_data_prefix), 29 | ann_file=train_ann_file)) 30 | val_dataloader = dict( 31 | dataset=dict( 32 | data_root=data_root, 33 | metainfo=metainfo, 34 | data_prefix=dict(img=val_data_prefix), 35 | ann_file=val_ann_file)) 36 | test_dataloader = val_dataloader 37 | val_evaluator = dict(ann_file=data_root + val_ann_file) 38 | test_evaluator = val_evaluator 39 | default_hooks = dict(logger=dict(interval=log_interval)) 40 | ##################### 41 | 42 | model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes))) 43 | -------------------------------------------------------------------------------- /configs/yolov5/ins_seg/yolov5_ins_x-v61_syncbn_fast_8xb16-300e_coco_instance.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_ins_l-v61_syncbn_fast_8xb16-300e_coco_instance.py' # noqa 2 | 3 | deepen_factor = 1.33 4 | widen_factor = 1.25 5 | 6 | model = dict( 7 | backbone=dict( 8 | deepen_factor=deepen_factor, 9 | widen_factor=widen_factor, 10 | ), 11 | neck=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | ), 15 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 16 | -------------------------------------------------------------------------------- /configs/yolov5/mask_refine/yolov5_n_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # This config will refine bbox by mask while loading annotations and 4 | # transforming after `YOLOv5RandomAffine` 5 | 6 | # ========================modified parameters====================== 7 | deepen_factor = 0.33 8 | widen_factor = 0.25 9 | 10 | # ===============================Unmodified in most cases==================== 11 | model = dict( 12 | backbone=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | ), 16 | neck=dict( 17 | deepen_factor=deepen_factor, 18 | widen_factor=widen_factor, 19 | ), 20 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 21 | -------------------------------------------------------------------------------- /configs/yolov5/mask_refine/yolov5_x_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_l_mask-refine-v61_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # This config use refining bbox and `YOLOv5CopyPaste`. 4 | # Refining bbox means refining bbox by mask while loading annotations and 5 | # transforming after `YOLOv5RandomAffine` 6 | 7 | # ========================modified parameters====================== 8 | deepen_factor = 1.33 9 | widen_factor = 1.25 10 | 11 | # ===============================Unmodified in most cases==================== 12 | model = dict( 13 | backbone=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | ), 17 | neck=dict( 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor, 20 | ), 21 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 22 | -------------------------------------------------------------------------------- /configs/yolov5/voc/yolov5_l-v61_fast_1xb32-50e_voc.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py' 2 | 3 | deepen_factor = 1.0 4 | widen_factor = 1.0 5 | train_batch_size_per_gpu = 32 6 | train_num_workers = 8 7 | 8 | load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco/yolov5_l-v61_syncbn_fast_8xb16-300e_coco_20220917_031007-096ef0eb.pth' # noqa 9 | 10 | model = dict( 11 | backbone=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | ), 15 | neck=dict( 16 | deepen_factor=deepen_factor, 17 | widen_factor=widen_factor, 18 | ), 19 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 20 | 21 | train_dataloader = dict( 22 | batch_size=train_batch_size_per_gpu, num_workers=train_num_workers) 23 | 24 | optim_wrapper = dict( 25 | optimizer=dict(batch_size_per_gpu=train_batch_size_per_gpu)) 26 | -------------------------------------------------------------------------------- /configs/yolov5/voc/yolov5_m-v61_fast_1xb64-50e_voc.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py' 2 | 3 | deepen_factor = 0.67 4 | widen_factor = 0.75 5 | 6 | load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_m-v61_syncbn_fast_8xb16-300e_coco/yolov5_m-v61_syncbn_fast_8xb16-300e_coco_20220917_204944-516a710f.pth' # noqa 7 | 8 | model = dict( 9 | backbone=dict( 10 | deepen_factor=deepen_factor, 11 | widen_factor=widen_factor, 12 | ), 13 | neck=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | ), 17 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 18 | -------------------------------------------------------------------------------- /configs/yolov5/voc/yolov5_n-v61_fast_1xb64-50e_voc.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py' 2 | 3 | deepen_factor = 0.33 4 | widen_factor = 0.25 5 | 6 | load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco/yolov5_n-v61_syncbn_fast_8xb16-300e_coco_20220919_090739-b804c1ad.pth' # noqa 7 | 8 | model = dict( 9 | backbone=dict( 10 | deepen_factor=deepen_factor, 11 | widen_factor=widen_factor, 12 | ), 13 | neck=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | ), 17 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 18 | -------------------------------------------------------------------------------- /configs/yolov5/voc/yolov5_x-v61_fast_1xb32-50e_voc.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb64-50e_voc.py' 2 | 3 | deepen_factor = 1.33 4 | widen_factor = 1.25 5 | train_batch_size_per_gpu = 32 6 | train_num_workers = 8 7 | 8 | # TODO: need to add pretrained_model 9 | load_from = None 10 | 11 | model = dict( 12 | backbone=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | ), 16 | neck=dict( 17 | deepen_factor=deepen_factor, 18 | widen_factor=widen_factor, 19 | ), 20 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 21 | 22 | train_dataloader = dict( 23 | batch_size=train_batch_size_per_gpu, num_workers=train_num_workers) 24 | 25 | optim_wrapper = dict( 26 | optimizer=dict(batch_size_per_gpu=train_batch_size_per_gpu)) 27 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_l-p6-v62_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | deepen_factor = 1.0 4 | widen_factor = 1.0 5 | 6 | model = dict( 7 | backbone=dict( 8 | deepen_factor=deepen_factor, 9 | widen_factor=widen_factor, 10 | ), 11 | neck=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | ), 15 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 16 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_l-v61_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | deepen_factor = 1.0 4 | widen_factor = 1.0 5 | 6 | model = dict( 7 | backbone=dict( 8 | deepen_factor=deepen_factor, 9 | widen_factor=widen_factor, 10 | ), 11 | neck=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | ), 15 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 16 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_n-p6-v62_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = 'yolov5_s-p6-v62_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | deepen_factor = 0.33 4 | widen_factor = 0.25 5 | 6 | model = dict( 7 | backbone=dict( 8 | deepen_factor=deepen_factor, 9 | widen_factor=widen_factor, 10 | ), 11 | neck=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | ), 15 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 16 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_n-v61_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | deepen_factor = 0.33 4 | widen_factor = 0.25 5 | 6 | model = dict( 7 | backbone=dict( 8 | deepen_factor=deepen_factor, 9 | widen_factor=widen_factor, 10 | ), 11 | neck=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | ), 15 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 16 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_s-v61_fast_1xb12-ms-40e_cat.py: -------------------------------------------------------------------------------- 1 | _base_ = 'yolov5_s-v61_fast_1xb12-40e_cat.py' 2 | 3 | model = dict( 4 | data_preprocessor=dict( 5 | type='YOLOv5DetDataPreprocessor', 6 | pad_size_divisor=32, 7 | batch_augments=[ 8 | dict( 9 | type='YOLOXBatchSyncRandomResize', 10 | random_size_range=(480, 800), 11 | size_divisor=32, 12 | interval=1) 13 | ])) 14 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_s-v61_syncbn-detect_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = 'yolov5_s-v61_syncbn_8xb16-300e_coco.py' 2 | 3 | test_pipeline = [ 4 | dict(type='LoadImageFromFile', backend_args=_base_.backend_args), 5 | dict( 6 | type='LetterResize', 7 | scale=_base_.img_scale, 8 | allow_scale_up=True, 9 | use_mini_pad=True), 10 | dict(type='LoadAnnotations', with_bbox=True), 11 | dict( 12 | type='mmdet.PackDetInputs', 13 | meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 14 | 'scale_factor', 'pad_param')) 15 | ] 16 | 17 | val_dataloader = dict( 18 | dataset=dict(pipeline=test_pipeline, batch_shapes_cfg=None)) 19 | test_dataloader = val_dataloader 20 | 21 | model = dict( 22 | test_cfg=dict( 23 | multi_label=False, score_thr=0.25, nms=dict(iou_threshold=0.45))) 24 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | data_root = 'data/balloon/' 5 | # Path of train annotation file 6 | train_ann_file = 'train.json' 7 | train_data_prefix = 'train/' # Prefix of train image path 8 | # Path of val annotation file 9 | val_ann_file = 'val.json' 10 | val_data_prefix = 'val/' # Prefix of val image path 11 | metainfo = { 12 | 'classes': ('balloon', ), 13 | 'palette': [ 14 | (220, 20, 60), 15 | ] 16 | } 17 | num_classes = 1 18 | 19 | train_batch_size_per_gpu = 4 20 | train_num_workers = 2 21 | log_interval = 1 22 | 23 | # =======================Unmodified in most cases================== 24 | train_dataloader = dict( 25 | batch_size=train_batch_size_per_gpu, 26 | num_workers=train_num_workers, 27 | dataset=dict( 28 | data_root=data_root, 29 | metainfo=metainfo, 30 | data_prefix=dict(img=train_data_prefix), 31 | ann_file=train_ann_file)) 32 | val_dataloader = dict( 33 | dataset=dict( 34 | data_root=data_root, 35 | metainfo=metainfo, 36 | data_prefix=dict(img=val_data_prefix), 37 | ann_file=val_ann_file)) 38 | test_dataloader = val_dataloader 39 | val_evaluator = dict(ann_file=data_root + val_ann_file) 40 | test_evaluator = val_evaluator 41 | model = dict(bbox_head=dict(head_module=dict(num_classes=num_classes))) 42 | default_hooks = dict(logger=dict(interval=log_interval)) 43 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = 'yolov5_s-v61_syncbn_8xb16-300e_coco.py' 2 | 3 | # fast means faster training speed, 4 | # but less flexibility for multitasking 5 | model = dict( 6 | data_preprocessor=dict( 7 | type='YOLOv5DetDataPreprocessor', 8 | mean=[0., 0., 0.], 9 | std=[255., 255., 255.], 10 | bgr_to_rgb=True)) 11 | 12 | train_dataloader = dict(collate_fn=dict(type='yolov5_collate')) 13 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_x-p6-v62_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_m-p6-v62_syncbn_fast_8xb16-300e_coco.py' 2 | deepen_factor = 1.33 3 | widen_factor = 1.25 4 | 5 | model = dict( 6 | backbone=dict( 7 | deepen_factor=deepen_factor, 8 | widen_factor=widen_factor, 9 | ), 10 | neck=dict( 11 | deepen_factor=deepen_factor, 12 | widen_factor=widen_factor, 13 | ), 14 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 15 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5_x-v61_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_m-v61_syncbn_fast_8xb16-300e_coco.py' 2 | deepen_factor = 1.33 3 | widen_factor = 1.25 4 | 5 | model = dict( 6 | backbone=dict( 7 | deepen_factor=deepen_factor, 8 | widen_factor=widen_factor, 9 | ), 10 | neck=dict( 11 | deepen_factor=deepen_factor, 12 | widen_factor=widen_factor, 13 | ), 14 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 15 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5u/yolov5u_l_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5u_s_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | # TODO: Update the training hyperparameters 5 | deepen_factor = 1.0 6 | widen_factor = 1.0 7 | 8 | # =======================Unmodified in most cases================== 9 | model = dict( 10 | backbone=dict( 11 | deepen_factor=deepen_factor, 12 | widen_factor=widen_factor, 13 | ), 14 | neck=dict( 15 | deepen_factor=deepen_factor, 16 | widen_factor=widen_factor, 17 | ), 18 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 19 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5u/yolov5u_m_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5u_s_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | # TODO: Update the training hyperparameters 5 | deepen_factor = 0.67 6 | widen_factor = 0.75 7 | 8 | # =======================Unmodified in most cases================== 9 | model = dict( 10 | backbone=dict( 11 | deepen_factor=deepen_factor, 12 | widen_factor=widen_factor, 13 | ), 14 | neck=dict( 15 | deepen_factor=deepen_factor, 16 | widen_factor=widen_factor, 17 | ), 18 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 19 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5u/yolov5u_n_mask-refine_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5u_s_mask-refine_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # This config will refine bbox by mask while loading annotations and 4 | # transforming after `YOLOv5RandomAffine` 5 | 6 | # ========================modified parameters====================== 7 | deepen_factor = 0.33 8 | widen_factor = 0.25 9 | 10 | # ===============================Unmodified in most cases==================== 11 | model = dict( 12 | backbone=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | ), 16 | neck=dict( 17 | deepen_factor=deepen_factor, 18 | widen_factor=widen_factor, 19 | ), 20 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 21 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5u/yolov5u_n_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5u_s_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 0.33 5 | widen_factor = 0.25 6 | 7 | # =======================Unmodified in most cases================== 8 | model = dict( 9 | backbone=dict( 10 | deepen_factor=deepen_factor, 11 | widen_factor=widen_factor, 12 | ), 13 | neck=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | ), 17 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 18 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5u/yolov5u_x_mask-refine_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5u_l_mask-refine_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 1.33 5 | widen_factor = 1.25 6 | 7 | # =======================Unmodified in most cases================== 8 | model = dict( 9 | backbone=dict( 10 | deepen_factor=deepen_factor, 11 | widen_factor=widen_factor, 12 | ), 13 | neck=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | ), 17 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 18 | -------------------------------------------------------------------------------- /configs/yolov5/yolov5u/yolov5u_x_syncbn_fast_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5u_l_syncbn_fast_8xb16-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | # TODO: Update the training hyperparameters 5 | deepen_factor = 1.33 6 | widen_factor = 1.25 7 | 8 | # =======================Unmodified in most cases================== 9 | model = dict( 10 | backbone=dict( 11 | deepen_factor=deepen_factor, 12 | widen_factor=widen_factor, 13 | ), 14 | neck=dict( 15 | deepen_factor=deepen_factor, 16 | widen_factor=widen_factor, 17 | ), 18 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 19 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_m_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 1 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 1 9 | 10 | # ============================== Unmodified in most cases =================== 11 | model = dict( 12 | backbone=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | hidden_ratio=1. / 2, 16 | block_cfg=dict( 17 | type='ConvWrapper', 18 | norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)), 19 | act_cfg=dict(type='SiLU', inplace=True)), 20 | neck=dict( 21 | deepen_factor=deepen_factor, 22 | widen_factor=widen_factor, 23 | hidden_ratio=1. / 2, 24 | block_cfg=dict( 25 | type='ConvWrapper', 26 | norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)), 27 | block_act_cfg=dict(type='SiLU', inplace=True)), 28 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 29 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_n_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_s_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 0.33 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 0.25 9 | 10 | # -----train val related----- 11 | lr_factor = 0.02 # Learning rate scaling factor 12 | 13 | # ============================== Unmodified in most cases =================== 14 | model = dict( 15 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 16 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 17 | bbox_head=dict( 18 | head_module=dict(widen_factor=widen_factor), 19 | loss_bbox=dict(iou_mode='siou'))) 20 | 21 | default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor)) 22 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_n_syncbn_fast_8xb32-400e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_s_syncbn_fast_8xb32-400e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 0.33 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 0.25 9 | 10 | # -----train val related----- 11 | lr_factor = 0.02 # Learning rate scaling factor 12 | 13 | # ============================== Unmodified in most cases =================== 14 | model = dict( 15 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 16 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 17 | bbox_head=dict( 18 | head_module=dict(widen_factor=widen_factor), 19 | loss_bbox=dict(iou_mode='siou'))) 20 | 21 | default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor)) 22 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_s_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_s_syncbn_fast_8xb32-400e_coco.py' 2 | 3 | # ======================= Frequently modified parameters ===================== 4 | # -----train val related----- 5 | # Base learning rate for optim_wrapper 6 | max_epochs = 300 # Maximum training epochs 7 | num_last_epochs = 15 # Last epoch number to switch training pipeline 8 | 9 | # ============================== Unmodified in most cases =================== 10 | default_hooks = dict( 11 | param_scheduler=dict( 12 | type='YOLOv5ParamSchedulerHook', 13 | scheduler_type='cosine', 14 | lr_factor=0.01, 15 | max_epochs=max_epochs)) 16 | 17 | custom_hooks = [ 18 | dict( 19 | type='EMAHook', 20 | ema_type='ExpMomentumEMA', 21 | momentum=0.0001, 22 | update_buffers=True, 23 | strict_load=False, 24 | priority=49), 25 | dict( 26 | type='mmdet.PipelineSwitchHook', 27 | switch_epoch=max_epochs - num_last_epochs, 28 | switch_pipeline=_base_.train_pipeline_stage2) 29 | ] 30 | 31 | train_cfg = dict( 32 | max_epochs=max_epochs, 33 | dynamic_intervals=[(max_epochs - num_last_epochs, 1)]) 34 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_t_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_s_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 0.33 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 0.375 9 | 10 | # ============================== Unmodified in most cases =================== 11 | model = dict( 12 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 13 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 14 | bbox_head=dict( 15 | type='YOLOv6Head', 16 | head_module=dict(widen_factor=widen_factor), 17 | loss_bbox=dict(iou_mode='siou'))) 18 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_t_syncbn_fast_8xb32-400e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_s_syncbn_fast_8xb32-400e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 0.33 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 0.375 9 | 10 | # ============================== Unmodified in most cases =================== 11 | model = dict( 12 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 13 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 14 | bbox_head=dict( 15 | type='YOLOv6Head', 16 | head_module=dict(widen_factor=widen_factor), 17 | loss_bbox=dict(iou_mode='siou'))) 18 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_v3_l_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_v3_m_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 1 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 1 9 | 10 | # ============================== Unmodified in most cases =================== 11 | model = dict( 12 | backbone=dict( 13 | deepen_factor=deepen_factor, 14 | widen_factor=widen_factor, 15 | hidden_ratio=1. / 2, 16 | block_cfg=dict( 17 | type='ConvWrapper', 18 | norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)), 19 | act_cfg=dict(type='SiLU', inplace=True)), 20 | neck=dict( 21 | deepen_factor=deepen_factor, 22 | widen_factor=widen_factor, 23 | hidden_ratio=1. / 2, 24 | block_cfg=dict( 25 | type='ConvWrapper', 26 | norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)), 27 | block_act_cfg=dict(type='SiLU', inplace=True)), 28 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 29 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_v3_n_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 0.33 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 0.25 9 | 10 | # -----train val related----- 11 | lr_factor = 0.02 # Learning rate scaling factor 12 | 13 | # ============================== Unmodified in most cases =================== 14 | model = dict( 15 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 16 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 17 | bbox_head=dict( 18 | head_module=dict(widen_factor=widen_factor), 19 | loss_bbox=dict(iou_mode='siou'))) 20 | 21 | default_hooks = dict(param_scheduler=dict(lr_factor=lr_factor)) 22 | -------------------------------------------------------------------------------- /configs/yolov6/yolov6_v3_t_syncbn_fast_8xb32-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_v3_s_syncbn_fast_8xb32-300e_coco.py' 2 | 3 | # ======================= Possible modified parameters ======================= 4 | # -----model related----- 5 | # The scaling factor that controls the depth of the network structure 6 | deepen_factor = 0.33 7 | # The scaling factor that controls the width of the network structure 8 | widen_factor = 0.375 9 | 10 | # ============================== Unmodified in most cases =================== 11 | model = dict( 12 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 13 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 14 | bbox_head=dict( 15 | type='YOLOv6Head', 16 | head_module=dict(widen_factor=widen_factor), 17 | loss_bbox=dict(iou_mode='siou'))) 18 | -------------------------------------------------------------------------------- /configs/yolov7/yolov7_d-p6_syncbn_fast_8x16b-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py' 2 | 3 | model = dict( 4 | backbone=dict(arch='D'), 5 | neck=dict( 6 | use_maxpool_in_downsample=True, 7 | use_in_channels_in_downsample=True, 8 | block_cfg=dict( 9 | type='ELANBlock', 10 | middle_ratio=0.4, 11 | block_ratio=0.2, 12 | num_blocks=6, 13 | num_convs_in_block=1), 14 | in_channels=[384, 768, 1152, 1536], 15 | out_channels=[192, 384, 576, 768]), 16 | bbox_head=dict( 17 | head_module=dict( 18 | in_channels=[192, 384, 576, 768], 19 | main_out_channels=[384, 768, 1152, 1536], 20 | aux_out_channels=[384, 768, 1152, 1536], 21 | ))) 22 | -------------------------------------------------------------------------------- /configs/yolov7/yolov7_e-p6_syncbn_fast_8x16b-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py' 2 | 3 | model = dict( 4 | backbone=dict(arch='E'), 5 | neck=dict( 6 | use_maxpool_in_downsample=True, 7 | use_in_channels_in_downsample=True, 8 | block_cfg=dict( 9 | type='ELANBlock', 10 | middle_ratio=0.4, 11 | block_ratio=0.2, 12 | num_blocks=6, 13 | num_convs_in_block=1), 14 | in_channels=[320, 640, 960, 1280], 15 | out_channels=[160, 320, 480, 640]), 16 | bbox_head=dict( 17 | head_module=dict( 18 | in_channels=[160, 320, 480, 640], 19 | main_out_channels=[320, 640, 960, 1280]))) 20 | -------------------------------------------------------------------------------- /configs/yolov7/yolov7_e2e-p6_syncbn_fast_8x16b-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov7_w-p6_syncbn_fast_8x16b-300e_coco.py' 2 | 3 | model = dict( 4 | backbone=dict(arch='E2E'), 5 | neck=dict( 6 | use_maxpool_in_downsample=True, 7 | use_in_channels_in_downsample=True, 8 | block_cfg=dict( 9 | type='EELANBlock', 10 | num_elan_block=2, 11 | middle_ratio=0.4, 12 | block_ratio=0.2, 13 | num_blocks=6, 14 | num_convs_in_block=1), 15 | in_channels=[320, 640, 960, 1280], 16 | out_channels=[160, 320, 480, 640]), 17 | bbox_head=dict( 18 | head_module=dict( 19 | in_channels=[160, 320, 480, 640], 20 | main_out_channels=[320, 640, 960, 1280]))) 21 | -------------------------------------------------------------------------------- /configs/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov7_l_syncbn_fast_8x16b-300e_coco.py' 2 | 3 | model = dict( 4 | backbone=dict(arch='X'), 5 | neck=dict( 6 | in_channels=[640, 1280, 1280], 7 | out_channels=[160, 320, 640], 8 | block_cfg=dict( 9 | type='ELANBlock', 10 | middle_ratio=0.4, 11 | block_ratio=0.4, 12 | num_blocks=3, 13 | num_convs_in_block=2), 14 | use_repconv_outs=False), 15 | bbox_head=dict(head_module=dict(in_channels=[320, 640, 1280]))) 16 | -------------------------------------------------------------------------------- /configs/yolov8/yolov8_l_syncbn_fast_8xb16-500e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov8_m_syncbn_fast_8xb16-500e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 1.00 5 | widen_factor = 1.00 6 | last_stage_out_channels = 512 7 | 8 | mixup_prob = 0.15 9 | 10 | # =======================Unmodified in most cases================== 11 | pre_transform = _base_.pre_transform 12 | mosaic_affine_transform = _base_.mosaic_affine_transform 13 | last_transform = _base_.last_transform 14 | 15 | model = dict( 16 | backbone=dict( 17 | last_stage_out_channels=last_stage_out_channels, 18 | deepen_factor=deepen_factor, 19 | widen_factor=widen_factor), 20 | neck=dict( 21 | deepen_factor=deepen_factor, 22 | widen_factor=widen_factor, 23 | in_channels=[256, 512, last_stage_out_channels], 24 | out_channels=[256, 512, last_stage_out_channels]), 25 | bbox_head=dict( 26 | head_module=dict( 27 | widen_factor=widen_factor, 28 | in_channels=[256, 512, last_stage_out_channels]))) 29 | 30 | train_pipeline = [ 31 | *pre_transform, *mosaic_affine_transform, 32 | dict( 33 | type='YOLOv5MixUp', 34 | prob=mixup_prob, 35 | pre_transform=[*pre_transform, *mosaic_affine_transform]), 36 | *last_transform 37 | ] 38 | 39 | train_dataloader = dict(dataset=dict(pipeline=train_pipeline)) 40 | -------------------------------------------------------------------------------- /configs/yolov8/yolov8_n_mask-refine_syncbn_fast_8xb16-500e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov8_s_mask-refine_syncbn_fast_8xb16-500e_coco.py' 2 | 3 | # This config will refine bbox by mask while loading annotations and 4 | # transforming after `YOLOv5RandomAffine` 5 | 6 | deepen_factor = 0.33 7 | widen_factor = 0.25 8 | 9 | model = dict( 10 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 11 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 13 | -------------------------------------------------------------------------------- /configs/yolov8/yolov8_n_syncbn_fast_8xb16-500e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov8_s_syncbn_fast_8xb16-500e_coco.py' 2 | 3 | deepen_factor = 0.33 4 | widen_factor = 0.25 5 | 6 | model = dict( 7 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 8 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 9 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 10 | -------------------------------------------------------------------------------- /configs/yolov8/yolov8_x_mask-refine_syncbn_fast_8xb16-500e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov8_l_mask-refine_syncbn_fast_8xb16-500e_coco.py' 2 | 3 | # This config use refining bbox and `YOLOv5CopyPaste`. 4 | # Refining bbox means refining bbox by mask while loading annotations and 5 | # transforming after `YOLOv5RandomAffine` 6 | 7 | deepen_factor = 1.00 8 | widen_factor = 1.25 9 | 10 | model = dict( 11 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 13 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 14 | -------------------------------------------------------------------------------- /configs/yolov8/yolov8_x_syncbn_fast_8xb16-500e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov8_l_syncbn_fast_8xb16-500e_coco.py' 2 | 3 | deepen_factor = 1.00 4 | widen_factor = 1.25 5 | 6 | model = dict( 7 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 8 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 9 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 10 | -------------------------------------------------------------------------------- /configs/yolox/pose/yolox-pose_l_8xb32-300e-rtmdet-hyp_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py'] 2 | 3 | load_from = 'https://download.openmmlab.com/mmyolo/v0/yolox/yolox_l_fast_8xb8-300e_coco/yolox_l_fast_8xb8-300e_coco_20230213_160715-c731eb1c.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 1.0 7 | widen_factor = 1.0 8 | 9 | # =======================Unmodified in most cases================== 10 | # model settings 11 | model = dict( 12 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 13 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 14 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 15 | -------------------------------------------------------------------------------- /configs/yolox/pose/yolox-pose_m_8xb32-300e-rtmdet-hyp_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = ['./yolox-pose_s_8xb32-300e-rtmdet-hyp_coco.py'] 2 | 3 | load_from = 'https://download.openmmlab.com/mmyolo/v0/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco_20230210_144328-e657e182.pth' # noqa 4 | 5 | # ========================modified parameters====================== 6 | deepen_factor = 0.67 7 | widen_factor = 0.75 8 | 9 | # =======================Unmodified in most cases================== 10 | # model settings 11 | model = dict( 12 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 13 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 14 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 15 | -------------------------------------------------------------------------------- /configs/yolox/yolox_l_fast_8xb8-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolox_s_fast_8xb8-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 1.0 5 | widen_factor = 1.0 6 | 7 | # =======================Unmodified in most cases================== 8 | # model settings 9 | model = dict( 10 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 11 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 13 | -------------------------------------------------------------------------------- /configs/yolox/yolox_m_fast_8xb32-300e-rtmdet-hyp_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolox_s_fast_8xb32-300e-rtmdet-hyp_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 0.67 5 | widen_factor = 0.75 6 | 7 | # =======================Unmodified in most cases================== 8 | # model settings 9 | model = dict( 10 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 11 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 13 | -------------------------------------------------------------------------------- /configs/yolox/yolox_m_fast_8xb8-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolox_s_fast_8xb8-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 0.67 5 | widen_factor = 0.75 6 | 7 | # =======================Unmodified in most cases================== 8 | # model settings 9 | model = dict( 10 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 11 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 13 | -------------------------------------------------------------------------------- /configs/yolox/yolox_nano_fast_8xb32-300e-rtmdet-hyp_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolox_tiny_fast_8xb32-300e-rtmdet-hyp_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 0.33 5 | widen_factor = 0.25 6 | use_depthwise = True 7 | 8 | # =======================Unmodified in most cases================== 9 | # model settings 10 | model = dict( 11 | backbone=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | use_depthwise=use_depthwise), 15 | neck=dict( 16 | deepen_factor=deepen_factor, 17 | widen_factor=widen_factor, 18 | use_depthwise=use_depthwise), 19 | bbox_head=dict( 20 | head_module=dict( 21 | widen_factor=widen_factor, use_depthwise=use_depthwise))) 22 | -------------------------------------------------------------------------------- /configs/yolox/yolox_nano_fast_8xb8-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolox_tiny_fast_8xb8-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 0.33 5 | widen_factor = 0.25 6 | use_depthwise = True 7 | 8 | # =======================Unmodified in most cases================== 9 | # model settings 10 | model = dict( 11 | backbone=dict( 12 | deepen_factor=deepen_factor, 13 | widen_factor=widen_factor, 14 | use_depthwise=use_depthwise), 15 | neck=dict( 16 | deepen_factor=deepen_factor, 17 | widen_factor=widen_factor, 18 | use_depthwise=use_depthwise), 19 | bbox_head=dict( 20 | head_module=dict( 21 | widen_factor=widen_factor, use_depthwise=use_depthwise))) 22 | -------------------------------------------------------------------------------- /configs/yolox/yolox_x_fast_8xb8-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolox_s_fast_8xb8-300e_coco.py' 2 | 3 | # ========================modified parameters====================== 4 | deepen_factor = 1.33 5 | widen_factor = 1.25 6 | 7 | # =======================Unmodified in most cases================== 8 | # model settings 9 | model = dict( 10 | backbone=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 11 | neck=dict(deepen_factor=deepen_factor, widen_factor=widen_factor), 12 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 13 | -------------------------------------------------------------------------------- /demo/demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/demo/demo.jpg -------------------------------------------------------------------------------- /demo/demo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/demo/demo.mp4 -------------------------------------------------------------------------------- /demo/dog.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/demo/dog.jpg -------------------------------------------------------------------------------- /demo/large_image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/demo/large_image.jpg -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG PYTORCH="1.9.0" 2 | ARG CUDA="11.1" 3 | ARG CUDNN="8" 4 | 5 | FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}-devel 6 | 7 | ENV TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0 8.6+PTX" \ 8 | TORCH_NVCC_FLAGS="-Xfatbin -compress-all" \ 9 | CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \ 10 | FORCE_CUDA="1" 11 | 12 | RUN rm /etc/apt/sources.list.d/cuda.list \ 13 | && rm /etc/apt/sources.list.d/nvidia-ml.list \ 14 | && apt-key del 7fa2af80 \ 15 | && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/3bf863cc.pub \ 16 | && apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/7fa2af80.pub 17 | 18 | # (Optional) 19 | # RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list && \ 20 | # pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 21 | 22 | RUN apt-get update \ 23 | && apt-get install -y ffmpeg libsm6 libxext6 git ninja-build libglib2.0-0 libxrender-dev \ 24 | && apt-get clean \ 25 | && rm -rf /var/lib/apt/lists/* 26 | 27 | # Install MMEngine , MMCV and MMDet 28 | RUN pip install --no-cache-dir openmim && \ 29 | mim install --no-cache-dir "mmengine>=0.6.0" "mmcv>=2.0.0rc4,<2.1.0" "mmdet>=3.0.0,<4.0.0" 30 | 31 | # Install MMYOLO 32 | RUN git clone https://github.com/open-mmlab/mmyolo.git /mmyolo && \ 33 | cd /mmyolo && \ 34 | mim install --no-cache-dir -e . 35 | 36 | WORKDIR /mmyolo 37 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | ## Build Documentation 2 | 3 | 1. Clone MMYOLO 4 | 5 | ```bash 6 | git clone https://github.com/open-mmlab/mmyolo.git 7 | cd mmyolo 8 | ``` 9 | 10 | 2. Install the building dependencies of documentation 11 | 12 | ```bash 13 | pip install -r requirements/docs.txt 14 | ``` 15 | 16 | 3. Change directory to `docs/en` or `docs/zh_cn` 17 | 18 | ```bash 19 | cd docs/en # or docs/zh_cn 20 | ``` 21 | 22 | 4. Build documentation 23 | 24 | ```bash 25 | make html 26 | ``` 27 | 28 | 5. Open `_build/html/index.html` with browser 29 | -------------------------------------------------------------------------------- /docs/en/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/en/_static/css/readthedocs.css: -------------------------------------------------------------------------------- 1 | .header-logo { 2 | background-image: url("../image/mmyolo-logo.png"); 3 | background-size: 115px 40px; 4 | height: 40px; 5 | width: 115px; 6 | } 7 | -------------------------------------------------------------------------------- /docs/en/_static/image/mmyolo-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/docs/en/_static/image/mmyolo-logo.png -------------------------------------------------------------------------------- /docs/en/advanced_guides/cross-library_application.md: -------------------------------------------------------------------------------- 1 | # MMYOLO cross-library application 2 | -------------------------------------------------------------------------------- /docs/en/api.rst: -------------------------------------------------------------------------------- 1 | mmyolo.datasets 2 | ------------------ 3 | 4 | datasets 5 | ^^^^^^^^^^ 6 | .. automodule:: mmyolo.datasets 7 | :members: 8 | 9 | transforms 10 | ^^^^^^^^^^^^ 11 | .. automodule:: mmyolo.datasets.transforms 12 | :members: 13 | 14 | mmyolo.engine 15 | -------------- 16 | 17 | hooks 18 | ^^^^^^^^^^ 19 | .. automodule:: mmyolo.engine.hooks 20 | :members: 21 | 22 | optimizers 23 | ^^^^^^^^^^ 24 | .. automodule:: mmyolo.engine.optimizers 25 | :members: 26 | 27 | mmyolo.models 28 | -------------- 29 | 30 | backbones 31 | ^^^^^^^^^^ 32 | .. automodule:: mmyolo.models.backbones 33 | :members: 34 | 35 | data_preprocessor 36 | ^^^^^^^^^^^^^^^^^^^^ 37 | .. automodule:: mmyolo.models.data_preprocessor 38 | :members: 39 | 40 | dense_heads 41 | ^^^^^^^^^^^^ 42 | .. automodule:: mmyolo.models.dense_heads 43 | :members: 44 | 45 | detectors 46 | ^^^^^^^^^^ 47 | .. automodule:: mmyolo.models.detectors 48 | :members: 49 | 50 | layers 51 | ^^^^^^^^^^ 52 | .. automodule:: mmyolo.models.layers 53 | :members: 54 | 55 | losses 56 | ^^^^^^^^^^ 57 | .. automodule:: mmyolo.models.losses 58 | :members: 59 | 60 | necks 61 | ^^^^^^^^^^^^ 62 | .. automodule:: mmyolo.models.necks 63 | :members: 64 | 65 | 66 | task_modules 67 | ^^^^^^^^^^^^^^^ 68 | .. automodule:: mmyolo.models.task_modules 69 | :members: 70 | 71 | utils 72 | ^^^^^^^^^^ 73 | .. automodule:: mmyolo.models.utils 74 | :members: 75 | 76 | 77 | mmyolo.utils 78 | -------------- 79 | .. automodule::mmyolo.utils 80 | :members: 81 | -------------------------------------------------------------------------------- /docs/en/common_usage/amp_training.md: -------------------------------------------------------------------------------- 1 | # Automatic mixed precision(AMP)training 2 | 3 | To enable Automatic Mixing Precision (AMP) training, add `--amp` to the end of the training command, which is as follows: 4 | 5 | ```shell 6 | python tools/train.py python ./tools/train.py ${CONFIG} --amp 7 | ``` 8 | 9 | Specific examples are as follows: 10 | 11 | ```shell 12 | python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --amp 13 | ``` 14 | -------------------------------------------------------------------------------- /docs/en/common_usage/freeze_layers.md: -------------------------------------------------------------------------------- 1 | # Freeze layers 2 | 3 | ## Freeze the weight of backbone 4 | 5 | In MMYOLO, we can freeze some `stages` of the backbone network by setting `frozen_stages` parameters, so that these `stage` parameters do not participate in model updating. 6 | It should be noted that `frozen_stages = i` means that all parameters from the initial `stage` to the `i`th `stage` will be frozen. The following is an example of `YOLOv5`. Other algorithms are the same logic. 7 | 8 | ```python 9 | _base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py' 10 | 11 | model = dict( 12 | backbone=dict( 13 | frozen_stages=1 # Indicates that the parameters in the first stage and all stages before it are frozen 14 | )) 15 | ``` 16 | 17 | ## Freeze the weight of neck 18 | 19 | In addition, it's able to freeze the whole `neck` with the parameter `freeze_all` in MMYOLO. The following is an example of `YOLOv5`. Other algorithms are the same logic. 20 | 21 | ```python 22 | _base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py' 23 | 24 | model = dict( 25 | neck=dict( 26 | freeze_all=True # If freeze_all=True, all parameters of the neck will be frozen 27 | )) 28 | ``` 29 | -------------------------------------------------------------------------------- /docs/en/common_usage/module_combination.md: -------------------------------------------------------------------------------- 1 | # Module combination 2 | -------------------------------------------------------------------------------- /docs/en/common_usage/resume_training.md: -------------------------------------------------------------------------------- 1 | # Resume training 2 | 3 | Resume training means to continue training from the state saved from one of the previous trainings, where the state includes the model weights, the state of the optimizer and the optimizer parameter adjustment strategy. 4 | 5 | The user can add `--resume` at the end of the training command to resume training, and the program will automatically load the latest weight file from `work_dirs` to resume training. If there is an updated checkpoint in `work_dir` (e.g. the training was interrupted during the last training), the training will be resumed from that checkpoint, otherwise (e.g. the last training did not have time to save the checkpoint or a new training task was started) the training will be restarted. Here is an example of resuming training: 6 | 7 | ```shell 8 | python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --resume 9 | ``` 10 | -------------------------------------------------------------------------------- /docs/en/common_usage/set_random_seed.md: -------------------------------------------------------------------------------- 1 | # Set the random seed 2 | 3 | If you want to set the random seed during training, you can use the following command. 4 | 5 | ```shell 6 | python ./tools/train.py \ 7 | ${CONFIG} \ # path of the config file 8 | --cfg-options randomness.seed=2023 \ # set seed to 2023 9 | [randomness.diff_rank_seed=True] \ # set different seeds according to global rank 10 | [randomness.deterministic=True] # set the deterministic option for CUDNN backend 11 | # [] stands for optional parameters, when actually entering the command line, you do not need to enter [] 12 | ``` 13 | 14 | `randomness` has three parameters that can be set, with the following meanings. 15 | 16 | - `randomness.seed=2023`, set the random seed to 2023. 17 | - `randomness.diff_rank_seed=True`, set different seeds according to global rank. Defaults to False. 18 | - `randomness.deterministic=True`, set the deterministic option for cuDNN backend, i.e., set `torch.backends.cudnn.deterministic` to True and `torch.backends.cudnn.benchmark` to False. Defaults to False. See https://pytorch.org/docs/stable/notes/randomness.html for more details. 19 | -------------------------------------------------------------------------------- /docs/en/common_usage/set_syncbn.md: -------------------------------------------------------------------------------- 1 | # Enabling and disabling SyncBatchNorm 2 | -------------------------------------------------------------------------------- /docs/en/common_usage/specify_device.md: -------------------------------------------------------------------------------- 1 | # Specify specific GPUs during training or inference 2 | 3 | If you have multiple GPUs, such as 8 GPUs, numbered `0, 1, 2, 3, 4, 5, 6, 7`, GPU 0 will be used by default for training or inference. If you want to specify other GPUs for training or inference, you can use the following commands: 4 | 5 | ```shell 6 | CUDA_VISIBLE_DEVICES=5 python ./tools/train.py ${CONFIG} #train 7 | CUDA_VISIBLE_DEVICES=5 python ./tools/test.py ${CONFIG} ${CHECKPOINT_FILE} #test 8 | ``` 9 | 10 | If you set `CUDA_VISIBLE_DEVICES` to -1 or a number greater than the maximum GPU number, such as 8, the CPU will be used for training or inference. 11 | 12 | If you want to use several of these GPUs to train in parallel, you can use the following command: 13 | 14 | ```shell 15 | CUDA_VISIBLE_DEVICES=0,1,2,3 ./tools/dist_train.sh ${CONFIG} ${GPU_NUM} 16 | ``` 17 | 18 | Here the `GPU_NUM` is 4. In addition, if multiple tasks are trained in parallel on one machine and each task requires multiple GPUs, the PORT of each task need to be set differently to avoid communication conflict, like the following commands: 19 | 20 | ```shell 21 | CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG} 4 22 | CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG} 4 23 | ``` 24 | -------------------------------------------------------------------------------- /docs/en/get_started/15_minutes_rotated_object_detection.md: -------------------------------------------------------------------------------- 1 | # 15 minutes to get started with MMYOLO rotated object detection 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/en/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/en/notes/code_style.md: -------------------------------------------------------------------------------- 1 | # Code Style 2 | 3 | Coming soon. Please refer to [chinese documentation](https://mmyolo.readthedocs.io/zh_CN/latest/community/code_style.html). 4 | -------------------------------------------------------------------------------- /docs/en/notes/conventions.md: -------------------------------------------------------------------------------- 1 | # Conventions 2 | 3 | Please check the following conventions if you would like to modify MMYOLO as your own project. 4 | 5 | ## About the order of image shape 6 | 7 | In OpenMMLab 2.0, to be consistent with the input argument of OpenCV, the argument about image shape in the data transformation pipeline is always in the `(width, height)` order. On the contrary, for computation convenience, the order of the field going through the data pipeline and the model is `(height, width)`. Specifically, in the results processed by each data transform pipeline, the fields and their value meaning is as below: 8 | 9 | - img_shape: (height, width) 10 | - ori_shape: (height, width) 11 | - pad_shape: (height, width) 12 | - batch_input_shape: (height, width) 13 | 14 | As an example, the initialization arguments of `Mosaic` are as below: 15 | 16 | ```python 17 | @TRANSFORMS.register_module() 18 | class Mosaic(BaseTransform): 19 | def __init__(self, 20 | img_scale: Tuple[int, int] = (640, 640), 21 | center_ratio_range: Tuple[float, float] = (0.5, 1.5), 22 | bbox_clip_border: bool = True, 23 | pad_val: float = 114.0, 24 | prob: float = 1.0) -> None: 25 | ... 26 | 27 | # img_scale order should be (width, height) 28 | self.img_scale = img_scale 29 | 30 | def transform(self, results: dict) -> dict: 31 | ... 32 | 33 | results['img'] = mosaic_img 34 | # (height, width) 35 | results['img_shape'] = mosaic_img.shape[:2] 36 | ``` 37 | -------------------------------------------------------------------------------- /docs/en/recommended_topics/algorithm_descriptions/index.rst: -------------------------------------------------------------------------------- 1 | Algorithm principles and implementation 2 | ****************************************** 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | 7 | yolov5_description.md 8 | yolov8_description.md 9 | rtmdet_description.md 10 | -------------------------------------------------------------------------------- /docs/en/recommended_topics/application_examples/index.rst: -------------------------------------------------------------------------------- 1 | MMYOLO application examples 2 | ******************** 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | 7 | ionogram_detection.md 8 | -------------------------------------------------------------------------------- /docs/en/recommended_topics/deploy/easydeploy_guide.md: -------------------------------------------------------------------------------- 1 | # EasyDeploy Deployment 2 | -------------------------------------------------------------------------------- /docs/en/recommended_topics/deploy/index.rst: -------------------------------------------------------------------------------- 1 | MMDeploy deployment tutorial 2 | ******************************** 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | 7 | mmdeploy_guide.md 8 | mmdeploy_yolov5.md 9 | 10 | EasyDeploy deployment tutorial 11 | ************************************ 12 | 13 | .. toctree:: 14 | :maxdepth: 1 15 | 16 | easydeploy_guide.md 17 | -------------------------------------------------------------------------------- /docs/en/recommended_topics/mm_basics.md: -------------------------------------------------------------------------------- 1 | # MM series repo essential basics 2 | -------------------------------------------------------------------------------- /docs/en/recommended_topics/troubleshooting_steps.md: -------------------------------------------------------------------------------- 1 | # Troubleshooting steps for common errors 2 | -------------------------------------------------------------------------------- /docs/en/switch_language.md: -------------------------------------------------------------------------------- 1 | ## English 2 | 3 | ## 简体中文 4 | -------------------------------------------------------------------------------- /docs/en/tutorials/rotated_detection.md: -------------------------------------------------------------------------------- 1 | # Rotated Object Detection 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/en/useful_tools/download_dataset.md: -------------------------------------------------------------------------------- 1 | # Download Dataset 2 | 3 | `tools/misc/download_dataset.py` supports downloading datasets such as `COCO`, `VOC`, `LVIS` and `Balloon`. 4 | 5 | ```shell 6 | python tools/misc/download_dataset.py --dataset-name coco2017 7 | python tools/misc/download_dataset.py --dataset-name voc2007 8 | python tools/misc/download_dataset.py --dataset-name voc2012 9 | python tools/misc/download_dataset.py --dataset-name lvis 10 | python tools/misc/download_dataset.py --dataset-name balloon [--save-dir ${SAVE_DIR}] [--unzip] 11 | ``` 12 | -------------------------------------------------------------------------------- /docs/en/useful_tools/print_config.md: -------------------------------------------------------------------------------- 1 | # Print the whole config 2 | 3 | `print_config.py` in MMDetection prints the whole config verbatim, expanding all its imports. The command is as following. 4 | 5 | ```shell 6 | mim run mmdet print_config \ 7 | ${CONFIG} \ # path of the config file 8 | [--save-path] \ # save path of whole config, suffixed with .py, .json or .yml 9 | [--cfg-options ${OPTIONS [OPTIONS...]}] # override some settings in the used config 10 | ``` 11 | 12 | Examples: 13 | 14 | ```shell 15 | mim run mmdet print_config \ 16 | configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py \ 17 | --save-path ./work_dirs/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py 18 | ``` 19 | 20 | Running the above command will save the `yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py` config file with the inheritance relationship expanded to \`\`yolov5_s-v61_syncbn_fast_1xb4-300e_balloon_whole.py`in the`./work_dirs\` folder. 21 | -------------------------------------------------------------------------------- /docs/zh_cn/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/zh_cn/_static/css/readthedocs.css: -------------------------------------------------------------------------------- 1 | .header-logo { 2 | background-image: url("../image/mmyolo-logo.png"); 3 | background-size: 115px 40px; 4 | height: 40px; 5 | width: 115px; 6 | } 7 | -------------------------------------------------------------------------------- /docs/zh_cn/_static/image/mmyolo-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/docs/zh_cn/_static/image/mmyolo-logo.png -------------------------------------------------------------------------------- /docs/zh_cn/advanced_guides/cross-library_application.md: -------------------------------------------------------------------------------- 1 | # MMYOLO 跨库应用解析 2 | -------------------------------------------------------------------------------- /docs/zh_cn/api.rst: -------------------------------------------------------------------------------- 1 | mmyolo.datasets 2 | -------------------- 3 | 4 | datasets 5 | ^^^^^^^^^^ 6 | .. automodule:: mmyolo.datasets 7 | :members: 8 | 9 | transforms 10 | ^^^^^^^^^^^^ 11 | .. automodule:: mmyolo.datasets.transforms 12 | :members: 13 | 14 | mmyolo.engine 15 | -------------- 16 | 17 | hooks 18 | ^^^^^^^^^^ 19 | .. automodule:: mmyolo.engine.hooks 20 | :members: 21 | 22 | optimizers 23 | ^^^^^^^^^^ 24 | .. automodule:: mmyolo.engine.optimizers 25 | :members: 26 | 27 | mmyolo.models 28 | -------------- 29 | 30 | backbones 31 | ^^^^^^^^^^ 32 | .. automodule:: mmyolo.models.backbones 33 | :members: 34 | 35 | data_preprocessor 36 | ^^^^^^^^^^^^^^^^^^^ 37 | .. automodule:: mmyolo.models.data_preprocessor 38 | :members: 39 | 40 | dense_heads 41 | ^^^^^^^^^^^^ 42 | .. automodule:: mmyolo.models.dense_heads 43 | :members: 44 | 45 | detectors 46 | ^^^^^^^^^^ 47 | .. automodule:: mmyolo.models.detectors 48 | :members: 49 | 50 | layers 51 | ^^^^^^^^^^ 52 | .. automodule:: mmyolo.models.layers 53 | :members: 54 | 55 | losses 56 | ^^^^^^^^^^ 57 | .. automodule:: mmyolo.models.losses 58 | :members: 59 | 60 | necks 61 | ^^^^^^^^^^^^ 62 | .. automodule:: mmyolo.models.necks 63 | :members: 64 | 65 | 66 | task_modules 67 | ^^^^^^^^^^^^^^^ 68 | .. automodule:: mmyolo.models.task_modules 69 | :members: 70 | 71 | utils 72 | ^^^^^^^^^^ 73 | .. automodule:: mmyolo.models.utils 74 | :members: 75 | 76 | 77 | mmyolo.utils 78 | -------------- 79 | .. automodule:: mmyolo.utils 80 | :members: 81 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/amp_training.md: -------------------------------------------------------------------------------- 1 | # 自动混合精度(AMP)训练 2 | 3 | 如果要开启自动混合精度(AMP)训练,在训练命令最后加上 `--amp` 即可, 命令如下: 4 | 5 | ```shell 6 | python tools/train.py python ./tools/train.py ${CONFIG} --amp 7 | ``` 8 | 9 | 具体例子如下: 10 | 11 | ```shell 12 | python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --amp 13 | ``` 14 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/freeze_layers.md: -------------------------------------------------------------------------------- 1 | # 冻结指定网络层权重 2 | 3 | ## 冻结 backbone 权重 4 | 5 | 在 MMYOLO 中我们可以通过设置 `frozen_stages` 参数去冻结主干网络的部分 `stage`, 使这些 `stage` 的参数不参与模型的更新。 6 | 需要注意的是:`frozen_stages = i` 表示的意思是指从最开始的 `stage` 开始到第 `i` 层 `stage` 的所有参数都会被冻结。下面是 `YOLOv5` 的例子,其他算法也是同样的逻辑: 7 | 8 | ```python 9 | _base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py' 10 | 11 | model = dict( 12 | backbone=dict( 13 | frozen_stages=1 # 表示第一层 stage 以及它之前的所有 stage 中的参数都会被冻结 14 | )) 15 | ``` 16 | 17 | ## 冻结 neck 权重 18 | 19 | MMYOLO 中也可以通过参数 `freeze_all` 去冻结整个 `neck` 的参数。下面是 `YOLOv5` 的例子,其他算法也是同样的逻辑: 20 | 21 | ```python 22 | _base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py' 23 | 24 | model = dict( 25 | neck=dict( 26 | freeze_all=True # freeze_all=True 时表示整个 neck 的参数都会被冻结 27 | )) 28 | ``` 29 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/multi_necks.md: -------------------------------------------------------------------------------- 1 | # 应用多个 Neck 2 | 3 | 如果你想堆叠多个 Neck,可以直接在配置文件中的 Neck 参数,MMYOLO 支持以 `List` 形式拼接多个 Neck 配置,你需要保证上一个 Neck 的输出通道与下一个 Neck 4 | 的输入通道相匹配。如需要调整通道,可以插入 `mmdet.ChannelMapper` 模块用来对齐多个 Neck 之间的通道数量。具体配置如下: 5 | 6 | ```python 7 | _base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py' 8 | 9 | deepen_factor = _base_.deepen_factor 10 | widen_factor = _base_.widen_factor 11 | model = dict( 12 | type='YOLODetector', 13 | neck=[ 14 | dict( 15 | type='YOLOv5PAFPN', 16 | deepen_factor=deepen_factor, 17 | widen_factor=widen_factor, 18 | in_channels=[256, 512, 1024], 19 | out_channels=[256, 512, 1024], 20 | # 因为 out_channels 由 widen_factor 控制,YOLOv5PAFPN 的 out_channels = out_channels * widen_factor 21 | num_csp_blocks=3, 22 | norm_cfg=dict(type='BN', momentum=0.03, eps=0.001), 23 | act_cfg=dict(type='SiLU', inplace=True)), 24 | dict( 25 | type='mmdet.ChannelMapper', 26 | in_channels=[128, 256, 512], 27 | out_channels=128, 28 | ), 29 | dict( 30 | type='mmdet.DyHead', 31 | in_channels=128, 32 | out_channels=256, 33 | num_blocks=2, 34 | # disable zero_init_offset to follow official implementation 35 | zero_init_offset=False) 36 | ], 37 | bbox_head=dict(head_module=dict(in_channels=[512, 512, 512])) 38 | # 因为 out_channels 由 widen_factor 控制,YOLOv5HeadModuled 的 in_channels * widen_factor 才会等于最后一个 neck 的 out_channels 39 | ) 40 | ``` 41 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/output_predictions.md: -------------------------------------------------------------------------------- 1 | # 输出模型预测结果 2 | 3 | 如果想将预测结果保存为特定的文件,用于离线评估,目前 MMYOLO 支持 json 和 pkl 两种格式。 4 | 5 | ```{note} 6 | json 文件仅保存 `image_id`、`bbox`、`score` 和 `category_id`; json 文件可以使用 json 库读取。 7 | pkl 保存内容比 json 文件更多,还会保存预测图片的文件名和尺寸等一系列信息; pkl 文件可以使用 pickle 库读取。 8 | ``` 9 | 10 | ## 输出为 json 文件 11 | 12 | 如果想将预测结果输出为 json 文件,则命令如下: 13 | 14 | ```shell 15 | python tools/test.py ${CONFIG} ${CHECKPOINT} --json-prefix ${JSON_PREFIX} 16 | ``` 17 | 18 | `--json-prefix` 后的参数输入为文件名前缀(无需输入 `.json` 后缀),也可以包含路径。举一个具体例子: 19 | 20 | ```shell 21 | python tools/test.py configs\yolov5\yolov5_s-v61_syncbn_8xb16-300e_coco.py yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth --json-prefix work_dirs/demo/json_demo 22 | ``` 23 | 24 | 运行以上命令会在 `work_dirs/demo` 文件夹下,输出 `json_demo.bbox.json` 文件。 25 | 26 | ## 输出为 pkl 文件 27 | 28 | 如果想将预测结果输出为 pkl 文件,则命令如下: 29 | 30 | ```shell 31 | python tools/test.py ${CONFIG} ${CHECKPOINT} --out ${OUTPUT_FILE} [--cfg-options ${OPTIONS [OPTIONS...]}] 32 | ``` 33 | 34 | `--out` 后的参数输入为完整文件名(**必须输入** `.pkl` 或 `.pickle` 后缀),也可以包含路径。举一个具体例子: 35 | 36 | ```shell 37 | python tools/test.py configs\yolov5\yolov5_s-v61_syncbn_8xb16-300e_coco.py yolov5_s-v61_syncbn_fast_8xb16-300e_coco_20220918_084700-86e02187.pth --out work_dirs/demo/pkl_demo.pkl 38 | ``` 39 | 40 | 运行以上命令会在 `work_dirs/demo` 文件夹下,输出 `pkl_demo.pkl` 文件。 41 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/plugins.md: -------------------------------------------------------------------------------- 1 | # 给主干网络增加插件 2 | 3 | MMYOLO 支持在 Backbone 的不同 Stage 后增加如 `none_local`、`dropblock` 等插件,用户可以直接通过修改 config 文件中 `backbone` 的 `plugins`参数来实现对插件的管理。例如为 `YOLOv5` 增加`GeneralizedAttention` 插件,其配置文件如下: 4 | 5 | ```python 6 | _base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py' 7 | 8 | model = dict( 9 | backbone=dict( 10 | plugins=[ 11 | dict( 12 | cfg=dict( 13 | type='GeneralizedAttention', 14 | spatial_range=-1, 15 | num_heads=8, 16 | attention_type='0011', 17 | kv_stride=2), 18 | stages=(False, False, True, True)) 19 | ])) 20 | ``` 21 | 22 | `cfg` 参数表示插件的具体配置, `stages` 参数表示是否在 backbone 对应的 stage 后面增加插件,长度需要和 backbone 的 stage 数量相同。 23 | 24 | 目前 `MMYOLO` 支持了如下插件: 25 | 26 |
27 | 支持的插件 28 | 29 | 1. [CBAM](https://github.com/open-mmlab/mmyolo/blob/dev/mmyolo/models/plugins/cbam.py#L86) 30 | 2. [GeneralizedAttention](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/generalized_attention.py#L13) 31 | 3. [NonLocal2d](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/non_local.py#L250) 32 | 4. [ContextBlock](https://github.com/open-mmlab/mmcv/blob/2.x/mmcv/cnn/bricks/context_block.py#L18) 33 | 34 |
35 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/resume_training.md: -------------------------------------------------------------------------------- 1 | # 恢复训练 2 | 3 | 恢复训练是指从之前某次训练保存下来的状态开始继续训练,这里的状态包括模型的权重、优化器和优化器参数调整策略的状态。 4 | 5 | 用户可以在训练命令最后加上 `--resume` 恢复训练,程序会自动从 `work_dirs` 中加载最新的权重文件恢复训练。如果 `work_dir` 中有最新的 checkpoint(例如该训练在上一次训练时被中断),则会从该 checkpoint 恢复训练,否则(例如上一次训练还没来得及保存 checkpoint 或者启动了新的训练任务)会重新开始训练。下面是一个恢复训练的示例: 6 | 7 | ```shell 8 | python tools/train.py configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py --resume 9 | ``` 10 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/set_random_seed.md: -------------------------------------------------------------------------------- 1 | # 设置随机种子 2 | 3 | 如果想要在训练时指定随机种子,可以使用以下命令: 4 | 5 | ```shell 6 | python ./tools/train.py \ 7 | ${CONFIG} \ # 配置文件路径 8 | --cfg-options randomness.seed=2023 \ # 设置随机种子为 2023 9 | [randomness.diff_rank_seed=True] \ # 根据 rank 来设置不同的种子。 10 | [randomness.deterministic=True] # 把 cuDNN 后端确定性选项设置为 True 11 | # [] 代表可选参数,实际输入命令行时,不用输入 [] 12 | ``` 13 | 14 | `randomness` 有三个参数可设置,具体含义如下: 15 | 16 | - `randomness.seed=2023` ,设置随机种子为 2023。 17 | 18 | - `randomness.diff_rank_seed=True`,根据 rank 来设置不同的种子,`diff_rank_seed` 默认为 False。 19 | 20 | - `randomness.deterministic=True`,把 cuDNN 后端确定性选项设置为 True,即把`torch.backends.cudnn.deterministic` 设为 True,把 `torch.backends.cudnn.benchmark` 设为False。`deterministic` 默认为 False。更多细节见 https://pytorch.org/docs/stable/notes/randomness.html。 21 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/set_syncbn.md: -------------------------------------------------------------------------------- 1 | # 开启和关闭 SyncBatchNorm 2 | -------------------------------------------------------------------------------- /docs/zh_cn/common_usage/specify_device.md: -------------------------------------------------------------------------------- 1 | # 指定特定设备训练或推理 2 | 3 | 如果你有多张 GPU,比如 8 张,其编号分别为 `0, 1, 2, 3, 4, 5, 6, 7`,使用单卡训练或推理时会默认使用卡 0。如果想指定其他卡进行训练或推理,可以使用以下命令: 4 | 5 | ```shell 6 | CUDA_VISIBLE_DEVICES=5 python ./tools/train.py ${CONFIG} #train 7 | CUDA_VISIBLE_DEVICES=5 python ./tools/test.py ${CONFIG} ${CHECKPOINT_FILE} #test 8 | ``` 9 | 10 | 如果设置`CUDA_VISIBLE_DEVICES`为 -1 或者一个大于 GPU 最大编号的数,比如 8,将会使用 CPU 进行训练或者推理。 11 | 12 | 如果你想使用其中几张卡并行训练,可以使用如下命令: 13 | 14 | ```shell 15 | CUDA_VISIBLE_DEVICES=0,1,2,3 ./tools/dist_train.sh ${CONFIG} ${GPU_NUM} 16 | ``` 17 | 18 | 这里 `GPU_NUM` 为 4。另外如果在一台机器上多个任务同时多卡训练,需要设置不同的端口,比如以下命令: 19 | 20 | ```shell 21 | CUDA_VISIBLE_DEVICES=0,1,2,3 PORT=29500 ./tools/dist_train.sh ${CONFIG} 4 22 | CUDA_VISIBLE_DEVICES=4,5,6,7 PORT=29501 ./tools/dist_train.sh ${CONFIG} 4 23 | ``` 24 | -------------------------------------------------------------------------------- /docs/zh_cn/get_started/15_minutes_rotated_object_detection.md: -------------------------------------------------------------------------------- 1 | # 15 分钟上手 MMYOLO 旋转框目标检测 2 | 3 | TODO 4 | -------------------------------------------------------------------------------- /docs/zh_cn/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /docs/zh_cn/notes/compatibility.md: -------------------------------------------------------------------------------- 1 | # MMYOLO 兼容性说明 2 | 3 | ## MMYOLO v0.3.0 4 | 5 | ### METAINFO 修改 6 | 7 | 为了和 OpenMMLab 其他仓库统一,将 Dataset 里 `METAINFO` 的所有键从大写改为小写。 8 | 9 | | 在 v0.3.0 之前 | v0.3.0 及之后 | 10 | | :------------: | :-----------: | 11 | | CLASSES | classes | 12 | | PALETTE | palette | 13 | | DATASET_TYPE | dataset_type | 14 | 15 | ### 关于图片 shape 顺序的说明 16 | 17 | 在 OpenMMLab 2.0 中, 为了与 OpenCV 的输入参数相一致,图片处理 pipeline 中关于图像 shape 的输入参数总是以 `(width, height)` 的顺序排列。 18 | 相反,为了计算方便,经过 pipeline 和 model 的字段的顺序是 `(height, width)`。具体来说在每个数据 pipeline 处理的结果中,字段和它们的值含义如下: 19 | 20 | - img_shape: (height, width) 21 | - ori_shape: (height, width) 22 | - pad_shape: (height, width) 23 | - batch_input_shape: (height, width) 24 | 25 | 以 `Mosaic` 为例,其初始化参数如下所示: 26 | 27 | ```python 28 | @TRANSFORMS.register_module() 29 | class Mosaic(BaseTransform): 30 | def __init__(self, 31 | img_scale: Tuple[int, int] = (640, 640), 32 | center_ratio_range: Tuple[float, float] = (0.5, 1.5), 33 | bbox_clip_border: bool = True, 34 | pad_val: float = 114.0, 35 | prob: float = 1.0) -> None: 36 | ... 37 | 38 | # img_scale 顺序应该是 (width, height) 39 | self.img_scale = img_scale 40 | 41 | def transform(self, results: dict) -> dict: 42 | ... 43 | 44 | results['img'] = mosaic_img 45 | # (height, width) 46 | results['img_shape'] = mosaic_img.shape[:2] 47 | ``` 48 | -------------------------------------------------------------------------------- /docs/zh_cn/notes/conventions.md: -------------------------------------------------------------------------------- 1 | # 默认约定 2 | 3 | 如果你想把 MMYOLO 修改为自己的项目,请遵循下面的约定。 4 | 5 | ## 关于图片 shape 顺序的说明 6 | 7 | 在OpenMMLab 2.0中, 为了与 OpenCV 的输入参数相一致,图片处理 pipeline 中关于图像 shape 的输入参数总是以 `(width, height)` 的顺序排列。 8 | 相反,为了计算方便,经过 pipeline 和 model 的字段的顺序是 `(height, width)`。具体来说在每个数据 pipeline 处理的结果中,字段和它们的值含义如下: 9 | 10 | - img_shape: (height, width) 11 | - ori_shape: (height, width) 12 | - pad_shape: (height, width) 13 | - batch_input_shape: (height, width) 14 | 15 | 以 `Mosaic` 为例,其初始化参数如下所示: 16 | 17 | ```python 18 | @TRANSFORMS.register_module() 19 | class Mosaic(BaseTransform): 20 | def __init__(self, 21 | img_scale: Tuple[int, int] = (640, 640), 22 | center_ratio_range: Tuple[float, float] = (0.5, 1.5), 23 | bbox_clip_border: bool = True, 24 | pad_val: float = 114.0, 25 | prob: float = 1.0) -> None: 26 | ... 27 | 28 | # img_scale 顺序应该是 (width, height) 29 | self.img_scale = img_scale 30 | 31 | def transform(self, results: dict) -> dict: 32 | ... 33 | 34 | results['img'] = mosaic_img 35 | # (height, width) 36 | results['img_shape'] = mosaic_img.shape[:2] 37 | ``` 38 | -------------------------------------------------------------------------------- /docs/zh_cn/recommended_topics/algorithm_descriptions/index.rst: -------------------------------------------------------------------------------- 1 | 算法原理和实现全解析 2 | ******************** 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | 7 | yolov5_description.md 8 | yolov6_description.md 9 | rtmdet_description.md 10 | yolov8_description.md 11 | -------------------------------------------------------------------------------- /docs/zh_cn/recommended_topics/application_examples/index.rst: -------------------------------------------------------------------------------- 1 | MMYOLO 应用范例介绍 2 | ******************** 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | 7 | ionogram_detection.md 8 | -------------------------------------------------------------------------------- /docs/zh_cn/recommended_topics/deploy/easydeploy_guide.md: -------------------------------------------------------------------------------- 1 | # EasyDeploy 部署 2 | 3 | 本项目作为 MMYOLO 的部署 project 单独存在,意图剥离 MMDeploy 当前的体系,独自支持用户完成模型训练后的转换和部署功能,使用户的学习和工程成本下降。 4 | 5 | 当前支持对 ONNX 格式和 TensorRT 格式的转换,后续对其他推理平台也会支持起来。 6 | -------------------------------------------------------------------------------- /docs/zh_cn/recommended_topics/deploy/index.rst: -------------------------------------------------------------------------------- 1 | MMDeploy 部署必备教程 2 | ************************ 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | 7 | mmdeploy_guide.md 8 | mmdeploy_yolov5.md 9 | 10 | EasyDeploy 部署必备教程 11 | ************************ 12 | 13 | .. toctree:: 14 | :maxdepth: 1 15 | 16 | easydeploy_guide.md 17 | -------------------------------------------------------------------------------- /docs/zh_cn/recommended_topics/mm_basics.md: -------------------------------------------------------------------------------- 1 | # MM 系列仓库必备基础 2 | -------------------------------------------------------------------------------- /docs/zh_cn/switch_language.md: -------------------------------------------------------------------------------- 1 | ## English 2 | 3 | ## 简体中文 4 | -------------------------------------------------------------------------------- /docs/zh_cn/tutorials/warning_notes.md: -------------------------------------------------------------------------------- 1 | # 常见警告说明 2 | 3 | 本文档收集用户经常疑惑的警告信息说明,方便大家理解。 4 | 5 | ## xxx registry in mmyolo did not set import location 6 | 7 | 完整信息为 The xxx registry in mmyolo did not set import location. Fallback to call `mmyolo.utils.register_all_modules` instead.。 8 | 这个警告的含义说某个模块在导入时候发现没有设置导入的 location,导致无法确定其位置,因此会自动调用 `mmyolo.utils.register_all_modules` 触发包的导入。这个警告属于 MMEngine 中非常底层的模块警告, 9 | 用户理解起来可能比较困难,不过对大家使用没有任何影响,可以直接忽略。 10 | 11 | ## save_param_schedulers is true but self.param_schedulers is None 12 | 13 | 以 YOLOv5 算法为例,这是因为 YOLOv5 中重新写了参数调度器策略 `YOLOv5ParamSchedulerHook`,因此 MMEngine 中设计的 ParamScheduler 是没有使用的,但是 YOLOv5 配置中也没有设置 `save_param_schedulers` 为 False。 14 | 首先这个警告对性能和恢复训练没有任何影响,用户如果觉得这个警告会影响体验,可以设置 `default_hooks.checkpoint.save_param_scheduler` 为 False 或者训练时候通过命令行设置 `--cfg-options default_hooks.checkpoint.save_param_scheduler=False` 即可。 15 | 16 | ## The loss_cls will be 0. This is a normal phenomenon. 17 | 18 | 这个和具体算法有关。以 YOLOv5 为例,其分类 loss 是只考虑正样本的,如果类别是 1,那么分类 loss 和 obj loss 就是功能重复的了,因此在设计上当类别是 1 的时候 loss_cls 是不计算的,因此始终是 0,这是正常现象。 19 | 20 | ## The model and loaded state dict do not match exactly 21 | 22 | 这个警告是否会影响性能要根据进一步的打印信息来确定。如果是在微调模式下,由于用户自定义类别不一样无法加载 Head 模块的 COCO 预训练权重,这是一个正常现象,不会影响性能。 23 | -------------------------------------------------------------------------------- /docs/zh_cn/useful_tools/dataset_converters.md: -------------------------------------------------------------------------------- 1 | # 数据集转换 2 | 3 | 文件夹 `tools/data_converters/` 目前包含 `ballon2coco.py`、`yolo2coco.py` 和 `labelme2coco.py` 三个数据集转换工具。 4 | 5 | - `ballon2coco.py` 将 `balloon` 数据集(该小型数据集仅作为入门使用)转换成 COCO 的格式。 6 | 7 | ```shell 8 | python tools/dataset_converters/balloon2coco.py 9 | ``` 10 | 11 | - `yolo2coco.py` 将 `yolo-style` **.txt** 格式的数据集转换成 COCO 的格式,请按如下方式使用: 12 | 13 | ```shell 14 | python tools/dataset_converters/yolo2coco.py /path/to/the/root/dir/of/your_dataset 15 | ``` 16 | 17 | 使用说明: 18 | 19 | 1. `image_dir` 是需要你传入的待转换的 yolo 格式数据集的根目录,内应包含 `images` 、 `labels` 和 `classes.txt` 文件, `classes.txt` 是当前 dataset 对应的类的声明,一行一个类别。 20 | `image_dir` 结构如下例所示: 21 | 22 | ```bash 23 | . 24 | └── $ROOT_PATH 25 | ├── classes.txt 26 | ├── labels 27 | │ ├── a.txt 28 | │ ├── b.txt 29 | │ └── ... 30 | ├── images 31 | │ ├── a.jpg 32 | │ ├── b.png 33 | │ └── ... 34 | └── ... 35 | ``` 36 | 37 | 2. 脚本会检测 `image_dir` 下是否已有的 `train.txt` 、 `val.txt` 和 `test.txt` 。若检测到文件,则会按照类别进行整理, 否则默认不需要分类。故请确保对应的 `train.txt` 、 `val.txt` 和 `test.txt` 要在 `image_dir` 内。文件内的图片路径必须是**绝对路径**。 38 | 3. 脚本会默认在 `image_dir` 目录下创建 `annotations` 文件夹并将转换结果存在这里。如果在 `image_dir` 下没找到分类文件,输出文件即为一个 `result.json`,反之则会生成需要的 `train.json` 、 `val.json`、 `test.json`,脚本完成后 `annotations` 结构可如下例所示: 39 | 40 | ```bash 41 | . 42 | └── $ROOT_PATH 43 | ├── annotations 44 | │ ├── result.json 45 | │ └── ... 46 | ├── classes.txt 47 | ├── labels 48 | │ ├── a.txt 49 | │ ├── b.txt 50 | │ └── ... 51 | ├── images 52 | │ ├── a.jpg 53 | │ ├── b.png 54 | │ └── ... 55 | └── ... 56 | ``` 57 | -------------------------------------------------------------------------------- /docs/zh_cn/useful_tools/download_dataset.md: -------------------------------------------------------------------------------- 1 | # 数据集下载 2 | 3 | 脚本 `tools/misc/download_dataset.py` 支持下载数据集,例如 `COCO`、`VOC`、`LVIS` 和 `Balloon`. 4 | 5 | ```shell 6 | python tools/misc/download_dataset.py --dataset-name coco2017 7 | python tools/misc/download_dataset.py --dataset-name voc2007 8 | python tools/misc/download_dataset.py --dataset-name voc2012 9 | python tools/misc/download_dataset.py --dataset-name lvis 10 | python tools/misc/download_dataset.py --dataset-name balloon [--save-dir ${SAVE_DIR}] [--unzip] 11 | ``` 12 | -------------------------------------------------------------------------------- /docs/zh_cn/useful_tools/extract_subcoco.md: -------------------------------------------------------------------------------- 1 | # 提取 COCO 子集 2 | 3 | COCO2017 数据集训练数据集包括 118K 张图片,验证集包括 5K 张图片,数据集比较大。在调试或者快速验证程序是否正确的场景下加载 json 会需要消耗较多资源和带来较慢的启动速度,这会导致程序体验不好。 4 | 5 | `extract_subcoco.py` 脚本提供了按指定图片数量、类别、锚框尺寸来切分图片的功能,用户可以通过 `--num-img`, `--classes`, `--area-size` 参数来得到指定条件的 COCO 子集,从而满足上述需求。 6 | 7 | 例如通过以下脚本切分图片: 8 | 9 | ```shell 10 | python tools/misc/extract_subcoco.py \ 11 | ${ROOT} \ 12 | ${OUT_DIR} \ 13 | --num-img 20 \ 14 | --classes cat dog person \ 15 | --area-size small 16 | ``` 17 | 18 | 会切分出 20 张图片,且这 20 张图片只会保留同时满足类别条件和锚框尺寸条件的标注信息, 没有满足条件的标注信息的图片不会被选择,保证了这 20 张图都是有 annotation info 的。 19 | 20 | 注意: 本脚本目前仅仅支持 COCO2017 数据集,未来会支持更加通用的 COCO JSON 格式数据集 21 | 22 | 输入 root 根路径文件夹格式如下所示: 23 | 24 | ```text 25 | ├── root 26 | │ ├── annotations 27 | │ ├── train2017 28 | │ ├── val2017 29 | │ ├── test2017 30 | ``` 31 | 32 | 1. 仅仅使用 5K 张验证集切分出 10 张训练图片和 10 张验证图片 33 | 34 | ```shell 35 | python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 10 36 | ``` 37 | 38 | 2. 使用训练集切分出 20 张训练图片,使用验证集切分出 20 张验证图片 39 | 40 | ```shell 41 | python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 20 --use-training-set 42 | ``` 43 | 44 | 3. 设置全局种子,默认不设置 45 | 46 | ```shell 47 | python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --num-img 20 --use-training-set --seed 1 48 | ``` 49 | 50 | 4. 按指定类别切分图片 51 | 52 | ```shell 53 | python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --classes cat dog person 54 | ``` 55 | 56 | 5. 按指定锚框尺寸切分图片 57 | 58 | ```shell 59 | python tools/misc/extract_subcoco.py ${ROOT} ${OUT_DIR} --area-size small 60 | ``` 61 | -------------------------------------------------------------------------------- /docs/zh_cn/useful_tools/model_converters.md: -------------------------------------------------------------------------------- 1 | # 模型转换 2 | 3 | 文件夹 `tools/model_converters/` 下的六个脚本能够帮助用户将对应YOLO官方的预训练模型中的键转换成 `MMYOLO` 格式,并使用 `MMYOLO` 对模型进行微调。 4 | 5 | ## YOLOv5 6 | 7 | 下面以转换 `yolov5s.pt` 为例: 8 | 9 | 1. 将 YOLOv5 官方代码克隆到本地(目前支持的最高版本为 `v6.1` ): 10 | 11 | ```shell 12 | git clone -b v6.1 https://github.com/ultralytics/yolov5.git 13 | cd yolov5 14 | ``` 15 | 16 | 2. 下载官方权重: 17 | 18 | ```shell 19 | wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt 20 | ``` 21 | 22 | 3. 将 `tools/model_converters/yolov5_to_mmyolo.py` 文件复制到 YOLOv5 官方代码克隆的路径: 23 | 24 | ```shell 25 | cp ${MMDET_YOLO_PATH}/tools/model_converters/yolov5_to_mmyolo.py yolov5_to_mmyolo.py 26 | ``` 27 | 28 | 4. 执行转换: 29 | 30 | ```shell 31 | python yolov5_to_mmyolo.py --src ${WEIGHT_FILE_PATH} --dst mmyolov5.pt 32 | ``` 33 | 34 | 转换好的 `mmyolov5.pt` 即可以为 MMYOLO 所用。 YOLOv6 官方权重转化也是采用一样的使用方式。 35 | 36 | ## YOLOX 37 | 38 | YOLOX 模型的转换不需要下载 YOLOX 官方代码,只需要下载权重即可。下面以转换 `yolox_s.pth` 为例: 39 | 40 | 1. 下载权重: 41 | 42 | ```shell 43 | wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth 44 | ``` 45 | 46 | 2. 执行转换: 47 | 48 | ```shell 49 | python tools/model_converters/yolox_to_mmyolo.py --src yolox_s.pth --dst mmyolox.pt 50 | ``` 51 | 52 | 转换好的 `mmyolox.pt` 即可以在 MMYOLO 中使用。 53 | -------------------------------------------------------------------------------- /docs/zh_cn/useful_tools/optimize_anchors.md: -------------------------------------------------------------------------------- 1 | # 优化锚框尺寸 2 | 3 | 脚本 `tools/analysis_tools/optimize_anchors.py` 支持 YOLO 系列中三种锚框生成方式,分别是 `k-means`、`Differential Evolution`、`v5-k-means`. 4 | 5 | ## k-means 6 | 7 | 在 k-means 方法中,使用的是基于 IoU 表示距离的聚类方法,具体使用命令如下: 8 | 9 | ```shell 10 | python tools/analysis_tools/optimize_anchors.py ${CONFIG} \ 11 | --algorithm k-means \ 12 | --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \ 13 | --out-dir ${OUT_DIR} 14 | ``` 15 | 16 | ## Differential Evolution 17 | 18 | 在 `Differential Evolution` 方法中,使用的是基于差分进化算法(简称 DE 算法)的聚类方式,其最小化目标函数为 `avg_iou_cost`,具体使用命令如下: 19 | 20 | ```shell 21 | python tools/analysis_tools/optimize_anchors.py ${CONFIG} \ 22 | --algorithm DE \ 23 | --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \ 24 | --out-dir ${OUT_DIR} 25 | ``` 26 | 27 | ## v5-k-means 28 | 29 | 在 v5-k-means 方法中,使用的是 YOLOv5 中基于 `shape-match` 的聚类方式,具体使用命令如下: 30 | 31 | ```shell 32 | python tools/analysis_tools/optimize_anchors.py ${CONFIG} \ 33 | --algorithm v5-k-means \ 34 | --input-shape ${INPUT_SHAPE [WIDTH HEIGHT]} \ 35 | --prior-match-thr ${PRIOR_MATCH_THR} \ 36 | --out-dir ${OUT_DIR} 37 | ``` 38 | -------------------------------------------------------------------------------- /docs/zh_cn/useful_tools/print_config.md: -------------------------------------------------------------------------------- 1 | # 打印完整配置文件 2 | 3 | MMDetection 中的 `tools/misc/print_config.py` 脚本可将所有配置继承关系展开,打印相应的完整配置文件。调用命令如下: 4 | 5 | ```shell 6 | mim run mmdet print_config \ 7 | ${CONFIG} \ # 需要打印的配置文件路径 8 | [--save-path] \ # 保存文件路径,必须以 .py, .json 或者 .yml 结尾 9 | [--cfg-options ${OPTIONS [OPTIONS...]}] # 通过命令行参数修改配置文件 10 | ``` 11 | 12 | 样例: 13 | 14 | ```shell 15 | mim run mmdet print_config \ 16 | configs/yolov5/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py \ 17 | --save-path ./work_dirs/yolov5_s-v61_syncbn_fast_1xb4-300e_balloon_whole.py 18 | ``` 19 | 20 | 运行以上命令,会将 `yolov5_s-v61_syncbn_fast_1xb4-300e_balloon.py` 继承关系展开后的配置文件保存到 `./work_dirs` 文件夹内的 `yolov5_s-v61_syncbn_fast_1xb4-300e_balloon_whole.py` 文件中。 21 | -------------------------------------------------------------------------------- /mmyolo/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import mmcv 3 | import mmdet 4 | import mmengine 5 | from mmengine.utils import digit_version 6 | 7 | from .version import __version__, version_info 8 | 9 | mmcv_minimum_version = '2.0.0rc4' 10 | mmcv_maximum_version = '2.1.0' 11 | mmcv_version = digit_version(mmcv.__version__) 12 | 13 | mmengine_minimum_version = '0.7.1' 14 | mmengine_maximum_version = '1.0.0' 15 | mmengine_version = digit_version(mmengine.__version__) 16 | 17 | mmdet_minimum_version = '3.0.0' 18 | mmdet_maximum_version = '4.0.0' 19 | mmdet_version = digit_version(mmdet.__version__) 20 | 21 | 22 | assert (mmcv_version >= digit_version(mmcv_minimum_version) 23 | and mmcv_version < digit_version(mmcv_maximum_version)), \ 24 | f'MMCV=={mmcv.__version__} is used but incompatible. ' \ 25 | f'Please install mmcv>={mmcv_minimum_version}, <{mmcv_maximum_version}.' 26 | 27 | assert (mmengine_version >= digit_version(mmengine_minimum_version) 28 | and mmengine_version < digit_version(mmengine_maximum_version)), \ 29 | f'MMEngine=={mmengine.__version__} is used but incompatible. ' \ 30 | f'Please install mmengine>={mmengine_minimum_version}, ' \ 31 | f'<{mmengine_maximum_version}.' 32 | 33 | assert (mmdet_version >= digit_version(mmdet_minimum_version) 34 | and mmdet_version < digit_version(mmdet_maximum_version)), \ 35 | f'MMDetection=={mmdet.__version__} is used but incompatible. ' \ 36 | f'Please install mmdet>={mmdet_minimum_version}, ' \ 37 | f'<{mmdet_maximum_version}.' 38 | 39 | __all__ = ['__version__', 'version_info', 'digit_version'] 40 | -------------------------------------------------------------------------------- /mmyolo/datasets/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .pose_coco import PoseCocoDataset 3 | from .transforms import * # noqa: F401,F403 4 | from .utils import BatchShapePolicy, yolov5_collate 5 | from .yolov5_coco import YOLOv5CocoDataset 6 | from .yolov5_crowdhuman import YOLOv5CrowdHumanDataset 7 | from .yolov5_dota import YOLOv5DOTADataset 8 | from .yolov5_voc import YOLOv5VOCDataset 9 | 10 | __all__ = [ 11 | 'YOLOv5CocoDataset', 'YOLOv5VOCDataset', 'BatchShapePolicy', 12 | 'yolov5_collate', 'YOLOv5CrowdHumanDataset', 'YOLOv5DOTADataset', 13 | 'PoseCocoDataset' 14 | ] 15 | -------------------------------------------------------------------------------- /mmyolo/datasets/pose_coco.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from typing import Any 3 | 4 | from mmengine.dataset import force_full_init 5 | 6 | try: 7 | from mmpose.datasets import CocoDataset as MMPoseCocoDataset 8 | except ImportError: 9 | MMPoseCocoDataset = object 10 | 11 | from ..registry import DATASETS 12 | 13 | 14 | @DATASETS.register_module() 15 | class PoseCocoDataset(MMPoseCocoDataset): 16 | 17 | METAINFO: dict = dict(from_file='configs/_base_/pose/coco.py') 18 | 19 | def __init__(self, *args, **kwargs): 20 | if MMPoseCocoDataset is object: 21 | raise ImportError( 22 | 'Please run "mim install -r requirements/mmpose.txt" ' 23 | 'to install mmpose first for PoseCocoDataset.') 24 | super().__init__(*args, **kwargs) 25 | 26 | @force_full_init 27 | def prepare_data(self, idx) -> Any: 28 | data_info = self.get_data_info(idx) 29 | data_info['dataset'] = self 30 | return self.pipeline(data_info) 31 | -------------------------------------------------------------------------------- /mmyolo/datasets/transforms/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .formatting import PackDetInputs 3 | from .mix_img_transforms import Mosaic, Mosaic9, YOLOv5MixUp, YOLOXMixUp 4 | from .transforms import (FilterAnnotations, LetterResize, LoadAnnotations, 5 | Polygon2Mask, PPYOLOERandomCrop, PPYOLOERandomDistort, 6 | RandomAffine, RandomFlip, RegularizeRotatedBox, 7 | RemoveDataElement, Resize, YOLOv5CopyPaste, 8 | YOLOv5HSVRandomAug, YOLOv5KeepRatioResize, 9 | YOLOv5RandomAffine) 10 | 11 | __all__ = [ 12 | 'YOLOv5KeepRatioResize', 'LetterResize', 'Mosaic', 'YOLOXMixUp', 13 | 'YOLOv5MixUp', 'YOLOv5HSVRandomAug', 'LoadAnnotations', 14 | 'YOLOv5RandomAffine', 'PPYOLOERandomDistort', 'PPYOLOERandomCrop', 15 | 'Mosaic9', 'YOLOv5CopyPaste', 'RemoveDataElement', 'RegularizeRotatedBox', 16 | 'Polygon2Mask', 'PackDetInputs', 'RandomAffine', 'RandomFlip', 'Resize', 17 | 'FilterAnnotations' 18 | ] 19 | -------------------------------------------------------------------------------- /mmyolo/datasets/yolov5_crowdhuman.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.datasets import CrowdHumanDataset 3 | 4 | from ..registry import DATASETS 5 | from .yolov5_coco import BatchShapePolicyDataset 6 | 7 | 8 | @DATASETS.register_module() 9 | class YOLOv5CrowdHumanDataset(BatchShapePolicyDataset, CrowdHumanDataset): 10 | """Dataset for YOLOv5 CrowdHuman Dataset. 11 | 12 | We only add `BatchShapePolicy` function compared with CrowdHumanDataset. 13 | See `mmyolo/datasets/utils.py#BatchShapePolicy` for details 14 | """ 15 | pass 16 | -------------------------------------------------------------------------------- /mmyolo/datasets/yolov5_dota.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset 4 | from ..registry import DATASETS 5 | 6 | try: 7 | from mmrotate.datasets import DOTADataset 8 | MMROTATE_AVAILABLE = True 9 | except ImportError: 10 | from mmengine.dataset import BaseDataset 11 | DOTADataset = BaseDataset 12 | MMROTATE_AVAILABLE = False 13 | 14 | 15 | @DATASETS.register_module() 16 | class YOLOv5DOTADataset(BatchShapePolicyDataset, DOTADataset): 17 | """Dataset for YOLOv5 DOTA Dataset. 18 | 19 | We only add `BatchShapePolicy` function compared with DOTADataset. See 20 | `mmyolo/datasets/utils.py#BatchShapePolicy` for details 21 | """ 22 | 23 | def __init__(self, *args, **kwargs): 24 | if not MMROTATE_AVAILABLE: 25 | raise ImportError( 26 | 'Please run "mim install -r requirements/mmrotate.txt" ' 27 | 'to install mmrotate first for rotated detection.') 28 | 29 | super().__init__(*args, **kwargs) 30 | -------------------------------------------------------------------------------- /mmyolo/datasets/yolov5_voc.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.datasets import VOCDataset 3 | 4 | from mmyolo.datasets.yolov5_coco import BatchShapePolicyDataset 5 | from ..registry import DATASETS 6 | 7 | 8 | @DATASETS.register_module() 9 | class YOLOv5VOCDataset(BatchShapePolicyDataset, VOCDataset): 10 | """Dataset for YOLOv5 VOC Dataset. 11 | 12 | We only add `BatchShapePolicy` function compared with VOCDataset. See 13 | `mmyolo/datasets/utils.py#BatchShapePolicy` for details 14 | """ 15 | pass 16 | -------------------------------------------------------------------------------- /mmyolo/deploy/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdeploy.codebase.base import MMCodebase 3 | 4 | from .models import * # noqa: F401,F403 5 | from .object_detection import MMYOLO, YOLOObjectDetection 6 | 7 | __all__ = ['MMCodebase', 'MMYOLO', 'YOLOObjectDetection'] 8 | -------------------------------------------------------------------------------- /mmyolo/deploy/models/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from . import dense_heads # noqa: F401,F403 3 | -------------------------------------------------------------------------------- /mmyolo/deploy/models/dense_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from . import yolov5_head # noqa: F401,F403 3 | 4 | __all__ = ['yolov5_head'] 5 | -------------------------------------------------------------------------------- /mmyolo/deploy/models/layers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .bbox_nms import efficient_nms 3 | 4 | __all__ = ['efficient_nms'] 5 | -------------------------------------------------------------------------------- /mmyolo/engine/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .hooks import * # noqa: F401,F403 3 | from .optimizers import * # noqa: F401,F403 4 | -------------------------------------------------------------------------------- /mmyolo/engine/hooks/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .ppyoloe_param_scheduler_hook import PPYOLOEParamSchedulerHook 3 | from .switch_to_deploy_hook import SwitchToDeployHook 4 | from .yolov5_param_scheduler_hook import YOLOv5ParamSchedulerHook 5 | from .yolox_mode_switch_hook import YOLOXModeSwitchHook 6 | 7 | __all__ = [ 8 | 'YOLOv5ParamSchedulerHook', 'YOLOXModeSwitchHook', 'SwitchToDeployHook', 9 | 'PPYOLOEParamSchedulerHook' 10 | ] 11 | -------------------------------------------------------------------------------- /mmyolo/engine/hooks/switch_to_deploy_hook.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from mmengine.hooks import Hook 4 | from mmengine.runner import Runner 5 | 6 | from mmyolo.registry import HOOKS 7 | from mmyolo.utils import switch_to_deploy 8 | 9 | 10 | @HOOKS.register_module() 11 | class SwitchToDeployHook(Hook): 12 | """Switch to deploy mode before testing. 13 | 14 | This hook converts the multi-channel structure of the training network 15 | (high performance) to the one-way structure of the testing network (fast 16 | speed and memory saving). 17 | """ 18 | 19 | def before_test_epoch(self, runner: Runner): 20 | """Switch to deploy mode before testing.""" 21 | switch_to_deploy(runner.model) 22 | -------------------------------------------------------------------------------- /mmyolo/engine/optimizers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .yolov5_optim_constructor import YOLOv5OptimizerConstructor 3 | from .yolov7_optim_wrapper_constructor import YOLOv7OptimWrapperConstructor 4 | 5 | __all__ = ['YOLOv5OptimizerConstructor', 'YOLOv7OptimWrapperConstructor'] 6 | -------------------------------------------------------------------------------- /mmyolo/models/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .backbones import * # noqa: F401,F403 3 | from .data_preprocessors import * # noqa: F401,F403 4 | from .dense_heads import * # noqa: F401,F403 5 | from .detectors import * # noqa: F401,F403 6 | from .layers import * # noqa: F401,F403 7 | from .losses import * # noqa: F401,F403 8 | from .necks import * # noqa: F401,F403 9 | from .plugins import * # noqa: F401,F403 10 | from .task_modules import * # noqa: F401,F403 11 | -------------------------------------------------------------------------------- /mmyolo/models/backbones/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base_backbone import BaseBackbone 3 | from .csp_darknet import YOLOv5CSPDarknet, YOLOv8CSPDarknet, YOLOXCSPDarknet 4 | from .csp_resnet import PPYOLOECSPResNet 5 | from .cspnext import CSPNeXt 6 | from .efficient_rep import YOLOv6CSPBep, YOLOv6EfficientRep 7 | from .yolov7_backbone import YOLOv7Backbone 8 | 9 | __all__ = [ 10 | 'YOLOv5CSPDarknet', 'BaseBackbone', 'YOLOv6EfficientRep', 'YOLOv6CSPBep', 11 | 'YOLOXCSPDarknet', 'CSPNeXt', 'YOLOv7Backbone', 'PPYOLOECSPResNet', 12 | 'YOLOv8CSPDarknet' 13 | ] 14 | -------------------------------------------------------------------------------- /mmyolo/models/data_preprocessors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .data_preprocessor import (PPYOLOEBatchRandomResize, 3 | PPYOLOEDetDataPreprocessor, 4 | YOLOv5DetDataPreprocessor, 5 | YOLOXBatchSyncRandomResize) 6 | 7 | __all__ = [ 8 | 'YOLOv5DetDataPreprocessor', 'PPYOLOEDetDataPreprocessor', 9 | 'PPYOLOEBatchRandomResize', 'YOLOXBatchSyncRandomResize' 10 | ] 11 | -------------------------------------------------------------------------------- /mmyolo/models/dense_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .ppyoloe_head import PPYOLOEHead, PPYOLOEHeadModule 3 | from .rtmdet_head import RTMDetHead, RTMDetSepBNHeadModule 4 | from .rtmdet_ins_head import RTMDetInsSepBNHead, RTMDetInsSepBNHeadModule 5 | from .rtmdet_rotated_head import (RTMDetRotatedHead, 6 | RTMDetRotatedSepBNHeadModule) 7 | from .yolov5_head import YOLOv5Head, YOLOv5HeadModule 8 | from .yolov5_ins_head import YOLOv5InsHead, YOLOv5InsHeadModule 9 | from .yolov6_head import YOLOv6Head, YOLOv6HeadModule 10 | from .yolov7_head import YOLOv7Head, YOLOv7HeadModule, YOLOv7p6HeadModule 11 | from .yolov8_head import YOLOv8Head, YOLOv8HeadModule 12 | from .yolox_head import YOLOXHead, YOLOXHeadModule 13 | from .yolox_pose_head import YOLOXPoseHead, YOLOXPoseHeadModule 14 | 15 | __all__ = [ 16 | 'YOLOv5Head', 'YOLOv6Head', 'YOLOXHead', 'YOLOv5HeadModule', 17 | 'YOLOv6HeadModule', 'YOLOXHeadModule', 'RTMDetHead', 18 | 'RTMDetSepBNHeadModule', 'YOLOv7Head', 'PPYOLOEHead', 'PPYOLOEHeadModule', 19 | 'YOLOv7HeadModule', 'YOLOv7p6HeadModule', 'YOLOv8Head', 'YOLOv8HeadModule', 20 | 'RTMDetRotatedHead', 'RTMDetRotatedSepBNHeadModule', 'RTMDetInsSepBNHead', 21 | 'RTMDetInsSepBNHeadModule', 'YOLOv5InsHead', 'YOLOv5InsHeadModule', 22 | 'YOLOXPoseHead', 'YOLOXPoseHeadModule' 23 | ] 24 | -------------------------------------------------------------------------------- /mmyolo/models/detectors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .yolo_detector import YOLODetector 3 | 4 | __all__ = ['YOLODetector'] 5 | -------------------------------------------------------------------------------- /mmyolo/models/layers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .ema import ExpMomentumEMA 3 | from .yolo_bricks import (BepC3StageBlock, BiFusion, CSPLayerWithTwoConv, 4 | DarknetBottleneck, EELANBlock, EffectiveSELayer, 5 | ELANBlock, ImplicitA, ImplicitM, 6 | MaxPoolAndStrideConvBlock, PPYOLOEBasicBlock, 7 | RepStageBlock, RepVGGBlock, SPPFBottleneck, 8 | SPPFCSPBlock, TinyDownSampleBlock) 9 | 10 | __all__ = [ 11 | 'SPPFBottleneck', 'RepVGGBlock', 'RepStageBlock', 'ExpMomentumEMA', 12 | 'ELANBlock', 'MaxPoolAndStrideConvBlock', 'SPPFCSPBlock', 13 | 'PPYOLOEBasicBlock', 'EffectiveSELayer', 'TinyDownSampleBlock', 14 | 'EELANBlock', 'ImplicitA', 'ImplicitM', 'BepC3StageBlock', 15 | 'CSPLayerWithTwoConv', 'DarknetBottleneck', 'BiFusion' 16 | ] 17 | -------------------------------------------------------------------------------- /mmyolo/models/losses/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .iou_loss import IoULoss, bbox_overlaps 3 | from .oks_loss import OksLoss 4 | 5 | __all__ = ['IoULoss', 'bbox_overlaps', 'OksLoss'] 6 | -------------------------------------------------------------------------------- /mmyolo/models/necks/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .base_yolo_neck import BaseYOLONeck 3 | from .cspnext_pafpn import CSPNeXtPAFPN 4 | from .ppyoloe_csppan import PPYOLOECSPPAFPN 5 | from .yolov5_pafpn import YOLOv5PAFPN 6 | from .yolov6_pafpn import (YOLOv6CSPRepBiPAFPN, YOLOv6CSPRepPAFPN, 7 | YOLOv6RepBiPAFPN, YOLOv6RepPAFPN) 8 | from .yolov7_pafpn import YOLOv7PAFPN 9 | from .yolov8_pafpn import YOLOv8PAFPN 10 | from .yolox_pafpn import YOLOXPAFPN 11 | 12 | __all__ = [ 13 | 'YOLOv5PAFPN', 'BaseYOLONeck', 'YOLOv6RepPAFPN', 'YOLOXPAFPN', 14 | 'CSPNeXtPAFPN', 'YOLOv7PAFPN', 'PPYOLOECSPPAFPN', 'YOLOv6CSPRepPAFPN', 15 | 'YOLOv8PAFPN', 'YOLOv6RepBiPAFPN', 'YOLOv6CSPRepBiPAFPN' 16 | ] 17 | -------------------------------------------------------------------------------- /mmyolo/models/plugins/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .cbam import CBAM 3 | 4 | __all__ = ['CBAM'] 5 | -------------------------------------------------------------------------------- /mmyolo/models/task_modules/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .assigners import BatchATSSAssigner, BatchTaskAlignedAssigner 3 | from .coders import YOLOv5BBoxCoder, YOLOXBBoxCoder 4 | 5 | __all__ = [ 6 | 'YOLOv5BBoxCoder', 'YOLOXBBoxCoder', 'BatchATSSAssigner', 7 | 'BatchTaskAlignedAssigner' 8 | ] 9 | -------------------------------------------------------------------------------- /mmyolo/models/task_modules/assigners/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .batch_atss_assigner import BatchATSSAssigner 3 | from .batch_dsl_assigner import BatchDynamicSoftLabelAssigner 4 | from .batch_task_aligned_assigner import BatchTaskAlignedAssigner 5 | from .pose_sim_ota_assigner import PoseSimOTAAssigner 6 | from .utils import (select_candidates_in_gts, select_highest_overlaps, 7 | yolov6_iou_calculator) 8 | 9 | __all__ = [ 10 | 'BatchATSSAssigner', 'BatchTaskAlignedAssigner', 11 | 'select_candidates_in_gts', 'select_highest_overlaps', 12 | 'yolov6_iou_calculator', 'BatchDynamicSoftLabelAssigner', 13 | 'PoseSimOTAAssigner' 14 | ] 15 | -------------------------------------------------------------------------------- /mmyolo/models/task_modules/coders/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .distance_angle_point_coder import DistanceAnglePointCoder 3 | from .distance_point_bbox_coder import DistancePointBBoxCoder 4 | from .yolov5_bbox_coder import YOLOv5BBoxCoder 5 | from .yolox_bbox_coder import YOLOXBBoxCoder 6 | 7 | __all__ = [ 8 | 'YOLOv5BBoxCoder', 'YOLOXBBoxCoder', 'DistancePointBBoxCoder', 9 | 'DistanceAnglePointCoder' 10 | ] 11 | -------------------------------------------------------------------------------- /mmyolo/models/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .misc import (OutputSaveFunctionWrapper, OutputSaveObjectWrapper, 3 | gt_instances_preprocess, make_divisible, make_round) 4 | 5 | __all__ = [ 6 | 'make_divisible', 'make_round', 'gt_instances_preprocess', 7 | 'OutputSaveFunctionWrapper', 'OutputSaveObjectWrapper' 8 | ] 9 | -------------------------------------------------------------------------------- /mmyolo/testing/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from ._utils import get_detector_cfg 3 | 4 | __all__ = ['get_detector_cfg'] 5 | -------------------------------------------------------------------------------- /mmyolo/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .collect_env import collect_env 3 | from .misc import is_metainfo_lower, switch_to_deploy 4 | from .setup_env import register_all_modules 5 | 6 | __all__ = [ 7 | 'register_all_modules', 'collect_env', 'switch_to_deploy', 8 | 'is_metainfo_lower' 9 | ] 10 | -------------------------------------------------------------------------------- /mmyolo/utils/collect_env.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import mmcv 3 | import mmdet 4 | from mmengine.utils import get_git_hash 5 | from mmengine.utils.dl_utils import collect_env as collect_base_env 6 | 7 | import mmyolo 8 | 9 | 10 | def collect_env() -> dict: 11 | """Collect the information of the running environments.""" 12 | env_info = collect_base_env() 13 | env_info['MMCV'] = mmcv.__version__ 14 | env_info['MMDetection'] = mmdet.__version__ 15 | env_info['MMYOLO'] = mmyolo.__version__ + '+' + get_git_hash()[:7] 16 | return env_info 17 | 18 | 19 | if __name__ == '__main__': 20 | for name, val in collect_env().items(): 21 | print(f'{name}: {val}') 22 | -------------------------------------------------------------------------------- /mmyolo/version.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | __version__ = '0.6.0' 4 | 5 | from typing import Tuple 6 | 7 | short_version = __version__ 8 | 9 | 10 | def parse_version_info(version_str: str) -> Tuple: 11 | """Parse version info of MMYOLO.""" 12 | version_info = [] 13 | for x in version_str.split('.'): 14 | if x.isdigit(): 15 | version_info.append(int(x)) 16 | elif x.find('rc') != -1: 17 | patch_version = x.split('rc') 18 | version_info.append(int(patch_version[0])) 19 | version_info.append(f'rc{patch_version[1]}') 20 | return tuple(version_info) 21 | 22 | 23 | version_info = parse_version_info(__version__) 24 | -------------------------------------------------------------------------------- /model-index.yml: -------------------------------------------------------------------------------- 1 | Import: 2 | - configs/yolov5/metafile.yml 3 | - configs/yolov6/metafile.yml 4 | - configs/yolox/metafile.yml 5 | - configs/rtmdet/metafile.yml 6 | - configs/yolov7/metafile.yml 7 | - configs/ppyoloe/metafile.yml 8 | - configs/yolov8/metafile.yml 9 | -------------------------------------------------------------------------------- /projects/assigner_visualization/configs/rtmdet_s_syncbn_fast_8xb32-300e_coco_assignervisualization.py: -------------------------------------------------------------------------------- 1 | _base_ = ['../../../configs/rtmdet/rtmdet_s_syncbn_fast_8xb32-300e_coco.py'] 2 | 3 | custom_imports = dict(imports=[ 4 | 'projects.assigner_visualization.detectors', 5 | 'projects.assigner_visualization.dense_heads' 6 | ]) 7 | 8 | model = dict( 9 | type='YOLODetectorAssigner', bbox_head=dict(type='RTMHeadAssigner')) 10 | -------------------------------------------------------------------------------- /projects/assigner_visualization/configs/yolov5_s-v61_syncbn_fast_8xb16-300e_coco_assignervisualization.py: -------------------------------------------------------------------------------- 1 | _base_ = [ 2 | '../../../configs/yolov5/yolov5_s-v61_syncbn_fast_8xb16-300e_coco.py' 3 | ] 4 | 5 | custom_imports = dict(imports=[ 6 | 'projects.assigner_visualization.detectors', 7 | 'projects.assigner_visualization.dense_heads' 8 | ]) 9 | 10 | model = dict( 11 | type='YOLODetectorAssigner', bbox_head=dict(type='YOLOv5HeadAssigner')) 12 | -------------------------------------------------------------------------------- /projects/assigner_visualization/configs/yolov7_tiny_syncbn_fast_8xb16-300e_coco_assignervisualization.py: -------------------------------------------------------------------------------- 1 | _base_ = ['../../../configs/yolov7/yolov7_tiny_syncbn_fast_8x16b-300e_coco.py'] 2 | 3 | custom_imports = dict(imports=[ 4 | 'projects.assigner_visualization.detectors', 5 | 'projects.assigner_visualization.dense_heads' 6 | ]) 7 | 8 | model = dict( 9 | type='YOLODetectorAssigner', bbox_head=dict(type='YOLOv7HeadAssigner')) 10 | -------------------------------------------------------------------------------- /projects/assigner_visualization/configs/yolov8_s_syncbn_fast_8xb16-500e_coco_assignervisualization.py: -------------------------------------------------------------------------------- 1 | _base_ = ['../../../configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py'] 2 | 3 | custom_imports = dict(imports=[ 4 | 'projects.assigner_visualization.detectors', 5 | 'projects.assigner_visualization.dense_heads' 6 | ]) 7 | 8 | model = dict( 9 | type='YOLODetectorAssigner', bbox_head=dict(type='YOLOv8HeadAssigner')) 10 | -------------------------------------------------------------------------------- /projects/assigner_visualization/dense_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .rtmdet_head_assigner import RTMHeadAssigner 3 | from .yolov5_head_assigner import YOLOv5HeadAssigner 4 | from .yolov7_head_assigner import YOLOv7HeadAssigner 5 | from .yolov8_head_assigner import YOLOv8HeadAssigner 6 | 7 | __all__ = [ 8 | 'YOLOv5HeadAssigner', 'YOLOv7HeadAssigner', 'YOLOv8HeadAssigner', 9 | 'RTMHeadAssigner' 10 | ] 11 | -------------------------------------------------------------------------------- /projects/assigner_visualization/detectors/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from projects.assigner_visualization.detectors.yolo_detector_assigner import \ 3 | YOLODetectorAssigner 4 | 5 | __all__ = ['YOLODetectorAssigner'] 6 | -------------------------------------------------------------------------------- /projects/assigner_visualization/detectors/yolo_detector_assigner.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from typing import Union 3 | 4 | from mmyolo.models import YOLODetector 5 | from mmyolo.registry import MODELS 6 | from projects.assigner_visualization.dense_heads import (RTMHeadAssigner, 7 | YOLOv7HeadAssigner, 8 | YOLOv8HeadAssigner) 9 | 10 | 11 | @MODELS.register_module() 12 | class YOLODetectorAssigner(YOLODetector): 13 | 14 | def assign(self, data: dict) -> Union[dict, list]: 15 | """Calculate assigning results from a batch of inputs and data 16 | samples.This function is provided to the `assigner_visualization.py` 17 | script. 18 | 19 | Args: 20 | data (dict or tuple or list): Data sampled from dataset. 21 | 22 | Returns: 23 | dict: A dictionary of assigning components. 24 | """ 25 | assert isinstance(data, dict) 26 | assert len(data['inputs']) == 1, 'Only support batchsize == 1' 27 | data = self.data_preprocessor(data, True) 28 | available_assigners = (YOLOv7HeadAssigner, YOLOv8HeadAssigner, 29 | RTMHeadAssigner) 30 | if isinstance(self.bbox_head, available_assigners): 31 | data['data_samples']['feats'] = self.extract_feat(data['inputs']) 32 | inputs_hw = data['inputs'].shape[-2:] 33 | assign_results = self.bbox_head.assign(data['data_samples'], inputs_hw) 34 | return assign_results 35 | -------------------------------------------------------------------------------- /projects/assigner_visualization/visualization/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .assigner_visualizer import YOLOAssignerVisualizer 3 | 4 | __all__ = ['YOLOAssignerVisualizer'] 5 | -------------------------------------------------------------------------------- /projects/easydeploy/README.md: -------------------------------------------------------------------------------- 1 | # MMYOLO Model Easy-Deployment 2 | 3 | ## Introduction 4 | 5 | This project is developed for easily converting your MMYOLO models to other inference backends without the need of MMDeploy, which reduces the cost of both time and effort on getting familiar with MMDeploy. 6 | 7 | Currently we support converting to `ONNX` and `TensorRT` formats, other inference backends such `ncnn` will be added to this project as well. 8 | 9 | ## Supported Backends 10 | 11 | - [Model Convert](docs/model_convert.md) 12 | -------------------------------------------------------------------------------- /projects/easydeploy/README_zh-CN.md: -------------------------------------------------------------------------------- 1 | # MMYOLO 模型转换 2 | 3 | ## 介绍 4 | 5 | 本项目作为 MMYOLO 的部署 project 单独存在,意图剥离 MMDeploy 当前的体系,独自支持用户完成模型训练后的转换和部署功能,使用户的学习和工程成本下降。 6 | 7 | 当前支持对 ONNX 格式和 TensorRT 格式的转换,后续对其他推理平台也会支持起来。 8 | 9 | ## 转换教程 10 | 11 | - [Model Convert](docs/model_convert.md) 12 | -------------------------------------------------------------------------------- /projects/easydeploy/backbone/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .common import DeployC2f 3 | from .focus import DeployFocus, GConvFocus, NcnnFocus 4 | 5 | __all__ = ['DeployFocus', 'NcnnFocus', 'GConvFocus', 'DeployC2f'] 6 | -------------------------------------------------------------------------------- /projects/easydeploy/backbone/common.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from torch import Tensor 4 | 5 | 6 | class DeployC2f(nn.Module): 7 | 8 | def __init__(self, *args, **kwargs): 9 | super().__init__() 10 | 11 | def forward(self, x: Tensor) -> Tensor: 12 | x_main = self.main_conv(x) 13 | x_main = [x_main, x_main[:, self.mid_channels:, ...]] 14 | x_main.extend(blocks(x_main[-1]) for blocks in self.blocks) 15 | x_main.pop(1) 16 | return self.final_conv(torch.cat(x_main, 1)) 17 | -------------------------------------------------------------------------------- /projects/easydeploy/bbox_code/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .bbox_coder import (rtmdet_bbox_decoder, yolov5_bbox_decoder, 3 | yolox_bbox_decoder) 4 | 5 | __all__ = ['yolov5_bbox_decoder', 'rtmdet_bbox_decoder', 'yolox_bbox_decoder'] 6 | -------------------------------------------------------------------------------- /projects/easydeploy/deepstream/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8.12) 2 | 3 | set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 72 75 86) 4 | set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc) 5 | 6 | project(nvdsparsebbox_mmyolo LANGUAGES CXX) 7 | 8 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O3 -g -Wall -Werror -shared -fPIC") 9 | set(CMAKE_CXX_STANDARD 14) 10 | set(CMAKE_BUILD_TYPE Release) 11 | option(CUDA_USE_STATIC_CUDA_RUNTIME OFF) 12 | 13 | # CUDA 14 | find_package(CUDA REQUIRED) 15 | 16 | # TensorRT 17 | set(TensorRT_INCLUDE_DIRS "/usr/include/x86_64-linux-gnu" CACHE STRING "TensorRT headers path") 18 | set(TensorRT_LIBRARIES "/usr/lib/x86_64-linux-gnu" CACHE STRING "TensorRT libs path") 19 | 20 | # DeepStream 21 | set(DEEPSTREAM "/opt/nvidia/deepstream/deepstream" CACHE STRING "DeepStream root path") 22 | set(DS_LIBRARIES ${DEEPSTREAM}/lib) 23 | set(DS_INCLUDE_DIRS ${DEEPSTREAM}/sources/includes) 24 | 25 | include_directories( 26 | ${CUDA_INCLUDE_DIRS} 27 | ${TensorRT_INCLUDE_DIRS} 28 | ${DS_INCLUDE_DIRS}) 29 | 30 | add_library( 31 | ${PROJECT_NAME} 32 | SHARED 33 | custom_mmyolo_bbox_parser/nvdsparsebbox_mmyolo.cpp) 34 | 35 | target_link_libraries(${PROJECT_NAME} PRIVATE nvinfer nvinfer_plugin) 36 | -------------------------------------------------------------------------------- /projects/easydeploy/deepstream/README_zh-CN.md: -------------------------------------------------------------------------------- 1 | # 使用 DeepStream SDK 推理 MMYOLO 模型 2 | 3 | 本项目演示了如何使用 [DeepStream SDK](https://developer.nvidia.com/deepstream-sdk) 配合改写的 parser 来推理 MMYOLO 的模型。 4 | 5 | ## 预先准备 6 | 7 | ### 1. 安装 Nidia 驱动和 CUDA 8 | 9 | 首先请根据当前的显卡驱动和目标使用设备的驱动完成显卡驱动和 CUDA 的安装。 10 | 11 | ### 2. 安装 DeepStream SDK 12 | 13 | 目前 DeepStream SDK 稳定版本已经更新到 v6.2,官方推荐使用这个版本。 14 | 15 | ### 3. 将 MMYOLO 模型转换为 TensorRT Engine 16 | 17 | 推荐使用 EasyDeploy 中的 TensorRT 方案完成目标模型的转换部署,具体可参考 [此文档](../../easydeploy/docs/model_convert.md) 。 18 | 19 | ## 编译使用 20 | 21 | 当前项目使用的是 MMYOLO 的 rtmdet 模型,若想使用其他的模型,请参照目录下的配置文件进行改写。然后将转换完的 TensorRT engine 放在当前目录下并执行如下命令: 22 | 23 | ```bash 24 | mkdir build && cd build 25 | cmake .. 26 | make -j$(nproc) && make install 27 | ``` 28 | 29 | 完成编译后可使用如下命令进行推理: 30 | 31 | ```bash 32 | deepstream-app -c deepstream_app_config.txt 33 | ``` 34 | 35 | ## 项目代码结构 36 | 37 | ```bash 38 | ├── deepstream 39 | │ ├── configs # MMYOLO 模型对应的 DeepStream 配置 40 | │ │ └── config_infer_rtmdet.txt 41 | │ ├── custom_mmyolo_bbox_parser # 适配 DeepStream formats 的 parser 42 | │ │ └── nvdsparsebbox_mmyolo.cpp 43 | | ├── CMakeLists.txt 44 | │ ├── coco_labels.txt # coco labels 45 | │ ├── deepstream_app_config.txt # DeepStream app 配置 46 | │ ├── README_zh-CN.md 47 | │ └── README.md 48 | ``` 49 | -------------------------------------------------------------------------------- /projects/easydeploy/deepstream/coco_labels.txt: -------------------------------------------------------------------------------- 1 | person 2 | bicycle 3 | car 4 | motorbike 5 | aeroplane 6 | bus 7 | train 8 | truck 9 | boat 10 | traffic light 11 | fire hydrant 12 | stop sign 13 | parking meter 14 | bench 15 | bird 16 | cat 17 | dog 18 | horse 19 | sheep 20 | cow 21 | elephant 22 | bear 23 | zebra 24 | giraffe 25 | backpack 26 | umbrella 27 | handbag 28 | tie 29 | suitcase 30 | frisbee 31 | skis 32 | snowboard 33 | sports ball 34 | kite 35 | baseball bat 36 | baseball glove 37 | skateboard 38 | surfboard 39 | tennis racket 40 | bottle 41 | wine glass 42 | cup 43 | fork 44 | knife 45 | spoon 46 | bowl 47 | banana 48 | apple 49 | sandwich 50 | orange 51 | broccoli 52 | carrot 53 | hot dog 54 | pizza 55 | donut 56 | cake 57 | chair 58 | sofa 59 | pottedplant 60 | bed 61 | diningtable 62 | toilet 63 | tvmonitor 64 | laptop 65 | mouse 66 | remote 67 | keyboard 68 | cell phone 69 | microwave 70 | oven 71 | toaster 72 | sink 73 | refrigerator 74 | book 75 | clock 76 | vase 77 | scissors 78 | teddy bear 79 | hair drier 80 | toothbrush 81 | -------------------------------------------------------------------------------- /projects/easydeploy/deepstream/configs/config_infer_rtmdet.txt: -------------------------------------------------------------------------------- 1 | [property] 2 | gpu-id=0 3 | net-scale-factor=0.01735207357279195 4 | offsets=57.375;57.12;58.395 5 | model-color-format=1 6 | model-engine-file=../end2end.engine 7 | labelfile-path=../coco_labels.txt 8 | batch-size=1 9 | network-mode=0 10 | num-detected-classes=80 11 | interval=0 12 | gie-unique-id=1 13 | process-mode=1 14 | network-type=0 15 | cluster-mode=2 16 | maintain-aspect-ratio=1 17 | parse-bbox-func-name=NvDsInferParseCustomMMYOLO 18 | custom-lib-path=../build/libnvdsparsebbox_mmyolo.so 19 | 20 | [class-attrs-all] 21 | pre-cluster-threshold=0.45 22 | topk=100 23 | -------------------------------------------------------------------------------- /projects/easydeploy/deepstream/configs/config_infer_yolov5.txt: -------------------------------------------------------------------------------- 1 | [property] 2 | gpu-id=0 3 | net-scale-factor=0.0039215697906911373 4 | model-color-format=0 5 | model-engine-file=../end2end.engine 6 | labelfile-path=../coco_labels.txt 7 | batch-size=1 8 | network-mode=0 9 | num-detected-classes=80 10 | interval=0 11 | gie-unique-id=1 12 | process-mode=1 13 | network-type=0 14 | cluster-mode=2 15 | maintain-aspect-ratio=1 16 | parse-bbox-func-name=NvDsInferParseCustomMMYOLO 17 | custom-lib-path=../build/libnvdsparsebbox_mmyolo.so 18 | 19 | [class-attrs-all] 20 | pre-cluster-threshold=0.45 21 | topk=100 22 | -------------------------------------------------------------------------------- /projects/easydeploy/deepstream/configs/config_infer_yolov8.txt: -------------------------------------------------------------------------------- 1 | [property] 2 | gpu-id=0 3 | net-scale-factor=0.0039215697906911373 4 | model-color-format=0 5 | model-engine-file=../end2end.engine 6 | labelfile-path=../coco_labels.txt 7 | batch-size=1 8 | network-mode=0 9 | num-detected-classes=80 10 | interval=0 11 | gie-unique-id=1 12 | process-mode=1 13 | network-type=0 14 | cluster-mode=2 15 | maintain-aspect-ratio=1 16 | parse-bbox-func-name=NvDsInferParseCustomMMYOLO 17 | custom-lib-path=../build/libnvdsparsebbox_mmyolo.so 18 | 19 | [class-attrs-all] 20 | pre-cluster-threshold=0.45 21 | topk=100 22 | -------------------------------------------------------------------------------- /projects/easydeploy/deepstream/deepstream_app_config.txt: -------------------------------------------------------------------------------- 1 | [application] 2 | enable-perf-measurement=1 3 | perf-measurement-interval-sec=5 4 | 5 | [tiled-display] 6 | enable=1 7 | rows=1 8 | columns=1 9 | width=1280 10 | height=720 11 | gpu-id=0 12 | nvbuf-memory-type=0 13 | 14 | [source0] 15 | enable=1 16 | type=3 17 | uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4 18 | num-sources=1 19 | gpu-id=0 20 | cudadec-memtype=0 21 | 22 | [sink0] 23 | enable=1 24 | type=2 25 | sync=0 26 | gpu-id=0 27 | nvbuf-memory-type=0 28 | 29 | [osd] 30 | enable=1 31 | gpu-id=0 32 | border-width=5 33 | text-size=15 34 | text-color=1;1;1;1; 35 | text-bg-color=0.3;0.3;0.3;1 36 | font=Serif 37 | show-clock=0 38 | clock-x-offset=800 39 | clock-y-offset=820 40 | clock-text-size=12 41 | clock-color=1;0;0;0 42 | nvbuf-memory-type=0 43 | 44 | [streammux] 45 | gpu-id=0 46 | live-source=0 47 | batch-size=1 48 | batched-push-timeout=40000 49 | width=1920 50 | height=1080 51 | enable-padding=0 52 | nvbuf-memory-type=0 53 | 54 | [primary-gie] 55 | enable=1 56 | gpu-id=0 57 | gie-unique-id=1 58 | nvbuf-memory-type=0 59 | config-file=configs/config_infer_rtmdet.txt 60 | 61 | [tests] 62 | file-loop=0 63 | -------------------------------------------------------------------------------- /projects/easydeploy/examples/cv2_nms.py: -------------------------------------------------------------------------------- 1 | from typing import List, Tuple, Union 2 | 3 | import cv2 4 | from numpy import ndarray 5 | 6 | MAJOR, MINOR = map(int, cv2.__version__.split('.')[:2]) 7 | assert MAJOR == 4 8 | 9 | 10 | def non_max_suppression(boxes: Union[List[ndarray], Tuple[ndarray]], 11 | scores: Union[List[float], Tuple[float]], 12 | labels: Union[List[int], Tuple[int]], 13 | conf_thres: float = 0.25, 14 | iou_thres: float = 0.65) -> Tuple[List, List, List]: 15 | if MINOR >= 7: 16 | indices = cv2.dnn.NMSBoxesBatched(boxes, scores, labels, conf_thres, 17 | iou_thres) 18 | elif MINOR == 6: 19 | indices = cv2.dnn.NMSBoxes(boxes, scores, conf_thres, iou_thres) 20 | else: 21 | indices = cv2.dnn.NMSBoxes(boxes, scores, conf_thres, 22 | iou_thres).flatten() 23 | 24 | nmsd_boxes = [] 25 | nmsd_scores = [] 26 | nmsd_labels = [] 27 | for idx in indices: 28 | box = boxes[idx] 29 | # x0y0wh -> x0y0x1y1 30 | box[2:] = box[:2] + box[2:] 31 | score = scores[idx] 32 | label = labels[idx] 33 | nmsd_boxes.append(box) 34 | nmsd_scores.append(score) 35 | nmsd_labels.append(label) 36 | return nmsd_boxes, nmsd_scores, nmsd_labels 37 | -------------------------------------------------------------------------------- /projects/easydeploy/examples/requirements.txt: -------------------------------------------------------------------------------- 1 | onnxruntime 2 | opencv-python==4.7.0.72 3 | -------------------------------------------------------------------------------- /projects/easydeploy/model/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .backend import MMYOLOBackend 3 | from .backendwrapper import ORTWrapper, TRTWrapper 4 | from .model import DeployModel 5 | 6 | __all__ = ['DeployModel', 'TRTWrapper', 'ORTWrapper', 'MMYOLOBackend'] 7 | -------------------------------------------------------------------------------- /projects/easydeploy/model/backend.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | import torch 4 | import torch.nn.functional as F 5 | 6 | 7 | class MMYOLOBackend(Enum): 8 | AX620A = 'ax620a' 9 | COREML = 'coreml' 10 | HORIZONX3 = 'horizonx3' 11 | NCNN = 'ncnn' 12 | ONNXRUNTIME = 'onnxruntime' 13 | OPENVINO = 'openvino' 14 | PPLNN = 'pplnn' 15 | RKNN = 'rknn' 16 | TENSORRT8 = 'tensorrt8' 17 | TENSORRT7 = 'tensorrt7' 18 | TORCHSCRIPT = 'torchscript' 19 | TVM = 'tvm' 20 | 21 | 22 | def HSigmoid__forward(self, x: torch.Tensor) -> torch.Tensor: 23 | return F.hardsigmoid(x, inplace=True) 24 | -------------------------------------------------------------------------------- /projects/easydeploy/nms/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .ort_nms import onnx_nms 3 | from .trt_nms import batched_nms, efficient_nms 4 | 5 | __all__ = ['efficient_nms', 'batched_nms', 'onnx_nms'] 6 | -------------------------------------------------------------------------------- /projects/example_project/configs/yolov5_s_dummy-backbone_v61_syncbn_8xb16-300e_coco.py: -------------------------------------------------------------------------------- 1 | _base_ = '../../../configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py' 2 | 3 | custom_imports = dict(imports=['projects.example_project.dummy']) 4 | 5 | _base_.model.backbone.type = 'DummyYOLOv5CSPDarknet' 6 | -------------------------------------------------------------------------------- /projects/example_project/dummy/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from .dummy_yolov5cspdarknet import DummyYOLOv5CSPDarknet 3 | 4 | __all__ = ['DummyYOLOv5CSPDarknet'] 5 | -------------------------------------------------------------------------------- /projects/example_project/dummy/dummy_yolov5cspdarknet.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from mmyolo.models import YOLOv5CSPDarknet 4 | from mmyolo.registry import MODELS 5 | 6 | 7 | @MODELS.register_module() 8 | class DummyYOLOv5CSPDarknet(YOLOv5CSPDarknet): 9 | """Implements a dummy YOLOv5CSPDarknet wrapper for demonstration purpose. 10 | Args: 11 | **kwargs: All the arguments are passed to the parent class. 12 | """ 13 | 14 | def __init__(self, **kwargs) -> None: 15 | print('Hello world!') 16 | super().__init__(**kwargs) 17 | -------------------------------------------------------------------------------- /projects/misc/custom_dataset/README.md: -------------------------------------------------------------------------------- 1 | Tips: 这个是自定义数据集的 config 文件,请结合 [标注+训练+测试+部署全流程](https://github.com/open-mmlab/mmyolo/blob/main/docs/zh_cn/recommended_topics/labeling_to_deployment_tutorials.md) 来使用。 2 | 3 | Tips: This is the config file of the custom dataset. Please use it in combination with [Annotation-to-deployment workflow for custom dataset](https://github.com/open-mmlab/mmyolo/blob/main/docs/en/recommended_topics/labeling_to_deployment_tutorials.md). 4 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/README.md: -------------------------------------------------------------------------------- 1 | Tips: 这是 MMYOLO 应用范例的配置文件,请结合 [基于 MMYOLO 的频高图实时目标检测 benchmark](/docs/zh_cn/recommended_topics/application_examples/ionogram_detection.md) 来使用。 2 | 3 | Tips: This is the config file of the MMYOLO application examples. Please use it in combination with [A Benchmark for Ionogram Detection Based on MMYOLO](/docs/en/recommended_topics/application_examples/ionogram_detection.md). 4 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb32-100e_ionogram_mosaic.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py' 2 | 3 | # ======================= Modified parameters ===================== 4 | # -----data related----- 5 | train_batch_size_per_gpu = 32 6 | 7 | # -----train val related----- 8 | base_lr = _base_.base_lr * train_batch_size_per_gpu \ 9 | / _base_.train_batch_size_per_gpu / 2 10 | train_pipeline = [ 11 | dict(type='LoadImageFromFile'), 12 | dict(type='LoadAnnotations', with_bbox=True), 13 | dict( 14 | type='Mosaic', 15 | img_scale=(640, 640), 16 | pad_val=114.0, 17 | pre_transform=[ 18 | dict(type='LoadImageFromFile'), 19 | dict(type='LoadAnnotations', with_bbox=True) 20 | ]), 21 | dict( 22 | type='mmdet.PackDetInputs', 23 | meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape')) 24 | ] 25 | 26 | # ===================== Unmodified in most cases ================== 27 | train_dataloader = dict( 28 | batch_size=train_batch_size_per_gpu, 29 | dataset=dict(dataset=dict(pipeline=train_pipeline))) 30 | 31 | val_dataloader = dict(batch_size=train_batch_size_per_gpu) 32 | 33 | test_dataloader = dict(batch_size=train_batch_size_per_gpu) 34 | 35 | optim_wrapper = dict(optimizer=dict(lr=base_lr)) 36 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_aug0.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py' 2 | 3 | # ======================= Modified parameters ===================== 4 | # -----train val related----- 5 | train_pipeline = [ 6 | dict(type='LoadImageFromFile'), 7 | dict(type='LoadAnnotations', with_bbox=True), 8 | dict(type='YOLOv5KeepRatioResize', scale=(640, 640)), 9 | dict( 10 | type='LetterResize', 11 | scale=(640, 640), 12 | allow_scale_up=False, 13 | pad_val=dict(img=114)), 14 | dict( 15 | type='mmdet.PackDetInputs', 16 | meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape', 17 | 'scale_factor', 'pad_param')) 18 | ] 19 | 20 | # ===================== Unmodified in most cases ================== 21 | train_dataloader = dict(dataset=dict(dataset=dict(pipeline=train_pipeline))) 22 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-100e_ionogram_mosaic_affine.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py' 2 | 3 | # ======================= Modified parameters ===================== 4 | # -----train val related----- 5 | train_pipeline = [ 6 | dict(type='LoadImageFromFile'), 7 | dict(type='LoadAnnotations', with_bbox=True), 8 | dict( 9 | type='Mosaic', 10 | img_scale=(640, 640), 11 | pad_val=114.0, 12 | pre_transform=[ 13 | dict(type='LoadImageFromFile'), 14 | dict(type='LoadAnnotations', with_bbox=True) 15 | ]), 16 | dict( 17 | type='YOLOv5RandomAffine', 18 | max_rotate_degree=0.0, 19 | max_shear_degree=0.0, 20 | scaling_ratio_range=(0.5, 1.5), 21 | border=(-320, -320), 22 | border_val=(114, 114, 114)), 23 | dict( 24 | type='mmdet.PackDetInputs', 25 | meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape')) 26 | ] 27 | 28 | # ===================== Unmodified in most cases ================== 29 | train_dataloader = dict(dataset=dict(dataset=dict(pipeline=train_pipeline))) 30 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/yolov5/yolov5_s-v61_fast_1xb96-200e_ionogram_pre0.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov5_s-v61_fast_1xb96-100e_ionogram.py' 2 | 3 | # ======================= Modified parameters ===================== 4 | # -----train val related----- 5 | base_lr = _base_.base_lr * 4 6 | max_epochs = 200 7 | load_from = None 8 | logger_interval = 50 9 | 10 | train_cfg = dict(max_epochs=max_epochs, ) 11 | 12 | # ===================== Unmodified in most cases ================== 13 | optim_wrapper = dict(optimizer=dict(lr=base_lr)) 14 | 15 | default_hooks = dict( 16 | param_scheduler=dict(max_epochs=max_epochs), 17 | logger=dict(type='LoggerHook', interval=logger_interval)) 18 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/yolov6/yolov6_l_fast_1xb32-100e_ionogram.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_m_fast_1xb32-100e_ionogram.py' 2 | 3 | # ======================= Modified parameters ======================= 4 | # -----model related----- 5 | deepen_factor = 1 6 | widen_factor = 1 7 | 8 | # -----train val related----- 9 | load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov6/yolov6_l_syncbn_fast_8xb32-300e_coco/yolov6_l_syncbn_fast_8xb32-300e_coco_20221109_183156-91e3c447.pth' # noqa 10 | 11 | # ====================== Unmodified in most cases =================== 12 | model = dict( 13 | backbone=dict( 14 | deepen_factor=deepen_factor, 15 | widen_factor=widen_factor, 16 | hidden_ratio=1. / 2, 17 | block_cfg=dict( 18 | type='ConvWrapper', 19 | norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)), 20 | act_cfg=dict(type='SiLU', inplace=True)), 21 | neck=dict( 22 | deepen_factor=deepen_factor, 23 | widen_factor=widen_factor, 24 | hidden_ratio=1. / 2, 25 | block_cfg=dict( 26 | type='ConvWrapper', 27 | norm_cfg=dict(type='BN', momentum=0.03, eps=0.001)), 28 | block_act_cfg=dict(type='SiLU', inplace=True)), 29 | bbox_head=dict(head_module=dict(widen_factor=widen_factor))) 30 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/yolov6/yolov6_s_fast_1xb32-200e_ionogram_pre0.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov6_s_fast_1xb32-100e_ionogram.py' 2 | 3 | # ======================= Modified parameters ===================== 4 | base_lr = _base_.base_lr * 4 5 | optim_wrapper = dict(optimizer=dict(lr=base_lr)) 6 | max_epochs = 200 7 | load_from = None 8 | 9 | # ==================== Unmodified in most cases =================== 10 | train_cfg = dict( 11 | max_epochs=max_epochs, 12 | val_begin=20, 13 | ) 14 | 15 | default_hooks = dict( 16 | param_scheduler=dict(max_epochs=max_epochs), 17 | logger=dict(type='LoggerHook', interval=50)) 18 | -------------------------------------------------------------------------------- /projects/misc/ionogram_detection/yolov7/yolov7_x_fast_1xb16-100e_ionogram.py: -------------------------------------------------------------------------------- 1 | _base_ = './yolov7_l_fast_1xb16-100e_ionogram.py' 2 | 3 | # ======================== Modified parameters ======================= 4 | load_from = 'https://download.openmmlab.com/mmyolo/v0/yolov7/yolov7_x_syncbn_fast_8x16b-300e_coco/yolov7_x_syncbn_fast_8x16b-300e_coco_20221124_215331-ef949a68.pth' # noqa 5 | 6 | # ===================== Unmodified in most cases ================== 7 | model = dict( 8 | backbone=dict(arch='X'), 9 | neck=dict( 10 | in_channels=[640, 1280, 1280], 11 | out_channels=[160, 320, 640], 12 | block_cfg=dict( 13 | type='ELANBlock', 14 | middle_ratio=0.4, 15 | block_ratio=0.4, 16 | num_blocks=3, 17 | num_convs_in_block=2), 18 | use_repconv_outs=False), 19 | bbox_head=dict(head_module=dict(in_channels=[320, 640, 1280]))) 20 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | addopts = --xdoctest --xdoctest-style=auto 3 | norecursedirs = .git ignore build __pycache__ data docker docs .eggs 4 | 5 | filterwarnings= default 6 | ignore:.*No cfgstr given in Cacher constructor or call.*:Warning 7 | ignore:.*Define the __nice__ method for.*:Warning 8 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | -r requirements/build.txt 2 | -r requirements/runtime.txt 3 | -r requirements/tests.txt 4 | -------------------------------------------------------------------------------- /requirements/albu.txt: -------------------------------------------------------------------------------- 1 | albumentations --no-binary qudida,albumentations 2 | -------------------------------------------------------------------------------- /requirements/build.txt: -------------------------------------------------------------------------------- 1 | # These must be installed before building mmyolo 2 | cython 3 | numpy 4 | -------------------------------------------------------------------------------- /requirements/docs.txt: -------------------------------------------------------------------------------- 1 | docutils==0.16.0 2 | mmcv>=2.0.0rc4,<2.1.0 3 | mmdet>=3.0.0 4 | mmengine>=0.7.1 5 | myst-parser 6 | -e git+https://github.com/open-mmlab/pytorch_sphinx_theme.git#egg=pytorch_sphinx_theme 7 | sphinx==4.0.2 8 | sphinx-copybutton 9 | sphinx_markdown_tables 10 | sphinx_rtd_theme==0.5.2 11 | torch 12 | torchvision 13 | urllib3<2.0.0 14 | -------------------------------------------------------------------------------- /requirements/mminstall.txt: -------------------------------------------------------------------------------- 1 | mmcv>=2.0.0rc4,<2.1.0 2 | mmdet>=3.0.0 3 | mmengine>=0.7.1 4 | -------------------------------------------------------------------------------- /requirements/mmpose.txt: -------------------------------------------------------------------------------- 1 | mmpose>=1.0.0 2 | -------------------------------------------------------------------------------- /requirements/mmrotate.txt: -------------------------------------------------------------------------------- 1 | mmrotate>=1.0.0rc1 2 | -------------------------------------------------------------------------------- /requirements/runtime.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | prettytable 3 | -------------------------------------------------------------------------------- /requirements/sahi.txt: -------------------------------------------------------------------------------- 1 | sahi>=0.11.4 2 | -------------------------------------------------------------------------------- /requirements/tests.txt: -------------------------------------------------------------------------------- 1 | flake8 2 | interrogate 3 | isort==4.3.21 4 | # Note: used for kwarray.group_items, this may be ported to mmcv in the future. 5 | kwarray 6 | memory_profiler 7 | mmcls>=1.0.0rc4 8 | mmpose>=1.0.0 9 | mmrazor>=1.0.0rc2 10 | mmrotate>=1.0.0rc1 11 | parameterized 12 | protobuf<=3.20.1 13 | psutil 14 | pytest 15 | ubelt 16 | xdoctest>=0.10.0 17 | yapf 18 | -------------------------------------------------------------------------------- /resources/mmyolo-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/resources/mmyolo-logo.png -------------------------------------------------------------------------------- /resources/qq_group_qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/resources/qq_group_qrcode.jpg -------------------------------------------------------------------------------- /resources/zhihu_qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/resources/zhihu_qrcode.jpg -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [isort] 2 | line_length = 79 3 | multi_line_output = 0 4 | extra_standard_library = setuptools 5 | known_first_party = mmyolo 6 | known_third_party = PIL,asynctest,cityscapesscripts,cv2,gather_models,matplotlib,mmcv,numpy,onnx,onnxruntime,pycocotools,pytest,parameterized,pytorch_sphinx_theme,requests,scipy,seaborn,six,terminaltables,torch,ts,yaml,mmengine,mmdet,mmdeploy 7 | no_lines_before = STDLIB,LOCALFOLDER 8 | default_section = THIRDPARTY 9 | 10 | [yapf] 11 | BASED_ON_STYLE = pep8 12 | BLANK_LINE_BEFORE_NESTED_CLASS_OR_DEF = true 13 | SPLIT_BEFORE_EXPRESSION_AFTER_OPENING_PAREN = true 14 | 15 | # ignore-words-list needs to be lowercase format. For example, if we want to 16 | # ignore word "BA", then we need to append "ba" to ignore-words-list rather 17 | # than "BA" 18 | [codespell] 19 | skip = *.ipynb 20 | quiet-level = 3 21 | ignore-words-list = patten,nd,ty,mot,hist,formating,winn,gool,datas,wan,confids,tood,ba,warmup,elease,dota 22 | -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2007/Annotations/000001.xml: -------------------------------------------------------------------------------- 1 | 2 | VOC2007 3 | 000001.jpg 4 | 5 | The VOC2007 Database 6 | PASCAL VOC2007 7 | flickr 8 | 341012865 9 | 10 | 11 | Fried Camels 12 | Jinky the Fruit Bat 13 | 14 | 15 | 353 16 | 500 17 | 3 18 | 19 | 0 20 | 21 | dog 22 | Left 23 | 1 24 | 0 25 | 26 | 48 27 | 240 28 | 195 29 | 371 30 | 31 | 32 | 33 | person 34 | Left 35 | 1 36 | 0 37 | 38 | 8 39 | 12 40 | 352 41 | 498 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2007/ImageSets/Main/test.txt: -------------------------------------------------------------------------------- 1 | 000001 2 | -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2007/ImageSets/Main/trainval.txt: -------------------------------------------------------------------------------- 1 | 000001 2 | -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2007/JPEGImages/000001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/tests/data/VOCdevkit/VOC2007/JPEGImages/000001.jpg -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2012/Annotations/000001.xml: -------------------------------------------------------------------------------- 1 | 2 | VOC2007 3 | 000002.jpg 4 | 5 | The VOC2007 Database 6 | PASCAL VOC2007 7 | flickr 8 | 329145082 9 | 10 | 11 | hiromori2 12 | Hiroyuki Mori 13 | 14 | 15 | 335 16 | 500 17 | 3 18 | 19 | 0 20 | 21 | train 22 | Unspecified 23 | 0 24 | 0 25 | 26 | 139 27 | 200 28 | 207 29 | 301 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2012/ImageSets/Main/test.txt: -------------------------------------------------------------------------------- 1 | 000001 2 | -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2012/ImageSets/Main/trainval.txt: -------------------------------------------------------------------------------- 1 | 000001 2 | -------------------------------------------------------------------------------- /tests/data/VOCdevkit/VOC2012/JPEGImages/000001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/tests/data/VOCdevkit/VOC2012/JPEGImages/000001.jpg -------------------------------------------------------------------------------- /tests/data/color.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-mmlab/mmyolo/8c4d9dc503dc8e327bec8147e8dc97124052f693/tests/data/color.jpg -------------------------------------------------------------------------------- /tests/test_datasets/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_datasets/test_transforms/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_deploy/conftest.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import pytest 3 | 4 | 5 | @pytest.fixture(autouse=True) 6 | def init_test(): 7 | # init default scope 8 | from mmdet.utils import register_all_modules as register_det 9 | 10 | from mmyolo.utils import register_all_modules as register_yolo 11 | 12 | register_yolo(True) 13 | register_det(False) 14 | -------------------------------------------------------------------------------- /tests/test_downstream/test_mmrazor.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import copy 3 | 4 | import pytest 5 | from mmcls.models.backbones.base_backbone import BaseBackbone 6 | 7 | from mmyolo.testing import get_detector_cfg 8 | 9 | 10 | @pytest.mark.parametrize('cfg_file', [ 11 | 'razor/subnets/' 12 | 'yolov5_s_spos_shufflenetv2_syncbn_8xb16-300e_coco.py', 'razor/subnets/' 13 | 'rtmdet_tiny_ofa_lat31_syncbn_16xb16-300e_coco.py', 'razor/subnets/' 14 | 'yolov6_l_attentivenas_a6_d12_syncbn_fast_8xb32-300e_coco.py' 15 | ]) 16 | def test_razor_backbone_init(cfg_file): 17 | model = get_detector_cfg(cfg_file) 18 | model_cfg = copy.deepcopy(model.backbone) 19 | from mmrazor.registry import MODELS 20 | model = MODELS.build(model_cfg) 21 | assert isinstance(model, BaseBackbone) 22 | -------------------------------------------------------------------------------- /tests/test_engine/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_engine/test_hooks/test_switch_to_deploy_hook.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | from unittest.mock import Mock 4 | 5 | from mmyolo.engine.hooks import SwitchToDeployHook 6 | from mmyolo.models import RepVGGBlock 7 | from mmyolo.utils import register_all_modules 8 | 9 | register_all_modules() 10 | 11 | 12 | class TestSwitchToDeployHook(TestCase): 13 | 14 | def test(self): 15 | 16 | runner = Mock() 17 | runner.model = RepVGGBlock(256, 256) 18 | 19 | hook = SwitchToDeployHook() 20 | self.assertFalse(runner.model.deploy) 21 | 22 | # test after change mode 23 | hook.before_test_epoch(runner) 24 | self.assertTrue(runner.model.deploy) 25 | -------------------------------------------------------------------------------- /tests/test_engine/test_optimizers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_backbone/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_backbone/utils.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from mmdet.models.backbones.res2net import Bottle2neck 3 | from mmdet.models.backbones.resnet import BasicBlock, Bottleneck 4 | from mmdet.models.backbones.resnext import Bottleneck as BottleneckX 5 | from mmdet.models.layers import SimplifiedBasicBlock 6 | from torch.nn.modules import GroupNorm 7 | from torch.nn.modules.batchnorm import _BatchNorm 8 | 9 | 10 | def is_block(modules): 11 | """Check if is ResNet building block.""" 12 | if isinstance(modules, (BasicBlock, Bottleneck, BottleneckX, Bottle2neck, 13 | SimplifiedBasicBlock)): 14 | return True 15 | return False 16 | 17 | 18 | def is_norm(modules): 19 | """Check if is one of the norms.""" 20 | if isinstance(modules, (GroupNorm, _BatchNorm)): 21 | return True 22 | return False 23 | 24 | 25 | def check_norm_state(modules, train_state): 26 | """Check if norm layer is in correct train state.""" 27 | for mod in modules: 28 | if isinstance(mod, _BatchNorm): 29 | if mod.training != train_state: 30 | return False 31 | return True 32 | -------------------------------------------------------------------------------- /tests/test_models/test_data_preprocessor/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_dense_heads/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_layers/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_layers/test_yolo_bricks.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from unittest import TestCase 4 | 5 | import torch 6 | 7 | from mmyolo.models.layers import SPPFBottleneck 8 | from mmyolo.utils import register_all_modules 9 | 10 | register_all_modules() 11 | 12 | 13 | class TestSPPFBottleneck(TestCase): 14 | 15 | def test_forward(self): 16 | input_tensor = torch.randn((1, 3, 20, 20)) 17 | bottleneck = SPPFBottleneck(3, 16) 18 | out_tensor = bottleneck(input_tensor) 19 | self.assertEqual(out_tensor.shape, (1, 16, 20, 20)) 20 | 21 | bottleneck = SPPFBottleneck(3, 16, kernel_sizes=[3, 5, 7]) 22 | out_tensor = bottleneck(input_tensor) 23 | self.assertEqual(out_tensor.shape, (1, 16, 20, 20)) 24 | 25 | # set len(kernel_sizes)=4 26 | bottleneck = SPPFBottleneck(3, 16, kernel_sizes=[3, 5, 7, 9]) 27 | out_tensor = bottleneck(input_tensor) 28 | self.assertEqual(out_tensor.shape, (1, 16, 20, 20)) 29 | 30 | # set use_conv_first=False 31 | bottleneck = SPPFBottleneck( 32 | 3, 16, use_conv_first=False, kernel_sizes=[3, 5, 7, 9]) 33 | out_tensor = bottleneck(input_tensor) 34 | self.assertEqual(out_tensor.shape, (1, 16, 20, 20)) 35 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/test_cspnext_pafpn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | 4 | import torch 5 | 6 | from mmyolo.models.necks import CSPNeXtPAFPN 7 | from mmyolo.utils import register_all_modules 8 | 9 | register_all_modules() 10 | 11 | 12 | class TestCSPNeXtPAFPN(TestCase): 13 | 14 | def test_forward(self): 15 | s = 64 16 | in_channels = [8, 16, 32] 17 | feat_sizes = [s // 2**i for i in range(4)] # [32, 16, 8] 18 | out_channels = 24 19 | feats = [ 20 | torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) 21 | for i in range(len(in_channels)) 22 | ] 23 | neck = CSPNeXtPAFPN(in_channels=in_channels, out_channels=out_channels) 24 | outs = neck(feats) 25 | assert len(outs) == len(feats) 26 | for i in range(len(feats)): 27 | assert outs[i].shape[1] == out_channels 28 | assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i) 29 | 30 | # test depth-wise 31 | neck = CSPNeXtPAFPN( 32 | in_channels=in_channels, 33 | out_channels=out_channels, 34 | use_depthwise=True) 35 | 36 | from mmcv.cnn.bricks import DepthwiseSeparableConvModule 37 | self.assertTrue(neck.conv, DepthwiseSeparableConvModule) 38 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/test_yolov5_pafpn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | 4 | import torch 5 | 6 | from mmyolo.models.necks import YOLOv5PAFPN 7 | from mmyolo.utils import register_all_modules 8 | 9 | register_all_modules() 10 | 11 | 12 | class TestYOLOv5PAFPN(TestCase): 13 | 14 | def test_forward(self): 15 | s = 64 16 | in_channels = [8, 16, 32] 17 | feat_sizes = [s // 2**i for i in range(4)] # [32, 16, 8] 18 | out_channels = [8, 16, 32] 19 | feats = [ 20 | torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) 21 | for i in range(len(in_channels)) 22 | ] 23 | neck = YOLOv5PAFPN(in_channels=in_channels, out_channels=out_channels) 24 | outs = neck(feats) 25 | assert len(outs) == len(feats) 26 | for i in range(len(feats)): 27 | assert outs[i].shape[1] == out_channels[i] 28 | assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i) 29 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/test_yolov8_pafpn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | 4 | import torch 5 | 6 | from mmyolo.models import YOLOv8PAFPN 7 | from mmyolo.utils import register_all_modules 8 | 9 | register_all_modules() 10 | 11 | 12 | class TestYOLOv8PAFPN(TestCase): 13 | 14 | def test_YOLOv8PAFPN_forward(self): 15 | s = 64 16 | in_channels = [8, 16, 32] 17 | feat_sizes = [s // 2**i for i in range(4)] # [32, 16, 8] 18 | out_channels = [8, 16, 32] 19 | feats = [ 20 | torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) 21 | for i in range(len(in_channels)) 22 | ] 23 | neck = YOLOv8PAFPN(in_channels=in_channels, out_channels=out_channels) 24 | outs = neck(feats) 25 | assert len(outs) == len(feats) 26 | for i in range(len(feats)): 27 | assert outs[i].shape[1] == out_channels[i] 28 | assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i) 29 | -------------------------------------------------------------------------------- /tests/test_models/test_necks/test_yolox_pafpn.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | 4 | import torch 5 | 6 | from mmyolo.models.necks import YOLOXPAFPN 7 | from mmyolo.utils import register_all_modules 8 | 9 | register_all_modules() 10 | 11 | 12 | class TestYOLOXPAFPN(TestCase): 13 | 14 | def test_forward(self): 15 | s = 64 16 | in_channels = [8, 16, 32] 17 | feat_sizes = [s // 2**i for i in range(4)] # [32, 16, 8] 18 | out_channels = 24 19 | feats = [ 20 | torch.rand(1, in_channels[i], feat_sizes[i], feat_sizes[i]) 21 | for i in range(len(in_channels)) 22 | ] 23 | neck = YOLOXPAFPN(in_channels=in_channels, out_channels=out_channels) 24 | outs = neck(feats) 25 | assert len(outs) == len(feats) 26 | for i in range(len(feats)): 27 | assert outs[i].shape[1] == out_channels 28 | assert outs[i].shape[2] == outs[i].shape[3] == s // (2**i) 29 | -------------------------------------------------------------------------------- /tests/test_models/test_plugins/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_plugins/test_cbam.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | 3 | from unittest import TestCase 4 | 5 | import torch 6 | 7 | from mmyolo.models.plugins import CBAM 8 | from mmyolo.utils import register_all_modules 9 | 10 | register_all_modules() 11 | 12 | 13 | class TestCBAM(TestCase): 14 | 15 | def test_forward(self): 16 | tensor_shape = (2, 16, 20, 20) 17 | 18 | images = torch.randn(*tensor_shape) 19 | cbam = CBAM(16) 20 | out = cbam(images) 21 | self.assertEqual(out.shape, tensor_shape) 22 | 23 | # test other ratio 24 | cbam = CBAM(16, reduce_ratio=8) 25 | out = cbam(images) 26 | self.assertEqual(out.shape, tensor_shape) 27 | 28 | # test other act_cfg in ChannelAttention 29 | cbam = CBAM(in_channels=16, act_cfg=dict(type='Sigmoid')) 30 | out = cbam(images) 31 | self.assertEqual(out.shape, tensor_shape) 32 | -------------------------------------------------------------------------------- /tests/test_models/test_task_modules/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_task_modules/test_assigners/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_task_modules/test_coders/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_task_modules/test_coders/test_distance_point_bbox_coder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | 4 | import torch 5 | 6 | from mmyolo.models.task_modules.coders import DistancePointBBoxCoder 7 | 8 | 9 | class TestDistancePointBBoxCoder(TestCase): 10 | 11 | def test_decoder(self): 12 | coder = DistancePointBBoxCoder() 13 | 14 | points = torch.Tensor([[74., 61.], [-29., 106.], [138., 61.], 15 | [29., 170.]]) 16 | pred_bboxes = torch.Tensor([[0, -1, 3, 3], [-1, -7, -4.8, 9], 17 | [-23, -1, 12, 1], [14.5, -13, 10, 18.3]]) 18 | expected_distance = torch.Tensor([[74, 63, 80, 67], 19 | [-25, 134, -48.2, 142], 20 | [276, 67, 210, 67], 21 | [-58, 248, 89, 279.8]]) 22 | strides = torch.Tensor([2, 4, 6, 6]) 23 | out_distance = coder.decode(points, pred_bboxes, strides) 24 | assert expected_distance.allclose(out_distance) 25 | 26 | batch_priors = points.unsqueeze(0).repeat(2, 1, 1) 27 | batch_pred_bboxes = pred_bboxes.unsqueeze(0).repeat(2, 1, 1) 28 | batch_out = coder.decode(batch_priors, batch_pred_bboxes, strides)[0] 29 | assert out_distance.allclose(batch_out) 30 | -------------------------------------------------------------------------------- /tests/test_models/test_task_modules/test_coders/test_yolov5_bbox_coder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | 4 | import torch 5 | 6 | from mmyolo.models.task_modules.coders import YOLOv5BBoxCoder 7 | 8 | 9 | class TestYOLOv5Coder(TestCase): 10 | 11 | def test_decoder(self): 12 | coder = YOLOv5BBoxCoder() 13 | 14 | priors = torch.Tensor([[10., 10., 20., 20.], [10., 8., 10., 10.], 15 | [15., 8., 20., 3.], [2., 5., 5., 8.]]) 16 | pred_bboxes = torch.Tensor([[0.0000, 0.0000, 1.0000, 1.0000], 17 | [0.1409, 0.1409, 2.8591, 2.8591], 18 | [0.0000, 0.3161, 4.1945, 0.6839], 19 | [1.0000, 5.0000, 9.0000, 5.0000]]) 20 | strides = torch.Tensor([2, 4, 8, 8]) 21 | expected_decode_bboxes = torch.Tensor( 22 | [[4.3111, 4.3111, 25.6889, 25.6889], 23 | [10.2813, 5.7033, 10.2813, 12.8594], 24 | [7.7949, 11.1710, 27.2051, 2.3369], 25 | [1.1984, 8.4730, 13.1955, 20.3129]]) 26 | out = coder.decode(priors, pred_bboxes, strides) 27 | assert expected_decode_bboxes.allclose(out, atol=1e-04) 28 | 29 | batch_priors = priors.unsqueeze(0).repeat(2, 1, 1) 30 | batch_pred_bboxes = pred_bboxes.unsqueeze(0).repeat(2, 1, 1) 31 | batch_out = coder.decode(batch_priors, batch_pred_bboxes, strides)[0] 32 | assert out.allclose(batch_out) 33 | -------------------------------------------------------------------------------- /tests/test_models/test_task_modules/test_coders/test_yolox_bbox_coder.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | from unittest import TestCase 3 | 4 | import torch 5 | 6 | from mmyolo.models.task_modules.coders import YOLOXBBoxCoder 7 | 8 | 9 | class TestYOLOv5Coder(TestCase): 10 | 11 | def test_decoder(self): 12 | coder = YOLOXBBoxCoder() 13 | 14 | priors = torch.Tensor([[10., 10.], [8., 8.], [15., 8.], [2., 5.]]) 15 | pred_bboxes = torch.Tensor([[0.0000, 0.0000, 1.0000, 1.0000], 16 | [0.0409, 0.1409, 0.8591, 0.8591], 17 | [0.0000, 0.3161, 0.1945, 0.6839], 18 | [1.0000, 5.0000, 0.2000, 0.6000]]) 19 | strides = torch.Tensor([2, 4, 6, 6]) 20 | expected_decode_bboxes = torch.Tensor( 21 | [[7.2817, 7.2817, 12.7183, 12.7183], 22 | [3.4415, 3.8415, 12.8857, 13.2857], 23 | [11.3559, 3.9518, 18.6441, 15.8414], 24 | [4.3358, 29.5336, 11.6642, 40.4664]]) 25 | out = coder.decode(priors, pred_bboxes, strides) 26 | assert expected_decode_bboxes.allclose(out, atol=1e-04) 27 | 28 | batch_priors = priors.unsqueeze(0).repeat(2, 1, 1) 29 | batch_pred_bboxes = pred_bboxes.unsqueeze(0).repeat(2, 1, 1) 30 | batch_out = coder.decode(batch_priors, batch_pred_bboxes, strides)[0] 31 | assert out.allclose(batch_out) 32 | -------------------------------------------------------------------------------- /tests/test_models/test_utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | -------------------------------------------------------------------------------- /tests/test_models/test_utils/test_misc.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import numpy as np 3 | import pytest 4 | import torch 5 | from mmengine.structures import InstanceData 6 | from torch import Tensor 7 | 8 | from mmyolo.models.utils import gt_instances_preprocess 9 | from mmyolo.utils import register_all_modules 10 | 11 | register_all_modules() 12 | 13 | 14 | class TestGtInstancesPreprocess: 15 | 16 | @pytest.mark.parametrize('box_dim', [4, 5]) 17 | def test(self, box_dim): 18 | gt_instances = InstanceData( 19 | bboxes=torch.empty((0, box_dim)), labels=torch.LongTensor([])) 20 | batch_size = 1 21 | batch_instance = gt_instances_preprocess([gt_instances], batch_size) 22 | assert isinstance(batch_instance, Tensor) 23 | assert len(batch_instance.shape) == 3, 'the len of result must be 3.' 24 | assert batch_instance.size(-1) == box_dim + 1 25 | 26 | @pytest.mark.parametrize('box_dim', [4, 5]) 27 | def test_fast_version(self, box_dim: int): 28 | gt_instances = torch.from_numpy( 29 | np.array([[0., 1., *(0., ) * box_dim]], dtype=np.float32)) 30 | batch_size = 1 31 | batch_instance = gt_instances_preprocess(gt_instances, batch_size) 32 | assert isinstance(batch_instance, Tensor) 33 | assert len(batch_instance.shape) == 3, 'the len of result must be 3.' 34 | assert batch_instance.shape[1] == 1 35 | assert batch_instance.shape[2] == box_dim + 1 36 | -------------------------------------------------------------------------------- /tests/test_utils/test_collect_env.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) OpenMMLab. All rights reserved. 2 | import sys 3 | from unittest import TestCase 4 | 5 | import mmcv 6 | import mmdet 7 | import mmengine 8 | 9 | from mmyolo.utils import collect_env 10 | 11 | 12 | class TestCollectEnv(TestCase): 13 | 14 | def test_collect_env(self): 15 | env_info = collect_env() 16 | print(env_info) 17 | expected_keys = [ 18 | 'sys.platform', 'Python', 'CUDA available', 'PyTorch', 19 | 'PyTorch compiling details', 'OpenCV', 'MMEngine', 'GCC' 20 | ] 21 | for key in expected_keys: 22 | assert key in env_info 23 | 24 | if env_info['CUDA available']: 25 | for key in ['CUDA_HOME', 'NVCC']: 26 | assert key in env_info 27 | 28 | assert env_info['sys.platform'] == sys.platform 29 | assert env_info['Python'] == sys.version.replace('\n', '') 30 | 31 | assert env_info['MMEngine'] == mmengine.__version__ 32 | assert env_info['MMCV'] == mmcv.__version__ 33 | assert env_info['MMDetection'] == mmdet.__version__ 34 | -------------------------------------------------------------------------------- /tools/dataset_converters/dota/README.md: -------------------------------------------------------------------------------- 1 | # Preparing DOTA Dataset 2 | 3 | Please refer to [Dataset preparation and description](../../../docs/en/recommended_topics/dataset_preparation.md) 4 | -------------------------------------------------------------------------------- /tools/dataset_converters/dota/split_config/multi_scale.json: -------------------------------------------------------------------------------- 1 | { 2 | "patch_sizes": [ 3 | 1024 4 | ], 5 | "patch_overlap_sizes": [ 6 | 500 7 | ], 8 | "img_resize_ratio": [ 9 | 0.5, 1.0, 1.5 10 | ], 11 | "min_img_ratio": 0.6, 12 | "iof_thr": 0.7, 13 | "padding": true, 14 | "padding_value": [ 15 | 104, 16 | 116, 17 | 124 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /tools/dataset_converters/dota/split_config/single_scale.json: -------------------------------------------------------------------------------- 1 | { 2 | "patch_sizes": [ 3 | 1024 4 | ], 5 | "patch_overlap_sizes": [ 6 | 200 7 | ], 8 | "img_resize_ratio": [ 9 | 1.0 10 | ], 11 | "min_img_ratio": 0.6, 12 | "iof_thr": 0.7, 13 | "padding": true, 14 | "padding_value": [ 15 | 104, 16 | 116, 17 | 124 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /tools/dist_test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | CONFIG=$1 4 | CHECKPOINT=$2 5 | GPUS=$3 6 | NNODES=${NNODES:-1} 7 | NODE_RANK=${NODE_RANK:-0} 8 | PORT=${PORT:-29500} 9 | MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} 10 | 11 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 12 | python -m torch.distributed.launch \ 13 | --nnodes=$NNODES \ 14 | --node_rank=$NODE_RANK \ 15 | --master_addr=$MASTER_ADDR \ 16 | --nproc_per_node=$GPUS \ 17 | --master_port=$PORT \ 18 | $(dirname "$0")/test.py \ 19 | $CONFIG \ 20 | $CHECKPOINT \ 21 | --launcher pytorch \ 22 | ${@:4} 23 | -------------------------------------------------------------------------------- /tools/dist_train.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | CONFIG=$1 4 | GPUS=$2 5 | NNODES=${NNODES:-1} 6 | NODE_RANK=${NODE_RANK:-0} 7 | PORT=${PORT:-29500} 8 | MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} 9 | 10 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 11 | python -m torch.distributed.launch \ 12 | --nnodes=$NNODES \ 13 | --node_rank=$NODE_RANK \ 14 | --master_addr=$MASTER_ADDR \ 15 | --nproc_per_node=$GPUS \ 16 | --master_port=$PORT \ 17 | $(dirname "$0")/train.py \ 18 | $CONFIG \ 19 | --launcher pytorch ${@:3} 20 | -------------------------------------------------------------------------------- /tools/slurm_test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -x 4 | 5 | PARTITION=$1 6 | JOB_NAME=$2 7 | CONFIG=$3 8 | CHECKPOINT=$4 9 | GPUS=${GPUS:-8} 10 | GPUS_PER_NODE=${GPUS_PER_NODE:-8} 11 | CPUS_PER_TASK=${CPUS_PER_TASK:-5} 12 | PY_ARGS=${@:5} 13 | SRUN_ARGS=${SRUN_ARGS:-""} 14 | 15 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 16 | srun -p ${PARTITION} \ 17 | --job-name=${JOB_NAME} \ 18 | --gres=gpu:${GPUS_PER_NODE} \ 19 | --ntasks=${GPUS} \ 20 | --ntasks-per-node=${GPUS_PER_NODE} \ 21 | --cpus-per-task=${CPUS_PER_TASK} \ 22 | --kill-on-bad-exit=1 \ 23 | ${SRUN_ARGS} \ 24 | python -u tools/test.py ${CONFIG} ${CHECKPOINT} --launcher="slurm" ${PY_ARGS} 25 | -------------------------------------------------------------------------------- /tools/slurm_train.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -x 4 | 5 | PARTITION=$1 6 | JOB_NAME=$2 7 | CONFIG=$3 8 | WORK_DIR=$4 9 | GPUS=${GPUS:-8} 10 | GPUS_PER_NODE=${GPUS_PER_NODE:-8} 11 | CPUS_PER_TASK=${CPUS_PER_TASK:-5} 12 | SRUN_ARGS=${SRUN_ARGS:-""} 13 | PY_ARGS=${@:5} 14 | 15 | PYTHONPATH="$(dirname $0)/..":$PYTHONPATH \ 16 | srun -p ${PARTITION} \ 17 | --job-name=${JOB_NAME} \ 18 | --gres=gpu:${GPUS_PER_NODE} \ 19 | --ntasks=${GPUS} \ 20 | --ntasks-per-node=${GPUS_PER_NODE} \ 21 | --cpus-per-task=${CPUS_PER_TASK} \ 22 | --kill-on-bad-exit=1 \ 23 | ${SRUN_ARGS} \ 24 | python -u tools/train.py ${CONFIG} --work-dir=${WORK_DIR} --launcher="slurm" ${PY_ARGS} 25 | --------------------------------------------------------------------------------