Python中如何基于darknet实现点选验证码的目标检测?

项目地址看这里darknet_captcha
稍微有点标题党。
前几个月上传了一个工作中用到的使用 CNN 识别验证码的项目,star 不知不觉到了 300,也有很多大佬提出了一些 issue 让我能够把项目更加完善。
这次,其实我是封装了一下 darknet,用 python 写了一系列启动脚本,写了很详细的使用指引,提供点选验证码的样本和标签的生成器,方便学习和使用目标检测技术的同学,节省大家时间。
为了带你熟悉使用流程,此项目会带你训练两个点选验证码的识别模型,分别是单类多分类点选验证码,验证码都是咱们自己生成的,比较简单。
另外也详细了讲了如何训练自己的样本、定位后的图片分割分类。 最后,提供了使用http 调用识别接口的代码。
图片就不放在这里了。
大佬们轻喷...


Python中如何基于darknet实现点选验证码的目标检测?

3 回复

核心思路: 用YOLO(Darknet框架)训练一个模型来识别验证码图片中需要点击的特定目标(比如文字、图标)。下面是一个完整的实现流程和关键代码。

1. 环境准备与数据标注 首先,你需要准备带有点选目标的验证码图片,并用标注工具(如LabelImg)框出目标,生成YOLO格式的标签文件(.txt,内容为:类别ID x_center y_center width height,坐标需归一化)。

2. 配置文件准备

  • obj.names:定义类别名称,每行一个(如 target)。
  • obj.data:配置文件路径:
    classes=1
    train=train.txt
    valid=valid.txt
    names=obj.names
    backup=backup/
    
  • yolov4-tiny-custom.cfg(示例网络配置):修改[yolo][convolutional]层中的classesfilters参数(filters=(classes+5)*3)。

3. 训练模型 使用Darknet训练命令:

./darknet detector train obj.data yolov4-tiny-custom.cfg yolov4-tiny.conv.29 -dont_show

4. 预测与点选坐标获取 训练完成后,用以下Python脚本加载模型进行预测,并计算点击坐标(这里假设使用OpenCV处理):

import cv2
import numpy as np
import subprocess

def predict_captcha(image_path, config_path, weights_path, names_path):
    # 使用darknet命令行预测(或使用darknet的Python接口)
    command = f"./darknet detector test {config_path} {weights_path} {image_path} -thresh 0.5"
    result = subprocess.run(command, shell=True, capture_output=True, text=True)
    
    # 解析输出结果,提取边界框坐标(示例解析逻辑,需根据实际输出调整)
    lines = result.stdout.split('\n')
    boxes = []
    for line in lines:
        if '%' in line:  # 假设输出行包含类别和置信度,如 'target: 90%'
            parts = line.split(':')
            coords = parts[1].split()[0:4]  # 假设坐标在后续字符串中
            x, y, w, h = map(float, coords)
            boxes.append((x, y, w, h))
    
    # 计算点击坐标(取第一个检测框的中心点)
    if boxes:
        x_center, y_center, _, _ = boxes[0]
        return int(x_center), int(y_center)
    return None

# 使用示例
config_path = 'yolov4-tiny-custom.cfg'
weights_path = 'backup/yolov4-tiny-custom_final.weights'
names_path = 'obj.names'
image_path = 'captcha.jpg'

click_point = predict_captcha(image_path, config_path, weights_path, names_path)
if click_point:
    print(f"点击坐标: {click_point}")
else:
    print("未检测到目标")

5. 自动化点选 结合Selenium或PyAutoGUI,将预测坐标转换为屏幕坐标并执行点击操作。

总结: 标注数据、训练YOLO模型、解析预测结果并转换为点击坐标。


感谢大佬分享,围观中

向大佬学习,文档很全面

回到顶部