pt->onnx->ncnn(pytorch部署自己训练的模型)

yolov6似乎有部分操作ncnn不支持,需要改一下网络结构,所以这里使用 yolov7-tiny

首先,找一个目标检测的安卓的demo跑通再换模型【替换assest文件夹中的bin和param文件】 yolov7[AS]: 然后,用自己的数据集重新训练模型,如果使用远程服务器,记得换与写路径有关的txt文件,这是我从网上找的一段生成文件路径的代码,感觉很好用。另外,有一个存疑的问题【数据集划分需不需要打乱?其实随机梯度下降的时候还是打乱了来着】

import os
from tqdm import tqdm
if __name__ == __main__:
    rootdir = D:myhomeprocess_fishdataset\front
    rootimagesdir = os.path.join(rootdir, images)
    rootlabelsdir = os.path.join(rootdir, labels)
    assert os.path.exists(rootimagesdir), f{
            
     rootimagesdir} not exists.
    assert os.path.exists(rootlabelsdir), f{
            
     rootlabelsdir} not exists.

    imagesets = [train, val, test]    # 将images/train val test中的图像的绝对地址分别写入txt中

    for sets in imagesets:
        imagesdir = os.path.join(rootimagesdir, sets)
        with open(os.path.join(rootdir, f{
            
     sets}.txt), w) as f:
            filelist = os.listdir(imagesdir)
            for images in tqdm(filelist):
                f.write(os.path.join(imagesdir, images) + 
)

训练完成之后,用yolo官方代码中的export文件导出成onnx格式,然后再转ncnn【命令行和封装好的网站都行】 接下来,是我在安卓部署遇到的问题,替换assest文件夹中的bin和param文件后,出现了不显示锚框的问题。打开安卓项目中的yolo.cpp文件,发现代码里输入输出的name中写的是in0,out0,out1和out2这种,和原项目中的模型对应,但是和我们自己训练出的模型大概率是不对应的。所以,用Netron打开自己转换出的param文件,查看输入的name和最后三个卷积层的输出name。对应看出自己的输入输出name,最后替换掉yolo.cpp中原来是in0,out0,out1和out2的地方,就可以显示锚框啦。另外,想改变锚框的显示大小,颜色,文字也是在这个文件里改,用opencv提供的函数就可以。

经验分享 程序员 微信小程序 职场和发展