YOLOv5目标检测(数据集的训练及预测)

一、模型训练

1.配置环境

2.YOLOv5项目克隆(Github官网)

3.项目依赖的安装

pip install -r requirements.txt

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

4.配置数据集和预训练权重

数据集结构目录位置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

预训练权重下载

YOLOv5预训练权重:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

预训练权重结构目录位置

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

5.配置代码参数

1° 复制voc.yaml,重命名粘贴到同级目录下

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

完成效果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

2° 修改新生成的yaml文件(此处为hat_person.yaml)

注释此行代码

01e39b6021b54910afecb083dab5edf4.png

3° 修改训练集和测试集路径、类别和类别名

68fbcf143f3c44bfbf47af2173111703.png

14ca0aa5c2104fd0a8d46f8be2b60cd6.png

完成效果

e687755de0774978be71eced20fe9345.png

450c67e8b92640baba77cb5ee6ca3a96.png

 4° 复制yolov5s.yaml,重命名粘贴到同级目录下 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

 完成效果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

 5° 修改新生成的yaml文件(此处为hat_person.yaml)

1482fc3f590a42f19f29d2b5571d5cb5.png

完成效果

a24f579ab338409a942c62d7a08a3193.png

6°修改 train.py

找到主函数,这里有模型的主要参数。模型的主要参数解析如下所示

