10行Python代码能做出哪些有趣的事情?

本文展示了Python借助百度飞桨进行深度学习的应用,包括批量抠图、情绪识别、人脸识别和口罩检测。此外,还介绍了OpenCV用于猫脸识别和字符画生成,以及如何快速搭建FTP服务器。通过这些实例,展现了Python在图像处理和自然语言处理领域的强大功能。

fa9d01eb8881ed80b23936deb359a64f.gif

公众号后台回复“图书“,了解更多号主新书内容

     作者:周萝卜

     来源:萝卜大杂烩

Python 凭借语法的易学性,代码的简洁性以及类库的丰富性,赢得了众多开发者的喜爱。下面我们来看看,用不超过10行代码能实现些什么有趣的功能

百度飞桨

百度飞桨 paddlepaddle 是百度开源的深度学习工具,其功能强大,基于该工具我们可以实现很既有趣又有用的功能

在使用之前,我们肯定要先安装喽

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

安装完成后,我们来体验几个有趣的项目

批量抠图

批量获取指定目录下的图片,然后通过 paddlehub 训练好的模型进行批量抠图处理

import os
import paddlehub as hub

# 加载模型
humanseg = hub.Module(name='deeplabv3p_xception65_humanseg')  
path = './heben/'    # 文件目录
# 获取文件列表
files = [path + i for i in os.listdir(path)]  
# 抠图
results = humanseg.segmentation(data={'image': files})  
for result in results:
    print(result)

Output:de6a0719958c1ea94d5fde338d4cd5a2.png

我们可以看到,经过处理之后的图片自动保存在目录 humanseg_output 下面

我们可以对比下处理前后图片的差异

4782878733bb26efc96beae5bba74d95.pngc64f6924578f31e8526d44753020e103.png

整体来看,抠图效果还是非常棒的!

注意:如果执行代码没有生成对应的 out 文件夹,可以重新手动安装模型再尝试

hub install deeplabv3p_xception65_humanseg==1.0.0

自然语言处理

飞桨同样有很强的自然语言处理能力,在处理文字情绪识别方面也非常突出

senta = hub.Module(name='senta_lstm')        # 加载模型
sentence = [    # 准备要识别的语句
    '你好漂亮', '你真难看呀', '他好难过', '我不开心', '这是一款什么游戏,真垃圾', '这个游戏太好玩了',
]
results = senta.sentiment_classify(data={'text':sentence})    # 情绪识别
# 输出识别结果
for result in results:
    print(result)

Output:322b5311ecc6e72197a020cbf3fa1cbd.png

可以看出,文字情绪的识别还是非常准确的,当然我们这里语料比较少,在大语料、更复杂的语言环境下,飞浆的表现如何还有待验证

人脸识别

当今社会人脸识别可以说是随处可见,而在疫情肆虐的今天,口罩似乎也成为我们日常出现必备的条件,飞浆工具也增加了口罩识别功能,我们来看看

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

face.jpg 如下17a59cefa78c3bfb27e8949a89ec4e7b.png

Output:

[{'data': [{'label': 'NO MASK',
    'confidence': 0.9995137453079224,
    'top': 478,
    'bottom': 775,
    'left': 1894,
    'right': 2126},
   {'label': 'NO MASK',
    'confidence': 0.9903278946876526,
    'top': 512,
    'bottom': 810,
    'left': 1754,
    'right': 1998},
   {'label': 'NO MASK',
    'confidence': 0.9997405409812927,
    'top': 697,
    'bottom': 985,
    'left': 1857,
    'right': 2131},
   {'label': 'NO MASK',
    'confidence': 0.943692147731781,
    'top': 575,
    'bottom': 888,
    'left': 1954,
    'right': 2216}],
  'path': 'face2.jpg'}]

可以看出,已经判断出超过99%的概率,该张图片是没有佩戴口罩的

人脸关键点检测

人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别、表情分析、三维人脸重建及三维动画等其它人脸相关问题的前提和突破口

我们以如下这张图片作为待检测图片232e2ab83a565402d53c99b26c4d383d.png

代码如下

face_landmark = hub.Module(name="face_landmark_localization")

image = 'face.jpg'
result = face_landmark.keypoint_detection(images=[cv2.imread(image)],visualization=True)
print(result)

Output:eccf02813bfcdfad0f3f568440308500.png

可以看到人脸关键点已经标注出来,并且把检测后的图片自动存储在 face_landmark_output 目录下a39af9870b07d028c40f2b69a619c0ad.png

OpenCV

OpenCV 作为最为著名的计算机视觉工具,基于它我们也可以做很多有趣的事情 首先我们安装好 OpenCV 库

pip install opencv-python

猫脸识别

在当今社会,谁还没有一个两个猫主子呢,高冷的猫咪往往会得到人们特殊的爱戴!

