本文为稀土技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

今日聊聊YOLO结构。

用YOLOv8一站式解决图像分类、检测、分割……

我的文章有个特点,不选自己想写的,专挑咱们想看的。就算内容对我生疏,我也有自傲先把它吃透,再让你听懂。

用YOLOv8一站式解决图像分类、检测、分割……

你看,有朋友就提议写写YOLO

也巧,上一年我还用过YOLO v5,今日再去官网一看,现已升到v8了。并且它在淡化YOLO版别,主打Ultralytics渠道。

我感觉这个渠道,能很好地处理图画范畴的大部分问题。

一、Ultralytics渠道

YOLO原本是一种公开的方针检测算法。它的优势是速度快,准确率还高。这很气人。一般情况下,两者是不能兼得的。

它之所以这么强,从它的姓名中就能找到答案。YOLO的全称是You Only Look Once(你仅需看一遍)。关于它原理解读的介绍非常多,归于街边知识,我就不多说了。横竖,你知道它很火就好了。基本上,从画面中找物体的技术方案,选YOLO就对了。

用YOLOv8一站式解决图像分类、检测、分割……

今年Ultralytics公司在YOLO之前版别基础上提出了v8版别。这个版别,更像是一个AI视觉处理渠道,它不光能够做检测,还能够做分类、切割、盯梢,乃至姿势估量。

用YOLOv8一站式解决图像分类、检测、分割……

可是它的调用和二次开发,也很便利。这太气人了,它不光好用,并且易用。

二、操作和原理攻略

Github地址:github.com/ultralytics

仍旧提示咱们去读ReadMe.md文件。我所说的,皆源于此。

基础环境要求:

Python >= 3.8
PyTorch >= 1.7

履行pip install ultralytics安装渠道支撑库,后边就能够操作了。

2.1 命令行操作

它有多易用呢?易用到你啥都不必动,安装完就能直接用。

找来一个图片,例如下面这图,咱们命名叫bus.jpg,放到主目录下。

用YOLOv8一站式解决图像分类、检测、分割……

然后你在终端运行如下命令:

yolo predict model=yolov8n.pt source=bus.jpg

这表明运用yoloyolov8n.pt模型对bus.jpg这张图进行猜测。它会自动去下载yolov8n.pt模型文件。随后,控制台打印如下:

(yolo)C:\tfboy\yolo> yolo predict model=yolov8n.pt source=bus.jpg
……
image 1/1 C:\tfboy\yolo\bus.jpg: 640x480 4 persons, 1 bus, 1 stop sign, 94.7ms
Speed: 0.0ms preprocess, 94.7ms inference, 0.0ms postprocess per image at shape (1, 3, 640, 480)
Results saved to runs\detect\predict

最终一句说,成果保存到了runs\detect\predict目录。咱们翻开一看,发现了一张bus.jpg

用YOLOv8一站式解决图像分类、检测、分割……

嗯,这便是方针检测的成果。看符号上,它辨认出了person人,bus公交车,还有左上角的stop sign停车路标。咱们发现person的辨认,左右两边都是半个人,它也辨认出来了。

最简略的用法便是这样,不必翻开IDE(程序员写代码的程序)就能处理图片。

你乃至都不必预备图片,直接运行命令也行。由于我从源码文件engin\model.py中的predict函数中看到这么一段:

if source is None:
    source = ROOT / 'assets' if is_git_dir() else 'https://www.6hu.cc/files/2023/10/1696328445-b5bbe82d1bff19c.jpg'
    LOGGER.warning(f"WARNING  'source' is missing. Using 'source={source}'.")

如果资料为空,它会运用一个预置的本地目录。如果这个坏了,它还会从网上下载一个图片,并日志提示你“没有图,我顶了一下”。

这绝对是业界良知!

可是,咱们想要拿到详细的辨认数据,或许还想测验其他功用怎么办?

继续往下看。

2.2 用代码处理

代码调用也极端简略。

# 从渠道库导入YOLO类
from ultralytics import YOLO
# 从模型文件构建model
model = YOLO("xx.pt")
# 对某张图片进行猜测
results = model("bus.jpg")
# 打印辨认成果
print(results) 

开头咱们说过,YOLOv8功用强大,除了方针检测,还支撑切割、追寻啥的。我也说过,它很易用。

现在就体现出来了。它履行一切功用的代码都是同一套,想换功用替换xx.pt模型文件就行。它的剖析成果,也都存在同一个results结构中。

2.2.1 模型文件的调用

它有哪些模型文件呢?

称号 模型文件 宗族
检测 yolov8n.pt 8n、8s、8m、8l、8x
切割 yolov8n-seg.pt 8n、8s、8m、8l、8x
分类 yolov8n-cls.pt 8n、8s、8m、8l、8x
姿势 yolov8n-pose.pt 8n、8s、8m、8l、8x

每一类模型,还搞出一个宗族。这就好比是同一款衣服的不同尺码。尺码不同,受众也不同。咱们拿检测来做个比照。

类型 准确度 耗时长 运算次数/秒
YOLOv8n 37.3 80.4 8.7
YOLOv8s 44.9 128.4 28.6
YOLOv8m 50.2 234.7 78.9
YOLOv8l 52.9 375.2 165.2
YOLOv8x 53.9 479.1 257.8

