Pozo de reconocimiento de texto OCR en la nube inteligente de Baidu

¡Continúe creando, acelere el crecimiento! Este es el primer día de mi participación en el "Nuggets Daily New Plan · June Update Challenge", haz clic para ver los detalles del evento

El contenido de este artículo en realidad no está muy relacionado con python. Es un pozo que se encuentra al usar python para el reconocimiento de texto. Lo registraré aquí. Espero que todos puedan usar rápidamente el reconocimiento de texto OCR de Baidu Smart Cloud. Resuelva este problema.

Los requisitos comerciales probablemente sean así: después de que los estudiantes usen el instrumento para completar el experimento, el instrumento imprimirá los resultados experimentales en un pequeño ticket. Normalmente, los estudiantes deben ingresar los datos del recibo en el sistema uno por uno. Sin embargo, el cliente piensa que esta operación es demasiado complicada y quiere usar el reconocimiento de texto para identificar los datos del recibo y completarlo automáticamente. Los estudiantes solo necesitan para comprobar el reconocimiento una vez es correcto.

Los requisitos son muy simples.Mi backend aquí está hecho con PHP, lo que no me demora en usar python para el reconocimiento de texto. El primer intento de reconocimiento de texto de Python, no entraré en detalles aquí. Para obtener más información, vaya a " Python Crawler (8) Graphic Captcha Recognition - Custom OCR Text Recognition "

Sin embargo, no hay un ejemplo prefabricado antes. Escribir y entrenar el modelo desde cero es un poco costoso. Más tarde, decidimos por unanimidad utilizar el reconocimiento de texto OCR de Baidu Smart Cloud para realizar esta pequeña función. Cómo usarlo, esta cosa tiene un SDK y documentación oficial, solo siga la escritura. Aquí el reconocimiento de texto general (versión estándar) puede satisfacer mis necesidades. Otros modos (alta precisión, escenas de tráfico, tarjetas, etc.) no los estudié en profundidad.

Esta vez, el cliente necesita actualizar, y es necesario leer los datos del medidor electrónico en el instrumento.Utilizo la interfaz del reconocimiento de texto general (versión estándar) que se conectó antes para la prueba, y la tasa de reconocimiento de texto en la pantalla electrónica es muy bajo.

Fui a la lista de productos de Baidu para echar un vistazo. Tiene la función de reconocimiento de lectura del panel de instrumentos. Los precios son los que se muestran a continuación:

WeChat captura de pantalla_20220520165007.png

Lo compré 10.000 veces y empecé a gritar.

La llamada de su familia sigue siendo muy simple. Estoy usando el marco laravel5.8 aquí. El código de llamada se muestra en la siguiente figura:

/**
     * @name: 百度文字识别
     * @author: camellia
     * @date: 2022-03-23
     * @param $filePath string 文件url
     */
    public function baiduOcr($url)
    {
        $client new \AipOcr($this->AppID, $this->API_Key, $this->Secret_Key);
        // 调用仪表文字识别, 图片参数为远程url图片
        $info $client->meter($url);
        // $info = $client->basicAccurate($url);
        // $info = $client->basicGeneralUrl($url);
        return $info;
    }
复制代码

Luego, como resultado, se informó un error.

{
    "code"1,
    "msg""解密成功!",
    "words_result": {
        "log_id"1527573108083997023,
        "error_msg""image format error",
        "error_code"216201
    }
}
复制代码

Words_result es el resultado que me devuelve Baidu Cloud. El código de error es 216201, ¿qué significa? La documentación oficial nos dice esto:

WeChat captura de pantalla_20220520165436.png

No entiendo, ¿qué tiene de malo la imagen png que subí?

Revisa la documentación, no hay otra manera.

El código de muestra proporcionado por la documentación oficial se ve así:

<?php
/**
 * 发起http post请求(REST API), 并获取REST请求的结果
 * @param string $url
 * @param string $param
 * @return - http response body if succeeds, else false.
 */
function request_post($url ''$param '')
{
    if (empty($url) || empty($param)) {
        return false;
    }
 
    $postUrl $url;
    $curlPost $param;
    // 初始化curl
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $postUrl);
    curl_setopt($curl, CURLOPT_HEADER, 0);
    // 要求结果为字符串且输出到屏幕上
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    // post提交方式
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
    // 运行curl
    $data = curl_exec($curl);
    curl_close($curl);
 
    return $data;
}
 
$token '[调用鉴权接口获取的token]';
$url 'https://aip.baidubce.com/rest/2.0/ocr/v1/meter?access_token=' . $token;
$img = file_get_contents('[本地文件路径]');
$img = base64_encode($img);
$bodys array(
    'image' => $img
);
$res = request_post($url$bodys);
 
var_dump($res);
复制代码

Este es realmente un documento oficial. Escribí tres líneas de código usando su SDK más el valor devuelto. ¿Me deja obtener el token durante la depuración? En otras palabras, tengo que ir a ver cómo se obtiene el token. No es de extrañar, su token aún debe tener un tiempo de vencimiento. cielo……

Luego, eché un vistazo a la descripción de los parámetros sobre su código de ejemplo:

WeChat captura de pantalla_20220520170046.png

Tenga en cuenta la ubicación marcada por mi cuadro rojo.

Fui a su SDK para echar un vistazo de nuevo, su código fuente:

    /**
     * 仪器仪表盘读数识别
     *
     * @param string $image
     * @param bool $probability
     * @param bool $polyLocation
     * @param array|options $
     * @return bool|mix|mixed|string[]
     */
    public function meter($image$options array())
    {
        $data array();
        $data['image'] = base64_encode($image);
        $data = array_merge($data$options);
        return $this->request($this->meter, $data);
    }
复制代码

En comparación, ¿han encontrado los inspectores algún problema?

Los parámetros que se muestran en su documento oficial son dos parámetros de imagen y url, pero en su código real, solo se asigna la imagen, por lo que es extraño que le pase la url de la imagen sin informar un error ...

Digamos simplemente, ¿puede consultar la documentación antes de que el SDK esté en línea? Un error de tan bajo nivel...

Bien, pondré mi método modificado aquí:

    /**
     * 仪器仪表盘读数识别
     *
     * @param string $image
     * @param bool $probability
     * @param bool $polyLocation
     * @param array|options $
     * @return bool|mix|mixed|string[]
     */
    public function meter($image$options array())
    {
        $data array();
        // $data['image'] = base64_encode($image);
        $data['url'] = $image;
        $data = array_merge($data$options);
        return $this->request($this->meter, $data);
    }
复制代码

Lo que paso aquí es la url del archivo, por lo que no considero el caso de base64. El cambio es bastante grosero. Jueces, por favor no rocíen.

Por supuesto, hay más de una interfaz con este problema, las otras no las he usado, así que no las modificaré aquí. La próxima vez que un compañero de clase encuentre un problema similar, recuerde verificar el código fuente con la documentación oficial.

Si tiene una buena sugerencia, ingrese su comentario a continuación.

Bienvenidos al blog personal guanchao.site

Bienvenido a mi subprograma: abra WeChat -> descubrimiento -> subprograma -> busque "a tiempo"

Supongo que te gusta

Origin juejin.im/post/7101427244177817636
Recomendado
Clasificación