我们也习惯了人脸识别,今天就通过几行代码来看看猫脸识别是怎么的呢

首先我们到安装目录下提取锚链识别 XML 分类器,具体目录如下

C:\Python3\Lib\site-packages\cv2\data

可以看到有如下很多分类器efb5031613c526b7b491b5f04e6dc941.png

我们复制 haarcascade_frontalcatface.xml 到自己的项目下即可

# 待检测的图片路径
ImagePath = './cat/cat.jpg'

# 读取图片
image = cv2.imread(ImagePath)
# 把图片转换为灰度模式
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 探测图片中的猫脸
# 获取训练好的猫脸的参数数据,进行猫脸检测
face_cascade = cv2.CascadeClassifier(r'./haarcascade_frontalcatface.xml')
faces = face_cascade.detectMultiScale(gray,scaleFactor=1.15,minNeighbors=5,minSize=(3, 3))

search_info = "Find %d face."%len(faces) if len(faces) <= 1 else "Find %d faces."%len(faces)

# 绘制猫脸的矩形区域(红色边框)
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x,y), (x+w,y+h), (0,0,255), 2)

# 显示图片
# cv2.imshow('Find faces!', image)
# cv2.waitKey(0)
cv2.imwrite("./cat/cat2.jpg", image)

Output:1a84c149c93c29cc95c6d29d3186feda.png

获取摄像头人脸

我们编写一个获取实时动态视频流的代码,实时获取当中的人脸信息

detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap = cv2.VideoCapture(0)

