Toybrick

转换并部署yolov5模型(demo)(详细图文见附件)

safe

注册会员

积分
76
楼主
发表于 2023-3-7 10:00:59    查看: 4449|回复: 1 | [复制链接]    打印 | 只看该作者
本帖最后由 safe 于 2023-3-7 10:05 编辑


1.      下载yolov5s.pt
2.      打开文件夹下models->yolo.py
将:
def forward(self, x):
       z = []  # inference output
       for i in range(self.nl):
            x = self.m(x)  # conv
            bs, _, ny, nx = x.shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
            x = x.view(bs, self.na,self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
           if not self.training:  # inference
                if self.grid.shape[2:4] !=x.shape[2:4] or self.onnx_dynamic:
                    self.grid,self.anchor_grid = self._make_grid(nx, ny, i)
                y = x.sigmoid()
                if self.inplace:
                    y[..., 0:2] = (y[..., 0:2]* 2. - 0.5 + self.grid) * self.stride # xy
                    y[..., 2:4] = (y[..., 2:4]* 2) ** 2 * self.anchor_grid  # wh
                else:  # for YOLOv5 on AWS Inferentiahttps://github.com/ultralytics/yolov5/pull/2953
                    xy = (y[..., 0:2] * 2. -0.5 + self.grid) * self.stride  #xy
                    wh = (y[..., 2:4] * 2) ** 2* self.anchor_grid  # wh
                    y = torch.cat((xy, wh,y[..., 4:]), -1)
                z.append(y.view(bs, -1,self.no))
       return x if self.training else (torch.cat(z, 1), x)
修改为:(仅仅是转换模型才需要修改,训练时不需要修改)
def forward(self, x):
        z = [] # inference output
        for i in range(self.nl):
            x = self.m(x)  # conv
        return x
3.      返回上一层打开export.py将opset_version=opset修改为opset_version=12 :
将last.pt移动至export.py同一文件夹下:(last.pt是训练好的最终模型,这里没有训练直接用yolov5s.pt代替)
4.      在项目的命令行输入以下命令:
python export.py --weights 自己的模型.pt --img 640 --batch 1 --includeonnx
(这里用python export.py --weightyolov5s.pt --img 640 --batch 1 --include onnx)
得到转换的模型yolov5s.onnx
*接下来进入Ubuntu22.04中进行正式的rknn模型的转换(转换工具rknn-toolkit2只能在Linux系统上运行)
5.      在linux中进入https://github.com/rockchip-linux/rknn-toolkit2 下载rknn-toolkit2
6.      在Ubuntu使用anaconda创建python3.8虚拟环境,创建环境并命名为rknn2_3588
7.      使用pip安装requirements_cp38-1.4.0.txt中的包:pip install-r requirements_cp38-1.4.0.txt -i https://mirror.baidu.com/pypi/simple
8.      安装rknn-toolkit2工具包:
首先进入packages中:
打开终端输入source activate rknn2_3588激活环境:
输入命令pipinstall rknn_toolkit2-1.4.0_22dcfef4-cp38-cp38-linux_x86_64.whl:
提示安装成功
然后检查是否安装成功,先输入python进入python环境,然后输入from rknn.api import RKNN:
没有报错,所以说明rknn2工具包安装成功
9.      onnx转换为rknn:
(1)首先将前面转换得到的自己的模型.onnx复制到./examples/onnx/yolov5文件夹中:(这里用yolov5s.onnx,理由同上)
(2)打开该文件夹下的test.py,修改如下图中选中的地方,应该把:
ONNX_MODEL = 'yolov5s.onnx'
RKNN_MODEL = 'yolov5s.rknn'
IMG_PATH = './bus.jpg'
DATASET = './dataset.txt'
......
CLASSES = ("person", "bicycle", "car","motorbike ", "aeroplane ", "bus ","train", "truck ", "boat", "trafficlight",
"fire hydrant", "stop sign ","parking meter", "bench", "bird","cat", "dog ", "horse ", "sheep","cow", "elephant",
"bear", "zebra ","giraffe", "backpack", "umbrella","handbag", "tie", "suitcase","frisbee", "skis", "snowboard", "sportsball", "kite",
"baseball bat", "baseball glove","skateboard", "surfboard", "tennis racket","bottle", "wine glass", "cup", "fork","knife ",
"spoon", "bowl", "banana","apple", "sandwich", "orange","broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair","sofa",
"pottedplant", "bed","diningtable", "toilet ", "tvmonitor","laptop  ", "mouse  ", "remote ", "keyboard", "cell phone", "microwave ",
"oven ", "toaster","sink", "refrigerator ", "book","clock", "vase", "scissors ", "teddy bear", "hair drier", "toothbrush ")
...
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255,255, 255]])
修改为:
ONNX_MODEL = '自己模型的名字.onnx'
RKNN_MODEL = '自己模型的名字.rknn'
IMG_PATH = '待预测的图片'
DATASET = './dataset.txt'
......
CLASSES = (自定义类别)
...
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255,255, 255]],target_platform='rk3588')(rk3588是搭载平台的名字)
(这里不做修改,理由同上)
(3)然后打开终端输入命令sourceactivate rknn2_3588,然后输入python test.py:
得到自己的模型.rknn(这里是yolov5s.rknn)
10.   3588平台部署
(1)在3588的主目录上获取官方demo:gitclone https://github.com/rockchip-linux/rknpu2.git
(2)进入rknn_yolov5_demo文件夹修改include文件中的头文件postprocess.h:
#define OBJ_CLASS_NUM     80
修改为:
#define OBJ_CLASS_NUM     自定义类别个数
(3)修改model目录下的coco_80_labels_list.txt文件,更改为自定义类别
(4)将转换后的rknn文件放在model/RK3588目录下;
编译运行bash ./build-linux_RK3588.sh生成install目录;
在model目录下放入需要推理的图片(这里用demo中的bus.jpg);
在终端中输入:
./rknn_yolov5_demo ./model/RK3588/yolov5s.rknn./model/bus.jpg
得到结果out.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

tjmies

新手上路

积分
18
沙发
发表于 2023-3-31 16:16:03 | 只看该作者
请教一下  对应的box_priors.txt文件如何生成
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表