【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。

【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。

文章目录

  • 【验证码识别】Yolov8实战某验3空间推理点选验证码,目标检测,语义分割,颜色分类。
    • 声明
    • 1.空间推理验证码:
    • 2.验证码图片下载
    • 3.sign文本分析
    • 4.划分数据集
    • 5.颜色和大小分类
    • 6.语义分割
    • 7.识别结果
    • 说在后面:

声明

本文章中所有内容仅供研究、学习交流使用,不能用作其他任何目的,严禁用于商业用途和非法用途,否则一切后果自负,与作者无关。如有侵权请联系作者删除文章

1.空间推理验证码:

根据提示信息,点击图片中对应的元素,主要是逻辑解题能力结合3D立体元素识别能力

以下是一些主流的空间推理验证码:

image-20240617164836331

我们可以看到其实大体都差不多,基本方法都可以通用,本文将以某验的空间推理点选验证码为例子介绍如何解决空间推理

2.验证码图片下载

某验图片下载可以刷新5次 每个challenge都请求打满。

image-20240617170044645

image-20240618110502922

image-20240618110756966

sign和图片直接一顿下载。。。。

3.sign文本分析

import jiebadef split_prompt():# jieba分词prompt_path = "../sign.txt"prompt_list = []with open(prompt_path, "r", encoding="utf-8") as f:for line in f.readlines():prompt_list.append(line.strip().replace("请_点击_", ""))# 分词,每一行,统计词频word_dict = {}for line in prompt_list:words = jieba.cut(line)for word in words:if word in word_dict.keys():word_dict[word] += 1else:word_dict[word] = 1# 排序# word_dict = sorted(word_dict.items(), key=lambda x: x[1], reverse=True)# 删除无用词delete_list = ["在", "的", "有", "。", "与"]for word in delete_list:del word_dict[word]# 排序word_dict = sorted(word_dict.items(), key=lambda x: x[0], reverse=False)print(word_dict)if __name__ == '__main__':split_prompt()# 球体 : 球,球体# 正方体 : 方块,正方体,立方体# 圆锥 : 圆锥体,圆锥# 圆柱体 : 圆柱体# 多面体 : 多面体# 相同形状,相同大小,相同颜色

通过分析可以看出有这几种关键词,

[球体,正方体,圆锥,圆柱体,多面体] 其实物品只有5种

[“绿色”, “红色”, “灰色”, “黄色”, “蓝色”] 颜色有5种

image-20240618110957725

由于物体种类比较少,这里我们使用 目标检测+颜色分类。

然后就是进行打标,这里要注意一点比如这个只露出一半的这个多面体,经过后面的模型效果来看,尽量将他的高拉长一点。

因为我们后期的计算大小的方式不是安装面积来算的,按照他的高度(可能也不太准确)。

image-20240618112330027

4.划分数据集

按照tarin85% test14% valid1%划分的

image-20240618113222575

image-20240618113304743

训练结果

image-20240618114028541

5.颜色和大小分类

AlexNet颜色分类 最后导出onnx使用。

