在PyTorch中使用YOLOv5
       YOLO是 "You only look once "的首字母缩写,是一个开源软件工具,它具有实时检测特定图像中物体的高效能力。YOLO算法使用卷积神经网络(CNN)模型来检测图像中的物体。该算法只需要通过给定的神经网络进行一次前向传播就能检测到图像中的所有物体。这使YOLO算法在速度上比其他算法更有优势,使其成为迄今为止最著名的检测算法之一。

什么是YOLO物体检测?
       物体检测算法是一种能够在特定帧中检测某些物体或形状的算法。例如,简单的检测算法可能能够检测和识别图像中的形状,如圆形或方形,而更高级的检测算法可以检测更复杂的物体,如人类、自行车、汽车等。

      YOLO算法不仅通过其单前向传播能力提供了较高的检测速度和性能,而且还能非常准确和精确地检测它们。在本教程中,我们将重点介绍YOLOv5,它是YOLO软件的第五个也是最新的版本。它最初于2020年5月18日发布。YOLO的开源代码可以在GitHub上找到。我们将使用YOLO与著名的PyTorch库。PyTorch是一个深度学习开源包,它是基于著名的Torch库。它也是一个基于Python的库,更常用于自然语言处理和计算机视觉。

YOLO算法是如何工作的?
      第一步:剩余区块(将图像划分为更小的、类似网格的盒子)
在这一步中,完整的(整个)框架被划分为更小的盒子或网格。

所有的网格都是在原始图像上绘制的,其形状和大小完全相同。这些划分背后的想法是,每个网格盒将检测其内部的不同物体。

EXX-Blog-pytorch-yolo5-tutorial-2

第二步:边界盒回归(识别边界盒内的物体)
在检测到图像中的某个物体后,会在其周围绘制一个边界框。该边界框有一些参数,如中心点、高度、宽度和类别(检测到的物体类型)。

EXX-Blog-pytorch-yolo5-tutorial-3

第三步:交叉重叠(IOU):

EXX-Blog-pytorch-yolo5-tutorial-4

IOU是intersection over union的缩写,用于计算我们模型的准确性。这是通过量化两个盒子的相交程度来实现的:真实价值盒子(图片中的红色盒子)和我们的结果返回的盒子(图片中的蓝色盒子)。

在本文的教程部分,我们确定我们的欠条价值为40%,这意味着如果两个盒子的交集低于40%,那么这个预测就不应该被考虑。这样做是为了帮助我们计算出预测的准确性。

下面是一张图片,显示了YOLO检测算法的完整过程

EXX-Blog-pytorch-yolo5-tutorial-5

有关YOLO算法如何工作的其他信息,请查看YOLO算法简介

我们试图通过我们的模型达到什么目的?
本教程中的例子的主要目标是使用YOLO算法来检测给定图像中的胸部疾病列表。与任何机器学习模型一样,我们将使用成千上万的胸部扫描图像来运行我们的模型。我们的目标是让YOLO算法成功检测出给定图像中的所有病变。

数据集
本教程中使用的VinBigData 512图像数据集可以在Kaggle上找到。该数据集分为两部分,训练和测试数据集。训练数据集包含15000张图片,而测试数据集包含3000张。训练和测试之间的这种数据划分在某种程度上是最佳的,因为训练数据集通常是测试数据集的4到5倍。:

EXX-Blog-pytorch-yolo5-tutorial-6

数据集的另一部分包含所有图像的标签。在这个数据集里面,每张图片都标有一个类别名称(发现的胸部疾病),以及类别ID、图片的宽度和高度等。检查下面的图片,查看所有可用的列。

EXX-Blog-pytorch-yolo5-tutorial-7

YOLOv5教程
注意:你可以在Kaggle上查看本例中使用的
原始代码

第1步:导入必要的库
首先,我们将在代码的最开始导入所需的库和包。首先,我们来解释一下刚才导入的一些比较常见的库。NumPy是一个开源的Python数值库,允许用户创建矩阵并对其进行一些数学运算。

import pandas as pd
import os
import numpy as np
import shutil
import ast
from sklearn import model_selection
from tqdm import tqdm
import wandb
from sklearn.model_selection import GroupKFold\
from IPython.display import Image, clear_output  # to display images
from os import listdir
from os.path import isfile
from glob import glob
import yaml
# clear_output()

第2步:定义我们的路径
为了使我们的生活更轻松,我们将首先定义通向训练和测试数据集的标签和图像的直接路径。

