本文为稀土技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!
今日聊聊YOLO
结构。
我的文章有个特点,不选自己想写的,专挑咱们想看的。就算内容对我生疏,我也有自傲先把它吃透,再让你听懂。
你看,有朋友就提议写写YOLO
。
也巧,上一年我还用过YOLO v5
,今日再去官网一看,现已升到v8
了。并且它在淡化YOLO
版别,主打Ultralytics
渠道。
我感觉这个渠道,能很好地处理图画范畴的大部分问题。
一、Ultralytics渠道
YOLO
原本是一种公开的方针检测
算法。它的优势是速度快,准确率还高。这很气人。一般情况下,两者是不能兼得的。
它之所以这么强,从它的姓名中就能找到答案。YOLO
的全称是You Only Look Once(你仅需看一遍)。关于它原理解读的介绍非常多,归于街边知识,我就不多说了。横竖,你知道它很火就好了。基本上,从画面中找物体的技术方案,选YOLO
就对了。
今年Ultralytics
公司在YOLO
之前版别基础上提出了v8
版别。这个版别,更像是一个AI视觉处理渠道,它不光能够做检测,还能够做分类、切割、盯梢,乃至姿势估量。
可是它的调用和二次开发,也很便利。这太气人了,它不光好用,并且易用。
二、操作和原理攻略
Github地址:github.com/ultralytics
仍旧提示咱们去读ReadMe.md
文件。我所说的,皆源于此。
基础环境要求:
Python >= 3.8
PyTorch >= 1.7
履行pip install ultralytics
安装渠道支撑库,后边就能够操作了。
2.1 命令行操作
它有多易用呢?易用到你啥都不必动,安装完就能直接用。
找来一个图片,例如下面这图,咱们命名叫bus.jpg
,放到主目录下。
然后你在终端运行如下命令:
yolo predict model=yolov8n.pt source=bus.jpg
这表明运用yolo
的yolov8n.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
。
嗯,这便是方针检测的成果。看符号上,它辨认出了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/storage/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 |
咱们看到从8n
到8x
,尽管准确值提高了,可是时间也提高了6倍。
由于它的算法,让它在竞争者中显得又快又准。可是回到同一个算法内,其实仍是有取舍的。
咱们替换模型文件就能够体会不同的功用。下面是我用代码测验了yolov8n-pose.pt
和yolov8n-cls.pt
这俩模型的作用。
姿势模型能检测人体的姿势动作。切割模型能够将辨认到的物体从布景中切分出来。
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
类。
瞬间,恍然大悟的感觉。我拣重要的,给咱们解说下:
- 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)
原来这是穿羊皮袄的帅哥。既然现已知道了他的方位,那么把圈里的像素提取出来,让他到济南的街头走一走,感受一下车让人,感受一下超然楼。
相同,你提取谁都能够,或许给全体换一个布景也行。由于物体咱们都拿到了。
在开源技术的加持下,这对程序员来说很简略。可是许多软件还收费。由于它们收的是电脑的运用费。
不要高兴太早,这个模型是受限的。
YOLO
是一种算法,它就好比是一种思想,本身啥也干不了。
上面的那些落地的模型文件仅仅是一个示例,是YOLOv8
针对COCO
数据集(一个很好的计算机视觉数据集)练习生成的。
这个数据会集有许多类物体:
你能够经过results[0].names
直接打印出来。
也便是说,它只认识上面罗列的80
种物体。你拿一个它没见过的,比方请找出图中的老济南把子肉,它必定辨认不出来。需求你去练习数据集之外方针。
接下来就讲讲练习的事情。
2.3 练习数据
练习数据的操作依然很友爱。只需求预备好练习集,然后启动练习就能够了。
这次我计划练习方针检测,来检测游戏角色的血量条。便是下面这样:
这有什么用呢?起码能够让我知道哪里出现活物了。
咱们预备一些图片资料。条件好就多预备,条件差就少预备,起码得200张吧。
预备好资料后,下面就开端符号。
2.3.1 符号数据
咱们运用labelImg
进行符号。
首先pip3 install labelImg
安装它。然后,在终端输入labelImg
就能启动它。如果有问题,能够下载源码启动。
你能够把它当成一个正常的软件来用。
一张图一张图地符号。符号完了之后,会产生一些文件。
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
下生成练习成果,有许多东西。
args.yaml
是练习的参数。你填的那点参数根本不行,其他都是默认的,这儿边有记录。如果你想改,能够练习时就指定。
咱们最期待的仍是weights
里边的俩文件,一个best.pt
是作用最好的权重,另一个是last.pt
是最终一个权重。最终一个纷歧定是最好的,可是练习一通,最终一个不藏着,用户会觉得吃亏了。所以保留俩。
results.png
是练习历史记录。
我取一点给咱们看,其实从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)
成果如下:
图片有点小,咱们来搞一个视频看看,这次用命令行:
(yolo)C:……\yolo> yolo task=detect mode=predict model=best.pt source="game.mp4"
它会一帧一帧地处理:
最终,输出到runs\detect\predict2
,咱们翻开它看看作用:
其实,实时摄像头或许视频流也能做到,只不过便是换个source
来源的问题。
至于这个辨认能做什么?必定是有想象空间的,比方不遮挡弹幕、焦点盯梢等。
三、更广阔的使用
YOLOv8
支撑其他渠道格局的导出。也便是说它的产品,能够跨渠道、跨终端。
torchscript
和tf.js
能够在浏览器上跑。tflite
能够在Android
和Ios
上运行。它乃至也能在飞桨渠道运行。
代码就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男孩,一个思路开阔的程序员。