import json
import torch
import torch.nn as nn
from torchvision import transforms, datasets, utils
import matplotlib.pyplot as plt
import numpy as np
import torch.optim as optim
from tqdm import tqdm
from model import AlexNetdef main():device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")print("using {} device.".format(device))batch_size = 32# torchvision自带的图片预处理# transforms.Resize()将图片调整为指定大小# transforms.RandomHorizontalFlip()图片随机水平翻转# ......参考torchvision官网教学data_transform = {"train": transforms.Compose([transforms.Resize((224, 224)),transforms.RandomHorizontalFlip(),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]),"val": transforms.Compose([transforms.Resize((224, 224)),  # cannot 224, must (224, 224)transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])}# torchvison中的datasets加载训练集train_dataset = datasets.ImageFolder(root="train/", transform=data_transform["train"])train_num = len(train_dataset)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)# {'blue': 0, 'cyan': 1, 'green': 2, 'purple': 3, 'red': 4, 'white': 5, 'yellow': 6}flower_list = train_dataset.class_to_idx# 将字典进行编码,最终生成class_indices.json文件cla_dict = dict((val, key) for key, val in flower_list.items())json_str = json.dumps(cla_dict, indent=4)with open('class_indices.json', 'w') as json_file:json_file.write(json_str)# torchvison中的datasets加载验证集validate_dataset = datasets.ImageFolder(root='val', transform=data_transform["val"])val_num = len(validate_dataset)validate_loader = torch.utils.data.DataLoader(validate_dataset, batch_size=batch_size, shuffle=False)print("using {} images for training, {} images for validation.".format(train_num, val_num))# # 训练集图像可视化,可注释# test_data_iter = iter(validate_loader)# test_image, test_label = test_data_iter.__next__()# def imshow(img):#     img = img / 2 + 0.5  # unnormalize#     print(img.shape)#     npimg = img.numpy()#     plt.imshow(np.transpose(npimg, (1, 2, 0)))#     plt.show()# print(' '.join('%5s' % cla_dict[test_label[j].item()] for j in range(4)))# # make_grid的作用是将若干幅图像拼成一幅图像,在需要展示一批数据时很有用# imshow(utils.make_grid(test_image))# num_classes=分类个数 init_weights=初始化权重net = AlexNet(num_classes=5, init_weights=True)net.to(device)loss_function = nn.CrossEntropyLoss()  # 多分类常用的损失函数optimizer = optim.Adam(net.parameters(), lr=0.0002)  # 优化器epochs = 20best_acc = 0.0  # 更新准确率最高的数值best_loss = 1.0  # 更新损失最低的数值train_steps = len(train_loader)for epoch in range(epochs):# 通过net.train()可以保证dropout/BatchNormal只在训练时候起作用net.train()running_loss = 0.0  # 统计训练过程中的损失train_bar = tqdm(train_loader)  # 119for step, data in enumerate(train_bar):# images: (batchsize,3,224,224)# labels: batchsizeimages, labels = dataoptimizer.zero_grad()# outputs: (batchsize,classes)outputs = net(images.to(device))loss = loss_function(outputs, labels.to(device))  # 计算预测值与真实值loss.backward()  # 损失反向传播optimizer.step()  # 更新参数# 计算一共多少损失running_loss += loss.item()train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1, epochs, loss)# 验证net.eval()acc = 0.0  # 计算精度公式 number / epochwith torch.no_grad():  # 进制pytorch对参数跟踪val_bar = tqdm(validate_loader)for val_data in val_bar:val_images, val_labels = val_dataoutputs = net(val_images.to(device))predict_y = torch.max(outputs, dim=1)[1]acc += torch.eq(predict_y, val_labels.to(device)).sum().item()val_accurate = acc / val_numprint('[epoch %d] train_loss: %.3f  val_accuracy: %.3f' % (epoch + 1, running_loss / train_steps, val_accurate))val_loss = running_loss / train_stepsif val_loss < best_loss:best_loss = val_lossif val_accurate > best_acc:best_acc = val_accuratetorch.save(net.state_dict(), './epoch%d_train_loss_%.2fval_accuracy_%.2f.pth'% (epoch + 1, running_loss / train_steps, val_accurate))print('Finished Training')if __name__ == '__main__':main()

这个非常准确,置信度基本都是1

image-20240618114954849

6.语义分割

color_keywords = ["绿色", "红色", "灰色", "黄色", "蓝色"]
size_keywords = ["大", "小"]
shape_keywords = ["方块", "正方体", "立方体", "圆锥体", "圆锥", "圆柱体", "球体", "球", "多面体"]
position_keywords = ["右", "左", "前", "后"]
same_keywords = ["相同形状", "相同颜色", "相同大小"]

我们主要根据这些关键词进行处理,position_keywords,same_keywords对于这几个条件的关键词来区分参照物和目标物。

然后对于物体添加对于的标签 颜色,根据坐标来区分位置,根据高度来区分大小,相同条件就拿到识别的参照物进行对比,最后得出目标物的坐标。

7.识别结果

