教程:使用显卡MX250做YOLO目标检测(定位)滑块缺口,包括获取数据集,对数据集手动标注,训练的代码,推理的代码,超多细节,你的第一次YOLO绝佳体验!
教程:使用显卡MX250做YOLO目标检测(定位)滑块缺口,包括获取数据集,对数据集手动标注,训练的代码,推理的代码,超多细节,你的第一次YOLO绝佳体验!
1. 背景
- 最近又心血来潮,想试试滑块自动验证,最牛逼的路线就是逆向js,模拟加密参数,但这个真的太难了,要研究的东西有亿点点多。
- 所以退而求其次,想用AI来试图识别缺口的位置,算出缺口的坐标,网上一搜一大把,但基本都把训练集隐藏了,做付费的钩子emmm。
- 看了几篇文章,把思路过程自己捋了一下,又自己成功做到了,现在分享一下整个过程,授人以鱼不如授人以渔。
2. 什么是YOLO
-
YOLO(You Only Look Once)是一种基于卷积神经网络(CNN)的目标检测算法。YOLO算法的主要特点是它将目标检测问题视为一个回归问题,通过单次网络前向传播直接预测图像中的多个边界框和类别概率。与传统的目标检测方法相比,YOLO的检测速度非常快,因此在实时应用中得到了广泛的应用。
-
YOLO算法有多个版本,每个版本在精度和速度上都有所改进。YOLO通常被用于图像和视频中的物体检测任务,如人脸识别、自动驾驶中的物体检测、安防监控等。
-
最新的已经到了v10,本文使用的是v8n,一个微小型的模型,不到200张的图片,就能训练出来,最后生成的模型不到7m,然后几乎100%的识别率,AI恐怖如斯。
3. 环境准备
3.1 python环境
- 强烈建议使用3.9系列的,本文用的是3.9.13,python版本不是越新越好的,python更新是不顾旧版本的逻辑的,有可能新版的就把旧版的一些函数直接删了
- 可以在官网下载
- 也可以点这里直接下载3.9.13
3.2 安装pytorch
- 这个有很多坑的,如果电脑有GPU的,要用上GPU,可参考我之前的文章链接
3.3 安装cv2
- 命令:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
3.4 安装YOLOv8
- 命令:
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
3.5 安装标注工具labelImg
- 命令:
pip install labelImg -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
4. 数据集
4.1 收集数据集
4.1.1 贴一下解题思路
- 这一款的滑块其实比较简单,左边的滑块的位置在x轴算是固定不变的,变动的只是y轴,所以只需要定位到右边缺口的坐标就行了
- 而这一款的滑块,背景图只包含右边的缺口,所以只需要搜集包含右边缺口的数据集就可以训练了
4.1.2 安装浏览器插件《图片助手(ImageAssistant) 批量图片下载器》
- 这个插件可以自动捕获页面的所有图片,还可以根据url,图片大小等等条件做筛选
- 官网地址
4.1.3 收集数据
- 思路就是,点开滑块验证的iframe后,不断点击刷新按钮,插件会捕获累加的背景图,最后一次性下载下来就行了
- 这里提供一个网站来收集数据,收集数据用的网站,打开后,点
登录
,点手机动态码登录
,随便输个手机号,比如18812345678,点获取验证码
,就出现滑块验证了 - 右键背景图,找到
图片助手
,提取本页图片
- 在打开的
图片助手
管理页,在URL筛选
里填上:https://turing.captcha.qcloud.com/cap_union_new_getcapbysig
,这样就只显示滑块的图片了
- 接下来需要的就是,不断点击刷新按钮,
图片助手
会不停累加捕获的图片,至于如何不断点击,方法有很多,看个人喜好,勤奋的可以用手点个200次,或者用影刀
、按键精灵
等辅助工具
- 上面每点一次刷新,
图片助手
就会捕获一张图片,大概捕获个200张左右就够了,这是我这一次的数据量,按照我这一次的训练经验,感觉不需要200张都可以。通过图片助手
把图片批量下载到本地
- 下好图片,到存放目录看看,会发现,2种类型的图片都下载下来了,而且还分类了,只需要背景图那些就好。
4.2 数据集手动标注和打标签(最痛苦最耗时的一步)
4.2.1 介绍labelImg常用功能和快捷键
- 先确保上面的3.5 安装标注工具labelImg步骤已经安装好labelImg
- 然后打开命令行cmd工具,输入:
labelImg
(label+大写的I开头的Img),就会自动打开labelImg工具
- 常用快捷键
- 下一张图片 D
- 上一张图片 A
- 创建标注框 W
4.2.2 手动标注和打标签
-
使用
labelImg
打开刚刚下载的图片集目录,修改标注信息保存目录(重要,YOLO需要这个信息来训练),切换标注格式为YOLO
-
还要设置一下自动保存模式,
View
-Auto save mode
-
开始标注和打标签,这一步就是苦力活了,就靠肝,通过快捷键ADW,3个快捷键不停的机械的框选
-
这一步结束的时候,收获的就是一堆对应图片名字的txt标注文件,一一对应,比如图片名叫
00001.png
,对应的标注文件名叫00001.txt
,如果打开一个,会发现有一行数据,因为这次只在一张图片上标注了1个框,所以只有一行,如果有多个框,就有多行,每一行的格式都是<class_id> <x_center> <y_center> <width> <height>
,具体代表意义可以问问gpt4o。
有多少个图片就有多少个标注文件名,还有一个classes.txt
,这个是用来保存标签名的,比如这次只有一个标签slide
,打开classes.txt
,里面就只有一个slide
。
5. 项目结构
5.1 构建YOLO需要的数据集结构
- YOLO训练需要的数据集结构是有要求的,按以下的结构构建
dataset
images
test
train
val
labels
test
train
val
- 把图片按比例放入
images
文件夹中,一般train
训练集放60%(比如200张图片就放120张);剩下的test
和val
各占20%(40张/40张) - 把标注txt文件也按比例放入
labels
文件夹中,与图片一一对应,图片的位置和它的标签对应好。 - 而
classes.txt
文件放到dataset下一级去(和labels同级)
5.2 需要的配置文件
- 为数据集创建一个
data.yaml
文件,文件位于dataset的根目录下,文件应该包括数据路径,类别数,类别信息等必要的内容,内容如下:
train: E:/dev/mySlide/dataset/images/train # 改成你的train的图片目录路径
val: E:/dev/mySlide/dataset/images/val # 改成你的val的图片目录路径
test: E:/dev/mySlide/dataset/images/test # 改成你的test的图片目录路径
# number of classes
nc: 1
# class names,如果改了要换成你的标签名
names: ['slide']
- 最终结构如下:
5.3 下载yolov8n.pt模型文件
-
点击github项目ultralytics,拉到下面,找到
COCO
下的YOLOv8n
,点击下载,或者点这个链接直接下载
-
下载后,放到项目根目录下
5.4 训练的代码
- 训练的代码其实就2行,很简单,真是开箱即用,新建一个python文件,
train.py
from ultralytics import YOLO
if __name__ == '__main__':
# Load a model
model = YOLO('yolov8n.pt') # load a pretrained model (recommended for training)
# Train the model
model.train(data='./dataset/data.yaml', epochs=300, imgsz=320)
-
配置了训练300轮,图片缩放为320x320
-
开始训练,我这台电脑的GPU是MX250,2g显存,没想到速度还挺快,而且只用了0.686G显存,一开始损失率好高,正确率惨不忍睹,随着训练的进行,损失率在慢慢下降,正确率在上升
-
尝试训练了2次,2次都因为早停策略而提前结束,没有跑满300轮,2次最优的模型都是第159轮,训练用时差不多半小时,先看看159轮的,正确率已经接近100%了
-
看看总结报告,40张图的验证集,99.9%正确率,平均每张图的处理速度,0.2毫秒预处理,3.8毫秒推理,2.5毫秒后处理,加起来平均6.5毫秒推理一张图,恐怖如斯!
5.5 批量验证的代码
- 可以自己再使用验证集验证一次结果
- 新建一个python文件,
val.py
,代码如下:
from ultralytics import YOLO
if __name__ == '__main__':
# Load a model
model = YOLO('./runs/detect/train/weights/best.pt') # 训练日志里贴出来的目录地址,每次训练后会变化的
# Validate the model
metrics = model.val() # no arguments needed, dataset and settings remembered
- 结果如下,准确率也是99.9%
- 去贴出来的结果目录里看看,40张图片全对,如下3张图
5.6 推理单张图片的代码(即获取结果)
- 直接指定推理某个图片,并获得坐标结果
- 新建一个python文件,
detect.py
,代码如下:
from PIL import Image
from ultralytics import YOLO
if __name__ == '__main__':
# 加载模型
model = YOLO("./runs/detect/train/weights/best.pt")
# 从PIL图像进行预测
im1 = Image.open("10001.png") # 指定要推理的图片
results = model.predict(source=im1, save=True) # 保存绘制后的图像
# 遍历结果并打印每个检测到的目标的坐标
for result in results:
boxes = result.boxes # 获取检测到的所有边界框
for box in boxes:
# 每个box包含坐标和其他信息
x_min, y_min, x_max, y_max = box.xyxy[0] # 获取左上角和右下角坐标
print(f"Detected object at: x_min={x_min}, y_min={y_min}, x_max={x_max}, y_max={y_max}")
- 推理结果如下:
5.7 项目源码
- github地址:YOLOv8nSlide
6. 一些资料
over, enjoy!!!
如对您有帮助,感谢投喂!
更多推荐
所有评论(0)