contenu
3 problème de format de sortie yolov5
4 Problèmes de format lors de la conversion au modèle rknn
1 Méthode de conversion
Convertissez le modèle pth de yolov5 en modèle rknn, la méthode spécifique est divisée en deux étapes
- Utilisez le fichier export.py fourni avec le projet yolov5 pour convertir le modèle pt en modèle onnx
- Utilisez le script suivant pour générer le modèle rknn
Convertir le modèle onnx en modèle rknn de la plate-forme RV1126 - cumtchw - Blog CSDN
Cette note n'a pas pour but d'introduire la méthode de conversion spécifique, mais d'enregistrer certains problèmes dans le processus de conversion intermédiaire.
2 problème de version yolov5
Nous voulons utiliser C++ pour déduire le modèle rknn de yolov5 sur la carte de Rockchip.Actuellement, nous utilisons généralement la démo C++ fournie par Rockchip.
Démo de raisonnement officiel YOLOv5 de Rockchip RV1126
Le post-traitement de cette démo est destiné au modèle à trois sorties. Si nous voulons utiliser cette démo, alors le yolov5 que nous utilisons doit utiliser la version v5.0 , et non la version v6.0, car le modèle de la version v5.0 a trois sorties, la version v6.0 combine enfin les trois sorties.
3 problème de format de sortie yolov5
Il y a trois sorties du yolov5-5.0 standard, qui sont
1x255x80x80
1x255x40x40
1x255x20x20
Parmi eux, 255 ici est 85*3, où 3 fait référence à 3 boîtes générées par 3 ancres ( pas RVB trois canaux, et il n'y a pas de concept RVB dans la sortie finale ), et 85 ici fait référence à 5+80= 85, où 80 est le nombre de catégories, chaque catégorie correspond à un score d'étiquette, un total de 80 scores d'étiquette, et 5 fait référence aux quatre coordonnées de la boîte plus un score de boîte.
S'il s'agit de la version yolov5-6.0, 6.0 combine les trois sorties, alors l'arrangement est xywh box_score id Id1_score id2_score .... idn_score, alors si 3*80*80*12, le nombre de catégories de sortie est 6 et non 7, parce qu'il contient un identifiant, ce qui équivaut à calculer l'identifiant, et que les trois sorties de la version yolov5-5.0 ne sont pas combinées, il n'y a que des scores de catégorie et aucune catégorie.
4 Problèmes de format lors de la conversion au modèle rknn
Ici, nous prenons un modèle de reconnaissance de masque avec 3 étiquettes (sans masque, porter un masque correctement, porter un masque incorrectement) comme exemple. La sortie du modèle de reconnaissance de masque avec 3 étiquettes est la suivante, dont 24 est la sortie de 3 canaux*8, et la sortie de 8 est le xywh box_score Id1_score id2_score id3_score ;
1*24*80*80
1*24*40*40
1*24*20*20
Lorsque j'ai converti pour la première fois auparavant, j'ai constaté que le résultat du modèle rknn transféré était complètement faux lors du raisonnement sur la carte RV1126 de Rockchip.Il y avait plusieurs petites cases sur l'ensemble de l'image.Après recherche, j'ai constaté que mon format de sortie n'était pas 1. *24*20*20, mais il est devenu tel que 1*3*20*20*8, j'ai donc modifié le yolo.py dans le projet yolov5-5.0 comme suit avant d'utiliser export.py pour générer le modèle onnx, puis utilisez export.py pour générer le modèle onnx, puis convertissez-le en modèle rknn.
Notez que la modification consiste à supprimer le permute, et la vue () est multipliée par self.na et self.no.
Ou modifiez-le comme suit, commentez self.training |= self.export, puis ajoutez directement une branche d'exportation :
def forward(self, x):
# x = x.copy() # for profiling
z = [] # inference output
# self.training |= self.export
if self.export:
for i in range(self.nl):
x[i] = self.m[i](x[i])
bs, _, ny, nx = x[i].shape # x(bs,48,20,20) to x(bs,3,20,20,16)
x[i] = x[i].view(bs, self.na*self.no, ny, nx).contiguous()
return x
for i in range(self.nl):
x[i] = self.m[i](x[i]) # conv
bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
.......后面代码........
Le format de sortie après cette modification est le suivant :
Quand netron regarde le modèle onnx
Quand netron regarde le modèle rknn :
L'impression lors de l'exécution sur la carte RV1126 est la suivante :