咱们看到从8n8x,尽管准确值提高了,可是时间也提高了6倍。

由于它的算法,让它在竞争者中显得又快又准。可是回到同一个算法内,其实仍是有取舍的。

咱们替换模型文件就能够体会不同的功用。下面是我用代码测验了yolov8n-pose.ptyolov8n-cls.pt这俩模型的作用。

用YOLOv8一站式解决图像分类、检测、分割……

姿势模型能检测人体的姿势动作。切割模型能够将辨认到的物体从布景中切分出来。

2.2.2 回来成果的解读

咱们运用它,必定是想让它帮咱们处理图画。像上面那样,它给原图画出一个框,没法融入到咱们产品中。这像极了有钱人来你家大把炫富,然后说并不计划给你或许借你。

Ultralytics绝对不会这么做。它有好多种办法将成果给你!

首先,它那个results = model("bus.jpg")results就包含着处理成果的数据。

其次,这是一个临时内存数据,它怕你不打印就丢了。因此又供给了一个持久化的保存办法。

看下面这段代码:

from ultralytics import YOLO
from PIL import Image
model = YOLO('yolov8n-seg.pt')
image = Image.open("bus.jpg")
results = model.predict(source=image, save=True, save_txt=True) 

这是另一种调用办法,咱们符号为code-666

与之前的区别是构建完model之后,调用了predict办法,参数里边有save_txt=True这项。这表明把数据成果保存到txt文本中。

其实咱们也看到入参也有变化。先经过Image.open("bus.jpg")把图片包装一下,然后经过source=image传入。除此之外,数据源也支撑文件夹或许摄像头。

# 辨认来自文件夹的图画
results = model.predict(source="test/pics", ……) 
# 辨认来自摄像头的图画
results = model.predict(source="0", ……)

不管哪种输入办法,这个results都很要害。想了解它的结构,你有3种途径:

  • 上网搜,找解析文章或许官方文档。
  • 直接print一下,看看它输出什么。
  • 检查源码,了解其特点构成。

作为老程序员一般会直接看源码。经过按着ctrl键点击办法名,我定位到它是engine/results.py下的Results类。

用YOLOv8一站式解决图像分类、检测、分割……

瞬间,恍然大悟的感觉。我拣重要的,给咱们解说下:

  • boxes: 检测出来物体的矩形框,便是方针检测的框。
  • masks: 检测出来的遮罩层,调用图画切割时,这项有数据。
  • keypoints: 检测出来的要害点,人体姿势估量时,身体的点便是这项。
  • names: 分类数据的称号,比方{0: 人,1: 狗}这类索引。

想看详细的数值,能够自己调用results[0].boxes或许results[0].masks打印一下。

2.2.3 简略的抠图示例

下面咱们做一个抠图的示例。咱们将bus.jpg采用yolov8n-seg.pt模型做一个物体切割。它会把图画中检测到的物体切割出来,并将成果保存到results中(code-666便是这项操作)。

然后,咱们打印一下成果:

import numpy as np
pixel_xy = results[0].masks.xy[1]
points = np.array(pixel_xy, np.int32)
print(points)
  • results是一个支撑批量图片的成果集,由于咱们只有一张图画,所以取results[0]
  • masks.xy是一张图里一切物体掩膜的轮廓坐标,咱们只取一个,取索引为1的物体。

points的打印值是:

array([[113, 398],
       [111, 399],
       [106, 399],
...
       [150, 399],
       [148, 398]])

都是xy坐标点。咱们能够把它画出来。

import cv2
input_image = cv2.imread('bus.jpg')
cv2.drawContours(input_image, [points], -1, (0, 255, 0), 2)
cv2.imwrite('output.jpg', input_image)

用YOLOv8一站式解决图像分类、检测、分割……

原来这是穿羊皮袄的帅哥。既然现已知道了他的方位,那么把圈里的像素提取出来,让他到济南的街头走一走,感受一下车让人,感受一下超然楼。

用YOLOv8一站式解决图像分类、检测、分割……

相同,你提取谁都能够,或许给全体换一个布景也行。由于物体咱们都拿到了。

用YOLOv8一站式解决图像分类、检测、分割……

在开源技术的加持下,这对程序员来说很简略。可是许多软件还收费。由于它们收的是电脑的运用费。

不要高兴太早,这个模型是受限的。

YOLO是一种算法,它就好比是一种思想,本身啥也干不了。

上面的那些落地的模型文件仅仅是一个示例,是YOLOv8针对COCO数据集(一个很好的计算机视觉数据集)练习生成的。

这个数据会集有许多类物体:

用YOLOv8一站式解决图像分类、检测、分割……

你能够经过results[0].names直接打印出来。

也便是说,它只认识上面罗列的80种物体。你拿一个它没见过的,比方请找出图中的老济南把子肉,它必定辨认不出来。需求你去练习数据集之外方针。

接下来就讲讲练习的事情。

2.3 练习数据

练习数据的操作依然很友爱。只需求预备好练习集,然后启动练习就能够了。

