前言
在这个实例中我会一步一步带你用Python调用百度AI开放平台提供的图像特效API服务,实现人像动漫化。在实际中,我们在抖音里或多或少的能看到一些任务人像动漫的视频。
如果你想在你的应用中添加这项功能,或在日常中使用,通过调用百度AI开放平台,我们很容易制作这样的图像。同时,在完成我们这个课程后,我们很容易调用百度开放的其他的AI能力,能让你秒变AI大神。
我们会详细跟你分析每一行代码,同时用简单的语言讲解一些相关概念,让你能明白他们的所以然。
如果是伸手党的话,直接跳到代码实现吧。
知识储备:
在开始实现我们的之前,希望你能有以下知识储备:
开发环境:
我们将在python3上实现我们的案例,请确保你的电脑已经安装好了python3,和requests库
最终效果展示
抖音上,看到别人的制作的动漫化形象,自己有没有也想自己做一自己的动漫化形象图片,
先看一下面的效果图
还挺帅,呵呵。
实现步骤
我们来看一下实现我们的实例需要哪些步骤吧。
了解了我们接下来要干嘛,现在开始动手完成实例吧。
必备的编程技巧与概念
首先,为了更好理解后面的我们的代码,我们需要介绍一些python的编程技巧和关于爬虫的一些概念。
技巧1 图片文件的读取
当我们在网上下载了一张图片时,我们该怎么保存到本地呢?
相信,你一定会想到 open 这语句,但是我们应该怎么写呢?
看代码
#imgName 保存到本地的文件名#img 存有图片二进制数据的变量with open(imgName,"wb") as f: f.write(img)
下面,跟我来实现一个获取Bing搜索主页的背景图片的例子,来熟悉一下图片的保存。
#coding:utf-8import requests#获取Bing搜索主页最新背景图片链接resp=requests.get("https://cn.bing.com/HPImageArchive.aspx?format=js&n=1").json()imgURL="https://cn.bing.com"+resp["images"][0]["url"]#打印图片链接print(imgURL)#下载图片img=requests.get(imgURL).content#保存图片到本地with open("Bing.jpg","wb") as f: f.write(img)
技巧2 % 格式化输出
下面,我们来学第二个技巧,字符串的格式化输出。
在python中,%可以用来做 求余符号,如 7%3 会返回结果 1。
% 还可以用来进行格式化输出,%格式化输出的语法类似C语言。
下面我们来通过几个例子来熟悉 一下 %的格式化输出
>>>#输出字符串>>>"hello %s world"%("wonderful")'hello wonderful world'>>>#输出整数>>>"hello %d world"%(99)'hello 99 world'>>>#输出浮点数>>>"hello %f world"%(99.9999)'hello 99.999900 world'>>>#指定浮点数的小数点后两位的输出,会四舍五入>>>"hello %.2f world"%(99.9999)'hello 100.00 world'>>>#多参数格式化输出>>>"hello %d world %s %s"%(99,"it has a ","long time no see")'hello 99 world it has a long time no see'
看了上面的例子,可能你还有点懵,别急,我这里再给你讲讲。
%s %d %f 这些符号是用于在字符串里占位的,%s代表字符串的占位,%d 代表整数的占位,%f代表浮点数的占位
传入的变量,在%连接后的括号按序传入,即 “ %s %d %f ” %(字符串变量,整型变量,浮点型变量)
行了,学习完了上面的两个技巧,我们再介绍一下关于一些爬虫的概念
概念一:GET POST
GET POST 是HTTP的两种请求方法,从字面意思,我们很很容易知道,GET方法是 从指定的资源请求数据。POST方法是向指定的资源提交要被处理的数据。
但是他们有什么优缺点呢?
GET 方法,在我们的使用的浏览器中请求的链接一般是https://www.baidu.com/s?wd=hello 这样子的。它在请求时,上传的数据是直接放在URL里的,参数保留在浏览器历史中,对于敏感的信息,安全性较差,且上传的数据大小被限制在2083个字符
POST方法,在请求时,上传的数据不会直接显示在URL中,也不会被缓存到浏览器中,相对于GET方法,POST的信息安全性较强,而且上传的数据的大小没有限制。
概念二:浏览器头header
下面,我们来了解一下浏览器头
当我们使用一个浏览器浏览一个网页时,我们的浏览器就会产生Request Headers,
这里我给你介绍在这个header里面两个比较重要的参数
1.CooKie
CooKie是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据,由用户客户端计算机暂时或永久保存的信息。我们可以通过设置它来进行模拟登录。
2.User-Agent
User-Agent记录了你的浏览器类型,版本,操作系统及版本,浏览器内核、等信息的标识。通过这个标识,网站可以显示不同的排版从而为你提供更好的体验或者进行信息统计。在使用python爬取网页时,我们有时就需要设置User-Agent来模拟浏览器来反爬。
后面的base64 requests 库我们这里不讲,如果实在需要学习,请自行百度。。。
创建百度API开发应用
注册百度账号,进入控制台,创建应用,获取#API Key,#Secret Key
1.首先,你先到百度AI开放平台,创建一个账号,网址:https://login.bce.baidu.com
2.登录百度AI开放平台后,到https://ai.baidu.com/,,
点击进入”人像动漫化“界面
进入到 ”人像动漫化“界面 后,点击“立即使用”,就会进到“百度智能云控制界面”
进到“百度智能云控制界面”,点击“创建应用”
创建好应用后,复制好你的 API Key Secret Key
后面需要使用。
代码实现
# -*- coding: utf-8 -*-"""人像图像化处理"""import requestsimport base64def get_token(): """ 初始化账户参数 use: token=get_token() """ client_id="" #你的API Key client_secret="" #你的Secret Key host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s'%(client_id,client_secret) resp = requests.get(host) if resp: resp=resp.json() print(resp) return resp["access_token"]def read_image(image_path): """ # 二进制方式打开图片文件,并编码成base64 use: img=read_image("demo.jpg") """ with open(image_path,"rb") as f: img = base64.b64encode(f.read()) return img def transform(image_path): """ 调用百度人像动漫化API,返回结果图片的base64编码数据 use: img=transform("demo.jpg") """ img=read_image(image_path) params = {"image":img} access_token = get_token() request_url = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime" request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} resp = requests.post(request_url, data=params, headers=headers) if resp: return resp.json()["image"] print(resp)def save_image(img,save_path="me.jpg"): """ #对base64编码的图片进行解码 use: img=transform("demo.jpg") ave_image(ime) """ img = base64.b64decode(img) with open(save_path,"wb") as f: f.write(img)img=transform("me.jpg") #"me.jpg" 你要转换的图片 save_image(img,'me-result.jpg')