AI圖像識別

使用百度AI圖像識別提供的API接口來搭建識圖工具,首先要註冊百度開發者帳號,而後找到圖像識別頁面,建立應用,申請成功後會給兩個重要的數據API Key ,Secret Key,這是實現識圖的重要參數,以動物識別爲例:json

獲取access_token接口app

import urllib, urllib2, sys
import ssl

# client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官網獲取的AK】&client_secret=【官網獲取的SK】'
request = urllib2.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib2.urlopen(request)
content = response.read()
if (content):
    print(content)

識別圖像接口ide

這是百度給的請求方法,返回的content是json數據格式,須要使用loads方法轉換爲Python對象,token的獲取也給了方法能夠調用工具

# encoding:utf-8
import base64
import urllib
import urllib2

'''
動物識別
'''

request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"

# 二進制方式打開圖片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())

params = {"image":img,"top_num":6}
params = urllib.urlencode(params)

access_token = '[調用鑑權接口獲取的token]'
request_url = request_url + "?access_token=" + access_token
request = urllib2.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
response = urllib2.urlopen(request)
content = response.read()
if content:
    print content

製做識圖工具使用Pyqt5這個模塊,也比較簡單佈局

import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QFileDialog

import json
import base64
import urllib
import urllib.request

""" 你的 APPID AK SK """
# http://ai.baidu.com/docs#/OCR-Pricing/top 申請地址

# API_KEY 爲官網獲取的AK, SECRET_KEY 爲官網獲取的SK


API_KEY = 'API_KEY'
SECRET_KEY = 'SECRET_KEY'

