yolov8实现图片验证码识别
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: k1: f2: 33: w4: l5: y6: q7: n8: c9: j10: e11: g12: 213: a14: b15: d16: 117: 418: v19: 520: r21: p22: t23: u24: z25: i26: 727: s28: m29: h30: 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目录中,下面我挑出一张(整体的准确率较客观):

如果还想提高准确率,可以多准备数据集进行训练 。
相关文章:
yolov8实现图片验证码识别
1、环境准备 1.1、安装miniconda 地址:Index of /anaconda/miniconda/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 注意:为避免不兼容的问题,推荐下载py38版本,我下载的是Miniconda3-py38_23.1.0-1-Windows-x86_…...
代码随想录训练营 Day56打卡 图论part06 108. 冗余连接 109. 冗余连接II
代码随想录训练营 Day56打卡 图论part06 一、卡码108. 冗余连接 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图&…...
QT天气预报
json 理论 什么是JSON? 规则 被大括号包括的是JSON对象,被中括号包括的是JSON数组. JSON数组JSON对象 实验 构建JSON 用代码实现如下json内容: //构建JSON void WirteJson() {QJsonObject rootObject;//1.插入name字段rootObject.insert("name","china&quo…...
JavaWeb中处理 Web 请求的方式总结
文章目录 JavaWeb中处理 Web 请求的方式总结1. 原始的 Servlet 方式1.1. 环境搭建**创建 Maven 或 Gradle 项目**:**添加 Servlet 依赖**:**创建 Servlet 类**:**配置项目**:**配置 Tomcat**: 1.2. 路由机制1.3. 示例代…...
React的事件与原生事件的执行顺序?
react自身实现了一套自己的事件机制,包括事件注册、事件的合成、事件冒泡、事件派发等,虽然和原生的是两码事,但也是基于浏览器的事件机制下完成的。 react 的所有事件并没有绑定到具体的dom节点上而是绑定在了document 上,然后由…...
【Java】Runtime与Properties获取系统信息
Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容:三、问题描述四、解决方案:4.1 代码4.2 运行结果 五、总结: 一、前言 这些都被淘汰比较少用了…...
基于SpringBoot的社团管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的社团管理系统【附源码文档】、…...
UE5.3_跟一个插件—Socket.IO Client
网上看到这个插件,挺好! 项目目前也没有忙到不可开交,索性跟着测一下吧: 商城可见,售价72.61人民币! 但是,git上有仓库哦,免费!! 跟着链接先准备起来: Documentation: GitHub - getnamo/SocketIOClient-Unreal: Socket.IO client plugin for the Unreal Engin…...
鸿蒙轻内核A核源码分析系列七 进程管理 (1)
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 轻内核A核源码分析系列一 数据结构-双向循环链表 轻内核A核源码分析系列二 数据结构-位图操作 轻内核A核源码分析系列三 物理内存(1࿰…...
qt QGraphicsScene场景坐标和场景内GraphicsItem局部坐标的相互转换
为了更清晰地解释场景坐标与局部坐标之间的转换过程,我们可以通过一个简单的实例来演示如何赋值场景坐标,并将其转换为图形项的局部坐标。 实例步骤 假设我们有一个场景 QGraphicsScene 和一个矩形图形项 QGraphicsRectItem,矩形的大小为 1…...
Windows与linux中docker的安装与使用
windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop: https://www.docker.com/启用wsl 我们搜索“启用或关闭Windows功能”,打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopp…...
some electronic products
纽扣电池 button cell 运动手环 sports wristband 智能手环 smart bracelet 皮卡丘夜灯 pikachu night lamp 数字显示充电器 Charger with a digital display 磁吸无线充 magnetic wireless charger 直流电机调速器 DC motor speed controller 继电器模块 relay module 锂离子电…...
刘润《关键跃升》读书笔记7
沟通: 想明⽩,说清楚,能接受 团队沟通的正确⽅式可以⽤9个字来概括:想明⽩,说清楚,能接受 (⻅图4-1)想明⽩ 有时经理跟⼈沟通,讲完之后却⽆奈地对员⼯说,你怎…...
带参宏定义
#define WM_EVENT_DECLARE_GROUP(group) extern wm_event_group_t const group 宏定义的结构: #define:这是C语言中的预处理指令,用来定义宏。宏的作用是替换代码中的特定部分,类似于全局的文本替换。这里定义的宏名称是 WM_EVE…...
java流
99. ByteArrayOutputStream转化为ByteArrayInputStream ByteArrayOutputStream baos xxx;i new ByteArrayInputStream(baos.toByteArray())100.将inputstream转换为byte[] https://blog.csdn.net/yogima/article/details/128500056 100.1 方式一 直接使用IOUtils byte[] …...
Java ArrayList扩容机制 (源码解读)
结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义 1:数组默认长度 2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ÿ…...
『功能项目』管理器基类【38】
我们打开上一篇37单例模式框架的项目, 本章要做的事情是编写管理器基类 首先创建脚本:ManagerBase.cs using UnityEngine; public abstract class ManagerBase : MonoBehaviour{public virtual void Init() { } } public class ManagerBase<T> : …...
Flex布局最后一行元素的对齐的解决方案
问题的产生 使用Flex布局,设置justify-content: space-between;让元素在主轴上两队对齐。 <div class"box"><div class"item">1</div><div class"item">2</div><div class"item">3&l…...
【ShuQiHere】上章:计算与计算机的基础概念
【ShuQiHere】✨ 在当今数字化社会,计算机已无处不在,从智能手机到人工智能应用,影响深远。然而,计算机并非一开始就如此强大。它经历了从手动工具、机械装置到电子计算机的演变。本章将回顾计算与算法的基本概念,探讨…...
前端框架有哪些?全面解析主流前端框架
一、React React 是由 Facebook 开发和维护的一个前端框架,它专注于构建用户界面。React 采用组件化的开发模式,允许开发者将用户界面拆分成多个可复用的组件。 主要特点 组件化: React 的核心是组件,它允许开发者将界面拆分成独立的、可复…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
