预测图片旋转角度——可用于破解旋转验证码
评论
收藏

预测图片旋转角度——可用于破解旋转验证码

经验分享
K2022
2024-03-27 22:46·浏览量:2782
K2022
影刀认证工程师
发布于 2024-03-27 22:462782浏览

基于开源项目: https://github.com/Starry-OvO/rotate-captcha-crack

Python >=3.8 建议使用python3.10​(影刀的python版本是3.7无法安装,所以需要在本地安装额外的python环境,通过接口的方式让影刀调用)

安装与配置(项目支持cpu与gpu模式)​

使用前安装好troch cuda ​

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121​

项目安装说明:​

下载项目到本地进入项目使用下方命令安装​

pip install .​

模型下载名为RotNetR的即可​

测试代码:​

import torch​
from PIL import Image​
from rotate_captcha_crack.common import device​
from rotate_captcha_crack.const import DEFAULT_CLS_NUM​
from rotate_captcha_crack.model import RotNetR, WhereIsMyModel​
from rotate_captcha_crack.utils import process_captcha​
​
def load_model_and_predict(model_path, image_path):​
    # Load model​
    cls_num = DEFAULT_CLS_NUM​
    model = RotNetR(cls_num=cls_num, train=False)​
    model.load_state_dict(torch.load(model_path))​
    model = model.to(device="cpu")​
    model.eval()​
​
    # Load and process image​
    img = Image.open(image_path)​
    img_ts = process_captcha(img)​
    img_ts = img_ts.to(device="cpu")​
​
    # Predict​
    predict = model.predict(img_ts)​
    degree = predict * 360​
    print(f"预测旋转角度: {degree}°")​
​
if __name__ == "__main__":​
    # 模型路径​
    model_path=r"D:\Work\python_project\旋转验证码识别\models\RotNetR\best.pth"​
    # 旋转验证码图片​
    image_path=r"D:\Work\python_project\旋转验证码识别\img\638465369943014784.png"​
​
    load_model_and_predict(model_path, image_path)​
​
    # 滑块移动距离计算:(滑轨的宽度-滑块的宽度)/360*预测的旋转角度​

接口服务(flask):​


from flask import Flask, request, jsonify
import torch
from PIL import Image
from rotate_captcha_crack.const import DEFAULT_CLS_NUM
from rotate_captcha_crack.model import RotNetR
from rotate_captcha_crack.utils import process_captcha

# 创建Flask应用实例
app = Flask(__name__)

# 定义一个路由,用于处理POST请求
@app.route('/predict', methods=['POST'])
def predict():
   # 检查请求中是否包含文件
   if 'file' not in request.files:
       return jsonify({'error': 'No file part'}), 400

   # 获取请求中的文件
   file = request.files['file']
   # 检查文件名是否为空
   if file.filename == '':
       return jsonify({'error': 'No selected file'}), 400

   # 打开并处理验证码图片
   img = Image.open(file)
   img_ts = process_captcha(img)
   img_ts = img_ts.to(device=device)

   # 创建模型实例
   model = RotNetR(cls_num=DEFAULT_CLS_NUM, train=False)
   
   # 加载模型参数
   model.load_state_dict(torch.load(model_path, map_location=device))
   # 设置模型为评估模式
   model.eval()

   # 使用模型进行预测
   predict = model.predict(img_ts)
   # 将预测结果(旋转角度)转换为整数
   degree = predict * 360

   # 根据预测结果旋转图片
   img = img.rotate(
       -degree, resample=Image.Resampling.BILINEAR, fillcolor=(255, 255, 255)
   )

   # 返回旋转角度
   return jsonify({'degree': degree})

# 如果当前脚本为主程序,则启动Flask应用
if __name__ == '__main__':
   # 设置设备为CPU(cpu)模式/GPU(cuda)模式
   device="cpu"
    # 设置模型路径
   model_path=r"D:\Work\models\RotNetR\best.pth"
   app.run(debug=True)

请求示例:​

def send_request(image_path):​
    url = 'http://localhost:5000/predict'​
    files = {'file': open(image_path, 'rb')}​
​
    response = requests.post(url, files=files)​
​
    return int(response.json()["degree"])

​影刀示例(百度指数登录)

requests_degree.py

元素


预测的成功率并不是百分之百建议加上循环以及登录成功的判断(实际测试百度指数登录验证的成功率还可以基本上一两次就成功了),有兴趣的盆友可以自行尝试其他地方的旋转验证

收藏12
全部评论1
最新
发布评论
评论