将两个模型和推理算法结合:

  • 1.目标检测,根据识别结果把对应图片切割
  • 2.颜色分类,对每个小图进行颜色分类,将结果加入label_name
  • 3.大小判断,这里没有使用面积判断大小,有些大物体只露出一半很容易误判,使用使用物体高度判断
  • 4.语义推理,拿到坐标,然后输出图像查看结果

在这里插入图片描述

image-20240618124616985

说在后面:

很多朋友来加博主很多时候不是为了交流,只是想要成品,所以为了避免大家的时间,我和朋友合伙开了个星球

后续这些成品都会放到星球,如果有需要的可以直接加入星球(ios的话可以联系博主)

image-20240618125436637

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

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

相关文章

2024年全国青少信息素养大赛python编程复赛集训第四天编程题分享

整理资料不容易,感谢各位大佬给个点赞和分享吧,谢谢 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数…

Studying-代码随想录训练营day17| 654.最大二叉树、617合并二叉树、700.二叉搜索树中的搜索、98.验证二叉树搜索树

第十七天&#xff0c;二叉树part05&#xff0c;进一步学习二叉树&#x1f4aa; 654.最大二叉树 文档讲解&#xff1a;代码随想录最大二叉树 视频讲解&#xff1a;手撕最大二叉树 题目&#xff1a; 学习&#xff1a;本题与利用中序和后序序列构造二叉树有相同之处。依据题目要求…

第五篇:构建与维护私有Docker Registry: 企业级实践指南

构建与维护私有Docker Registry: 企业级实践指南 1. 引言&#xff1a;解析私有Docker仓库的必要性 1.1 Docker Registry简介与私有化的好处 Docker Registry是一个用于存储和分发Docker镜像的系统。在Docker生态系统中&#xff0c;Registry扮演着至关重要的角色&#xff0c;为…

洛谷:P5714 【深基3.例7】肥胖问题

1. 题目链接 https://www.luogu.com.cn/problem/P5714 P5714 【深基3.例7】肥胖问题 2. 题目描述 题目描述&#xff1a;BMI计算:m / (h * h)&#xff0c;m是体重(kg)&#xff0c;h是身高(m) 小于18.5&#xff1a;体重国轻&#xff0c;Underweight 小于等于18.5且小于24&#…

骨传导耳机值不值得入手?五款运动好物骨传导耳机推荐!

开放式耳机在如今社会中已经迅速成为大家购买耳机的新趋势&#xff0c;开放式蓝牙耳机作为骨传导耳机&#xff0c;深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时&#xff0c;后挂式骨传导耳机都会收到一致好评。对于热爱运动的人士而言&#xff0c;高品质的骨传…

A800显卡驱动安装(使用deb安装)

重新安装显卡驱动&#xff0c;查阅了资料将过程记录如下&#xff1a; 1.下载deb安装包 打开nvidia官网查找对应的驱动版本&#xff0c;A800所在的选项卡位置如图&#xff1a; 点击查找后下载得到的是nvidia-driver-local-repo-ubuntu2004-550.90.07_1.0-1_amd64.deb安装包 2.…

从零到一学FFmpeg:avcodec_open2 函数详析与实战

文章目录 前言一、函数原型二、功能描述三、使用实例 前言 avcodec_open2是FFmpeg库中的一个关键函数&#xff0c;用于根据给定的AVCodecContext和AVCodec实例初始化编解码器&#xff0c;使其准备好进行编解码操作。 这个函数是编解码流程中配置编解码器上下文后的重要一步&am…

不同点云聚类提取方法(模型、距离、密度)

目录 一、简介 二、点云聚类方法 1.基于距离的聚类方法 2.基于密度的聚类方法 3.基于模型的聚类方法 三、不同实现方式 1.平面模型 2.欧氏距离聚类 四、实现结果 一、简介 点云聚类方法是一种将点云数据进行分组的技术,在三维扫描、计算机视觉和机器人领域中,点云数据…

UDS服务——RequestDownload(0x34)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍RequestDownload(0x34)—— 请求下载,用于给ECU下载数据的,最常见的应用就是在bootloader中,程序下载工具会发起请求下载,以完成ECU程序的升级。通过阅读本文,希望能对你有所帮助。 文章目录 诊断协议那些事儿…

