1.需求及方案:python
在我之前的一個帖子https://ai.baidu.com/forum/topic/show/943365 裏面講了怎麼經過圖像分割來旅遊。json
這一次我要說一下怎麼經過地標識別+百度百科帶你們來看遍/認識天下名勝。app
2.平臺接入測試
地標識別接入網址:https://console.bce.baidu.com/ai/#/ai/imagerecognition/overview/index編碼
具體接入方式比較簡單,能夠參考個人另外一個帖子,這裏就不重複了:url
http://ai.baidu.com/forum/topic/show/943327設計
3.地標識別調用攻略(Python3)rest
3.1首先認證受權:code
在開始調用任何API以前須要先進行認證受權,具體的說明請參考:orm
http://ai.baidu.com/docs#/Auth/top
具體Python3代碼以下:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import base64
import json
#client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
client_id =【百度雲應用的AK】
client_secret =【百度雲應用的SK】
#獲取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
3.2 接口調用:
詳細說明請參考:https://ai.baidu.com/docs#/ImageClassify-API/2c607890
說明的比較清晰,這裏就不重複了。
你們須要注意的是:
API訪問URL:https://aip.baidubce.com/rest/2.0/image-classify/v1/landmark
圖片格式:Base64編碼字符串,以圖片文件形式請求時必填。(支持圖片格式:jpg,bmp,png),圖片大小不超過4M。最短邊至少15px,最長邊最大4096px。 注意:圖片的base64編碼是不包含圖片頭的
Python3調用代碼以下:
#地標識別
#filename:圖片名(本地存儲包括路徑)
def landmark(filename):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/landmark"
# 二進制方式打開圖片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['show'] = 'true'
params = urllib.parse.urlencode(params).encode("utf-8")
#params = json.dumps(params).encode('utf-8')
access_token = get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
landmark=''
if content:
#print(content)
content=content.decode('utf-8')
#print(content)
data = json.loads(content)
#print(data)
words_result=data['result']
landmark=words_result['landmark']
print ('地標:',landmark)
return landmark
4.應用方案:
4.1 總體方案:
首先調用地標識別API對地標圖片進行識別。
而後經過百度百科對地標的具體狀況進行搜索,並將結果展現給客戶。
4.2 具體實現代碼:
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import base64
import json
#client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
client_id =【百度雲應用的AK】
client_secret =【百度雲應用的SK】
#獲取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content)
token_key = token_info['access_token']
return token_key
#地標識別
#filename:圖片名(本地存儲包括路徑)
def landmark(filename):
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/landmark"
# 二進制方式打開圖片文件
f = open(filename, 'rb')
img = base64.b64encode(f.read())
params = dict()
params['image'] = img
params['show'] = 'true'
params = urllib.parse.urlencode(params).encode("utf-8")
#params = json.dumps(params).encode('utf-8')
access_token = get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib.request.urlopen(request)
content = response.read()
landmark=''
if content:
#print(content)
content=content.decode('utf-8')
#print(content)
data = json.loads(content)
#print(data)
words_result=data['result']
landmark=words_result['landmark']
print ('地標:',landmark)
return landmark
from bs4 import BeautifulSoup
#經過百度百科獲取地標的詳細說明
def get_baike_summary(itemname):
url='https://baike.baidu.com/item/'+urllib.parse.quote(itemname)
# 構建請求對象
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"
}
request = urllib.request.Request(url, headers=headers)
# 發送請求
response = urllib.request.urlopen(request)
# 讀取文件
content = response.read().decode('utf8')
# 先構建一個soup對象
soup = BeautifulSoup(content, "lxml")
#獲取描述
summary = soup.find("div", attrs={"class": "lemma-summary"}).get_text()
print (summary)
def get_landmark_more(filename):
result=landmark(filename)
get_baike_summary(result)
get_landmark_more('landmark1.jpg')
5 效果測試
如下是幾個測試地標圖片及返回結果。
地標: 埃菲爾鐵塔
埃菲爾鐵塔(法語:La Tour Eiffel;英語:the Eiffel Tower)矗立在塞納河南岸法國巴黎的戰神廣場,於1889年建成,是當時世界上最高的建築物。埃菲爾鐵塔得名於設計它的著名建築師、結構工程師古斯塔夫·埃菲爾,所有由施耐德鐵器(現施耐德電氣)建造。埃菲爾鐵塔高300米,天線高24米,總高324米,鐵塔是由不少分散的鋼鐵構件組成的——看起來就像一堆模型的組件。鋼鐵構件有18038個,重達10000噸,施工時共鑽孔700萬個,使用1.2萬個金屬部件,用鉚釘250萬個。除了四個腳是用鋼筋水泥以外,全身都用鋼鐵構成,共用去熟鐵7300噸。塔分三樓,分別在離地面57.6米、115.7米和276.1米處,其中1、二樓設有餐廳,第三樓建有觀景臺,從塔座到塔頂共有1711級階梯。埃菲爾鐵塔是世界著名建築、法國文化象徵之1、巴黎城市地標之1、巴黎最高建築物。被法國人愛稱爲「鐵娘子」 。埃菲爾鐵塔2011年約有698萬人參觀,在2010年累計參觀人數已超過2.7億人,每一年爲巴黎帶來15億歐元的旅遊收入。
[1]
地標: 胡夫金字塔
胡夫金字塔是古埃及金字塔中最大的金字塔。塔高146.59米,因年久風化,頂端剝落10米,現高136.5米,至關於40層大廈高。塔身是用230萬塊巨石堆砌而成,大小不等的石料重達1.5噸至160噸,塔的總重量約爲684萬噸,它的規模是埃及至今發現的110座金字塔中最大的。它是一座幾乎實心的巨石體,三五成羣的人將這些大石塊沿着金字塔內部的螺旋上升通道往上拖運,而後逐層堆砌而成,十萬多個工匠共用約20年的時間才完成的人類奇蹟,當年埃菲爾鐵塔還未建成時胡夫金字塔還曾是世界上最高的建築物。
地標: 盧浮宮
盧浮宮(法語:Musée du Louvre)位於法國巴黎市中心的塞納河北岸,位居世界四大博物館之首。始建於1204年,原是法國的王宮,居住過50位法國國王和王后,是法國文藝復興時期最珍貴的建築物之一,以收藏豐富的古典繪畫和雕刻而聞名於世。現爲盧浮宮博物館,佔地約198公頃,分新老兩部分,宮前的金字塔形玻璃入口,佔地面積爲24公頃,是華人建築大師貝聿銘設計的。1793年8月10日,盧浮宮藝術館正式對外開放,成爲一個博物館。盧浮宮已成爲世界著名的藝術殿堂,最大的藝術寶庫之一,是舉世矚目的萬寶之宮。
經過測試發現識別的效果很好,速度很快,配合自動調取的百度百科的內容描述,效果很是的棒。