while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.3, 5)
    for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

    cv2.imshow('frame', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

注意这里使用的分类器是 haarcascade_frontalface_default.xml,可不要用错哦

Output:

自行在自己的电脑上尝试下哦~

快速生成动图

在很多时候,尤其是在线聊天时,输了什么也不能输掉斗图啊,下面的代码可以快速生成动图,在和朋友的斗图当中,得胜的把握又增加了

import imageio


image_list = ['image/1.jpg','image/2.jpg', 'image/3.jpg', 'image/4.jpg']
gif_name = "dongtu.gif"
duration = 1
frames = []
for image_name in image_list:
    frames.append(imageio.imread(image_name))
imageio.mimsave(gif_name, frames, "GIF", duration=duration)

Output:a71ba64d9cca964c08578962530bc856.gif

扫一下有惊喜~

ftp 服务器

可能很多人不知道,通过 Python 几行简单代码,我们可以快速实现一个简易的 ftp 服务器,这样在局域网内进行文件传输不再发愁啦!

代码非常简单,直接运行 Python 自带的 http 服务器即可

python -m http.server 8090

Output:e29885d8d4120809e0c3da9fe1b00ddd.png

接下来我们访问本地 IP + 端口80907521f208b9e9e263463bcfeda7ac31cf.png

很强大,很简单,很好用!

字符画

字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色,字符的种类越多,可以表现的颜色也越多,图片也会更有层次感

我们只需要短短几行代码,就可以完成字符画的制作

我们使用的图片如下f54c1fb5657c79f2853d771159f43550.png

代码如下

IMG = "3.jpg"
WIDTH = 80
HEIGHT = 40
OUTPUT = "./ascii/ascii.txt"

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")

# 将256灰度映射到70个字符上
def get_char(r,g,b,alpha = 256):
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

    unit = (256.0 + 1)/length
    return ascii_char[int(gray/unit)]

im = Image.open(IMG)
im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

txt = ""

for i in range(HEIGHT):
    for j in range(WIDTH):
        txt += get_char(*im.getpixel((j,i)))
    txt += '\n'

print(txt)

#字符画输出到文件
with open(OUTPUT,'w') as f:
    f.write(txt)

Output:e14dd3da61bfe0b7bc0e1952d798e276.png

◆ ◆ ◆  ◆ ◆
麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:
<think>好的,用户问的是Python算法中的复杂度是什么以及它的代码原理。首先,我需要明确算法复杂度的定义,它通常指的是时间复杂度和空间复杂度,用来衡量算法执效率和资源消耗的。接下来,我应该解释这两个概念的区别和重要性。 用户可能刚接触算法,所以得用简单易懂的例子来说明。比如,用线性查找和二分查找对比时间复杂度。可能还需要提到大O表示法,这是描述复杂度的一种方式,需要解释常见的大O类别,比如O(1), O(n), O(log n), O(n²)等,以及它们对应的算法例子。 然后关于代码原理部分,需要说明代码结构如何影响复杂度。比如循环嵌套会导致O(n²)的时间复杂度,递归可能带来更高的复杂度,除非有优化。可能需要举一个实际代码的例子,比如双重循环的冒泡排序,说明其时间复杂度是O(n²),或者快速排序的平均情况O(n log n)。 还要注意用户提到的是Python算法,可能需要结合Python的特性,比如列表操作的时间复杂度,例如append是O(1),而insert在开头是O(n)等。不过用户的问题更偏向于算法本身的复杂度,而不是Python具体实现的细节,所以这部分可能不需要深入,但稍微提及可能有助于理解。 用户可能的误区是认为代码数越多复杂度越高,需要澄清复杂度关注的是输入规模增长时的趋势,而不是具体的执时间或代码长度。因此,要强调大O表示法忽略常数和低阶项的原因。 另外,可能需要解释如何分析代码的复杂度,比如逐分析循环和递归的次数,以及空间复杂度如何由使用的数据结构决定,比如是否使用了额外的数组或递归栈。 最后,总结一下复杂度分析的重要性,帮助用户写出更高效的代码,尤其是在处理大数据量时的应用。可能需要提醒用户在实际编程中权衡时间与空间复杂度,根据具体情况选择合适算法。 需要检查是否有遗漏点,比如最好有一个实际的Python代码示例,并逐步分析其复杂度,这样用户更直观。例如,遍历列表的循环,或者递归计算斐波那契数的低效性,以及如何通过记忆化优化时间复杂度。 确保语言口语化,避免术语堆砌,用比喻或类比帮助理解。比如时间复杂度可以比作做事情的步骤多少,空间复杂度比作需要的储物空间大小。 另外,用户可能想知道如何计算自己写的算法的复杂度,所以需要给出一些基本步骤,比如识别循环结构,计算基本操作的执次数,转化为大O表示等。 可能还需要区分最好、最坏、平均情况,尤其是对于像快速排序这样的算法,不同情况下的复杂度差异。但用户的问题可能只需要基础解释,所以这部分可能简要提及即可。 最后确认回答结构是否清晰,是否分点或分步骤,符合用户可见层的要求,结构清晰,逐步解决问题。可能需要用标题分隔时间复杂度和空间复杂度,以及代码原理部分。</think>### Python算法复杂度解析(附代码原理) --- #### 一、什么是算法复杂度? 算法复杂度是衡量算法效率的核心指标,分为两类: 1. **时间复杂度**:算法运所需时间与输入规模的增长关系 2. **空间复杂度**:算法运所需内存与输入规模的增长关系 用**大O表示法**(Big O notation)描述,忽略常数项和低阶项,只保留增长最快的部分。 --- #### 二、时间复杂度详解 常见时间复杂度类型(按效率排序): $$O(1) < O(\log n) < O(n) < O(n \log n) < O(n^2) < O(2^n)$$ **代码示例分析**: ```python # O(1) 常数时间 def get_first_element(arr): return arr[0] # 直接访问元素,无需遍历 # O(n) 线性时间 def linear_search(arr, target): for num in arr: # 单层循环 if num == target: return True return False # O(n^2) 平方时间 def bubble_sort(arr): n = len(arr) for i in range(n): # 外层循环 for j in range(n-i-1): # 内层循环 if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] ``` --- #### 三、空间复杂度详解 衡量算法使用的额外内存空间(不含输入数据本身) **代码示例分析**: ```python # O(1) 常数空间 def sum_list(arr): total = 0 # 仅需一个变量存储累加值 for num in arr: total += num return total # O(n) 线性空间 def copy_list(arr): new_arr = [] # 创建与输入等长的新列表 for num in arr: new_arr.append(num) return new_arr ``` --- #### 四、复杂度分析原理 1. **循环分析**: - 单层循环 → $O(n)$ - 双层嵌套循环 → $O(n^2)$ - 循环次数减半 → $O(\log n)$ 2. **递归分析**: - 斐波那契数列递归实现 → $O(2^n)$ ```python def fib(n): if n <= 1: return n return fib(n-1) + fib(n-2) # 每次调用产生2个新调用 ``` 3. **分治算法**: - 归并排序 → $O(n \log n)$ $$T(n) = 2T(n/2) + O(n)$$ --- #### 五、Python特性与复杂度 1. 列表操作: - `append()`/`pop()` → $O(1)$ - `insert(0, x)` → $O(n)$(需要移动元素) 2. 字典操作: - 查找/插入 → 平均$O(1)$,最坏$O(n)$ --- #### 六、优化技巧 1. **空间换时间**:使用哈希表加速查找 2. **剪枝策略**:提前终止无效计算 3. **记忆化**:缓存重复计算结果(如斐波那契数列优化) --- #### 七、实际应用场景 - 选择排序算法: - 数据量小 → 冒泡排序(代码简单) - 数据量大 → 快速排序(时间更优) - 内存敏感场景: - 选择迭代代替递归(减少栈空间消耗) 通过复杂度分析,开发者可以预测算法在不同数据规模下的表现,做出最优选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值