在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算法是如何工作的?
第一步:剩余区块(将图像划分为更小的、类似网格的盒子)
在这一步中,完整的(整个)框架被划分为更小的盒子或网格。
所有的网格都是在原始图像上绘制的,其形状和大小完全相同。这些划分背后的想法是,每个网格盒将检测其内部的不同物体。
第二步:边界盒回归(识别边界盒内的物体)
在检测到图像中的某个物体后,会在其周围绘制一个边界框。该边界框有一些参数,如中心点、高度、宽度和类别(检测到的物体类型)。
第三步:交叉重叠(IOU):
IOU是intersection over union的缩写,用于计算我们模型的准确性。这是通过量化两个盒子的相交程度来实现的:真实价值盒子(图片中的红色盒子)和我们的结果返回的盒子(图片中的蓝色盒子)。
在本文的教程部分,我们确定我们的欠条价值为40%,这意味着如果两个盒子的交集低于40%,那么这个预测就不应该被考虑。这样做是为了帮助我们计算出预测的准确性。
下面是一张图片,显示了YOLO检测算法的完整过程
有关YOLO算法如何工作的其他信息,请查看YOLO算法简介。
我们试图通过我们的模型达到什么目的?
本教程中的例子的主要目标是使用YOLO算法来检测给定图像中的胸部疾病列表。与任何机器学习模型一样,我们将使用成千上万的胸部扫描图像来运行我们的模型。我们的目标是让YOLO算法成功检测出给定图像中的所有病变。
数据集
本教程中使用的VinBigData 512图像数据集可以在Kaggle上找到。该数据集分为两部分,训练和测试数据集。训练数据集包含15000张图片,而测试数据集包含3000张。训练和测试之间的这种数据划分在某种程度上是最佳的,因为训练数据集通常是测试数据集的4到5倍。:
数据集的另一部分包含所有图像的标签。在这个数据集里面,每张图片都标有一个类别名称(发现的胸部疾病),以及类别ID、图片的宽度和高度等。检查下面的图片,查看所有可用的列。
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绝对值得一试。
如有想了解更多软件设计与架构, 系统IT,企业信息化, 团队管理 资讯,请关注我的微信订阅号:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
我正在尝试整个BDD方法并想测试AMQP基于Vanilla的方面Ruby我正在写的应用程序。选择Minitest后作为与其他名副其实的蔬菜框架不同的平衡功能和表现力的测试框架,我着手编写此规范:#File./test/specs/services/my_service_spec.rb#Requirementsfortestrunningandconfigurationrequire"minitest/autorun"require"./test/specs/spec_helper"#Externalrequires#MinitestSpecsforEventMachinerequire