yolov8实现图片验证码识别

news2024/11/25 23:51:31

1、环境准备

1.1、安装miniconda

地址:Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

注意:为避免不兼容的问题,推荐下载py38版本,我下载的是Miniconda3-py38_23.1.0-1-Windows-x86_64.exe

安装建议

①、推荐安装在C盘;

②、勾选将其添加进Path,如下图(不要选为所有用户,要选仅为自己安装,否则不会有该选项);


1.2、创建并激活虚拟环境

概述:为了不影响默认环境的使用,推荐创建一个新的虚拟环境。

首先打开 Anaconda Prompt ,然后输入如下命令创建一个名为 yolov8 的虚拟环境:

# 推荐指定一个python版本,防止自动指定高版本的python导致不兼容
conda create -n yolov8 python=3.8

运行结果如下:

接下来在 Anaconda Prompt 输入如下命令激活虚拟环境,虽然说叫激活,也可以理解为切换到指定的虚拟环境:

conda activate yolov8

运行结果如下(命令行前面的小括号中显示yolov8就说明激活成功了):


1.3、配置镜像

概述:为保证后续能实现较高的下载速度,建议配置一个国内的镜像。

参考地址:pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

在 Anaconda Prompt 输入如下命令配置默认镜像:

pip config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

运行结果如下:


1.4、安装Pytorch

在安装Pytorch之前需要查看自己显卡的版本信息,在 Anaconda Prompt 输入如下命令即可查看:

nvidia-smi

运行结果如下:

接下来进入Pytorch官网:Previous PyTorch Versions | PyTorch

注意

①、16系显卡需安装 cu102 版本;

②、30系,40系显卡要安装 cu111 以上的版本,否则无法运行;

③、为避免冲突,Pytorch的版本推荐 v1.13

由于我使用的是30系显卡,所以可以使用CUDA11.7,因此我复制了此链接,如果你们使用的是16系显卡可以去找cu102版本的Pytorch。

注意:如果你的下载时间有2个多小时,你可能获取了一个wheel的下载链接,你要选择一个Conda下面的链接进行下载。

在 Anaconda Prompt 输入如下命令安装支持30系显卡和40系显卡的Pytorch:

conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia

运行结果如下:


1.5、安装CUDA

概述:此处需根据自身情况进行安装,如果你的需求只是做训练和简单推理,可忽略本小节,如果你有部署的需求,例如导出模型,则需要安装CUDA。

下载地址:https://developer.nvidia.com/cuda-downloads

根据自己的实际情况进行下载并安装即可:


1.6、源码安装ultralytics

下载地址:ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite (github.com)

将下载好的压缩包解压到d盘下的yolov8文件夹中(yolov8文件夹是我自己提前手动创建的):

在 Anaconda Prompt 输入如下命令实现 ultralytics 的源码安装:

# 切换到d盘
d:

# 进入文件夹
cd D:\yolov8\ultralytics-main

# 源码安装
pip install -e .

运行结果如下:


2、标记验证码

概述:本文使用labelImg进行标记,在终端中(Alt+F12)输入如下命令进行安装:

pip install labelImg

运行结果如下:

输入如下命令启动labelImg:

labelImg.exe

按照下图步骤对图片进行标注:

我总计标注了109张图片,名称从1开始到109结束,接下来在任意位置创建一个名为yzm的文件夹,该文件夹作为我们的数据集文件夹,然后在yzm文件夹中分别创建名为images的文件夹和labels的文件夹,然后在images文件夹和labels文件夹中都创建名为train的文件夹和val的文件夹,具体文件结构如下:

images文件夹用于放图片,labels文件夹用于放txt文件,我将1~99号图片放进了images/train目录中,100~109号图片放进了images/val目录中,1~99号txt文件放进了labels/train目录中,100~109号txt文件放进了labels/val目录中,classes.txt文件放在labels目录下。

注意:图片和txt文件的名称必须 一 一 对应 !!!

Pycharm打开前面解压的 D:\yolov8\ultralytics-main (根据自己的情况打开,如果按照我的步骤做的继续跟做即可)。

在ultralytics-main的根目录下创建一个名为 datasets 的文件夹,然后把前面准备的 yzm 文件夹粘贴到 datasets 中,目录结构如下:


3、训练模型

首先修改一下Pycharm的解释器:

然后参考如下文件编写yaml文件:ultralytics-main\ultralytics\cfg\datasets目录下所有的yaml文件。

在 ultralytics-main 项目的根目录下创建一个名为 yolo-yzm.yaml 文件,参考内容如下:

# 声明项目图片在哪儿
path: yzm
# 训练集图片
train: D:\yolov8\ultralytics-main\datasets\yzm\images\train
# 验证集图片
val: D:\yolov8\ultralytics-main\datasets\yzm\images\val

