Python 用很少的代码能实现些什么

167 阅读8分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」。

前言

大家都知道,Python 有着简洁的语法,但是 Python 同其它语言没有本质的区别。如果我们只使用 Python 标准库中的东西,我们用很少的代码能实现的功能也非常有限,但是如果我们借助第三方模块、第三方工具,我们可以实现的东西就多了许多。

1. 使用飞桨模型

百度飞桨是一个非常好用的深度学习框架,我们使用飞桨可以很快地实现迁移学习。我们写一个深度学习的工具只需要十几行代码,在我们使用之前我们需要安装相应的模块。

1.1 PaddleHub 环境搭建

环境搭建非常简单,我们只需要根据自己电脑的系统安装相应版本的模块即可。我们先安装 PaddlePaddle,我们可以根据官网的指引选择版本:

在这里插入图片描述

需要注意,PaddlePaddle 暂时不支持 Python 3.8+。为了方便,我直接使用 pip 安装:

python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple

另外我们需要安装 PaddleHub 模型库:

pip install -i https://mirror.baidu.com/pypi/simple paddlehub

接下来我们就可以用 PaddlePaddle 实现一些东西了。

1.2 批量抠图

我们加载 PaddleHub 中相应的模型库可以很容易地实现抠图:

# 1、导入模块
import paddlehub as hub
# 2、加载模型库
humanseg = hub.Module(name='deeplabv3p_xception65_humanseg')
# 3、准备文件列表
files = ['D:/img1.jpg', 'D:/img2.jpg']
# 4、批量抠图
results = humanseg.segmentation(data={'image':files})

执行程序后我们可以看到,项目下出现 humanseg_output 目录,抠好的图片就在该目录下。下面我们看一下效果图:

在这里插入图片描述

从右下角看,效果还是比较不错的。

1.3 自然语言处理

我们同样按照上面的套路,加载模型库,然后准备文字,最后开始识别。几个步骤下来只需要几行代码即可搞定:

# 导入模块
import paddlehub as hub
# 2、加载模型库
senta = hub.Module(name='senta_lstm')
# 3、准备句子
sentence = ['我对你太失望了']
# 4、情绪识别
result = senta.sentiment_classify(data={"text":sentence})
# 5、输出识别结果
print(result)

输出结果如下:

[{'text': '我对你太失望了', 'sentiment_label': 0, 'sentiment_key': 'negative', 'positive_probs': 0.0066, 'negative_probs': 0.9934}]

我们可以看到有五个字段,我们只需要关注 sentiment_key 字段即可,该字段有两个值:negative 和 positive,negative 为消极,positive 为积极。

1.4 识别口罩

口罩的识别也是一样的:

import paddlehub as hub
# 1、加载模型
module = hub.Module(name='pyramidbox_lite_mobile_mask')
# 2、图片列表
image_list = ['mask.jpg']
# 3、获取图片字典
mask = {'image':image_list}
# 检测是否带了口罩
module.face_detection(data=mask)

执行程序后我们在项目下可以看到 detection_result 目录,识别效果如下:

在这里插入图片描述

我们可以看到人脸被框了起来,左边的没带口罩显示 NO MASK,可能性为 100%。右边检测出 MASK,可能性为 75%。总的来说还是比较准确。

2. 使用接口简化编程

我们都听过面向对象编程,面向对象编程是一种实实在在的编程思想。除了面向对象编程外,我们还可能会听到面向接口编程。这实际上是一种讽刺的说法,在我们编程过程中,有很多高深莫测的功能实现起来相当复杂,而市面上我们可以找到许多接口,我们调用接口可以将所有问题转换成网络请求的问题。我们不需要掌握实现原理,只需要读懂文档即可。

下面我审核图片是否合格为例,这里使用百度的接口:

from aip import AipImageCensor

APP_ID = '你的 APPID'
API_KEY = '你的 APIKey'
SECRET_KEY = '你的 SecretKey'

client = AipImageCensor(APP_ID, API_KEY, SECRET_KEY)

""" 读取图片 """
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

""" 调用审核图片接口 """
result = client.imageCensorUserDefined(get_file_content('mv.png'))

print(result)

当图片包含不受社会大众做包容的信息时,会返回不合格相关的数据。

我们可以看到使用起来非常简单,但是人们之所以讽刺面向接口编程,就是因为我们不需要做太多的操作,不用了解其原理。这样很大程度纵容了程序员的懒散,如果太过于依赖接口会使程序员低能。所以接口的使用我们要适度。

3. 生成二维码

生成二维码的方式多种多样,我们可以使用 MyQR,也可以使用 QRCode,使用起来都很简单。我们用两个模块分别生成一个简单的二维码。

3.1 QRCode 生成二维码

我们在命令行窗口执行下列命令:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ qrcode

这是使用清华大学的源下载 QRCode,下面我们来使用 QRCode:

from qrcode import QRCode
qr = QRCode()	# 创建 QRCode 对象
qr.add_data('Do not go gentle into that good night!')	# 设置二维码包含数据
img = qr.make_image()	# 创建图片
img.save('qrcode.png')	# 保存二维码图片

执行后我们能在项目下找到 qrcode.png 图片。

3.2 MyQR 生成二维码

我们先安装模块:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ myqr

我们主要使用 MyQR 类实现:

from MyQR import myqr		# 注意区分大小写
myqr.run(words='不要温顺的走进那个良夜')

