赞
踩
在人工智能机器学习领域中,目前最火的莫过于计算机视觉,在计算机视觉方向中,目前最火的莫过于图像分类目标检测,在图像分类目标检测算法中,目前最火的莫过于图像分类目标检测YOLO体系。目前最新的是YOLOv7,不过因为还不稳定,所以选择更为成熟的v5进行研究,而且v7也是在v5的基础上改进来的,所以还是很有研究意义的。虽然在2020年的时候我就开始接触YOLO体系,不过一直都只是把它工具化,对其中的网络结构、模型优化、锚框设置等方式只是略知一二,没有真正去理解和精学其中的算法思想,借这个机会打算好好去学习一番,本文作为学习笔记。
Yolo就是一个是用于目标检测的模型,简单来讲就是是在一张图片中找出物体,并给出它的类别和位置。
目标检测是基于监督学习的,每张图片的监督信息是它所包含的N个物体,每个物体的信息有五个,分别是物体的中心位置(x,y)和它的高(h)和宽(w),最后是它的类别。
Yolo 模型的预测是基于整个图片的,并且它会一次性输出所有检测到的目标信息,包括类别和位置。
而YOLOv5是在 COCO 数据集上预训练的一系列对象检测架构和模型,代表Ultralytics 对未来视觉 AI 方法的开源研究,结合了经过数千小时的研究和开发的经验教训和最佳实践。
官方要求:Python>=3.7.0、 PyTorch>=1.7。
本机环境:Ubuntu18、NVIDIA 、cuda10.1、cudnn、pycharm、OpenCV4、anaconda3(虚拟环境python3.7、pytorch1.7),具体搭建方法可参考我的视觉学习笔记1——配置深度学习环境
补丁:
requirements.txt文件要求torch>=1.7.0,torchvision>=0.8.1,所以要对于一下版本
其他的环境依赖都写在了requirements.txt文件里,具体内容如下:
# YOLOv5 requirements # Usage: pip install -r requirements.txt # Base ---------------------------------------- matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.1 Pillow>=7.1.2 PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 torch>=1.7.0 torchvision>=0.8.1 tqdm>=4.64.0 protobuf<=3.20.1 # https://github.com/ultralytics/yolov5/issues/8012 # Logging ------------------------------------- tensorboard>=2.4.1 # wandb # clearml # Plotting ------------------------------------ pandas>=1.1.4 seaborn>=0.11.0 # Export -------------------------------------- # coremltools>=5.2 # CoreML export # onnx>=1.9.0 # ONNX export # onnx-simplifier>=0.4.1 # ONNX simplifier # nvidia-pyindex # TensorRT export # nvidia-tensorrt # TensorRT export # scikit-learn==0.19.2 # CoreML quantization # tensorflow>=2.4.1 # TFLite export (or tensorflow-cpu, tensorflow-aarch64) # tensorflowjs>=3.9.0 # TF.js export # openvino-dev # OpenVINO export # Extras -------------------------------------- ipython # interactive notebook psutil # system utilization thop>=0.1.1 # FLOPs computation # albumentations>=1.0.3 # pycocotools>=2.0 # COCO mAP # roboflow
把自己编译过opencv4.4的cv2.so文件复制到虚拟环境中,且已经安装了torch1.7.0,torchvision0.8.1,所以可以把opencv-python>=4.1.1,torch>=1.7.0,torchvision>=0.8.1注释掉(加#)。
执行以下命令,直接一键安装所有依赖
pip install -r requirements.txt --default-timeout=5000
#--default-timeout=5000:因为下载不稳定容易掉,所以给他补个时间
断断续续的弄了一圈,运行detect文件时发现下载好的库和依赖居然没有自动安装(摸不着头脑),于是手动安装。。。
安装后再次运行,开始自动下载模型
运行成功后,会在runs/detect/exp保存被处理过的标签,若程序报错,大概率是因为有的库版本不正确或者还未安装,这个自己调试一下即可。
因为是个人电脑,所以算力有限,把yolov5s.pt作为预训练模型。
cocollw.yaml从coco128.yaml复制,将自定义测试的图像数据和标签数据集分别 划分为:训练集、验证集、测试集,,比例根据数据量不同,一般可以为 90%:5%:5%(主要看具体数据量,我使用的是公司废弃数据集,数据量为近2万张图片)。需要按照Yolov5代码规则,创建images、labels两个子目录,两目录下是train、val、test,三个数据集中就是图片和标注文件。修改path、train、val、test、nc、names,删除download。
yolov5llw.yaml从yolov5s.yaml复制,修改nc即可。
预训练模型
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
模型结构文件
parser.add_argument('--cfg', type=str, default='cfg.yaml', help='model.yaml path')
模型配置文件
parser.add_argument('--data', type=str, default='data.yaml', help='dataset.yaml path')
迭代训练轮数
parser.add_argument('--epochs', type=int, default=2000, help='total training epochs')
batch-size大小设置
parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')
使用哪块GPU或者几块GPU或者使用CPU
parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
参数conf-thres的default值需要调整,较好的置信度可以减少同一个目标多个检测框问题,这里选择50%置信度。
parser.add_argument('--conf-thres',type=float,default=0.50,help='confidence threshold')
参数save-txt的末尾添加default = True,这个参数就是保存检测的标签文件,设置保存。
parser.add_argument('--save-txt', action='store_true', help='save results to *.txt',default=True)
参数nosave的的末尾添加default = True,这个参数是是否保存检测后图片,设置不保存。
parser.add_argument('--nosave', action='store_true', help='do not save images/videos',default=True)
yolo文件夹下打开终端,执行命令
python train.py --img 640 --cfg models/yolov5llw.yaml --data data/cocollw.yaml --weights yolov5s.pt --epoch 100 --batch 8
报错:
1、images.cache. Can not train without labels.
数据位置不对,不符合代码逻辑位置
2、RuntimeError: Unable to find a valid cuDNN algorithm to run convolution
3、RuntimeError: CUDA out of memory. Tried to allocate 126.00 MiB (GPU 0; 7.79 GiB total capacity; 6.38 GiB already allocated; 115.75 MiB free; 6.61 GiB reserved in total by PyTorch)
可能是cuda、cudnn不匹配,也可能是算力不足,算力问题可以通过降低batch,epoch和yolov5.pt来缓解
最后建议还是用服务器跑,本地电脑跑的温度飙升,疯狂喘气。
命令行进入到YOLOv5的目录下
tensorboard --logdir=runs
使用detect.py,weights使用新训练后的best.pt,测试图片可以拍一个新照片,或者找一个之前没有用到的图片,这里直接用它的图片(标签不对是因为废弃数据集数据混乱,比值小是因为训练次数太少)。
python detect.py --weights runs/train/exp5/weights/best.pt --source yolov5/data/images/bus.jpg
模型结构可以在yaml文件或者netron去观察,其中netron对pt文件支持不友好,需要转为onnx文件才勉强能用。
在 export.py 设置–data、–weights和–opset等参数,通过参数修改后运行,待转换的权重文件与导出格式即可。
错误1
ONNX: export failure ❌ 0.0s: Unsupported ONNX opset version: 12
onnx版本需要提高到1.12版本或以上才行。
错误2
ONNX: export failure: Exporting the operator silu to ONNX opset version 12 is not supported. Please open a bug to request ONNX export support for the missing operator.
找到anaconda虚拟环境下的/site-packages/torch/nn/modules/activation.py并修改:
# 重写394行
def forward(self, input: Tensor) -> Tensor:
# 原始
# return F.silu(input, inplace=self.inplace)
# 重写
return input * torch.sigmoid(input)
网络结构可视化表达:
网络结构文字化表达:
整体:
部分:
common.py部分结构模块理解:
yolov5.yaml:
整体:
部分:
整体:
部分:
未完待续。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。