ZIP小红书旋转验证码自动识别验证 1MB

For|\Tomorrow需要积分:1(1积分=1元)

资源文件列表:

RotatedImageVerification.zip 大约有20个文件
  1. api.py 4.86KB
  2. libs/
  3. libs/stealth.min.js 176.23KB
  4. output/
  5. output/rotate_model.pth 1.05MB
  6. src/
  7. src/__pycache__/
  8. src/__pycache__/model.cpython-38.pyc 1.05KB
  9. src/__pycache__/model.cpython-39.pyc 1.05KB
  10. src/model.py 783B
  11. test.py 859B
  12. train.py 2.79KB
  13. utils/
  14. utils/__pycache__/
  15. utils/__pycache__/dataLoader.cpython-38.pyc 1.13KB
  16. utils/__pycache__/dataLoader.cpython-39.pyc 1.13KB
  17. utils/crawl_img.py 2.73KB
  18. utils/dataLoader.py 829B
  19. utils/generate_dataset.py 1.01KB
  20. utils/manual_annotation.py 6.21KB

资源介绍:

【小红书旋转验证码自动识别验证】项目是一个旨在解决在线平台中常见的安全验证问题的实践。这类验证码通常设计为旋转的字母或数字组合,目的是防止自动化脚本或机器人进行恶意操作。通过自动化识别这种验证码,我们可以更好地理解验证码的运作机制,并在测试软件或插件时提高效率。 该项目主要涉及以下几个关键知识点: 1. **数据获取**:我们需要一个包含大量旋转验证码的图像库。这可能涉及到网络爬虫技术,通过编程方式从小红书或其他含有此类验证码的网站上抓取图片。同时,为了确保数据的多样性和质量,可能需要处理各种分辨率、颜色模式和旋转角度的图像。 2. **标注**:在获得验证码图像后,我们需要手动或使用自动化工具对每个图像进行标注,即识别并标记出图像中的每一个字符。这一步通常采用如LabelImg等工具,将每个字符的位置和对应的文本信息记录下来,生成用于训练模型的标注文件。 3. **模型训练**:项目中`train.py`文件很可能是用于构建和训练机器学习模型的脚本。常用的技术包括卷积神经网络(CNN)或循环神经网络(RNN),结合转角检测算法来识别旋转的字符。训练过程中,会涉及到超参数调整、数据增强(例如翻转、缩放、裁剪)以及模型优化策略(如Adam优化器)以提高模型性能。 4. **模型测试**:`test.py`文件用于评估模型的性能。通常,我们会划分训练集、验证集和测试集,使用交叉验证方法来检验模型的泛化能力。测试指标可能包括准确率、精确率、召回率和F1分数。 5. **实际操作**:项目可能包含了一个API接口(`api.py`),使得模型可以集成到其他应用中,例如自动化测试脚本。API接口能够接收验证码图像,返回识别结果,从而实现对验证码的自动识别。 6. **辅助文件与目录**: - `src`:源代码目录,可能包含了处理图像、数据预处理及模型构建的相关代码。 - `utils`:工具函数库,包含了一些通用的辅助函数,如图像处理、数据读取、日志记录等。 - `libs`:可能包含了项目依赖的第三方库或自定义模块。 - `output`:存储模型训练过程中的输出,如模型权重、损失曲线、预测结果等。 通过这个项目,开发者可以深入理解深度学习在图像识别领域的应用,以及如何将训练好的模型部署到实际环境中。同时,对于测试工程师来说,这个工具可以帮助他们更快地完成验证码相关的测试任务,提高工作效率。
import os import json import tkinter as tk from PIL import Image, ImageTk class ImageRotatorApp: def __init__(self, master, labels_path, output_path, all_image_index=500): self.config = {} self.output_path = output_path self.labels_path=labels_path self.master = master self.title = "旋转验证码角度标注" self.master.title(self.title) # Initialize variables self.angle = 0 self.image_index = 1 self.all_image_index = all_image_index if os.path.exists(f"{labels_path}/config.json"): with open(f"{labels_path}/config.json") as f: self.config = json.loads(f.read()) keys = [int(k) for k in self.config.keys()] self.image_index = int(max(keys))+1 # Load images self.image1 = Image.open(f"{labels_path}/bg_{self.image_index}.png") self.image2 = Image.open(f"{labels_path}/center_{self.image_index}.png") self.image1_tk = ImageTk.PhotoImage(self.image1) self.image2_tk = ImageTk.PhotoImage(self.image2) self.master.title(f"{self.title} - {self.image_index} / {self.all_image_index}") # Create canvas self.canvas = tk.Canvas(master, width=self.image1.width, height=self.image1.height) self.canvas.pack() # Display images on canvas self.image1_id = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.image1_tk) self.center_x = (self.image1.width - self.image2.width) // 2 self.center_y = (self.image1.height - self.image2.height) // 2 self.image2_id = self.canvas.create_image(self.center_x, self.center_y, anchor=tk.NW, image=self.image2_tk) # Create rotation slider self.rotation_slider = tk.Scale(master, from_=0, to=360, orient=tk.HORIZONTAL, length=360, command=self.rotate_image) self.rotation_slider.pack() # Create angle entry self.input_frame = tk.Frame(master) self.input_frame.pack() self.decrease_button = tk.Button(self.input_frame, text="-", command=lambda: self.adjust_angle(-1)) self.decrease_button.pack(side=tk.LEFT, pady=5) self.angle_var = tk.StringVar() self.angle_var.set(str(self.angle)) validate_cmd = master.register(self.validate_input) self.angle_entry = tk.Entry(self.input_frame, textvariable=self.angle_var, validate="key", validatecommand=(validate_cmd, '%P')) self.angle_entry.pack(side=tk.LEFT) self.increase_button = tk.Button(self.input_frame, text="+", command=lambda: self.adjust_angle(1)) self.increase_button.pack(side=tk.LEFT, pady=5) # Create "Next Group" button self.next_button = tk.Button(master, text="Next Group", command=self.next_group) self.next_button.pack(pady=10) # Create "Commit" button self.commit_button = tk.Button(master, text="Commit", command=self.commit_angle) self.commit_button.pack(pady=10) def rotate_image(self, angle): if not hasattr(self,"angle_entry"): return self.angle = int(angle) self.angle_entry.delete(0, tk.END) self.angle_entry.insert(0, str(self.angle)) # Rotate image2 self.rotated_image2 = self.image2.rotate(-self.angle) self.rotated_image2_tk = ImageTk.PhotoImage(self.rotated_image2) self.canvas.itemconfig(self.image2_id, image=self.rotated_image2_tk) # Update image2 position to keep it centered self.canvas.coords(self.image2_id, self.center_x, self.center_y) def validate_input(self, event): value = self.angle_var.get() if not value.isdigit(): self.angle_var.set(str(self.angle)) else: self.rotation_slider.set(value) self.rotate_image(value) def adjust_angle(self, delta): new_angle = int(self.angle_var.get()) + delta if 0 <= new_angle <= 360: self.angle_var.set(str(new_angle)) self.rotation_slider.set(new_angle) self.rotate_image(new_angle) def save_rotate_image(self, image_path, degrees_to_rotate, output_path): image = Image.open(image_path) rotated_image = image.rotate(-degrees_to_rotate) rotated_image.save(output_path) print("图像保存到:", output_path) def commit_angle(self): angle = int(self.angle_var.get()) self.config[str(self.image_index)] = angle with open(f"{self.labels_path}/config.json", "w") as f: f.write(json.dumps(self.config)) self.save_rotate_image(f"{self.labels_path}/center_{self.image_index}.png", angle, f"{self.output_path}/center_{self.image_index}.png") def next_group(self): # Change images self.commit_angle() self.image_index += 1 if not os.path.exists(f"{self.labels_path}/bg_{self.image_index}.png") or not os.path.exists(f"{self.labels_path}/center_{self.image_index}.png"): tk.messagebox.showinfo("提示", "文件未找到或者已经标注结束") return self.master.title(f"{self.title} - {self.image_index} / {self.all_image_index}") self.image1 = Image.open(f"{self.labels_path}/bg_{self.image_index}.png") self.image2 = Image.open(f"{self.labels_path}/center_{self.image_index}.png") self.image1_tk = ImageTk.PhotoImage(self.image1) self.image2_tk = ImageTk.PhotoImage(self.image2) # Update canvas self.canvas.itemconfig(self.image1_id, image=self.image1_tk) self.canvas.itemconfig(self.image2_id, image=self.image2_tk) self.rotation_slider.set(0) # Reset slider self.angle = 0 self.angle_entry.delete(0, tk.END) self.angle_entry.insert(0, str(self.angle)) def main(): origin_path = "../data/original" # 需要标注的图片路径 output_path = "../data/test" # 输出旋转到正确角度的验证码图片 root = tk.Tk() app = ImageRotatorApp(root, origin_path, output_path) root.mainloop() if __name__ == "__main__": main()
100+评论
captcha
    类型标题大小时间
    ZIPJave Web实验报告二:开源中国静态复刻5.5MB3周前
    ZIP抖音爆火的QQ价格评估前端源码32.3KB3周前
    ZIPJava:IDEA Win2019-2024激活码.zip108.56KB3周前
    ZIP和利时DCS软件MACS 6.5.4 虚拟机(送一个工程案例),可以在线仿真,送学习资料 不含加密狗,8小时软件会自动退出,退1.18MB3周前
    ZIP全国计算机等级考试四级数据库工程师16套(真题及答案)1.24MB2周前
    ZIP橘子公益端口8.2.zip28.57MB2周前
    7ZSTM32CubeIDE 1.15.0自动补全插件5.27MB2周前
    ZIPModbus Poll,Modbus Slave4.82MB2周前