Based on ultralytics/yolov5.
The original Yolo V5 was an amazing project. When I want to make some changes to the network, it's not so easy, such as adding branches and trying other backbones. Maybe there are people like me, so I split the yolov5 model to {backbone, neck, head} to facilitate the operation of various modules and support more backbones.Basically, I only changed the model, and I didn't change the architecture, training and testing of yolov5. Therefore, if the original code is updated, it is also very convenient to update this code. if this repo can help you, please give me a star.
- Reorganize model structure, such as backbone, neck, head, can modify the network flexibly and conveniently
- mobilenetV3-small, mobilenetV3-large
- shufflenet_v2_x0_5, shufflenet_v2_x1_0, shufflenet_v2_x1_5, shufflenet_v2_x2_0
- yolov5s, yolov5m, yolov5l, yolov5x, yolov5transformer
- resnet18, resnet50, resnet34, resnet101, resnet152
- efficientnet_b0 - efficientnet_b8, efficientnet_l2
- hrnet 18,32,48
- CBAM, SE
- Swin transformer (please set half=False in scripts/eval.py and don't use model.half in train.py)
- DCN (mixed precision training not support, if you want use dcn, please close amp in line 292 of scripts/train.py)
- coord conv
- drop_block
- The CBAM, SE, DCN, coord conv. At present, the above plug-ins are not added to all networks, so you may need to modify the code yourself.
- The default gw and gd for PAN and FPN of other backbone are same as yolov5_L, so if you want a smaller and faster model, please modify self.gw and self.gd in FPN and PAN.
please refer requirements.txt
Make data for yolov5 format. you can use od/data/transform_voc.py convert VOC data to yolov5 data format.
For training and Testing, it's same like yolov5.
- check out configs/data.yaml, and replace with your data, and number of object nc
- check out configs/model_*.yaml, choose backbone. and change nc to your dataset. please refer support_backbone in models.backbone.init.py
$ python scripts/train.py --batch 16 --epochs 5 --data configs/data.yaml --cfg confgis/model_XXX.yaml
A google colab demo in train_demo.ipynb
Same as ultralytics/yolov5
Because the training takes too much time, each model has only trained 150 epoch on coco2014. You can download it to continue training, and the model can continue to converge. The following model is different only from the backbone network, which is compared with yolov5s. The following table can be used as a performance comparison.
doing
Model | size | mAPval 0.5:0.95 |
mAPval 0.5 |
params |
---|---|---|---|---|
YOLOv5s[7vuv] | 640 | 31.3 | 51.4 | 9543197 |
mobilenetv3-small[qi77] | 640 | 21 | 37.6 | 5360221 |
[shufflenetv2-x1_0][] | 640 | |||
[resnet-18][] | 640 | |||
[hrnet-18][] | 640 | |||
[vgg-16_bn][] | 640 | |||
[SwinTransformer][] | 640 | |||
[efficientnet-b0][] | 640 |
see detector.py
For tf_serving or triton_server, you can set model.detection.export = False in scripts/deploy/export.py in line 50 to export an onnx model, A new output node will be added to combine the three detection output nodes into one. For Official tensorrt converter, you should set model.detection.export = True, because ScatterND op not support by trt. For this repo, best use official tensorrt converter, not tensorrtx
You can directly quantify the onnx model
python scripts/trt_quant/convert_trt_quant.py --img_dir /XXXX/train/ --img_size 640 --batch_size 6 --batch 200 --onnx_model runs/train/exp1/weights/bast.onnx --mode int8
trt python infer demo scripts/trt_quant/trt_infer.py
resnet with dcn, training on gpu *RuntimeError: expected scalar type Half but found Floatswin-transformer, training is ok, but testing report *RuntimeError: expected object of scalar type Float but got scalar type Half for argument #2 'mat2' in call to_th_bmm_out in swin_trsansformer.py 143mobilenet export onnx failed, please replace HardSigmoid() by others, because onnx don't support pytorch nn.threshold