本文主要介绍如何使用Python编写一个百度智能图像识别项目。文章中的样例代码讲解的很详细,对我们学习Python很有帮助。有需要的可以参考一下。
这是我们最终的结果,那我们就来看看如何实现吧!超级简单好用!
首先需要先配置pyqt5的资源,这里就不说安装包了(pip或者pycharm可以直接添加解决的问题,就不一一赘述了)。直接说环境配置和路径吧(所有配置都在文件-设置-工具-外部工具):
1.配置designer.exe。
如果之前没有安装,需要点击加号添加。这里只要注意工作目录和程序的正确配置就可以了(一定要正确,不然以后用designer的时候自己手动导入就麻烦了)。点击增加后,会出现这个界面,然后可以输入以下数据。
工作目录不确定前面是哪个磁盘,但是后面的路径都是一样的。
program Files \ PycharmProjects \ python project \ Lib \ site-packages \ qt5 _ applications \ Qt \ bin \ designer . exe
程序不需要改变
$ProjectFileDir$
2.之后,我们需要配置pyuic。这一步也很关键,保证了我们做出来的窗口界面会被翻译成python语言。没有这一步,只能手工编码(涉及到自己敲代码实现窗口)。同样,单击加号。
然后输入以下内容:
程序(同样的道理,存在哪个盘可能不确定,但是自己设定,但是下面的路径都是一样的)
program Files \ PycharmProjects \ python project \ Scripts \ pyuic 5 . exe
参数(参数也不能有问题):
$ FileName $-o $ FileName without text tension $。巴拉圭
工作目录(这一定不能出错)
$FileDir$
3.然后,我们现在还可以添加一个pyrcc.exe(主要是把图片转换成可用的文件,比如导入图标之类的)
程序
program Files \ PycharmProjects \ python project \ Scripts \ pyr cc5 . exe
争论
$ FileName $-o $ FileName without text tension $ _ RC . py
工作目录
$FileDir$
所以现在,我们和配置都完成了,接下来就是代码的问题。
首先,我们打开我们导入的外部工具Qt designer。
进去之后,页面是这样的:
我们可以直接创建一个主窗口。
我们要实现的窗口大致如下:
所以现在我们需要开始收拾东西:
先选中按钮,然后可以随意改变它的大小和字体。
然后我们编辑第一个信号和插槽功能:按下F4,点击按钮,拖出一条红线,放在喜欢的位置,选择“显示从QWidget继承的信号和插槽”。然后我们点击clicked()(意为点击),再选择close()(意为关闭)。当点击时,它将被关闭。
然后Ctrl R就可以测试功能了,就是点击退出。
请选择这样的图片,这需要我们在python代码中手动添加信号和槽。但为了方便写手码,我们最好双击更改它的备注。(如下)
然后先加上我们需要的零件。
双击combox来添加它。
之后就是文字和图片的位置了。我们统一使用Label(所以记住要改名字以防混淆)
当添加到显示的图片和路径中时,我们可以如下更改它们的背景颜色:
然后就变白了。
至此,我们已经完成了窗口的工作。当然,我们也可以添加一个小窗口图标,让它打开时有一个图标:(还要注意,combox的新项目被重命名了)
之后,我们单击文件并保存它:
现在我们回到pycharm,我们可以看到我们的文件:
用Py uic,翻译成python代码,因为python打不开ui文件。
此时,将生成一个AIrecognition.py文件。
在这里,我们可以导入一些必要的包(模块),如下:这些包做什么我们后面再说。
导入json,sys
从PyQt5导入QtCore、QtGui、QtWidgets
来自PyQt5。QtWidgets导入QGraphicsWidget,QApplication,QFileDialog
来自PyQt5。QtGui导入*
来自PyQt5。QtCore导入*
导入simplejson,请求
导入测试_rc
导入urllib,urllib.request
导入base64,ssl
正如你所看到的,在我们命名它之后,更容易找到相应的插槽来写信号:
接下来,让我们编写一个打开图像的信号和插槽函数(在py文件的底部)。这里需要注意的是,打开的窗口是主窗口,它必须存在,否则会报错:
self . choose picture . clicked . connect(self . openfile)
def openfile(自身):
self . download _ path=qfiledialog . getopen filename(self . central widget,'请选择要识别的图片','/',
图像文件(*。jpg *。gif *。png *。jpeg)')
如果不是self.download_path[0]。strip():
及格
否则:
print(self.download_path[0])
self . filedirectory . settext(self . download _ path[0])
pix map=qpix map(self . download _ path[0])
scarePixmap=pixmap . scaled(QSize(421,281),aspectRatioMode=Qt。KeepAspectRatio)
self . picturedisplay . setpixmap(scare pixmap)
self.typeTp()
由于我们将选择图片的按钮的名称更改为choosepicture,所以此时直接使用它来生成信号是很好的。
然后我们也写一个slot函数来显示图片的路径和打开图片后的样子。所以这些函数都是在槽函数中实现的:
显示图片路径的标签名是filedirectory,显示图片的标签名是picturedisplay,所以我们在使用setText和setPixmap的时候,只需要直接使用这两个名字就可以了。这样就实现了文字显示和图片显示(具体的代码和功能,比如QPixmap就不详细描述了,因为涉及的知识点会比较多,只能自己上网查了!)
现在,我们已经完成了这个信号和槽,只需要接入百度识别的系统。
让我们来看看:
点击搜索百度ai,进入后选择图像识别,打开技术文档:
可以看到python语言如何访问API及其返回示例(我们展示图片信息时需要注意这个返回示例)。
当然之后还需要注册自己的百度AI账号,找到自己的API_Key和Secret_Key。
注册后,点击左上角的三个栏,然后选择图像识别。
然后创建一个应用程序(我在这里,我已经创建了它,只需简单地写和写信息)
点进去之后,可以查看你的API_Key和Secret_Key。
然后选择一些我们需要的鉴定物品(不用担心,免费使用的数量足够)
然后输入刚才access和return的例子并复制到python代码中(导入的模块写在上面)。
注意,上面的写槽函数实现了图片代码中typeTP的打开。我们必须依赖这个接入网络,所以我们必须编写函数。由于combox在设计窗口界面时已经被重命名为choices,所以我们可以在这里使用choices。
这里我们写了一个接受令牌值的函数。我们还需要改进它的功能,访问API并正常返回令牌值。
定义类型Tp(自身):
#工厂标识
if self . choices . current index()==0:
self.get_token()
self.get_plants(self.get_token())
#动物识别
if self . choices . current index()==1:
self.get_token()
self . get _ animals(self . get _ token())
#徽标识别
if self . choices . current index()==2:
self.get_token()
self.get_logo(self.get_token())
这里,我们需要导入一些新的包。不过我在开头已经给出了所有需要导入的包,这里就不介绍了(比如simplejson,request)。
def get_token(自身):
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(主机)
request . add _ header(' Content-Type ',' application/JSON;charset=UTF-8 ')
响应=urllib。请求。urlopen(请求)
token_content=response.read()
如果令牌_内容:
token _ info=简单JSON。loads(token _ content。解码(' utf-8 '))
令牌密钥=令牌信息['访问令牌]
打印(令牌密钥)
打印(令牌内容)
返回令牌_密钥
那么我们只演示其中的几个案例,植物和动物和logo,其他的接入都一样,在此之前,我们书写一个函数来处理冗余的代码问题(因为就像能在百度提供的接口代码一样,很多都是一样的,除了接受返回值):
# 为了解决代码的冗余问题,使用函数来接入网站,而后再在子函数里实现获取价值
def get_website(self,token_key,k):
网站列表=[' https://AIP。白杜布斯。' com/rest/2.0/image-classify/v1/plant ',
'https://aip.baidubce.com/rest/2.0/image-classify/v1/animal',
https://AIP。白杜布斯。' com/rest/2.0/image-classify/v2/logo ']
请求_url=网站列表[k]
f=open(self.download_path[0],' rb ')
img=base64.b64encode(f.read())
params={'image': img}
访问令牌=令牌密钥
'请求url=请求网址?访问令牌='访问令牌
headers={ ' content-type ':' application/x-www-form-urlencoded ' }
响应=请求。post(请求URL,数据=参数,标题=标题)
如果响应:
return response.json()
可以看到,这里返回的是一个回应,也就是我们需要的一些内容(令牌_密钥的值),
def get_plants(self,token_key):
植物=自我。get _ website(token _ key,0)
strover='识别结果如下:\n '
strover='辨认种类:{}\n辨认置信度:{}\n' \。格式(植物['结果'][0]['名称'],植物['结果'][0]['分数']) \
\n其他可能植物:\n1 .{}\n2 .{}\n' \。格式(植物['结果'][1]['名称'],植物['结果'][2]['名称'])
自我。pictureinfo。settext
def get_animals(self,token_key):
动物=自我。get _ website(令牌_密钥,1)
strover='识别结果如下:\n '
strover='辨认种类:{}\n辨认置信度:{}\n' \。格式(动物['结果'][0]['名称'],动物['结果'][0]['分数']) \
\n其他可能动物:\n1 .{}\n2 .{}\n' \。格式(动物['结果'][1]['名称'],动物['结果'][2]['名称'])
自我。pictureinfo。settext
def get_logo(self,token_key):
logos=自我。get _ website(token _ key,2)
strover='识别结果如下:\n '
strover='辨认种类:{}\n辨认置信度:{}\n' \。格式(徽标['结果'][0]['名称'],徽标['结果'][0]['概率'])
自我。pictureinfo。settext
我们使用斯特罗沃来接受返回的内容,这时候我们需要查看返回的示例了(以植物为例):
可以看到,它返回了一个字典,那么我们就需要提取字典里的信息,也就是上面的代码所给出的:
def get_plants(self,token_key):
植物=自我。get _ website(token _ key,0)
strover='识别结果如下:\n '
strover='辨认种类:{}\n辨认置信度:{}\n' \。格式(植物['结果'][0]['名称'],植物['结果'][0]['分数']) \
\n其他可能植物:\n1 .{}\n2 .{}\n' \。格式(植物['结果'][1]['名称'],植物['结果'][2]['名称'])
自我。pictureinfo。settext
字典的一些基本操作就不多解释了,所以,我们就这样成功的获取了信息。
其他的识别也可以以此类推,所以,我们就实现了智能识别(基于百度AI)。当然,要记得写入自己的阿拉斯加和SK,不然也无法识别。
当然了,只是这样是无法运行这个代码的,我们还需要一个测试文件:
从空气认知导入*
if __name__=='__main__ ':
app=QA application(sys . argv)
main=QtWidgets。QMainWindow()
ui=Ui_MainWindow()
ui.setupUi(main)
main.show()
sys.exit(app.exec_())
那我们来看看效果:
效果很好。当然我们看到这个表头什么都没有,很丑。我们可以手写:
Test _ RC不能更小。
icon=QtGui。QIcon()
icon.addPixmap(QtGui。QPixmap(':/new/Lib/school bus . ico '),QtGui。QIcon .正常,QtGui。QIcon.Off)
MainWindow.setWindowIcon(图标)
同时,我们也可以设置一些标题词来改变主窗口:
只要把这个地方变成我们想要的样子:
以上是百度智能图像识别在Python实战中实现的详细内容。更多关于Python图像识别的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。