基于python的本地选择图像接入百度云api的图像识别项目

张开发
2026/4/3 15:12:58 15 分钟阅读
基于python的本地选择图像接入百度云api的图像识别项目
项目灵感来源于老师布置的任务。怎么感觉老师这个题目也是ai生成的~。~题目基于 AI 视觉的本地图像分析脚本任务要求请使用 Python 编写一个通用的图像分析脚本具体流程需满足以下三个步骤* 本地选图程序运行后自动弹出文件选择窗口让用户手动选择一张本地图片。* 云端识别调用视觉大模型API如火山引擎对图片进行分析* 结果输出在终端控制台直接打印出大模型返回的完整分析结果。我的思路是先解决图像识别然后加入弹窗。一、本地图像识别跟连熟悉代码流程首先去百度云实名认证领一下KEY可以简单参考怎么获取API就行Python结合百度API实现高效图像识别从入门到实战-百度开发者中心百度云的图像识别网址如下图像识别-百度智能云教程参考抖音博主跟练一遍理解流程但是他代码有点小bug还有考虑自己电脑的适配性可以问AI我把抖音博主视频链接放在下面7.46 复制打开抖音看看【不说爱你到永久的作品】本身想着懒一点来着的 基于百度智能云的API进行... https://v.douyin.com/bAxLTonFRLc/ kp.qe SLw:/ 04/13注意一下这个是比较两张图片的代码并且没有终端显示所有信息只显示了部分信息。然后下面是我的代码import requests #用于发送http请求 import base64 #用于将图片转换为base64编码以字符串流形式传递 API_KEY 放你的 SECRET_KEY 放你的 通用物体和场景识别 #定义本地图片路径告诉程序那里打开 image_path_1 C:/Users/86135/Desktop/pic_classify/image_1.jpg image_path_2 C:/Users/86135/Desktop/pic_classify/image_2.jpg def get_access_token(): url https://aip.baidubce.com/oauth/2.0/token params { grant_type: client_credentials, client_id: API_KEY, client_secret: SECRET_KEY } return requests.post(url, paramsparams).json().get(access_token) #定义一个参数用于打开路径图片打开后base64编码然后关闭 def recognize_image(image_path): #以二进制形式打开图片文件 f open(image_path, rb) img base64.b64encode(f.read()).decode(utf-8) # 转为字符串 f.close() #使用字典构建请求函数将编码后的图片进行传参 params {image: img} #放置申请到的接口 #access_token [调用鉴权接口获取的token] # 1. 先获取有效的 token access_token get_access_token() if not access_token: print(获取 access_token 失败) return None #定义了请求网址及接口地址 url https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general #将获取到的token拼接到URL后面形成完整请求地址用于接口身份认证 request_url url ?access_token access_token #定义请求头headers用于告诉服务器请求体中的数据是经过URL编码后的表单数据 headers {Content-Type: application/x-www-form-urlencoded} #适用respone.post()方法向接口发送POST请求服务器处理后返回一个响应对象response response requests.post(request_url, dataparams, headersheaders) #如果响应成功则将response.post()方法中内容解析为json文件并打印 if response: #print(response.json()) return response.json() else: #print(请求失败) return None #请求失败就返回 #调用函数识别图片将上方定义的路径传值给result_1和result_2 result_1 recognize_image(image_path_1) result_2 recognize_image(image_path_2) def compare_results(result_1, result_2): #将刚刚传入的值作为形参传入函数 # 先检查是否识别失败 if not result_1 or not result_2: print(识别失败) return #如果都识别成功则比较可信度识别失败则返回“识别失败” #识别成功需要区分不同物体要分清主体和场景以及可信度 #为了方便判断将两张图片进行比较如果可信度超过70%即0.7时就认为高度相似 #可信度大约在50%即0.5则较为相似低于则不像 #首先获取识别中的物体/场景 #items_1 {item{keyword}:item[score] for items in result_1.get(result),[]} #items_2 {item{keyword}:item[score] for items in result_2.get(result),[]} #增加可读性换成段落形式 items_1 {} for item in result_1.get(result, []): keyword item[keyword] score item[score] items_1[keyword] score items_2 {} for item in result_2.get(result, []): keyword item[keyword] score item[score] items_2[keyword] score #现在已经获取到识别出的物体/场景 #找出两图片识别到的物体场景导出来 common_items set(items_1.keys()) set(items_2.keys()) #有了共同物体场景则可以比较可信度 similarity_printed False for item in common_items: #遍历识别到的物体场景 score_1 items_1[item] score_2 items_2[item] if score_1 0.7 and score_2 0.7: print(高度相似) similarity_printed True break elif score_1 0.5 and score_2 0.5: print(比较相似) similarity_printed True break if not similarity_printed and common_items: print(相似度较低) elif not common_items: print(没有共同的识别标签无法直接比较相似度) #可能出现误判添加人工复查 print(\n 第一张图片识别结果) #首先for在字典item遍历用.get()方法在字典中取值去字典中的键 -列表 #key - 按此依据 lamada - 匿名函数 x:x[score]以score为依据进行排序顺序reverse为逆序ture #使用f方法输出信息item[score] - 当前物体场景可信度 item[root] - 分类item[keyword] -名称 for item in sorted(result_1.get(result,[]),keylambda x:x[score],reverseTrue): print(fscore:{item[score]},root: {item[root]},keyword: {item[keyword]}) print(\n 第二张图片识别结果) for item in sorted(result_2.get(result,[]),keylambda x:x[score],reverseTrue): print(fscore:{item[score]},root: {item[root]},keyword: {item[keyword]}) compare_results(result_1, result_2) #最后调用函数比较即可测试图片如下输出如下二、解决弹窗问题参考帖子如下Python 用简单对话框选择文件|极客教程我的代码如下# 导入 tkinter 所有基础组件 from tkinter import * # 导入文件对话框子模块 from tkinter import filedialog # 创建主窗口 root Tk() root.title(选择文件) # 窗口标题 root.geometry(400x200) # 窗口大小 400x200 像素 # 按钮点击事件函数 def choose_file(): # 弹出文件选择对话框返回选中文件的完整路径 file_path filedialog.askopenfilename() # 更新标签显示选中的文件路径 label_result.config(text选中的文件 file_path) # 创建两个不同的标签 # 提示标签 label_hint Label(root, text请手动选择一张图片) # 结果显示标签,稍后会被更新 label_result Label(root, text选中的文件) # 创建按钮 button Button(root, text选择文件, commandchoose_file) # 布局使用 pack 按顺序从上到下放置 label_hint.pack(pady5) # 提示标签上下边距5像素 button.pack(pady10) # 按钮上下边距10像素 label_result.pack(pady5) # 结果显示标签上下边距5像素 # 进入事件循环保持窗口响应 root.mainloop()运行输出如下选完图片后三、综合题目考虑怎么组合代码开始我是先想着组合起来还不是很符合题目要求没有自动弹窗而是手动显示图片识别结果也是只显示了几项。代码如下from tkinter import * from tkinter import filedialog import requests import base64 import os # 用于检查文件是否存在 # 创建主窗口 root Tk() root.title(选择文件) root.geometry(400x200) API_KEY 放你的 SECRET_KEY 放你的 # 全局变量存储图片路径初始为 None image_path None # 按钮点击事件函数 def choose_file(): global image_path file_path filedialog.askopenfilename() if file_path: # 用户确实选择了文件 image_path file_path label_result.config(text选中的文件 file_path) label_hint.config(text请关闭窗口然后识别结果将打印在控制台) else: # 用户取消选择不更新任何内容 pass # 创建标签 label_hint Label(root, text请选择一张图片) label_result Label(root, text选中的文件) # 创建按钮 button Button(root, text选择文件, commandchoose_file) # 布局 label_hint.pack(pady5) button.pack(pady10) label_result.pack(pady5) # 进入事件循环窗口显示等待用户操作 root.mainloop() # ------------------ 以下为识别相关函数在窗口关闭后执行 ------------------ def get_access_token(): url https://aip.baidubce.com/oauth/2.0/token params { grant_type: client_credentials, client_id: API_KEY, client_secret: SECRET_KEY } return requests.post(url, paramsparams).json().get(access_token) def recognize_image(image_path): try: with open(image_path, rb) as f: img base64.b64encode(f.read()).decode(utf-8) except Exception as e: print(f读取图片失败{e}) return None params {image: img} access_token get_access_token() if not access_token: print(获取 access_token 失败) return None url https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general request_url f{url}?access_token{access_token} headers {Content-Type: application/x-www-form-urlencoded} try: response requests.post(request_url, dataparams, headersheaders) if response.status_code 200: return response.json() else: print(fAPI 请求失败状态码{response.status_code}) return None except Exception as e: print(f网络请求异常{e}) return None def print_results(result): if not result or result not in result: print(识别失败未获得有效结果) return print(\n图片识别结果) for item in sorted(result[result], keylambda x: x[score], reverseTrue): print(fscore: {item[score]:.4f}, root: {item[root]}, keyword: {item[keyword]}) # 窗口关闭后检查是否有选中的图片然后识别并打印 if image_path and os.path.exists(image_path): print(f开始识别图片{image_path}) result recognize_image(image_path) print_results(result) else: print(未选择有效图片程序退出。)效果就是程序开始显示一个弹窗要手动选择文件选好后要关闭弹窗才会开始识别图片还行接近要求。可以适当借用AI工具辅助比如查错的时候AI就很聪明。最后按要求实现代码如下import requests import base64 from tkinter import filedialog # 仅用于弹出文件选择对话框 # ---------- 你的 API 密钥 ---------- API_KEY 放你的 SECRET_KEY 放你的 # ---------- 获取 access_token ---------- def get_access_token(): url https://aip.baidubce.com/oauth/2.0/token params { grant_type: client_credentials, client_id: API_KEY, client_secret: SECRET_KEY } return requests.post(url, paramsparams).json().get(access_token) # ---------- 调用百度 API 识别图片 ---------- def recognize_image(image_path): # 读取图片并转为 base64 字符串 with open(image_path, rb) as f: img base64.b64encode(f.read()).decode(utf-8) params {image: img} access_token get_access_token() if not access_token: print(获取 access_token 失败) return None url https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general request_url f{url}?access_token{access_token} headers {Content-Type: application/x-www-form-urlencoded} response requests.post(request_url, dataparams, headersheaders) if response.status_code 200: return response.json() else: print(fAPI 请求失败状态码{response.status_code}) return None # ---------- 主流程 ---------- if __name__ __main__: # 步骤1本地选图弹出文件选择窗口 print(请在弹出的窗口中选择一张本地图片...) file_path filedialog.askopenfilename(title选择一张图片) if not file_path: print(未选择任何文件程序退出。) exit() print(f已选择图片{file_path}) # 步骤2云端识别 print(正在调用云端视觉大模型识别...) result recognize_image(file_path) # 步骤3在终端打印完整分析结果 if result: print(\n 云端识别结果完整 JSON ) # 为了可读性格式化输出 JSON缩进2中文不转义 import json print(json.dumps(result, indent2, ensure_asciiFalse)) else: print(识别失败未获取到结果。)本来可以一键AI的但是这样学不到东西现在也是学会了新技能第一次尝试用接入API之前一直想玩玩但是都没空的。我新手学起来也就几个小时大家最好还是跑一遍流程敲一遍代码理解的更快哟~

更多文章