利用Python实现图像识别工具

一、概述

这里通过 python + PyQt5 + 百度AI 实现简单的图片识别工具。

二、流程

  1. 设计图片识别工具界面

  2. 选择识别类型

    • 通用物体
    • 菜品
    • 车辆
  3. 选择要识别的图片

  4. 显示识别结果

三、开发工具准备

  1. 百度API接口

进入百度AI,注册登录后直接申请一个API,具体操作如下:
百度AI官网

进入官网,界面如下。

image

点击上图中的 图像识别 ,然后注册、登录。

image

登录后,直接创建图像识别的应用。

image

填写相关信息即可创建成功。

image

成功后,返回点击管理应用,可以得到百度API的相关参数(AppID, API Key, Secret Key)。

image

到这里,就算是准备好了图像识别最重要的工具。

最后,就是对百度API的使用了。如果不懂得如何使用百度API,可以通过查看官网上的相关文档。

百度图像识别AI的python使用

  1. 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_())

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容