# 声明类别,可以从classes.txt文件中获取
names:
    0:  k
    1:  f
    2:  3
    3:  w
    4:  l
    5:  y
    6:  q
    7:  n
    8:  c
    9:  j
    10:  e
    11:  g
    12:  2
    13:  a
    14:  b
    15:  d
    16:  1
    17:  4
    18:  v
    19:  5
    20:  r
    21:  p
    22:  t
    23:  u
    24:  z
    25:  i
    26:  7
    27:  s
    28:  m
    29:  h
    30:  C

3.1、利用命令训练模型

# 在Pycharm中的终端中输入如下命令
# task用于指定任务,mode用于指定模型进行训练,data用于指定自定义的yaml文件,epochs用于指定训练次数,windows用户需设置workers=1,否则会报错
yolo task=detect mode=train model=yolov8n.pt data=yolo-yzm.yaml epochs=30 workers=1 batch=16

运行结果如下:


3.2、利用文件训练模型

在根目录下创建一个名为 begin.python 的文件,内容如下:

from ultralytics import YOLO
# 指定模型
mode = YOLO('yolov8n.pt')
# 让模型开始训练
mode.train(data='yolo-yzm.yaml',workers=0,epochs=80,batch=24)
# 验证模型
mode.val()

运行结果如下:(这里就将验证的步骤直接一笔带过,只需加一行语句即可,验证集的检测结果会更加准确)


3.3、拷贝默认yaml文件启动模型

概述:前面的两种方法实际都是传入参数覆盖默认的参数,我们可以通过命令将默认的 yaml 文件拷贝到根目录,然后对拷贝的 yaml 文件参数进行修改,最后通过命令启动模型即可。

# 在终端中执行如下命令即可
yolo copy-cfg

运行结果如下:

此时根目录中多了一个名为 default_copy.yaml 的文件:

打开 default_copy.yaml 文件,修改 Train 模块的参数,主要是model ,data 和 workers。

最后在终端中运行如下命令启动模型:

yolo cfg=default_copy.yaml

4、查看结果

我们运行完模型后,都会给我们返回结果,所有结果都在项目根目录下的 runs/detect 目录中,每一个 train 目录就是一次训练结果:

下面是某次训练完成后验证集的识别结果图片val_batch0_pred.jpg(第一位是识别到的字符,第二位是预估的正确率,最大值为1.0):

打开最后一次训练的结果后,目录结构如下:

知识点补充:从上面的目录结构中可以发现:weights目录中包含了两个 pt 文件,pt 文件就是模型,best.pt 就是效果最好的模型,last.pt 就是最后一次训练后产生的模型,如果要导出模型可以导出 best.pt 文文件,如果要继续训练就使用 last.pt 。

5、预测模型

概述:我准备了110~121号图片进行预测,放在datasets目录中的test文件夹中(test文件夹是自己手动创建的),文件结构如下:

然后在根目录下创建一个名为 pre_one_img.py 的文件,文件内容如下:

from ultralytics import YOLO
# 引入训练好的模型
model = YOLO('runs/detect/train8/weights/best.pt')

# 要预测的图片
public_path = 'datasets/yzm/test/'
image_paths = []
for i in range(110,122):
    image_paths.append(f'{public_path}{i}.png')

# 对每张图片进行预测
for image_path in image_paths:
    results = model(image_path,save=True)

运行结果如下:

根据结果可知,预测后的图片保存到了runs\detect\predict目录中,下面我挑出一张(整体的准确率较客观):

如果还想提高准确率,可以多准备数据集进行训练 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123470.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 类与对象】多态

空山新雨后 天气晚来秋 目录 多态的概念 多态实现条件 多态的转型 向上转型 向下转型 instanceof 关键字 方法的重写 Override注解 重写的权限 只能重写继承而来的方法(1) final、static 不能被重写(2) 重写的方法不能带有等级更严…

向量——通俗地解释

1. 向量 向量是一个既有大小(模)又有方向的对象,它可以用来描述空间中的位置、力或速度等量。我们可以从物理、数学和计算机的角度来看待向量,这三种观点看似不同却有关联。 (1)在物理专业视角下,向量是空间中的箭头&a…

KubeBlocks 如何降低管理多种数据库的学习门槛

什么是 KubeBlocks KubeBlocks 是一个开源的 Kubernetes 数据库 operator,能够帮助用户在 Kubernetes 上运行和管理多种类型的数据库。据我们所知,大多数数据库 operator 通常只能管理某种特定类型的数据库,例如: CloudNativePG…

秋招突击——算法练习——9/4——73-矩阵置零、54-螺旋矩阵、48-旋转图像、240-搜索二维矩阵II

文章目录 引言复习新作73-矩阵置零个人实现 54-螺旋矩阵个人实现参考实现 48-旋转图像个人实现参考实现 240-搜索二维矩阵II个人实现参考实现 总结 引言 秋招开展的不是很顺利,还是要继续准备,继续刷算法!不断完善自己,希望能够找…

Jupyter notebook配置与使用(安装过程+环境配置+运行实例)

前言 Jupyter Notebook 是一个开放源代码的 Web 应用程序,它允许创建和共享包含实时代码、方程式、可视化和叙述性文本的文档。 主要功能: 交互式计算:用户可以直接在浏览器中编写和执行代码。Markdown 支持:使用 Markdown 格式来…

