Convertir yolov5 en modèle rknn

contenu

1 Méthode de conversion

2 problème de version yolov5

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

  1. Utilisez le fichier export.py fourni avec le projet yolov5 pour convertir le modèle pt en modèle onnx
  2. 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 :

Je suppose que tu aimes

Origine blog.csdn.net/u013171226/article/details/123401225
conseillé
Classement