执行后项目下会生成一张图片,就是我们需要的二维码图片。

4. 使用 Pynput 模块控制输入设备

Pynput 内置了键盘和鼠标的控制器,我们创建控制器对象后就相当于创建了一个虚拟的键盘和鼠标,我们可以用它们控制我们的电脑。

4.1 控制鼠标

我们先安装 Pynput 模块:

pip install pynput

安装完成后我们就可以控制电脑了,我们先看看鼠标有什么操作:

from pynput import *
# 创建鼠标
m_mouse = mouse.Controller()
# 移动鼠标
m_mouse.position = (0, 0)
# 点击鼠标左键
m_mouse.click(mouse.Button.left)
# 点击鼠标右键
m_mouse.click(mouse.Button.right)
# 按下鼠标左键
m_mouse.press(mouse.Button.right)
# 松下鼠标左键
m_mouse.release(mouse.Button.right)

上面就是我们常用的操作。

4.2 控制键盘

键盘的操作相比要复杂得多,我们只看一些常见的操作:

from pynput import *
# 创建键盘
m_keyboard = keyboard.Controller()
# 打字
m_keyboard.type('zack')
# 单击 a
m_keyboard.type('a')
# 安装左键
m_keyboard.press(keyboard.Key.right)
# 松下左键
m_keyboard.release(keyboard.Key.right)

在 keyboard.Key 中内置了许多按键的常量,我们可以直接使用。

4.3 简单应用

我们可以通过循环的方式实现消息轰炸的效果,具体实现就是打开对话窗口后让程序重复执行打字和发送的操作:

import time
from pynput import keyboard

time.sleep(3)

kb = keyboard.Controller()
while True:
    kb.type('你好')
    kb.press(keyboard.Key.enter)
    time.sleep(1)

我们运行程序,然后用鼠标点击你要发消息的输入框,这样就会一直循环发消息了。当然,我们可以用 pynput 实现一些其它重复的操作。

5. 文字转语音

这就要用到我们的 pyttsx 3 了,我们用 pip 安装模块:

pip install pyttsx3

然后就是我们的简单使用:

import pyttsx3 as pyttsx
# 初始化引擎
engine = pyttsx.init()
# 文字转语音
engine.say('do not go gentle into that good night!')
# 运行引擎等待说完
engine.runAndWait()

我们运行后电脑就会说出这句话。

6. P 图

P 图的操作是多种多样的,今天介绍两种,一种是图片美化,一种是场景置换。我们先看看美化。

6.1 图片降噪

在图片中,有时候会有一些比较突兀的像素点集合,我们直观看到的就是几个点。像是图片中的皱纹、痘印等,这些点就是我们说的噪声,我们通过计算降除噪声即可消除画面中不和谐的地方。我们要用到 OpenCV 模块:

pip install opencv-python

我们安装好模块后就可以使用了:

import cv2
level = 18	# 降噪等级
img = cv2.imread('girl.jpg')	# 读取原图
img = cv2.bilateralFilter(img, level, level*2, level/2)	# 美颜
cv2.imwrite('girl2.jpg', img)	# 保存图片

美颜效果如下,左图为原图,右图为美颜后的图片,效果上是把雀斑去掉了,但是图片某些部位有失真实感。

在这里插入图片描述

6.2 图片切换背景

在上面我们讲到了抠图的操作,我们可以用抠好的图,结合 Pillow 实现图片切换背景的效果,我们先安装 Pillow:

pip install pillow

这里就不再重复抠图了,我们直接使用抠好的 PNG 图片作为素材:

from PIL import Image
# 读取前景图片
f_im = Image.open('jljt.png')
# 读取背景图片
bg_im = Image.open('bg.jpg')
# 分离色道
r, g, b, a = f_im.split()
# 修改背景图片大小
bg_im = bg_im.resize(f_im.size)
# 将前景图片放置到背景图片上
bg_im.paste(f_im, (0, 0), mask=a)
bg_im.show()

效果如下:

在这里插入图片描述

左边为背景图,中间为前景图,右边为合成图。

7. 发送邮件

Python 中内置了用于发送邮件操作的模块,但是我们使用三方的 yagmail 模块能更快的实现邮件发送:

pip install yagmail

接下来我们发一个简单的邮件:

import yagmail
yagmail.register('发件人邮箱', '发件人密码或授权码')
# host 为 SMTP 的邮箱服务器,大家可以取各个邮箱官网查看
yag = yagmail.SMTP(user='发件人邮箱', host='smtp.163.com')
# 发送的内容
contents = [
    '不要温顺的走进那个良夜',
    'Do not go gentle into that good night!'
]
yag.send('收件人', '主题', contents)

这样我们就实现了邮箱的发送。

8. 视频音频混流

MoviePy 是一个非常厉害的多媒体处理库,里面提供了大量关于多媒体文件的操作,我们用 pip 安装 MoviePy:

pip install moviepy

然后看看如何进行混流处理:

from moviepy.editor import *
# 读取视频文件
video = VideoFileClip('video.mp4')
# 读取音频文件
audio = AudioFileClip('audio.mp3')
# 混流
video.set_audio(audio)
# 将合成的视频重新保存,注意名字不要和源文件相同
video.write_videofile('video1.mp4')

当然还有许多其它操作需要大家慢慢发掘。