基于YOLOv5开发构建超过100种类别的目标检测系统还是比较少的实践了,虽然在之前的项目中也有鸟类的量级达到了100种以上,但是这种类型的任务相对来说更为小众化一点,这里本文的核心目的就是想要基于yolov5来开发细粒度的多目标类别的检测识别系统,这里为了全面直观地对模型性能进行评价分析,我们开发了yolov5全系列5款不同参数量级的模型,首先看下效果图:
接下来看下数据集:
共有20580张数据。
【yolov5n】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 120 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
【yolov5s】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 120 # number of classes
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
#Backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
#Head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
【yolov5m】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 120 # number of classes
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
【yolov5l】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 120 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
【yolov5x】
# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 120 # number of classes
depth_multiple: 1.33 # model depth multiple
width_multiple: 1.25 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, C3, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 6, C3, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, C3, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 3, C3, [1024]],
[-1, 1, SPPF, [1024, 5]], # 9
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, C3, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, C3, [256, False]], # 17 (P3/8-small)
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, C3, [512, False]], # 20 (P4/16-medium)
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, C3, [1024, False]], # 23 (P5/32-large)
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
接下来我们来整体对比下五款不同模型的性能差异:
首先是F1值曲线:
接下来是loss对比曲线:
之后是精确率曲线:
最后是召回率对比曲线:
可以看到:模型参数量级的提升对于模型检测识别性能的帮助是很明显的,但是模型参数量级的膨胀带来的是计算消耗的增大,在实际项目的开发过程中还是需要根据实际的需求来选择最合适自己的模型。
因为目标类别数量太多导致评估过程出现问题,这里没有输出绘制好的图表,我就直接给出最优模型的计算详情指标吧,如下所示:
Validating runs/train/yolov5x/weights/best.pt...
Fusing layers...
YOLOv5x summary: 322 layers, 86974165 parameters, 0 gradients, 206.3 GFLOPs
Class Images Instances P R mAP50 mAP50-95: 100%|??????????| 258/258 [02:42<00:00, 1.59it/s]
all 4115 4412 0.884 0.892 0.937 0.875
Afghan_hound 4115 48 0.906 1 0.99 0.943
African_hunting_dog 4115 50 0.938 0.96 0.971 0.876
Airedale 4115 48 0.871 0.938 0.977 0.944
American_Staffordshire_terrier 4115 35 0.849 0.805 0.905 0.873
Appenzeller 4115 32 0.905 0.891 0.939 0.868
Australian_terrier 4115 42 0.676 0.81 0.827 0.747
Bedlington_terrier 4115 38 0.986 0.947 0.99 0.91
Bernese_mountain_dog 4115 47 0.947 0.979 0.981 0.946
Blenheim_spaniel 4115 44 0.944 0.977 0.988 0.938
Border_collie 4115 39 0.769 0.974 0.887 0.788
Border_terrier 4115 33 0.923 0.97 0.988 0.94
Boston_bull 4115 39 0.928 0.897 0.974 0.884
Bouvier_des_Flandres 4115 35 0.907 0.914 0.95 0.907
Brabancon_griffon 4115 42 0.96 0.976 0.988 0.924
Brittany_spaniel 4115 26 0.983 0.923 0.976 0.914
Cardigan 4115 41 0.881 0.854 0.934 0.85
Chesapeake_Bay_retriever 4115 33 0.824 0.848 0.901 0.881
Chihuahua 4115 37 0.884 0.824 0.932 0.89
Dandie_Dinmont 4115 45 0.955 0.946 0.985 0.926
Doberman 4115 35 1 0.9 0.985 0.969
English_foxhound 4115 38 0.835 0.816 0.864 0.797
English_setter 4115 36 0.883 0.944 0.981 0.946
English_springer 4115 43 0.938 0.953 0.987 0.941
EntleBucher 4115 51 0.902 0.905 0.964 0.897
Eskimo_dog 4115 36 0.604 0.297 0.614 0.58
French_bulldog 4115 29 0.87 0.927 0.927 0.847
German_shepherd 4115 35 0.845 0.971 0.983 0.943
German_short-haired_pointer 4115 32 0.885 0.962 0.987 0.965
Gordon_setter 4115 31 1 0.981 0.995 0.926
Great_Dane 4115 24 0.882 0.938 0.967 0.92
Great_Pyrenees 4115 37 0.77 0.994 0.915 0.876
Greater_Swiss_Mountain_dog 4115 36 0.92 0.889 0.954 0.907
Ibizan_hound 4115 35 0.909 0.971 0.992 0.974
Irish_setter 4115 38 0.892 0.921 0.963 0.896
Irish_terrier 4115 35 0.941 0.914 0.976 0.875
Irish_water_spaniel 4115 27 0.93 0.99 0.971 0.922
Irish_wolfhound 4115 34 0.767 0.882 0.854 0.761
Italian_greyhound 4115 42 0.875 0.929 0.959 0.851
Japanese_spaniel 4115 31 1 0.899 0.989 0.925
Kerry_blue_terrier 4115 37 0.92 0.946 0.974 0.926
Labrador_retriever 4115 38 0.784 0.895 0.948 0.882
Lakeland_terrier 4115 50 0.817 0.82 0.915 0.857
Leonberg 4115 57 0.937 0.982 0.993 0.923
Lhasa 4115 40 0.792 0.85 0.892 0.819
Maltese_dog 4115 47 0.955 0.902 0.962 0.883
Mexican_hairless 4115 33 0.909 0.848 0.959 0.867
Newfoundland 4115 37 0.879 0.973 0.978 0.901
Norfolk_terrier 4115 36 0.81 0.833 0.847 0.785
Norwegian_elkhound 4115 41 0.917 0.927 0.986 0.958
Norwich_terrier 4115 46 0.842 0.761 0.869 0.788
Old_English_sheepdog 4115 27 0.911 1 0.991 0.942
Pekinese 4115 21 0.869 1 0.995 0.938
Pembroke 4115 48 0.828 1 0.97 0.911
Pomeranian 4115 41 0.938 0.951 0.975 0.912
Rhodesian_ridgeback 4115 39 0.822 0.718 0.865 0.782
Rottweiler 4115 26 0.897 1 0.992 0.917
Saint_Bernard 4115 27 1 0.983 0.995 0.958
Saluki 4115 37 1 0.993 0.995 0.954
Samoyed 4115 41 0.927 0.931 0.952 0.871
Scotch_terrier 4115 27 0.894 0.926 0.954 0.834
Scottish_deerhound 4115 52 0.933 0.885 0.959 0.906
Sealyham_terrier 4115 53 0.959 0.943 0.965 0.872
Shetland_sheepdog 4115 31 0.908 0.956 0.961 0.866
Shih-Tzu 4115 36 0.871 0.917 0.969 0.939
Siberian_husky 4115 47 0.705 0.723 0.771 0.738
Staffordshire_bullterrier 4115 29 0.733 0.758 0.853 0.768
Sussex_spaniel 4115 33 1 0.872 0.956 0.929
Tibetan_mastiff 4115 39 0.97 0.841 0.944 0.874
Tibetan_terrier 4115 42 0.97 0.764 0.942 0.863
Walker_hound 4115 33 0.759 0.762 0.814 0.755
Weimaraner 4115 36 0.838 0.889 0.941 0.905
Welsh_springer_spaniel 4115 22 0.953 0.922 0.977 0.921
West_Highland_white_terrier 4115 35 0.891 0.914 0.943 0.866
Yorkshire_terrier 4115 40 0.848 0.835 0.887 0.815
affenpinscher 4115 36 0.953 0.944 0.987 0.9
basenji 4115 49 0.924 0.898 0.943 0.86
basset 4115 29 0.885 0.931 0.983 0.916
beagle 4115 55 0.918 0.891 0.952 0.889
black-and-tan_coonhound 4115 37 0.939 0.892 0.964 0.892
bloodhound 4115 41 0.953 0.995 0.994 0.944
bluetick 4115 32 0.95 1 0.992 0.968
borzoi 4115 38 0.964 0.974 0.993 0.922
boxer 4115 38 0.945 0.974 0.98 0.905
briard 4115 27 0.767 0.852 0.868 0.819
bull_mastiff 4115 38 0.968 1 0.995 0.94
cairn 4115 49 0.897 0.889 0.942 0.893
chow 4115 46 0.963 0.978 0.989 0.956
clumber 4115 36 0.912 1 0.963 0.875
cocker_spaniel 4115 37 0.894 0.784 0.91 0.865
collie 4115 35 0.89 0.657 0.812 0.737
curly-coated_retriever 4115 26 0.943 0.923 0.957 0.939
dhole 4115 33 0.959 0.939 0.967 0.843
dingo 4115 33 0.827 0.867 0.857 0.808
flat-coated_retriever 4115 26 0.959 0.896 0.988 0.909
giant_schnauzer 4115 28 0.856 0.85 0.927 0.858
golden_retriever 4115 40 0.82 0.85 0.908 0.823
groenendael 4115 28 0.932 0.981 0.989 0.911
keeshond 4115 37 0.972 1 0.994 0.921
kelpie 4115 29 0.949 0.655 0.776 0.693
komondor 4115 32 0.918 0.969 0.965 0.904
kuvasz 4115 31 0.833 0.806 0.9 0.861
malamute 4115 36 0.853 0.861 0.885 0.837
malinois 4115 34 0.859 0.898 0.957 0.884
miniature_pinscher 4115 34 0.827 1 0.983 0.926
miniature_poodle 4115 41 0.741 0.558 0.729 0.672
miniature_schnauzer 4115 23 0.861 0.783 0.916 0.87
otterhound 4115 37 0.933 0.946 0.981 0.934
papillon 4115 30 0.896 0.967 0.979 0.868
pug 4115 42 0.885 0.912 0.959 0.871
redbone 4115 24 0.781 0.745 0.911 0.885
schipperke 4115 38 0.924 0.868 0.96 0.907
silky_terrier 4115 41 0.857 0.683 0.871 0.826
soft-coated_wheaten_terrier 4115 30 0.777 0.929 0.897 0.857
standard_poodle 4115 31 0.728 0.779 0.83 0.77
standard_schnauzer 4115 43 0.732 0.721 0.792 0.71
toy_poodle 4115 29 0.531 0.862 0.703 0.666
toy_terrier 4115 33 0.856 0.848 0.936 0.902
vizsla 4115 35 0.898 0.943 0.954 0.855
whippet 4115 45 0.951 0.861 0.955 0.865
wire-haired_fox_terrier 4115 37 0.861 0.839 0.913 0.867