TRAIN_LABELS_PATH = './vinbigdata/labels/train'
VAL_LABELS_PATH = './vinbigdata/labels/val'
TRAIN_IMAGES_PATH = './vinbigdata/images/train' #12000
VAL_IMAGES_PATH = './vinbigdata/images/val' #3000
External_DIR = '../input/vinbigdata-512-image-dataset/vinbigdata/train' # 15000
os.makedirs(TRAIN_LABELS_PATH, exist_ok = True)
os.makedirs(VAL_LABELS_PATH, exist_ok = True)
os.makedirs(TRAIN_IMAGES_PATH, exist_ok = True)
os.makedirs(VAL_IMAGES_PATH, exist_ok = True)
size = 51

第3步:导入和读取文本数据集
这里我们将导入并读取文本数据集。这些数据是以CSV文件格式的行和列的形式存储的。

df = pd.read_csv('../input/vinbigdata-512-image-dataset/vinbigdata/train.csv')
df.head()

注意:df.head()函数打印出给定数据集的前5行。

第4步:过滤和清理数据集
由于没有一个数据集是完美的,大多数时候,过滤过程是必要的,以优化数据集,从而优化我们模型的性能。在这一步骤中,我们将放弃任何类别ID等于14的行。

这个类的ID代表了在疾病类中没有发现。我们放弃这个类的原因是,它可能会混淆我们的模型。此外,它还会减慢速度,因为我们的数据集会稍微大一点。

df = df[df.class_id!=14].reset_index(drop = True)

第5步:计算YOLO的边界框的坐标
正如之前在 "YOLO算法是如何工作的 "一节中提到的(尤其是步骤1和2),YOLO算法希望数据集是某种格式的。在这里,我们将通过数据框架并应用一些转换。

以下代码的最终目标是计算每个数据点的新的x-mid、y-mid、宽度和高度尺寸。

df['x_min'] = df.apply(lambda row: (row.x_min)/row.width, axis = 1)*float(size)
df['y_min'] = df.apply(lambda row: (row.y_min)/row.height, axis = 1)*float(size)
df['x_max'] = df.apply(lambda row: (row.x_max)/row.width, axis =1)*float(size)
df['y_max'] = df.apply(lambda row: (row.y_max)/row.height, axis =1)*float(size)

df['x_mid'] = df.apply(lambda row: (row.x_max+row.x_min)/2, axis =1)
df['y_mid'] = df.apply(lambda row: (row.y_max+row.y_min)/2, axis =1)

df['w'] = df.apply(lambda row: (row.x_max-row.x_min), axis =1)
df['h'] = df.apply(lambda row: (row.y_max-row.y_min), axis =1)

df['x_mid'] /= float(size)
df['y_mid'] /= float(size)

df['w'] /= float(size)
df['h'] /= float(size)

第6步:改变所提供的数据格式
在这部分代码中,我们将把数据集中所有行的给定数据格式改为以下列;<class> <x_center> <y_center> <width> <height>。这是必要的,因为YOLOv5算法只能读取这种特定格式的数据。

# <class> <x_center> <y_center> <width> <height>
def preproccess_data(df, labels_path, images_path):
     for column, row in tqdm(df.iterrows(), total=len(df)):
         attributes = row[['class_id','x_mid','y_mid','w','h']].values
         attributes = np.array(attributes)
         np.savetxt(os.path.join(labels_path, f"{row['image_id']}.txt"),
                    [attributes], fmt = ['%d', '%f', '%f', '%f', '%f'])
         shutil.copy(os.path.join('/kaggle/input/vinbigdata-512-image-dataset/vinbigdata/train', f"{row['image_id']}.png"),images_path)

然后我们将运行preproccess_data函数两次,一次是训练数据集及其图像,第二次是测试数据集及其图像。

preproccess_data(df, TRAIN_LABELS_PATH, TRAIN_IMAGES_PATH)
preproccess_data(val_df, VAL_LABELS_PATH, VAL_IMAGES_PATH)

使用下面这一行,我们将把YOLOv5算法克隆到我们的模型中

git clone https://github.com/ultralytics/yolov5.git

第7步:定义我们模型的类
在这里,我们将在我们的模型中把现有的14种胸部疾病定义为类。这些是可以在数据集的图像中识别的实际疾病。

classes = [ 'Aortic enlargement',
             'Atelectasis',
             'Calcification',
             'Cardiomegaly',
             'Consolidation',
             'ILD',
             'Infiltration',
             'Lung Opacity',
             'Nodule/Mass',
             'Other lesion',
             'Pleural effusion',
             'Pleural thickening',
             'Pneumothorax',
             'Pulmonary fibrosis']

data = dict(
     train =  '../vinbigdata/images/train',
     val   =  '../vinbigdata/images/val',
     nc    = 14,
     names = classes
     )