这次我计划练习方针检测,来检测游戏角色的血量条。便是下面这样:

用YOLOv8一站式解决图像分类、检测、分割……

这有什么用呢?起码能够让我知道哪里出现活物了。

咱们预备一些图片资料。条件好就多预备,条件差就少预备,起码得200张吧。

用YOLOv8一站式解决图像分类、检测、分割……

预备好资料后,下面就开端符号。

2.3.1 符号数据

咱们运用labelImg进行符号。

首先pip3 install labelImg安装它。然后,在终端输入labelImg就能启动它。如果有问题,能够下载源码启动。

用YOLOv8一站式解决图像分类、检测、分割……

你能够把它当成一个正常的软件来用。

一张图一张图地符号。符号完了之后,会产生一些文件。

用YOLOv8一站式解决图像分类、检测、分割……

classes.txt是总分类,一个分类占一行。另外,每张图片还会配一个同名的txt文件。里边记录了有几个框,都是什么类型,在哪个方位。

0 0.386605 0.149837 0.091455 0.063518举例:

第1个数字0表明物体的类别标签。
第2个数字0.386605表明鸿沟框左上角的X坐标相对于图画宽度的份额。
第3个数字0.149837表明鸿沟框左上角的Y坐标相对于图画高度的份额。
第4个数字0.091455表明鸿沟框的宽度相对于图画宽度的份额。
第5个数字0.063518表明鸿沟框的高度相对于图画高度的份额。

它们用份额表明方位,这样能够实现1010像素和10001000像素相同处理。

符号完成之后,咱们需求把很多的.png.txt依照固定的格局整理好。

datasets
  |--game
    |--images
      |--train
        |--xx1.png
      |--val
        |--xx2.png
    |--labels
      |--train
        |--xx1.txt
      |--val
        |--xx2.txt

下一步便是练习。

2.3.2 练习数据

yolo供给许多种符号和练习办法。我挑选的是比较传统的一种。

数据预备好了,咱们需求给数据做个索引,告诉结构在哪儿、有啥。新建一个game.yaml,内容如下:

# 练习集、验证集方位
train: game/images/train/
val: game/images/val/
# 几个分类
nc: 1
# 分类称号
names: ['blood']

然后就能练习了。能够采用命令行形式:

(yolo)C:……\yolo> yolo task=detect mode=train model=yolov8n.pt data=game.yaml epochs=300

也能够采用代码形式:

from ultralytics import YOLO
model = YOLO('yolov8n.pt')
results = model.train(data="game.yaml", epochs=300)

都很简略。全都是在yolov8n.pt基础上进行练习,只要你符号的好,成果必定也是很快很准确。

练习结束以后,会在runs\detect\train下生成练习成果,有许多东西。

用YOLOv8一站式解决图像分类、检测、分割……

args.yaml是练习的参数。你填的那点参数根本不行,其他都是默认的,这儿边有记录。如果你想改,能够练习时就指定。

咱们最期待的仍是weights里边的俩文件,一个best.pt是作用最好的权重,另一个是last.pt是最终一个权重。最终一个纷歧定是最好的,可是练习一通,最终一个不藏着,用户会觉得吃亏了。所以保留俩。

results.png是练习历史记录。

用YOLOv8一站式解决图像分类、检测、分割……

我取一点给咱们看,其实从50轮开端就平稳了。我练习了300轮有些多余。从这个图中也能够看出,最终一个纷歧定是准确率最高的。

下面试试作用吧。

2.3.3 推理猜测

为了便利调用,咱们把best.pt复制到项目根目录下。用法跟上面相同,只不过模型换成best.pt

去辨认一个文件夹下的图片:

from ultralytics import YOLO
model = YOLO("best.pt")
results = model.predict(source="game/images/val", save=True)

成果如下:

用YOLOv8一站式解决图像分类、检测、分割……

图片有点小,咱们来搞一个视频看看,这次用命令行:

(yolo)C:……\yolo> yolo task=detect mode=predict model=best.pt source="game.mp4"

它会一帧一帧地处理:

用YOLOv8一站式解决图像分类、检测、分割……

最终,输出到runs\detect\predict2,咱们翻开它看看作用:

用YOLOv8一站式解决图像分类、检测、分割……

其实,实时摄像头或许视频流也能做到,只不过便是换个source来源的问题。

至于这个辨认能做什么?必定是有想象空间的,比方不遮挡弹幕、焦点盯梢等。

三、更广阔的使用

YOLOv8支撑其他渠道格局的导出。也便是说它的产品,能够跨渠道、跨终端。

用YOLOv8一站式解决图像分类、检测、分割……

torchscripttf.js能够在浏览器上跑。tflite能够在AndroidIos上运行。它乃至也能在飞桨渠道运行。

代码就3行:

from ultralytics import YOLO
model = YOLO('best.pt')
model.export(format='tfjs')

看完赶忙测验,起飞吧,少年!

四、参考

官网ultralytics.com

文档docs.ultralytics.com

GitHubgithub.com/ultralytics…

labelImggithub.com/HumanSignal…

我是@TF男孩,一个思路开阔的程序员。