ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

双十一无套路,paddlepaddle一键识别到手价

2021-10-24 15:30:10  阅读:270  来源: 互联网

标签:distance 一无 reference paddlepaddle 一键 text position txt data


简介

一年一度的双十一剁手节又来了,电商玩法淘箩也越来越复杂,你还在重拾丢掉多年的数学算到手价么?尤其是电商小伙伴们,还在为了算竞对到手价头疼么?!

不用怕,paddlepaddle开源模型库教你一键识别到手价

前面写过一篇飞桨的ocr识别
《PaddleHub一键OCR中文识别(超轻量8.1M模型,火爆)——本地实现》

前两天把这个算法扩展了下,应用于淘宝商品的到手价识别

识别效果展示

部分图片及结果如下图所示,测试了120张图片,一张识别错误,一张未识别出来,主图不存在预估到手价的也准确识别并提示无目标价,总体识别准确率尚可,凑合能用。
在这里插入图片描述

在这里插入图片描述

代码&逻辑

在这里插入图片描述
基本逻辑:
如上图所示,需要先配置到手价文案,调用飞桨ocr识别出对应文案坐标,以正则筛选符合要求的目标文本(也可不做正则匹配,主要为了降低计算距离的复杂度),计算各文本到目标文案之间的距离,取距离目标文案最近的识别结果即可。

为了保证代码运行稳定性,本代码读取本地文件进行识别,与爬取商品主图拆分开了。很多工具可以爬取商品主图,可以先爬取下来再识别,后续有时间再分享商品主图的爬虫的代码吧。

完整代码如下:

import os
import cv2
import re
import paddlehub as hub

# 完善版本2.0,速度慢,全部文本验证距离,因为有一部分目标参考位置会在下方


# 加载移动端预训练模型
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")


def get_txt(image_path):
    return ocr.recognize_text(images=[cv2.imread(image_path)])


def handle_data(txt_data):
    pass


def order_text_box_position(txt_data):
    """
    文本对位置排序,从左上到右下,并选取左下和右下的纯数字|带¥符号的|以【起】结尾的

    一般 带¥符号的|以【起】结尾的 可以确认为目标值,不过最好加一个距离验证

    坐标顺序为:左上 右上、右下、左下,图片左上角为起始原点[0,0]

    坐标值为[横坐标,纵坐标]

    """

    # 预选列,剔除其他干扰文本
    pre_select_list = []
    for j in txt_data[0]['data']:
        string = j['text'].replace(" ", "")
        if re.findall("^\d+\.\d*$|^¥\d+\.\d*$|^\d+\.\d*起$|^¥\d+$|^\d+起$|^\d+$", string):
            pre_select_list.append(j)
        else:
            pass
    if len(pre_select_list) == 0:
        return "无目标价"
    else:

        # 获取参考位置坐标
        reference_position = get_reference_position(txt_data)

        # 计算距离求最小距离
        # 注意:小数点结尾,被分割了,找下一个距离最近的文本拼接,此处目标为选出来的整数项
        return cal_min_distance(reference_position,  pre_select_list)


def cal_min_distance(reference_position, inner_elements):
    """

    计算距离,取到最小距离的值,返回目标价

    reference_position:参考目标位置

    inner_elements:预选元素列表

    """
    distance_list = []
    distance_list1 = []
    x0, y0 = reference_position[0]
    for i in inner_elements:
        x1, y1 = i['text_box_position'][0]
        d = (x1 - x0) ** 2 + (y1 - y0) ** 2  # 不开方也可,只比大小不取值
        distance_list.append(d)
    price = inner_elements[distance_list.index(min(distance_list))]['text'].replace(" ", "")
    if (price[-1] == ".") & (len(inner_elements) > 1):
        x0_, y0_ = inner_elements[distance_list.index(min(distance_list))]['text_box_position'][0]
        for i in inner_elements:
            x1, y1 = i['text_box_position'][0]
            if (x1 != x0) & (y1 != y0):  # 排除自己
                d = (x1 - x0) ** 2 + (y1 - y0) ** 2  # 不开方也可,只比大小不取值
                distance_list1.append(d)
        decimal_price = inner_elements[distance_list1.index(min(distance_list))]['text'].replace(" ", "")
        return "".join([price, decimal_price])
    else:
        return price


def get_reference_position(txt_data):
    """获取参考位置坐标"""

    # 读取目标文本
    f = open("parameter.txt", encoding='utf8')
    reference_txt = f.readlines()
    f.close()
    # print(reference_txt)
    for i in reference_txt:
        for j in txt_data[0]['data']:
            if i.split('\n')[0] in j['text']:
                return j['text_box_position']
    return "无目标位置,检查配置和图片"


def main():
    """主程序,循环图片路径"""
    dir_path = "./picture"
    pictures = os.listdir(dir_path)
    for picture in pictures:
        image_path = os.path.join(dir_path, picture)
        txt_data = get_txt(image_path)
        price = order_text_box_position(txt_data)
        print(f"商品{picture.split('.')[0]}  预估到手价:{price}")


if __name__ == '__main__':
    main()

# # cv2无法识别中文路径,使用英文路径
# image_path = "./picture/1.jpg"
# txt_data = get_txt(image_path)
# print(txt_data[0]['data'])
#
# # 获取参考位置坐标
# reference_position = get_reference_position(txt_data)
# print(reference_position)
#
# price = order_text_box_position(txt_data)
# print(f"预估到手价格:{price}")

标签:distance,一无,reference,paddlepaddle,一键,text,position,txt,data
来源: https://blog.csdn.net/qq_35866846/article/details/120934366

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有