#qt自動生成的UI類
class Ui_Form(object):
    def setupUi(self, Form):
        #設置窗體名稱
        Form.setObjectName("Form")
        # 設置窗體大小
        Form.resize(724, 489)
        # 建立顯示要識別圖片控件
        self.image = QtWidgets.QLabel(Form)
        # 設置控件大小
        self.image.setGeometry(QtCore.QRect(96, 140, 311, 301))
        # 設置黑色邊框
        self.image.setStyleSheet("border-width: 1px;border-style: solid;border-color: rgb(0, 0, 0);")
        # 設置圖片顯示控件名稱
        self.image.setObjectName("image")
        # 建立窗體
        self.widget = QtWidgets.QWidget(Form)
        # 窗體大小
        self.widget.setGeometry(QtCore.QRect(110, 50, 221, 31))
        # 設置名稱
        self.widget.setObjectName("widget")
        # 建立佈局容器控件
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        # 設置容器中內容邊距
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        # 設置名稱
        self.horizontalLayout.setObjectName("horizontalLayout")
        # 建立文字顯示控件
        self.label = QtWidgets.QLabel(self.widget)
        # 設置名稱
        self.label.setObjectName("label")
        # 把文字顯示控件添加到佈局容器中
        self.horizontalLayout.addWidget(self.label)
        # 在窗體裏建立選擇內容控件
        self.comboBox = QtWidgets.QComboBox(self.widget)
        # 設置名稱
        self.comboBox.setObjectName("comboBox")
        # 添加子標題有多少分類添加幾個
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        # 把下拉選擇控件添加到佈局容器中
        self.horizontalLayout.addWidget(self.comboBox)
        # 建立窗體
        self.widget1 = QtWidgets.QWidget(Form)
        # 建立窗體大小
        self.widget1.setGeometry(QtCore.QRect(96, 90, 318, 31))
        # 建立名稱
        self.widget1.setObjectName("widget1")
        # 新建橫向佈局
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget1)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.widget1)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.lineEdit = QtWidgets.QLineEdit(self.widget1)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout_2.addWidget(self.lineEdit)
        # 新建按鈕
        self.pushButton = QtWidgets.QPushButton(self.widget1)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_2.addWidget(self.pushButton)
        self.widget2 = QtWidgets.QWidget(Form)
        self.widget2.setGeometry(QtCore.QRect(450, 50, 201, 401))
        self.widget2.setObjectName("widget2")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.widget2)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_3 = QtWidgets.QLabel(self.widget2)
        self.label_3.setLayoutDirection(QtCore.Qt.LeftToRight)
        # 設置內容自動換行
        self.label_3.setWordWrap(True)
        # 設置黑色邊框
        self.label_3.setStyleSheet("border-width: 1px;border-style: solid;border-color: rgb(0, 0, 0);")
        self.label_3.setObjectName("label_3")
        self.verticalLayout.addWidget(self.label_3)
        self.pushButton_2 = QtWidgets.QPushButton(self.widget2)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        # 自動生成的ui控件 處理方法
        self.retranslateUi(Form)
        # 自動生成的  關聯信號槽
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        # 設置窗體內容
        Form.setWindowTitle(_translate("Form", "圖像識別工具"))
        # 設置文字控件顯示內容
        self.label.setText(_translate("Form", "選擇識別類型:"))
        # 設置下拉控件選項內容
        self.comboBox.setItemText(0, _translate("Form", "菜品"))
        self.comboBox.setItemText(1, _translate("Form", "植物"))
        self.comboBox.setItemText(2, _translate("Form", "動物"))
        self.comboBox.setItemText(3, _translate("Form", "通用物體和場景"))
        self.comboBox.setItemText(4, _translate("Form", "紅酒"))
        self.comboBox.setItemText(5, _translate("Form", "貨幣"))
        self.comboBox.setItemText(6, _translate("Form", "花卉"))
        self.comboBox.setItemText(7, _translate("Form", "果蔬類食材"))
        self.comboBox.setItemText(8, _translate("Form", "地標"))
        self.comboBox.setItemText(9, _translate("Form", "車型"))
        self.comboBox.setItemText(10, _translate("Form", "Logo"))
        # 設置控件顯示文字
        self.label_2.setText(_translate("Form", "選擇要識別的圖片:"))
        # 設置按鈕顯示的文字
        self.pushButton.setText(_translate("Form", "選擇..."))
        # 設置文本控件顯示內容
        self.label_3.setText(_translate("Form", "顯示識別結果"))
        # 設置按鈕內容
        self.pushButton_2.setText(_translate("Form", "複製到剪切版"))
        # 爲按鈕設置方法
        self.pushButton.clicked.connect(self.openfile)
        # 爲按鈕設置點擊方法
        self.pushButton_2.clicked.connect(self.copyText)
    # 複製文字到剪貼板方法
    def copyText(self):
        # 複製文字到剪貼板
        clipboard = QApplication.clipboard()
        # 設置複製的內容
        clipboard.setText(self.label_3.text())
    # 打開文件選擇對話框方法
    def openfile(self):
        # 啓動選擇文件對話空,查找jpg以及png圖片
        self.download_path = QFileDialog.getOpenFileName(self.widget1, "選擇要識別的圖片", "/", "Image Files(*.jpg *.png)")
        # 判斷是否選擇圖片
        if not self.download_path[0].strip():
            # 沒有選擇圖片
            pass
        else:
            # 選擇圖片執行如下內容
            # 設置圖片路徑
            self.lineEdit.setText(self.download_path[0])
            # 理由pixmap解析圖片
            pixmap = QPixmap(self.download_path[0])
            # 等比例縮放圖片
            scaredPixmap = pixmap.scaled(QSize(311, 301), aspectRatioMode=Qt.KeepAspectRatio)
            # 設置圖片
            self.image.setPixmap(scaredPixmap)
            # 判斷選擇的類型 根據類型作相應的圖片處理
            self.image.show()
            # 判斷選擇的類型
            self.typeTp()
            pass

    # 判斷選擇的類型 進行相應處理
    def typeTp(self):
        # 菜品識別
        if self.comboBox.currentIndex() == 0:
            #self.get_bankcard(self.get_token())
            self.get_dishDetect(self.get_token())
            pass
        # 植物識別
        elif self.comboBox.currentIndex() == 1:
            self.get_plant(self.get_token())
            pass
        # 動物識別
        elif self.comboBox.currentIndex() == 2:
            self.get_animal(self.get_token())
            pass
        #通用識別
        elif self.comboBox.currentIndex() == 3:
            self.get_advanced_general(self.get_token())
            pass
        # 紅酒識別
        elif self.comboBox.currentIndex() == 4:
            self.get_redwine(self.get_token())
            pass
        # 貨幣識別
        elif self.comboBox.currentIndex() == 5:
            self.get_currency(self.get_token())
            pass
        # 花卉識別
        elif self.comboBox.currentIndex() == 6:
            self.get_flower(self.get_token())
            pass
        # 果蔬類識別
        elif self.comboBox.currentIndex() == 7:
            self.get_ingredient(self.get_token())
            pass
        # 地標識別
        elif self.comboBox.currentIndex() == 8:
            self.get_landmark(self.get_token())
            pass
        # 車型識別
        elif self.comboBox.currentIndex() == 9:
            self.get_car(self.get_token())
            pass
        # Logo識別
        elif self.comboBox.currentIndex() == 10:
            self.get_logo(self.get_token())
            pass
        pass

    # 百度提供方法 獲取token
    def get_token(self):
        # client_id 爲官網獲取的AK, client_secret 爲官網獲取的SK
        host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + API_KEY + '&client_secret=' + SECRET_KEY
        # 發送請求
        request = urllib.request.Request(host)
        # 添加請求頭
        request.add_header('Content-Type', 'application/json; charset=UTF-8')
        # 獲取返回內容
        response = urllib.request.urlopen(request)
        # 讀取返回內容
        content = response.read()
        # 判斷內容是否爲空
        if (content):
            # 打印內容
            print(content)
            # 打印token
            print(json.loads(content)['access_token'])
            # 使用json解析出token 設置token
            self.access_token = json.loads(content)['access_token']
            # 返回token
            return self.access_token
    #菜品識別
    def get_dishDetect(self, access_token):
        request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/dish"
        # 二進制方式打開圖片文件
        f = self.get_file_content(self.download_path[0])
        img = base64.b64encode(f)
        params = {"image": img,"top_num":5}
        params = urllib.parse.urlencode(params).encode('utf-8')
        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()
        if content:
            # 解析返回數據
            dishDetect = json.loads(content)
            # 輸出返回結果
            strover = '識別結果:\n'
            # 捕捉異常判斷是否正確返回信息
            try:
                # i = 1
                # for dish in dishDetect['result']:
                #     strover += '{} 菜名:{} \n  卡路里:{} \n'.format(i, dish['name'], dish['calorie'])
                #     i += 1
                dish_result=dishDetect['result']
                # 名稱
                name = dish_result[0]['name']
                strover += ' 名稱:\n  {} \n '.format(name)
                # 能量
                calorie = dish_result[0]['calorie']
                strover += ' 卡路里:{} \n '.format(calorie)
              

            # 錯誤的時候提示錯誤緣由
            except BaseException:
                error_msg = dish_result['error_msg']
                strover += '  錯誤:\n {} \n '.format(error_msg)
            # 設置識別顯示結果
            self.label_3.setText(strover)
    # 1植物識別
    def get_plant(self, access_token):
        request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/plant"
        # 二進制方式打開圖片文件
        f = self.get_file_content(self.download_path[0])
        # 轉換圖片
        img = base64.b64encode(f)
        # 拼接圖片參數
        params = {"image": img}
        params = urllib.parse.urlencode(params).encode('utf-8')
        # 請求地址
        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()
        #print(content)
        # 內容判斷
        if content:
            plants = json.loads(content)
            strover = '識別結果:\n'
            try:
                i = 1
                for plant in plants['result']:
                    strover += '{} 植物名稱:{} \n'.format(i, plant['name'])
                    i += 1
            except BaseException:
                error_msg = plants['error_msg']
                strover += '  錯誤:\n {} \n '.format(error_msg)
            self.label_3.setText(strover)
    # 2動物識別
    def get_animal(self, access_token):
        request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"
        # 二進制方式打開圖片文件
        f = self.get_file_content(self.download_path[0])
        img = base64.b64encode(f)
        params = {"image": img, "top_num": 6}
        params = urllib.parse.urlencode(params).encode('utf-8')
        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()
        if content:
            animals = json.loads(content)
            strover = '識別結果:\n'
            try:
                i = 1
                for animal in animals['result']:
                   strover += '{} 動物名稱:{} \n'.format(i, animal['name'])
                   i += 1
            except BaseException:
                error_msg = animals['error_msg']
                strover += '  錯誤:\n {} \n '.format(error_msg)
            self.label_3.setText(strover)
    # 3 通用物體識別
    def get_advanced_general(self, access_token):
        request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general"
        # 二進制方式打開圖片文件
        f = self.get_file_content(self.download_path[0])
        img = base64.b64encode(f)
        params = {"image": img}
        params = urllib.parse.urlencode(params).encode('utf-8')
        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()
        if content:
            general_result = json.loads(content)
            strover = '識別結果:\n'
            try:
                i=1
                for general in general_result['result']:
                    #票據內容
                    root =general['root']
                    keyword=general['keyword']
                    strover += '{} 物體標籤:{} \n  物體名稱:{} \n'.format(i, root, keyword)
                    i+=1
            except BaseException:
                error_msg = general_result['error_msg']
                strover += '  錯誤:\n {} \n '.format(error_msg)
            self.label_3.setText(strover)
    
    #4紅酒識別
    def get_redwine(self,access_token):
        request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/redwine"
        # 二進制方式打開圖片文件
        f = self.get_file_content(self.download_path[0])
        img = base64.b64encode(f)
        params = {"image": img}
        params = urllib.parse.urlencode(params).encode('utf-8')
        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()
        if content:
            redwine = json.loads(content)
            strover = '識別結果:\n'
            hasdetail=redwine['result']['hasdetail']
            try:
                wine_result=redwine['result']
                if hasdetail==0:
                    
            #print(wine_result)
                    wineNameCn = wine_result['wineNameCn']
                    strover += ' 名稱:\n  {} \n '.format(wineNameCn)
                else:
                    # 紅酒名稱
                    wine_name = wine_result['subRegionCn']
                    strover += ' 名稱:\n  {} \n '.format(wine_name)
                    # 紅酒品牌
                    wineNameCn = wine_result['wineNameCn']
                    strover += ' 品牌:{} \n '.format(wineNameCn)
                    # 顏色
                    color = wine_result['color']
                    strover += '  顏色:{} \n '.format(color)
                    # 類型
                    classifyBySugar = wine_result['classifyBySugar']
                    strover += '  類型:{} \n '.format(classifyBySugar)
                    # 溫度
                    tasteTemperature = wine_result['tasteTemperature']
                    strover += '  溫度:{} \n '.format(tasteTemperature)
                    # 地址
                    countryCn = wine_result['countryCn']
                    strover += '  地址:\n{}\n '.format(countryCn)
                    #描述
                    description = wine_result['description']
                    strover += '  描述:\n{}\n '.format(description)
            except BaseException:
                error_msg=wine_result['error_msg']
                strover += '  錯誤:\n  {} \n '.format(error_msg)
            self.label_3.setText(strover)         

    # #5 貨幣識別
    def get_currency(self, access_token):
        request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/currency"
        # 二進制方式打開圖片文件
        f = self.get_file_content(self.download_path[0])
        img = base64.b64encode(f)
        params = {"image": img}
        params = urllib.parse.urlencode(params).encode('utf-8')
        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()
        if content:
            currency = json.loads(content)
            strover = '識別結果:\n'
            try:
                currency_result = currency['result']
                
                currencyName = currency_result['currencyName']
                strover += '  貨幣類型:\n{} \n '.format(currencyName)
                # 民族
                year = currency_result['year']
                strover += '  年份:{} \n '.format(year)
                # 面值
                currencyDenomination = currency_result['currencyDenomination']
                strover += '  姓名:{} \n '.format(currencyDenomination)
            except BaseException:
                error_msg = currency_result['error_msg']
                strover += '  錯誤:\n  {} \n '.format(error_msg)
            # 顯示識別結果
            self.label_3.setText(strover)

    # 讀取圖片
    def get_file_content(self, filePath):
        with open(filePath, 'rb') as fp:
            return fp.read()

# 程序主方法
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    # 初始化窗體
    ui = Ui_Form()
    # 調用建立窗體方法
    ui.setupUi(MainWindow)
    # 顯示窗體
    MainWindow.show()
    sys.exit(app.exec_())
View Code

相關文章
相關標籤/搜索