PyTorch の YOLOv5 ターゲット検出に基づく Win10

@[目次]


プロジェクトの説明

不適切な製造プロセスによる回路基板の上側のネジの欠落を検出します

データセットの準備

labelimg による注釈付き

labelimg をインストールせずにこの記事からダウンロードしてください:ポータル

ここで用意したのはYOLO形式のデータセットです。データ セットが VOC 形式の場合は、この記事を通じて変換できます:ポータル

私のデータセットは示しています

合計 701 枚のオリジナル画像があり、すべて対応する YOLO 形式の txt ファイルとしてマークされており、合計 701 枚の画像があります。この記事を通じてトレーニング セットと検証セットを分割します:ポータル

最終的なトレーニング セットは 631、検証セットは 70 です。

注: VOC 形式から変換された txt データセットの場合は、txt データセットにクラス ラベル txt ファイルを手動で追加します。

「ネジは私だけのカテゴリタグ」内のコンテンツを開きます

この時点でデータセットの準備は完了です

環境のモデルとyolov5を準備する

PyTorch の GPU バージョンについては、私の他の記事「ポータル」を参照してください。

yolov5 モデルはオープン ソースであり、github: Portalから入手できます。1 と 2 をクリックして圧縮パッケージをダウンロードします。

解凍後に PyCharm で開き、pytorch 環境を設定します。

モデル紹介

§── データ: 主に、いくつかのハイパーパラメータ設定ファイルが保存されます (これらのファイル (yaml ファイル) は、トレーニング セット、テスト セット、検証セットのパスを設定するために使用されます。これには、ターゲット検出の種類の数と名前も含まれます)タイプ ); テスト用の公式画像もいくつかあります。独自のデータセットをトレーニングしている場合は、そのデータセット内の yaml ファイルを変更する必要があります。ただし、独自のデータ セットをこのパスの下に置くことはお勧めできませんが、yolov5 プロジェクトの同じディレクトリの下にデータ セットを置くことをお勧めします。

├── models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。这就是所谓的鱼和熊掌不可兼得。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。

├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。

├── weights:放置训练好的权重参数。

├── detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。

├── train.py:训练自己的数据集的函数。

├── test.py:测试训练的结果的函数。

├──requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包。

安装依赖包

打开PyCharm终端,输入以下命令安装依赖包

pip install -r requirements.txt

至此,环境和依赖包就结束了

获取数据集和预训练权重

从github上获得预训练权重,我这里选的是yolov5s.pt传送门

把事先准备好的数据集放在yolov5_master文件夹下面,并且把下载好的yolov5s.pt也放在该文件夹,如图所示:

训练自己的模型

预训练模型和数据集准备好,就可以开始训练自己的yolov5目标检测模型。

训练目标检测模型需要修改两个yaml文件中的参数。一个是data目录下的相应的yaml文件,一个是model目录文件下的相应的yaml文件。

修改数据配置文件

修改data目录下的相应的yaml文件。找到目录下的voc.yaml文件,将该文件复制一份,将复制的文件重命名,最好和项目相关,这样方便后面操作。我这里修改为Screw.yaml。该项目是对螺丝的检测。

打开Screw.yaml,修改train和val后面对应的路径,还有分类标签的names

修改模型配置文件

因为使用的预训练权重是yolov5s.pt,所以要修改models目录下的yolov5s.yaml文件中的相应参数(不同的预训练权重对应着不同的网络层数,用错预训练权重会报错)。我将yolov5s.yaml文件复制一份在models目录下,将其重命名为yolov5_Screw.yaml

打开yolov5_Screw.yaml,只修改nc的数字,我只识别一种标签,所以是1

开始训练

首先找到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()

有几个参数必须要修改的。修改之后就可以训练了。

  1. 首先将weights权重的路径填写到对应的参数里面

parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
  1. 然后将修好的models模型的yolov5s_Screw.yaml文件路径填写到相应的参数里面

parser.add_argument('--cfg', type=str, default='models/yolov5s_Screw.yaml', help='model.yaml path')

3)最后将data数据的Screw.yaml文件路径填写到相对于的参数里面

parser.add_argument('--data', type=str, default=ROOT / 'data/Screw.yaml', help='dataset.yaml path')

还有几个需要根据自己的需求来更改的参数:

1)模型的训练轮次,这里默认是训练100轮

parser.add_argument('--epochs', type=int, default=100, help='total training epochs')

2)输入图片的数量

parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')

3)工作的核心数

parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')

输入图片的数量和工作的核心数,要根据每个人自己电脑的性能来判断。我的电脑配置CPU是AMD16核的,GPU是英伟达的3060显卡。我的电脑按默认的参数输入图片数量为16,工作核心为8的话是可以正常训练的。如果你的电脑会报错,那么调小batch-size=8试一下,还是不行就继续调小。

至此,就可以运行train.py函数训练自己的模型了。

查看模型结果

启用tensorbord查看参数

打开pycharm的terminal终端,输入如下命令,就会出现一个网址地址,将那行网址复制下来到浏览器打开就可以看到训练的过程了

tensorboard --logdir=runs/train

想用tensorbord查看此模型的训练过程,需要输入如下的命令,就可以看到模型的训练结果了。

tensorboard --logdir=runs

推理测试

数据训练好了以后,在主目录下会产生一个run文件夹,在run/train/exp/weights目录下会产生两个权重文件,一个是最后一轮的权重文件,一个是最好的权重文件,除此以外还产生一些验证文件图片等一些文件。我们可以利用这个最好的权重文件来做推理测试。

找到主目录下的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()

将刚刚训练好的最好的权重传入到推理函数中去,然后就可以对图像进行推理。

parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp2/weights/best.pt', help='model path or triton URL')

对图片进行测试推理,将如下参数修改成要测试的图片的路径,然后运行detect.py就可以进行测试了。

parser.add_argument('--source', type=str, default=ROOT / 'data/images', help='file/dir/URL/glob/screen/0(webcam)')

推理测试结束以后,在run下面会生成一个detect目录,推理结果会保存在exp目录下。如图所示。

效果如图:

对视频进行测试,和如上的图片的测试是一样的,只不过是将图片的路径改为视频的路径而已。

利用摄像头进行测试只需将路径改写为0就好了。但是好像还是会报错,

解决方法:首先找到datasets.py这个py文件。

打开文件,找到第279行代码,给两个url参数加上str就可以了,如图所示,就可以完美运行电脑的摄像头了。

至此yolov5训练自己的模型就完全搞定了。

おすすめ

転載: blog.csdn.net/m0_63769180/article/details/129333009