教程:使用显卡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张);剩下的testval各占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 项目源码

6. 一些资料

over, enjoy!!!
如对您有帮助,感谢投喂!
微信感谢投喂版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值