with open('./yolov5/vinbigdata.yaml', 'w') as outfile:
     yaml.dump(data, outfile, default_flow_style=False)

f = open('./yolov5/vinbigdata.yaml', 'r')
print('\nyaml:')
print(f.read())

第8步:训练模型
首先,我们将打开YOLOv5的目录。然后我们将使用 pip 来安装所有写在需求文件中的库。

需求文件包含了代码库工作所需的所有库。我们还将安装其他的库,如pycocotools、seaborn和pandas。

%cd ./yolov5
!pip install -U -r requirements.txt
!pip install pycocotools>=2.0 seaborn>=0.11.0 pandas thop
clear_output()

Wandb是权重和偏差的简称,它允许我们监控一个特定的神经网络模型。

# b39dd18eed49a73a53fccd7b684ea7ecaed75b08
wandb.login()

现在我们将在提供的vinbigdata集上训练YOLOv5,训练时间为100 epochs。我们还将传递一些其他的标志,比如--img 512,它告诉模型我们的图像大小是512像素,--batch 16将允许我们的模型每批取16张图像。使用--data ./vinbigdata.yaml标志,我们将传递我们的数据集,也就是vinbigdata.yaml数据集。
!python train.py --img 512 --batch 16 --epochs 100 --data ./vinbigdata.yaml --cfg models/yolov5x.yaml --weights yolov5x.pt --cache --name vin

第9步:评估模型
首先,我们将确定测试数据集目录和权重目录。

test_dir = f'/kaggle/input/vinbigdata-{size}-image-dataset/vinbigdata/test'
weights_dir = './runs/train/vin3/weights/best.pt'
os.listdir('./runs/train/vin3/weights')

在这一部分,我们将使用detect.py作为我们的推理,检查我们预测的准确性。我们还将传递一些标志,比如 --conf 0.15\,这是模型的置信度阈值。如果检测到的对象的置信度低于15%,就从我们的输出中删除它。--iou 0.4\标志通知我们的模型,如果两个盒子的联合上的交集低于40%,就应该把它删除。

!python detect.py --weights $weights_dir\
--img 512\
--conf 0.15\
--iou 0.4\
--source $test_dir
--save-txt --save-conf --exist-ok

在PyTorch中使用YOLOv5的最终想法
在这篇文章中,我们解释了什么是YOLOv5以及基本的YOLO算法是如何工作的。接下来,我们继续简要地解释了PyTorch。然后,我们介绍了为什么你应该使用YOLO而不是其他类似的检测算法的几个原因。

      最后,我们带你看了一个机器学习模型,该模型能够检测X射线图像中的胸部疾病。在这个例子中,我们使用YOLO作为我们的主要检测算法来寻找和定位胸部病变。然后我们将每个病变归入一个特定的类别或疾病。

如果你对机器学习和建立自己的模型感兴趣,特别是需要在给定的图像或视频表示中检测多个对象的模型,那么YOLOv5绝对值得一试。



今天先到这儿,希望对云原生,技术领导力, 企业管理,系统架构设计与评估,团队管理, 项目管理, 产品管管,团队建设 有参考作用 , 您可能感兴趣的文章:
领导人怎样带领好团队
构建创业公司突击小团队
国际化环境下系统架构演化
微服务架构设计
视频直播平台的系统架构演化
微服务与Docker介绍
Docker与CI持续集成/CD
互联网电商购物车架构演变案例
互联网业务场景下消息队列架构
互联网高效研发团队管理演进之一
消息系统架构设计演进
互联网电商搜索架构演化之一
企业信息化与软件工程的迷思
企业项目化管理介绍
软件项目成功之要素
人际沟通风格介绍一
精益IT组织与分享式领导
学习型组织与企业
企业创新文化与等级观念
组织目标与个人目标
初创公司人才招聘与管理
人才公司环境与企业文化
企业文化、团队文化与知识共享
高效能的团队建设
项目管理沟通计划
构建高效的研发与自动化运维
某大型电商云平台实践
互联网数据库架构设计思路
IT基础架构规划方案一(网络系统规划)
餐饮行业解决方案之客户分析流程
餐饮行业解决方案之采购战略制定与实施流程
餐饮行业解决方案之业务设计流程
供应链需求调研CheckList
企业应用之性能实时度量系统演变

如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:

MegadotnetMicroMsg_thumb1_thumb1_thu[2]

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 该文章也同时发布在我的独立博客中-Petter Liu Blog。

posted on 2022-12-10 14:32  PetterLiu  阅读(3815)  评论(0编辑  收藏  举报