funcaptcha手势指向验证码识别

devtools/2025/1/16 6:35:48/

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路
如有侵犯,请联系作者下架

本文滑块识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/21

验证码会给出某物品所有的角度,根据手指的朝向确定正确的物品,成果图如下:
请添加图片描述
请添加图片描述
请添加图片描述

解决思路

不用于之前的验证码,该验证码在确认物体的同时,还要确认物体角度,由于该物体是一个3D的效果,并且角度360度,也可能去做一个360的分类检测,这样太复杂了,而且很可能没有效果,360分类早在旋转验证码中就提出,是很难拟合数据集的,即使现在拟合了一部分数据集,对没有见过的物体也基本拟合不了,这样就没有做模型的必要了,因为咱们做模型,通常是要泛化出其他数据集,用我的话讲,与其做一个这样的垃圾模型,不如好好研究其他方案

那么,我们参考yolo官方可以看到,yolo-obb模型在检测物体位置的同时还能检测出物体的部分角度,为什么说部分角度呢,因为实际上是检测不出角度的,具体我们来看以下操作

正如yolo-obb官方介绍,这只是基于检测框的旋转框检测而已,并未有任何计算角度可言
在这里插入图片描述
其本质上是由正常检测框的两个点扩展到4个点,而且据官网的数据显示,这更多的基于卫星图像,也就是2D图像的旋转框检测,而我们这个作为3D图像的角度检测,那怎么办呢,那玩的就是一个抽象,照样使用,我们使用xanylabeling进行图像的标注,标注如下
在这里插入图片描述

我们需要将显示旋转角度打开,然后使用旋转框进行标注

通过快捷键 “zxcv” 旋转所选框,其中:

  • z:大角度逆时针旋转
  • x:小角度逆时针旋转
  • c:小角度顺时针旋转
  • v:大角度顺时针旋转

需要注意,旋转后的旋转框可能会超出图片大小,需要矫正过来,但是这样标注就行了吗,当然是不行的,我们标注的标签需要注意,这里必须将四个象限分开,不能用统一的角度进行标注,因为旋转框是计算不了角度,举个例子,我们在标注时,尽管已经确定了0度和180的x1y1x2y2x3y3x4y4的不同(也就是xy上下相反的),在角度上也是0度和180度区别,但是实际在检测中,yolo的推理返回给我们的只有一个0度的框(也就是xy上下相同的),在区分四个象限后,标注标签如下
在这里插入图片描述
然后通过一键导出yolo格式后,使用yolo-obb模型进行训练,训练完成后,在使用代码推理后,将每个旋转框的角度计算出来后+对应标签象限的角度即可得到最终的360角度

在这里插入图片描述
在这里插入图片描述
可以看到,角度不一定完全一样,实际上,通过实战观察也是一样,手指的角度和实际物品的角度并不是完全一样的(部分图中)只需要找到角度最接近的即可,预测代码如下:

model = YOLO("best.pt")
def predict_funxx(img_base64):img = base642cv(img_base64)results = model(img)[0]names = results.namesboxes = results.obb.data.cpu()confs = boxes[..., 5].tolist()classes = list(map(int, boxes[..., 6].tolist()))boxes, angles = xywhr2xyxyxyxy(boxes[..., :5])hand = Nonefor i, box in enumerate(boxes):confidence = round(confs[i], 2)if confidence < 0.5:continuelabel = classes[i]points = box.tolist()x1, y1 = points[0]angle = angles[i] + (classes[i] * 90)if y1 > 250:# 说明是手指if classes[i] == 0 and angle == 90:hand = [classes[i], 0]else:hand = [classes[i], angle]# print("hand", classes[i], angle)breakif hand is None:print('未检测到手指朝向')return 1minangle = 999minbox = Nonefor i, box in enumerate(boxes):confidence = round(confs[i], 2)if confidence < 0.5:continuelabel = classes[i]points = box.tolist()x1, y1 = points[0]angle = angles[i] + (classes[i] * 90)if classes[i] == 0 and angle == 90:angle = 0if y1 < 250:# print(classes[i], angle)if abs(hand[1] - angle) < minangle:minangle = abs(hand[1] - angle)minbox = box.tolist()if not minbox:print("未检测框位置")return 1left1, top1 = [int(b) for b in minbox[0]]left2, top2 = [int(b) for b in minbox[1]]center_x = (left1 + left2) // 2center_y = (top1 + top2) // 2xx = center_x // 200 + 1return xx

http://www.ppmy.cn/devtools/150868.html

相关文章

JAVA多线程学习

文章目录 线程相关概念线程创建继承Thread类Runnable接口多个线程同时操作同一个对象测试&#xff1a;实现callable接口(了解)静态代理lamda表达式 线程状态线程停止线程休眠线程礼让 线程相关概念 线程&#xff1a;是进程的一部分&#xff0c;一个进程之内的线程之间共享进程的…

基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于禁忌搜索算法的TSP问题最优路径搜索&#xff0c;旅行商问题&#xff08;TSP&#xff09;是一个经典的组合优化问题。其起源可以追溯到 19 世纪初&#xff0c;…

CSS3的aria-hidden学习

前言 aria-hidden 属性可用于隐藏非交互内容&#xff0c;使其在无障碍 API 中不可见。即当aria-hidden"true" 添加到一个元素会将该元素及其所有子元素从无障碍树中移除&#xff0c;这可以通过隐藏来改善辅助技术用户的体验&#xff1a; 纯装饰性内容&#xff0c;如…

【初识扫盲】厚尾分布

厚尾分布&#xff08;Fat-tailed distribution&#xff09;是一种概率分布&#xff0c;其尾部比正态分布更“厚”&#xff0c;即尾部的概率密度更大&#xff0c;极端值出现的概率更高。 一、厚尾分布的特征 尾部概率大 在正态分布中&#xff0c;极端值&#xff08;如距离均值很…

动态规划——树形DP

题目清单 acwing285.没有上司的舞会 状态表示 d p [ u ] [ 0 / 1 ] dp[u][0/1] dp[u][0/1] 集合&#xff1a;对于以u节点为根的子树&#xff0c;选择&#xff08;1&#xff09;或不选择&#xff08;0&#xff09;u节点的方案。 属性&#xff1a; m a x max max 状态计算 d p …

Node.js入门html,css,js 30年了nodejs环境 09年出现 15年

Node.js入门 html,css,js 30年了 nodejs环境 09年出现 15年 nodejs为我们解决了2个方面的问题&#xff1a; 【锦上添花】让我们前端工程师拥有了后端开发能力&#xff08;开接口&#xff0c;访问数据库&#xff09; - 大公司BFF&#xff08;50&#xff09;【✔️】前端工程…

深入理解计算机系统阅读笔记-第十二章

第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型&#xff0c;一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源&#xff0c;并且通过操作这种资源来为它的客户端提供某种服务。例如&#xf…

虚假星标:GitHub上的“刷星”乱象与应对之道

在开源软件的世界里&#xff0c;GitHub无疑是最重要的平台之一。它不仅是一个代码托管平台&#xff0c;也是一个社交网络&#xff0c;允许开发者通过“点赞”&#xff08;即加星&#xff09;来表达对某个项目的喜爱和支持&#xff0c;“星标”&#xff08;Star&#xff09;则成…