PyQT5调用百度大脑AI开放平台实现动物种类识别

190 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

目前许多手机的浏览器自带识图功能,但是识别的精度忽高忽低,百度AI大脑开放平台已经集成了许多种类的图片识别、和语音识别。 注册地址如下 ai.baidu.com/?track=cp:a…

image.png

里面有一些帮助文档 ai.baidu.com/ai-doc/REFE…

可以看一下,在里面选择图像识别,然后“创建应用”,申请自己的ID和KEY。

界面代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(899, 720)
        self.horizontalLayoutWidget = QtWidgets.QWidget(Form)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 741, 711))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_2 = QtWidgets.QLabel(self.horizontalLayoutWidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout.addWidget(self.label_2)
        self.verticalLayoutWidget = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(750, 0, 141, 171))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.verticalLayoutWidget_2 = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(750, 170, 141, 81))
        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.label = QtWidgets.QLabel(self.verticalLayoutWidget_2)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout_2.addWidget(self.label)
        self.verticalLayoutWidget_3 = QtWidgets.QWidget(Form)
        self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(750, 250, 141, 461))
        self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.textEdit = QtWidgets.QTextEdit(self.verticalLayoutWidget_3)
        self.textEdit.setReadOnly(True)
        self.textEdit.setObjectName("textEdit")
        self.verticalLayout_3.addWidget(self.textEdit)

        self.retranslateUi(Form)
        self.pushButton.clicked.connect(Form.OpenFile)
        self.pushButton_2.clicked.connect(Form.StartDetect)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label_2.setText(_translate("Form", "TextLabel"))
        self.pushButton.setText(_translate("Form", "打开图片"))
        self.pushButton_2.setText(_translate("Form", "动物识别"))
        self.label.setText(_translate("Form", "识别结果"))

界面运行时这个样子的

image.png

主函数如下

import requests
from DetectUI import Ui_Form
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import cv2
import sys
import base64

class MainWindow(QMainWindow, Ui_Form):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent=parent)
        self.setupUi(self)
        self.file_path = None
        self.msg = QMessageBox()

    # 只运行一次即可,主要用于获取access_token,下面检测时需要这个access_token
    def get_access_tocken(self):
        # encoding:utf-8
        # client_id 为官网获取的SK, client_secret 为官网获取的SK
        host = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&client_secret=0rDSjzQ20XUj5itV6WRtznPQSzr5pVw2&"
        response = requests.get(host)
        if response:
            print(response.json()['access_token'])

    # 获取文件地址函数
    def getFileDir(self):
        try:
            self.file_path = QFileDialog.getOpenFileName(self, "select file", "./", "Image File(*.png *.jpg *.jpeg *.bmp)")
        except Exception as e:
            print(e)
        return self.file_path

    def OpenFile(self):
        filePath = self.getFileDir()
        print(filePath)
        if filePath[0] != '' and filePath[1] != '':
            img = cv2.imread(filePath[0])
            self.label_2.setScaledContents(True)
            img_dis = QImage(img, img.shape[1], img.shape[0],img.shape[1] * 3, QImage.Format_BGR888)
            # 加载图片,并设定图片大小
            img_dis = QPixmap(img_dis)# .scaled(int(img.shape[1]), int(img.shape[0]))
            self.label_2.setPixmap(img_dis)
        else:
            QMessageBox.information(QWidget(), '警告!', '请先打开一幅图像', QMessageBox.Yes)

    def StartDetect(self):
        if self.file_path is not None and self.file_path[0] != '' and self.file_path[1] != '':
            request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"
            # 二进制方式打开图片文件
            f = open(self.file_path[0], 'rb')
            img = base64.b64encode(f.read())
            f.close()
            params = {"image": img, "top_num": 3}  # 返回前3个概率比较大的
            access_token = 'your access_token'
            request_url = request_url + "?access_token=" + access_token
            headers = {'content-type': 'application/x-www-form-urlencoded'}
            response = requests.post(request_url, data=params, headers=headers)
            if response:
                self.textEdit.append("物种:"+str(response.json()['result'][0]['name'])+"\n")
                self.textEdit.append("准确率:"+str(response.json()['result'][0]['score']))
        else:
            QMessageBox.information(QWidget(), '警告!', '无法检测到图像!请确认是否打开图像!', QMessageBox.Yes)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

执行结果如下

image.png

image.png

项目非常简单,权当学习之余的玩乐,如果有需要补充和规范的可以在评论区告诉我,我会在以后的博客中注意这些问题,并对这些存在问题的博客进行修改。