一道迭代器失效练习题

随便写写 首先学习迭代器失效 传送门 : C—浅谈迭代器失效 学完迭代器失效之后做一道题呗 题目 分析 vector的迭代器为啥会失效 1、插入的时候扩容,转移空间出现野指针 2、删除的时候移动了元素,导致指针没指向正确的元素 list的迭代器为啥会失效 li…

pdf怎么压缩?分享5种压缩PDF文件的方法

pdf怎么压缩?PDF文件的压缩在日常办公和学习中尤为重要,它不仅能够大幅度缩减文件大小,节省宝贵的存储空间,还能加快文件在网络中的传输速度,提升工作效率。特别是在处理包含大量图像或复杂布局的PDF文档时&#xff0c…

Http带消息头两种请求办法

API接口最近经常碰到,协调几个乙方来回对接,把我折腾晕了,索性自己写一个小的工具,导入历史数据。 获取平台免登录token 接口说明 URL Path:gateweb/bigm-dm/openApi/ologin/openLogin 说明:第三方免登…

vue2 wavesurfer.js(7.8.5)简单使用

文档地址&#xff1a;https://wavesurfer.xyz/docs/ <template><div><el-row><el-card class"card"><div id"waveform" ref"waveform"></div></el-card></el-row><div>总时长&#xff1…

004——双向链表和循环链表

目录 双向链表 双向链表的初始化&#xff08;与单链表类似&#xff09; 增&#xff1a; Ⅰ&#xff09;头插法 Ⅱ&#xff09;尾插法 Ⅲ&#xff09;中间插入 删 改 查 整体代码示例&#xff1a; 循环链表 循环单链表 ​编辑 循环双链表 双向链表 不同于单链表&…

亲测可用导航网站源码分享 – 幽络源

幽络源为大家分享一套经过亲测可用的导航网站源码。初看这套PHP源码时&#xff0c;其数据库结构更像是商城系统源码&#xff0c;但经过某位小天才的修改&#xff0c;它已变成一个功能完备的导航网站。经过站长的测试&#xff0c;该源码运行良好&#xff0c;简单部署即可使用&am…

基于springboot的在线租房系统设计与实现

项目描述 这是一款基于springboot的在线租房系统 截图

438.找到字符串中所有字母异位词

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 很容易想到&#xff0c;这个题目要求我们在字符串s中找到一个定长的窗口让窗口里面出现异位词。 OK&#xff0c;先思考一下怎么快速判断两个字符串是否是异位词&#xff1f; 比较简单的方法是…

AV1 Bitstream Decoding Process Specification:约定

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

ubuntu配置tftp、nfs

tftp配置 tftp是简单文件传输协议&#xff0c;基于udp实现传输。这里的简单文件&#xff0c;指的是不复杂、开销不大的文件。 先在ubuntu中安装tftp&#xff0c;输入命令&#xff1a;sudo apt-get install tftp-hpa tftpd-hpa。 接着配置tftp。 输入命令&#xff1a;sudo v…

div内英文不换行问题以及解决方案

div内英文不换行问题以及解决方案 div盒子中文字换行问题&#xff1a;div中放中文的代码&#xff1a;div中放英文的代码&#xff1a; 解决办法注意 div盒子中文字换行问题&#xff1a; div设置宽度以后&#xff0c;如果div中放的是中文&#xff0c;默认文字超过div宽度会自动换…

GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断

GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断 目录 GAF-PCNN-BiLSTM、GASF-CNN-BiLSTM、GADF-CNN-BiLSTM的多特征分类预测/故障诊断分类效果格拉姆矩阵图 基本介绍程序设计参考资料 分类效果 格拉姆矩阵图 基本介绍 1.Matlab实现GAF-PCNN-Bi…

Kerberos:更安全的网络认证协议

简介 Kerberos 是一种网络认证协议&#xff0c;主要用于特定的场景下&#xff0c;代替传统的token方式&#xff0c;以一种更繁琐&#xff0c;但更安全的方式来认证用户信息。它通过票据 (ticket) 机制&#xff0c;确保用户在网络中与服务之间进行加密通信&#xff0c;并且避免…

【云备份】可视化客户端----QT开发➕QT数据库编程

文章目录 一、 需求分析二、 概念结构设计三、逻辑结构设计1. 用户表 (users)2. 客户端本地文件信息表 (upload_files)3. 备份记录表 (backup_records)4. 服务端备份文件信息表 (backup_files) 四、 开发工具五、具体实现&#xff08;一&#xff09; 客户端程序运行演示 一、 需…

7.科学计算模块Numpy(4)ndarray数组的常用操作(二)

引言 书接上回&#xff0c;numpy能作为python中最受欢迎的数据处理模块&#xff0c;脱离不了它最核心的部件——ndarray数组。那么&#xff0c;我们今天就来了解一下numpy中对ndarray的常用操作。 通过阅读本篇博客&#xff0c;你可以&#xff1a; 1.掌握ndarray数组的分割 …