基于PaddlePaddle实现的一些有趣工具

/ 技术文章 / 0 条评论 / 2970浏览

工具简介

元旦期间对百度PaddlePaddle突然感了兴趣,根据人们的一些库,做了一些小工具。 主要是为了保持对新鲜技术的兴趣。 演示页面在 https://funfan.xyz/tools/#/

使用的PaddlePaddle库

最主要的当然是PaddlePadlle和PaddleHub啦,继承了大量经过封装的模型,可以直接拿来玩玩。 但是要项目落地估计还需要在深挖一下。

小工具

演示页面在 https://funfan.xyz/tools/#/

图像转文字

使用PaddleOCR的预训练模型

hub install chinese_ocr_db_crnn_mobile==1.1.2
hub install chinese_ocr_db_crnn_server==1.1.2

移动版准确率一般,对于笔画较多的字容易出现误判, 服务器版准确率很高,基本能够商用了,但是需要GPU才能有比较好的响应速度,2核2G的阿里云机器很吃力。

使用模型相当简单,通过PaddleHub加载模型后,直接调用识别方法即可,置信度给带0.5或0.6就比较合适。


import paddlehub as hub
import os

# 加载移动端预训练模型
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
# 服务端可以加载大模型,效果更好 
# ocr = hub.Module(name="chinese_ocr_db_crnn_server") 

# 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
def recognize_text(np_images, thresh):
    results = ocr.recognize_text(
        images=np_images,         # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
        use_gpu=False,            # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量
        output_dir='ocr_result',  # 图片的保存路径,默认设为 ocr_result;
        visualization=False,       # 是否将识别结果保存为图片文件;
        box_thresh=0.5,           # 检测文本框置信度的阈值;
        text_thresh=thresh)          # 识别中文文本置信度的阈值;
    # return json.dumps(results)
    return {'code': 0, 'result': results}

文本情绪判断

PaddleNLP已经提供了强大的封装,可以开箱即用实现以下功能(摘自PaddleNLP github)

from paddlenlp import Taskflow

# 中文分词
seg = Taskflow("word_segmentation")
seg("第十四届全运会在西安举办")
>>> ['第十四届', '全运会', '在', '西安', '举办']

# 词性标注
tag = Taskflow("pos_tagging")
tag("第十四届全运会在西安举办")
>>> [('第十四届', 'm'), ('全运会', 'nz'), ('在', 'p'), ('西安', 'LOC'), ('举办', 'v')]

# 命名实体识别
ner = Taskflow("ner")
ner("《孤女》是2010年九州出版社出版的小说,作者是余兼羽")
>>> [('《', 'w'), ('孤女', '作品类_实体'), ('》', 'w'), ('是', '肯定词'), ('2010年', '时间类'), ('九州出版社', '组织机构类'), ('出版', '场景事件'), ('的', '助词'), ('小说', '作品类_概念'), (',', 'w'), ('作者', '人物类_概念'), ('是', '肯定词'), ('余兼羽', '人物类_实体')]

# 『解语』- 名词短语标注
nptag = Taskflow("knowledge_mining", model="nptag")
nptag("红曲霉菌")
>>> [{'text': '红曲霉菌', 'label': '微生物'}]

# 句法分析
ddp = Taskflow("dependency_parsing")
ddp("9月9日上午纳达尔在亚瑟·阿什球场击败俄罗斯球员梅德韦杰夫")
>>> [{'word': ['9月9日', '上午', '纳达尔', '在', '亚瑟·阿什球场', '击败', '俄罗斯', '球员', '梅德韦杰夫'], 'head': [2, 6, 6, 5, 6, 0, 8, 9, 6], 'deprel': ['ATT', 'ADV', 'SBV', 'MT', 'ADV', 'HED', 'ATT', 'ATT', 'VOB']}]

# 情感分析
senta = Taskflow("sentiment_analysis")
senta("这个产品用起来真的很流畅,我非常喜欢")
>>> [{'text': '这个产品用起来真的很流畅,我非常喜欢', 'label': 'positive', 'score': 0.9938690066337585}]

女生卡通头像

其实说白了就是两张图片的风格迁移:

  1. 通过dlib检测照片人脸部分,并提取出来
  2. 将提取出的人脸风格化为,预训练的卡通风格
  3. 输出结果,就完啦
import sys 
import os
import cv2
from PIL import Image
import numpy as np

import paddle
from paddle.utils.download import get_path_from_url
from ppgan.faceutils.dlibutils import align_crop
from ppgan.faceutils.face_segmentation import FaceSeg
from ppgan.models.generators import ResnetUGATITP2CGenerator
from ppgan.apps.base_predictor import BasePredictor

# 预训练卡通风格权重
P2C_WEIGHT_URL = "https://paddlegan.bj.bcebos.com/models/photo2cartoon_genA2B_weight.pdparams"

# 读取权重
cur_path = os.path.abspath(os.path.dirname(__file__))
weight_path = get_path_from_url(P2C_WEIGHT_URL, cur_path)

# 加载模型
genA2B = ResnetUGATITP2CGenerator()
params = paddle.load(weight_path)
genA2B.set_state_dict(params)
genA2B.eval()
faceseg = FaceSeg()

# 读取照片
image = nparray2Image(nparray)
# 检测提取人脸
face_image = align_crop(image)
face_mask =faceseg(face_image)

# 压缩图片
face_image = cv2.resize(face_image, (256, 256), interpolation=cv2.INTER_AREA)
face_mask = cv2.resize(face_mask, (256, 256))[:, :, np.newaxis] / 255.
face = (face_image * face_mask + (1 - face_mask) * 255) / 127.5 - 1

# 风格迁移
face = np.transpose(face[np.newaxis, :, :, :], (0, 3, 1, 2)).astype(np.float32)
face = paddle.to_tensor(face)
# inference
with paddle.no_grad():
    cartoon =genA2B(face)[0][0]

# 最后处理一下
cartoon = np.transpose(cartoon.numpy(), (1, 2, 0))
cartoon = (cartoon + 1) * 127.5
cartoon = (cartoon * face_mask + (1 - face_mask) * 255).astype(np.uint8)
cv2.cvtColor(cartoon, cv2.COLOR_RGB2BGR)

图片拼接

SIFT + RESCAN,没用PaddlePaddle,网上很多,抄的