一、概述
这里通过 python + PyQt5 + 百度AI 实现简单的图片识别工具。
二、流程
设计图片识别工具界面
选择识别类型
通用物体
菜品
车辆
选择要识别的图片
显示识别结果
三、开发工具准备
百度API接口
进入百度AI,注册登录后直接申请一个API,具体操作如下:
百度AI官网
进入官网,界面如下。
image
点击上图中的 图像识别 ,然后注册、登录。
image
登录后,直接创建图像识别的应用。
image
填写相关信息即可创建成功。
image
成功后,返回点击管理应用,可以得到百度API的相关参数(AppID, API Key, Secret Key)。
image
到这里,就算是准备好了图像识别最重要的工具。
最后,就是对百度API的使用了。如果不懂得如何使用百度API,可以通过查看官网上的相关文档。
python相关库的下载
下载百度API支持的库
pip install baidu-aip
下载PyQt5用于界面搭建
pip install PyQt5
鉴于python安装模块使用的镜像都是国外的,通常下载较慢,还经常下载失败,这里建议使用如下命令下载。
pip install PyQt5 -i https://pypi.douban.com/simple
四、搭建界面
通过PyQt5搭建图片识别工具界面。
image
五、识别结果
image
image
六、代码
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QFileDialog
class Ui_imageAI(object):
def setupUi(self, imageAI):
imageAI.setObjectName("imageAI")
imageAI.resize(724, 489) # 设置窗体大小
# 图片显示控件
self.image = QtWidgets.QLabel(imageAI)
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.widget = QtWidgets.QWidget(imageAI)
self.widget.setGeometry(QtCore.QRect(110, 50, 221, 31))
self.widget.setObjectName("widget")
# 选择识别类型
self.label = QtWidgets.QLabel(self.widget)
self.label.setObjectName("label")
# 下拉控件,用于选择识别类型
self.comboBox = QtWidgets.QComboBox(self.widget)
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
# 横向布局容器,包含 self.label self.comboBox
self.HBoxLayout = QtWidgets.QHBoxLayout(self.widget)
self.HBoxLayout.setContentsMargins(0, 0, 0, 0)
self.HBoxLayout.setObjectName("HBoxLayout")
self.HBoxLayout.addWidget(self.label)
self.HBoxLayout.addWidget(self.comboBox)
self.widget2 = QtWidgets.QWidget(imageAI)
self.widget2.setGeometry(QtCore.QRect(96, 90, 318, 31))
self.widget2.setObjectName("widget2")
# 选择要识别的图片
self.label2 = QtWidgets.QLabel(self.widget2)
self.label2.setObjectName("label2")
# 图片路径显示
self.lineEdit = QtWidgets.QLineEdit(self.widget2)
self.lineEdit.setObjectName("lineEdit")
# 图片路径选择Button
self.pushButton = QtWidgets.QPushButton(self.widget2)
self.pushButton.setObjectName("pushButton")
# 横向布局容器,包含 self.label2 self.lineEdit self.pushButton
self.HBoxLayout2 = QtWidgets.QHBoxLayout(self.widget2)
self.HBoxLayout2.setContentsMargins(0, 0, 0, 0)
self.HBoxLayout2.setObjectName("HBoxLayout2")
self.HBoxLayout2.addWidget(self.label2)
self.HBoxLayout2.addWidget(self.lineEdit)
self.HBoxLayout2.addWidget(self.pushButton)
self.widget3 = QtWidgets.QWidget(imageAI)
self.widget3.setGeometry(QtCore.QRect(450, 50, 201, 401))
self.widget3.setObjectName("widget3")
# 显示识别的结果
self.label3 = QtWidgets.QLabel(self.widget3)
self.label3.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label3.setWordWrap(True)
self.label3.setStyleSheet("border-width: 1px;border-style: solid;border-color: rgb(0, 0, 0);")
self.label3.setObjectName("label3")
# 复制Button
self.pushButton2 = QtWidgets.QPushButton(self.widget3)
self.pushButton2.setObjectName("pushButton2")
# 垂直布局容器,包含 self.label3 self.pushButton2
self.VBoxLayout = QtWidgets.QVBoxLayout(self.widget3)
self.VBoxLayout.setContentsMargins(0, 0, 0, 0)
self.VBoxLayout.setObjectName("VBoxLayout")
self.VBoxLayout.addWidget(self.label3)
self.VBoxLayout.addWidget(self.pushButton2)
self.retranslateUi(imageAI)
QtCore.QMetaObject.connectSlotsByName(imageAI)
def retranslateUi(self, imageAI):
_translate = QtCore.QCoreApplication.translate
imageAI.setWindowTitle(_translate("imageAI", "图像识别工具"))
self.label.setText(_translate("imageAI", "选择识别类型"))
self.comboBox.setItemText(0, _translate("imageAI", "通用物体"))
self.comboBox.setItemText(1, _translate("imageAI", "菜品"))
self.comboBox.setItemText(2, _translate("imageAI", "车辆"))
self.label2.setText(_translate("imageAI", "选择要识别的图片"))
self.pushButton.setText(_translate("imageAI", "..."))
self.pushButton.clicked.connect(self.openfile)
self.label3.setText(_translate("imageAI", "显示识别结果"))
self.pushButton2.setText(_translate("imageAI", "复制结果"))
self.pushButton2.clicked.connect(self.copyText)
def openfile(self):
self.path = QFileDialog.getOpenFileName(self.widget2, "选择要识别的图片", "/", "Image Files(*.jpg *.png")
print(self.path)
if not self.path[0].strip():
pass
else:
self.lineEdit.setText(self.path[0])
pixmap = QPixmap(self.path[0])
scaledPixmap = pixmap.scaled(QtCore.QSize(311, 301), aspectRatioMode=Qt.KeepAspectRatio)
self.image.setPixmap(scaledPixmap)
self.image.show()
self.imageDetect()
pass
def copyText(self):
clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(self.label3.text())
def imageDetect(self):
'''
图片识别主函数,通过检测 comboBox 中的值来进行相应的识别
:return:
'''
# 通用物体识别
if self.comboBox.currentText() == "通用物体":
AI = AI_image_classify()
result = AI.get_general(self.path[0])
text = ''
for key, value in result[0].items():
text = text + str(key) + ':' + str(value) + '\n'
text = text + '\n'
self.label3.setText(text)
# 菜品识别
elif self.comboBox.currentText() == "菜品":
AI = AI_image_classify()
result = AI.get_dish(self.path[0])
text = ''
for key, value in result[0].items():
text = text + str(key) + ':' + str(value) + '\n'
text = text + '\n'
self.label3.setText(text)
elif self.comboBox.currentText() == "车辆":
AI = AI_image_classify()
result = AI.get_car(self.path[0])
text = ''
for key, value in result[0].items():
text = text + str(key) + ':' + str(value) + '\n'
text = text + '\n'
self.label3.setText(text)
class AI_image_classify(object):
AppID = '16612216'
API_Key = '7SUIDjrUt01HcUXD9kbBvLan'
Secret_Key = 'OKHysIXt3nGNjTiPfjSiyBjntGq8XRlY'
client = AipImageClassify(AppID, API_Key, Secret_Key)
def get_file_content(self, filePath):
'''
读取图片
:param filePath: 图片路径
:return:
'''
with open(filePath, 'rb') as fp:
return fp.read()
def get_general(self, filePath):
'''
通用物体识别
:param filePath: 读取的图片的路径
:return: AI识别的结果
'''
image = self.get_file_content(filePath)
return self.client.advancedGeneral(image)['result']
def get_dish(self, filePath):
'''
菜品识别
:param filePath: 读取的图片的路径
:return: AI识别的结果
'''
image = self.get_file_content(filePath)
return self.client.dishDetect(image)['result']
def get_car(self, filePath):
'''
车辆识别
:param filePath: 读取的图片的路径
:return: AI识别的结果
'''
image = self.get_file_content(filePath)
return self.client.carDetect(image)['result']
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
Ui = Ui_imageAI()
Ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())