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提供的函数就可以。