if __name__ == '__main__':
"""
    opt模型主要参数解析:
    --weights:初始化的权重文件的路径地址
    --cfg:模型yaml文件的路径地址
    --data:数据yaml文件的路径地址
    --hyp:超参数文件路径地址
    --epochs:训练轮次
    --batch-size:喂入批次文件的多少
    --img-size:输入图片尺寸
    --rect:是否采用矩形训练,默认False
    --resume:接着打断训练上次的结果接着训练
    --nosave:不保存模型,默认False
    --notest:不进行test,默认False
    --noautoanchor:不自动调整anchor,默认False
    --evolve:是否进行超参数进化,默认False
    --bucket:谷歌云盘bucket,一般不会用到
    --cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
    --image-weights:使用加权图像选择进行训练
    --device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
    --multi-scale:是否进行多尺度训练,默认False
    --single-cls:数据集是否只有一个类别,默认False
    --adam:是否使用adam优化器
    --sync-bn:是否使用跨卡同步BN,在DDP模式使用
    --local_rank:DDP参数,请勿修改
    --workers:最大工作核心数
    --project:训练模型的保存位置
    --name:模型保存的目录名称
    --exist-ok:模型目录是否存在,不存在就创建
"""
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', type=str, default='yolov5s.pt', help='initial weights path')
    parser.add_argument('--cfg', type=str, default='', help='model.yaml path')
    parser.add_argument('--data', type=str, default='data/coco128.yaml', help='data.yaml path')
    parser.add_argument('--hyp', type=str, default='data/hyp.scratch.yaml', help='hyperparameters path')
    parser.add_argument('--epochs', type=int, default=300)
    parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs')
    parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='[train, test] image sizes')
    parser.add_argument('--rect', action='store_true', help='rectangular training')
    parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')
    parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')
    parser.add_argument('--notest', action='store_true', help='only test final epoch')
    parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check')
    parser.add_argument('--evolve', action='store_true', help='evolve hyperparameters')
    parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
    parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
    parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
    parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')
    parser.add_argument('--adam', action='store_true', help='use torch.optim.Adam() optimizer')
    parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')
    parser.add_argument('--local_rank', type=int, default=-1, help='DDP parameter, do not modify')
    parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
    parser.add_argument('--project', default='runs/train', help='save to project/name')
    parser.add_argument('--entity', default=None, help='W&B entity')
    parser.add_argument('--name', default='exp', help='save to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    parser.add_argument('--quad', action='store_true', help='quad dataloader')
    parser.add_argument('--linear-lr', action='store_true', help='linear LR')
    parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')
    parser.add_argument('--upload_dataset', action='store_true', help='Upload dataset as W&B artifact table')
    parser.add_argument('--bbox_interval', type=int, default=-1, help='Set bounding-box image logging interval for W&B')
    parser.add_argument('--save_period', type=int, default=-1, help='Log model after every "save_period" epoch')
    parser.add_argument('--artifact_alias', type=str, default="latest", help='version of dataset artifact to be used')
    opt = parser.parse_args()

修改权重、模型、数据地址路径

18dfdd98114c42a39614321d925adefb.png

完成效果  5d58769ae8854af9908ebe682786f496.png

 修改epochs和batch_size

600c827a0f7d42d2a54b698b0e20cf36.png

完成效果 

689addf05ea34a06ba2c996b65415095.png

此时运行 train.py 会报错 011aafdf8b784607847c85b737419ea5.png

报错原因:虚拟内存不够

方案:找到 datasets.py 文件,将81行num_workers=nw修改为num_workers=0

完成效果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

再次运行 train.py 再次报错

8387ea05ddae4a598807bd9cbebb179a.png

 报错原因:电脑性能不够

方案:修改 train.py 文件,修改 batch_size 和 workers

配置适合的参数完成训练

二、模型推理

训练完成后,目录中生成

7f5430fef64c42a3b2c9b0ebfe80186c.png

在exp文件中weights文件保存训练的权重参数

(best.pt——最优训练权重和last.pt——最后一轮epochs训练权重)

cd1044e78c624857b9fe9359a5e9f8c2.png


 1.拷贝最优训练权重 best.pt 拷贝结构目录中 weights 文件夹中

21c2726ea806498cac43d8ec50a4b6a3.png

 2.修改 detect.py

找到主函数,这里有模型的主要参数。模型的主要参数解析如下所示

f __name__ == '__main__':
"""
--weights:权重的路径地址
--source:测试数据,可以是图片/视频路径,也可以是'0'(电脑自带摄像头),也可以是rtsp等视频流
--output:网络预测之后的图片/视频的保存路径
--img-size:网络输入图片大小
--conf-thres:置信度阈值
--iou-thres:做nms的iou阈值
--device:是用GPU还是CPU做推理
--view-img:是否展示预测之后的图片/视频,默认False
--save-txt:是否将预测的框坐标以txt文件形式保存,默认False
--classes:设置只保留某一部分类别,形如0或者0 2 3
--agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
--augment:推理的时候进行多尺度,翻转等操作(TTA)推理
--update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False
--project:推理的结果保存在runs/detect目录下
--name:结果保存的文件夹名称
"""
    parser = argparse.ArgumentParser()
    parser.add_argument('--weights', nargs='+', type=str, default='yolov5s.pt', help='model.pt path(s)')
    parser.add_argument('--source', type=str, default='data/images', help='source')  # file/folder, 0 for webcam
    parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')
    parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')
    parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')
    parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
    parser.add_argument('--view-img', action='store_true', help='display results')
    parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')
    parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')
    parser.add_argument('--nosave', action='store_true', help='do not save images/videos')
    parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')
    parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')
    parser.add_argument('--augment', action='store_true', help='augmented inference')
    parser.add_argument('--update', action='store_true', help='update all models')
    parser.add_argument('--project', default='runs/detect', help='save results to project/name')
    parser.add_argument('--name', default='exp', help='save results to project/name')
    parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')
    opt = parser.parse_args()

 修改权重路径(权重路径更新为——最优训练权重 best.pt 目录路径)

a96b2c6b4f52474abd0568977e9cbf06.png

完成效果  

dcc64d22dec3421cac9c82c0d47b3437.png

修改来源路径

摄像路径(来源路径更新为0),完成效果

ff41aab3aa6e412eb8ceb01b607df02f.png

运行代码可能报如下错误

3d7a331b34254c7ca70ab73abf48c038.png

解决方案:

         在 utils 文件夹中 找到 datasets.py,第279行代码,在两个url参数加上str,即可完美运行电脑的摄像头

2461f1627fb44264aebff0503cce66b3.png

图片、视频路径,完成效果(路径用 / )

ddc0c00b983b40ce960176ad26cbfec3.png

7bd0b360f7b94a679b2ef42d11ff66ff.png

为是否展现推理结果,展现则在后方添加代码:default=True

                                             不展现则在后方添加代码:defalut=False (默认)

以图片为例,进行推理,运行 detect.py 文件,推理结果保存地址如下

3020921df46f4faa8d435ffdfb358119.png

推理结果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2m5omL5paH,size_20,color_FFFFFF,t_70,g_se,x_16

至此 YOLOv5 训练推理完美

猜你喜欢

转载自blog.csdn.net/Aaaa_ZZZ/article/details/123151060