【康复学习--LeetCode每日一题】2288. 价格减免

题目&#xff1a; 句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 ‘$’ 。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个 价格 。 例如 “$100”、“$23”…

linux如何部署前端项目和安装nginx

要在Linux上部署前端项目并安装Nginx&#xff0c;你可以按照以下步骤操作&#xff1a; 安装Nginx: sudo apt update sudo apt install nginx 启动Nginx服务: sudo systemctl start nginx 确保Nginx服务开机自启: sudo systemctl enable nginx 部署前端项目&#xff0c;假设前…

萨科微slkor宋仕强论道华强北假货之六

萨科微slkor宋仕强论道华强北假货之六&#xff0c;华强北的假货这么多&#xff0c;搞得客户害怕、同行焦虑&#xff0c;话说“在华强北没有被坑过的&#xff0c;就不是华强北人”。我们金航标Kinghelm&#xff08;www.kinghelm.com.cn&#xff09;公司以前有一个贸易部&#xf…

45、基于深度学习的螃蟹性别分类(matlab)

1、基于深度学习的螃蟹性别分类原理及流程 基于深度学习的螃蟹性别分类原理是利用深度学习模型对螃蟹的图像进行训练和识别&#xff0c;从而实现对螃蟹性别的自动分类。整个流程可以分为数据准备、模型构建、模型训练和性别分类四个步骤。 数据准备&#xff1a; 首先需要收集包…

构造方法可以调用本类中重载的构造方法和它的父类的构造方法

1.调用本类中重载的构造方法&#xff1a;构造方法可以通过this()来调用本类中其他重载的构造方法。但是&#xff0c;这个调用必须位于构造方法的第一行&#xff0c;也就是说&#xff0c;它是构造方法中的第一个语句。这是因为构造方法需要先完成一些初始化工作&#xff0c;然后…

【报错解决】引入@ComponentScan注解注册bean容器后,导致的接口404问题

引入ComponentScan注解注册bean容器后&#xff0c;导致的接口404问题 背景 由于微服务开发中&#xff0c;经常需要在公共模块在引入一些公共模块&#xff0c;供其他服务使用&#xff0c;但是其他服务需要在启动类中配置ComponentScan注解扫描这个公共模块下注册的 bean&#…

一篇文章带你学会“二分算法”

二分算法&#xff08;也称为二分法或折半查找&#xff09;是一种在有序数组中查找特定元素的搜索算法。其基本原理是通过不断缩小查找范围来逼近目标值。以下是二分算法的详细讲解&#xff1a; 基本原理 有序性&#xff1a;二分算法要求待搜索的数组必须是有序的&#xff08;…

在下游市场需求带动下 我国气调包装机市场规模逐渐扩大

在下游市场需求带动下 我国气调包装机市场规模逐渐扩大 气调包装机又称为气调保鲜包装机&#xff0c;是一种具有气体置换功能的保鲜包装设备。气调包装机的工作原理是将原有的包装内空气抽至真空&#xff0c;再充入一定配比的混合气体&#xff0c;从而对被包装的物品进行有效保…

ubuntu开机怎么进入、退出命令行界面

要在Ubuntu系统开机时进入命令行界面&#xff0c;可以按照以下步骤操作&#xff1a; 在开机过程中按下Ctrl Alt F1组合键&#xff0c;这将会切换到第一个虚拟控制台&#xff0c;即命令行界面。如果Ctrl Alt F1没有生效&#xff0c;也可以尝试Ctrl Alt F2、Ctrl Alt F3…

点云处理中阶 Sampling

目录 一、什么是点云Sampling 二、示例代码 1、下采样 Downsampling 2、均匀采样 3、上采样 4、表面重建 一、什么是点云Sampling 点云处理中的采样(sampling)是指从大量点云数据中选取一部分代表性的数据点,以减少计算复杂度和内存使用,同时保留点云的几何特征和重…

Java module-info模块系统

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ 从Java9开始引入了模块系统&#xff08;Jigsaw项目&#xff09;&#xff0c;用于更好的管理代码依赖和封装性。模块系统允许你定义模块…