Qwen/Qwen2.5-VL-7B-Instruct图片检测

<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit;
}

function callVlmApi($imgPath, $prompt = "") {
    $baseUrl = "xxxxxxxxxxxxxxxxxxxxxx";
    $modelName = "Qwen/Qwen2.5-VL-7B-Instruct";

    // ✅【关键】强化指令:禁止markdown,只输出纯JSON,无任何多余内容
    $prompt = <<<PROMPT
你是一名专注身份证信息提取的AI助手,精准从图片中提取**身份证姓名+身份证号码**。
规则:
1. 只提取真实姓名和18位身份证号
2. 未识别到身份证号则填空字符串
3. **只输出纯JSON,不要加任何解释、文字、换行、代码块、```json```标记**
4. 输出格式必须严格为:{"name":"","idcard":""}
PROMPT;

    if (!file_exists($imgPath)) {
        throw new Exception("图片不存在");
    }

    // 图片转 base64
    $mime = mime_content_type($imgPath);
    $data = file_get_contents($imgPath);
    $base64 = "data:$mime;base64," . base64_encode($data);

    // 请求体
    $postData = [
        "model" => $modelName,
        "messages" => [
            [
                "role" => "user",
                "content" => [
                    ["type" => "text", "text" => $prompt],
                    ["type" => "image_url", "image_url" => ["url" => $base64]]
                ]
            ]
        ],
        "max_tokens" => 2048,
        "stream" => false
    ];

    // CURL 请求
    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $baseUrl . "/chat/completions",
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
        CURLOPT_POSTFIELDS => json_encode($postData),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 60,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
    ]);

    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);

    if ($error) {
        throw new Exception("请求失败:" . $error);
    }

    $result = json_decode($response, true);
    $content = $result['choices'][0]['message']['content'] ?? '';

    // ✅【核心净化】自动清理模型返回的 markdown 代码块、换行、空格
    $content = trim($content);
    $content = str_replace(['```json', '```', "\n", "\r"], '', $content);
    $content = trim($content);

    // 验证是否为合法JSON
    json_decode($content);
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception("格式错误:" . $content);
    }

    return $content;
}

// 接收上传
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $dir = './uploads/';
    if (!is_dir($dir)) mkdir($dir, 0777, true);
    
    $file = $_FILES['file'];
    $target = $dir . uniqid() . '_' . basename($file['name']);

    if (!move_uploaded_file($file['tmp_name'], $target)) {
        echo json_encode(["code" => -1, "msg" => "上传失败"]);
        exit;
    }

    try {
        $res = callVlmApi($target);
        unlink($target);

        // ✅ 直接返回干净的JSON结构,前端可直接解析
        echo json_encode([
            "code" => 0,
            "data" => json_decode($res, true)
        ], JSON_UNESCAPED_UNICODE);
    } catch (Exception $e)
 {
        @unlink($target);
        echo json_encode(["code" => -1, "msg" => $e->getMessage()]);
    }
    exit;
}

echo json_encode(["code" => -1, "msg" => "请上传图片"]);
?>
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容