【class9】人工智能初步(处理单张图片)
Class9的任务:处理单张图像
为了更高效地学习,我们将“处理单张图像”拆分成以下几步完成:
1. 读取图像文件
2. 调用通用物体识别
3. 提取图像分类信息
4. 对应分类文件夹还未创建时,创建文件夹
5. 移动图像到对应文件夹
0.获取了图像路径
整理清楚解决问题的思路以后,我们开始获取图像路径。我们直接从铭铭的文件夹'img'中选出一张图像'cat.jpg'。它的路径可以表示为 '/Users/img/cat.jpg' 。
# TODO 将照片路径'/Users/img/cat.jpg'赋值给变量filePath
filePath= '/Users/img/cat.jpg'
1. 读取图像文件
,接下来需要读取图像内容。在读取图像内容时,需要先打开图像文件。前面我们直接用open() 函数来打开文件,但是open() 函数在读取文件时,有时候会发生异常。为了能在发生异常时,自动释放打开的文件资源,我们可以搭配使用 with...as...语句。
# 使用with...as以rb方式,打开路径为filePath的图片并赋值给f
with open(filePath, 'rb') as f:
接着读取图像。在这里,我们可以调用 read() 函数,read() 函数可以逐个字节(或者逐个字符)读取文件中的内容。由于是以二进制格式打开图像,所以读取的图像内容是二进制格式。调用 read() 函数读取变量f,并赋值给变量 image;使用 print() 输出 image。
# 使用read()读取f,赋值给变量image
image = f.read()
# 使用print()输出变量image
print(image)
2.调用通用物体识别
这样,我们就完成了读取图像的操作。接下来,我们调用接口实现对图像物体的识别。当然,在调用之前,我们首先得了解,什么是通用物体识别接口。

调用通用物体识别
代码的作用
这几行高亮的代码,利用通用物体识别接口,对一张输入图片,输出其中的多个物体及场景标签。
第9-19行,是我们在上节课中创建的图像识别客户端。
第22行,通过advancedGeneral接口识别输入的图像image,并将结果存储在ending变量中。
第24行,将结果输出查看。

Ps:待识别的图像
必选参数image,图像数据,支持jpg/png/bmp格式
要求大小不超过4M,最短边至少15px,最长边最大4096px,否则会识别失败。
可
调用通用物体识别
对刚刚新建的AipImageClassify对象--client,使用advancedGeneral( )函数。
将待识别的图像必选参数image传入到该函数中即可。
赋值给ending
调用接口返回的结果赋值给ending,并输出进行查看。
Ps: 使用advancedGeneral()函数调用通用物体识别接口。
将待识别的图像必选参数image传入到该函数中。
输出调用接口返回的结果ending。

O(∩_∩)O哈哈~,作者有点忘记了之前的知识,所以又回去看了看
复习:在Python编程语言中,字典(Dictionary)、列表(List)和元组(Tuple)是三种不同的内置数据结构,每种都有其独特的特点和用途:
列表(List)
- 有序集合:列表中的元素有固定的顺序,可以通过索引(从0开始)访问。
- 可变:列表中的元素可以被修改,可以增加、删除或改变元素。
- 支持元素的多样性:列表可以包含不同类型的元素,包括数字、字符串、其他列表等。
- 支持嵌套:列表可以包含其他列表(嵌套列表)。
- 方法多样:Python为列表提供了大量的方法,如append(), remove(), pop(), reverse()等
例子:
my_list = [1, "Hello", 3.14, [2, 4, 6]]
my_list[2] = 'pi' # 修改第三个元素
元组(Tuple)
- 有序集合:元组和列表类似,元素有固定的顺序,通过索引访问。
- 不可变:一旦创建,元组中的元素不能被修改。
- 支持元素的多样性:元组也可以包含不同类型的元素。
- 支持嵌套:元组可以包含其他元组、列表、字典等。
- 内存效率:相较于列表,元组占用的空间通常更小,创建速度更快。
例子:
my_tuple = (1, "Hello", 3.14, (2, 4, 6))
# my_tuple[2] = 'pi' # 这会引发TypeError,因为元组不可变
字典(Dictionary)
- 无序集合:字典存储键值对,但它们是无序的(在Python 3.7及以后的版本中,字典记住了插入顺序,但这是一个实现细节,不应依赖于这一点来保证跨版本的一致性)。
- 可变:可以添加、删除或修改键值对。
- 键必须是不可变的:如字符串、数字或元组,但值则可以是任何数据类型。
- 不支持索引:字典通过键来访问数据,不像列表和元组使用索引。
- 查找效率高:字典在大数据集中查找元素时非常快,因其基于哈希表实现。
例子:
my_dict = {'name': "Alice", 'age': 25, 'is_student': True}
my_dict['age'] = 26 # 修改键'age'对应的值
回到现在的class
调用通用物体识别的描述
调用通用物体识别需要传入一个必选参数
调用通用物体识别返回数据参数有很多种
AipImageClassify是图像识别的Python SDK客户端,提供了一系列的交互方法,所以在调用通用物体识别之前必须提前创建AipImageClassify。
调用通用物体识别输入一张图片可以输出图片中的多个物体及场景标签
3.提取分类结果
查看输出结果,我们从result中的参数root就能得到分类信息。调用接口返回的是一个复杂的字典结构,我们将它赋值给了变量ending。从字典ending中取出参数'result'的值可以用ending['result']。

前三步的代码:
# 1.读取图像文件
# 将照片路径'/Users/img/cat.jpg'赋值给变量filePath
filePath = '/Users/img/cat.jpg'
# 使用with...as以rb方式,打开路径为filePath的图片并赋值给f
with open(filePath, 'rb') as f:
# 使用read()读取f,赋值给变量img
image = f.read()
# 2.调用通用物体识别
# 从aip中导入AipImageClassify
from aip import AipImageClassify
# 将AppID"10252021"赋值给变量APP_ID
APP_ID = '10252021'
# 将API Key"ZHe7788sh11GEjIAdEKeY"赋值给变量API_KEY
API_KEY = 'ZHe7788sh11GEjIAdEKeY'
# 将Secret Key"JMMzHe7788BUSH1ZhEnM1YUEhh"赋值给变量SECRET_KEY
SECRET_KEY = 'JMMzHe7788BUSH1ZhEnM1YUEhh'
# 新建一个AipImageClassify,并赋值给变量client
client = AipImageClassify(APP_ID, API_KEY, SECRET_KEY)
# 调用通用物体识别接口并把结果赋值给ending
ending = client.advancedGeneral(image)
# 3.提取图像分类信息
# 从返回结果中提取出参数result的值并赋值给变量value
value = ending['result']
# 使用print()输出变量value
print(value)
得到的ending['result']是一个列表结构。
我们只取列表ending['result']中的第一个元素就是ending['result'][0]。

研究得到所需要的内容:

接下来,我们直接用识别结果组成分类文件夹路径,作为移动图像的目标地址。
用字符串拼接的方式拼接铭铭的文件夹'img' 、"/"、变量 value,将拼接后的字符串赋值给变量 targetPath。

4. 对应分类文件夹还未创建时,创建文件夹
确定了每个文件需要移动的目标地址,在移动前还需要确定目标文件夹是否存在。
如果目标文件夹已经存在,直接创建会报错,如果不存在,需要先创建。
例如:cat.jpg 要移动到'动物-猫'这个文件夹中,需要先检查 'img'文件夹中是否已经创建了名为'动物-猫'的文件夹。

判断文件(夹)是否存在
代码的作用
得到了目标文件夹的路径后,我们可以使用 os.path.exists() 函数来判断该文件夹是否已经存在。
代码:
# 将分类文件夹路径赋值给变量targetPath
targetPath = '/Users/img/动物-猫'
# 使用import导入os模块
import os
# 如果目标文件夹不存在
if not os.path.exists(targetPath):
# 使用print输出目标路径
print(targetPath)
分析代码:
os模块
在对文件进行处理之前,首先要使用import 导入 os 模块。os 模块可用于文件处理操作,os 模块是Python的内置模块,不需要安装可以直接导入。
判断文件(夹)是否存在
os.path.exists() 函数接受一个路径字符串作为参数,判断返回的结果是布尔数。
当该路径的文件夹存在时,返回True,不存在时,则返回False。
Ps:os.path.exists(targetPath) 是Python中的一个函数调用,该函数用于检查给定的路径 targetPath 是否存在。如果路径存在,无论是文件还是目录,它都会返回 True;如果路径不存在,它则返回 False。
if not
if 语句用于判断当前条件的真假,只有满足条件时才会执行if语句中的内容。
我们要输出结果为 False 的文件名,这里就需要使用关键字 not 运算符 搭配 os.path.exists() 函数,再使用 if语句 来判断结果并输出。
因此,我们在得到了目标文件夹的路径后,就可以使用 os.path.exists() 函数来判断目标文件夹是否已经存在。
通过 if 判断语句+ not 运算符来判断目标文件夹不存在的情况。
简单介绍一下os模块
在Python中,os模块提供了丰富的方法用以与操作系统交互。通过使用os模块,你可以执行文件系统操作,如文件的创建、删除、移动、更改名称,以及获取文件属性等。此外,os模块还允许你与操作系统进行交互,如获取和设置环境变量,处理进程参数,以及使用与平台无关的路径操作等。
以下是一些os模块的常用功能:
文件系统操作
- os.listdir(path): 列出指定路径下的文件和目录名。
- os.mkdir(path): 创建新目录。
- os.makedirs(path): 递归创建多层目录。
- os.remove(path): 删除一个文件。
- os.rmdir(path): 删除一个空目录。
- os.removedirs(path): 递归删除目录,从子目录到父目录依次删除。
- os.rename(src, dst): 重命名文件或目录。
- os.stat(path): 获取文件或目录的状态信息。
路径操作
- os.path.join(path1[, path2[, ...]]): 拼接一个或多个路径组件。
- os.path.split(path): 将路径分割成目录和文件名二元组返回。
- os.path.exists(path): 检查路径是否存在。
- os.path.isfile(path): 检查路径是否为文件。
- os.path.isdir(path): 检查路径是否为目录。
- os.path.abspath(path): 获取绝对路径。
- os.path.basename(path): 获取路径的基本名称。
- os.path.dirname(path): 获取路径的目录名称。
- os.path.getsize(path): 获取路径的文件大小。
环境操作
- os.environ: 一个表示环境变量的字典。
- os.getenv(key, default=None): 获取一个环境变量,如果不存在则返回默认值。
- os.putenv(key, value): 设置一个环境变量值。
其他
- os.system(command): 运行系统命令。
- os.name: 字符串,指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
- os.getpid(): 获取当前进程ID。
- os.getuid(): 获取当前用户的ID(仅在Unix下有效)。
- os.getlogin(): 返回当前登录系统的用户名。
下一步:
创建文件夹
代码的作用
找到未创建的文件夹以后,我们就可以使用 os.mkdir() 函数来创建文件夹。

创建文件(夹)
创建文件夹可以使用 os.mkdir() 函数:将要创建的文件夹路径作为参数传入函数中即可。
5. 移动图像到对应文件夹
创建完文件夹,我们打开'img'文件夹就可以看到刚刚创建的'动物-猫'这个文件夹。一切准备就绪,接下来完成最后一步:
将'cat.jpg'移动图像到对应的文件夹'动物-猫'中。

移动文件夹
代码的作用
这里,可以使用shutil.move()函数移动文件,将图像移动到目标文件夹中。
# 导入shutil模块
import shutil
# 使用shutil.move()函数移动文件,将图像移动到目标文件夹中
# 将结果赋值给变量newPath
newPath = shutil.move(filePath, targetPath)
# 使用格式化输出"已经移动到:{newPath}"
print(f"已经移动到:{newPath}")
分析代码:
导入shutil模块
要想移动文件,我们需要导入Python中另一个内置的模块 shutil 。
使用import 导入 shutil 模块。
移动文件
shutil.move() 函数可以用来移动文件或文件夹。
它接收两个参数,第一个参数是要移动的文件(夹)路径,第二个参数是目标文件(夹)的路径。

next class,处理多张图片
相关文章:
【class9】人工智能初步(处理单张图片)
Class9的任务:处理单张图像 为了更高效地学习,我们将“处理单张图像”拆分成以下几步完成: 1. 读取图像文件 2. 调用通用物体识别 3. 提取图像分类信息 4. 对应分类文件夹还未创建时,创建文件夹 5. 移动图像到对应文件夹 0.获取…...
cgicc开发 (结合jsoncpp)
#include <iostream> #include <fstream> //读写文件 c标准库 #include <string> //字符串类 c标准库 #include <sstream> //字符串流 c标准库 #include <assert.h> #include "json/json.h" //jsoncpp的头文件#include <cgicc/CgiD…...
HTML常用标签及属性
一、简单标签 标签作用div 自带换行,块级显示span 语义化标签,无任何修饰效果br 换行,单标签hr 水平分割线,单标签h1 ~ h6 标题标签,有加粗效果,h1最明显,往后依次减弱,独占一行&am…...
【PB案例学习笔记】-03用户名密码校验
写在前面 通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码,小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…...
设计模式六大原则之 接口分离原则
文章目录 概念比较代码示例优势 小结 概念 要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。 比较 概念有了,再来看看比较下吧,和单一职责比较比较。 接口隔离原则和单一职责都是为了提高类的…...
嵌入式学习——Shell()——day21
(1)标准IO——有缓存 1.打开文件 fopen 2.读写文件 fgetc/fputc fgets/fputs fprintf/fscanf 3.关闭文件 fclose 1. 缓存(标准I…...
STM32学习计划
前言: 这里先记录下STM32的学习计划。 2024/05/08 今天我正在学习的是正点原子的I.MX6ULL APLHA/Mini 开发板的 Linux 之ARM裸机第二期开发的视频教程,会用正点原子的I.MX6ULL开发板学习第二期ARM裸机开发的教程,然后是学习完正点原子的I.M…...
小米15曝光?可能会要稍微涨价
也许是感受到了智能机市场的逐渐复苏,最近各大手机品牌发售新品的速度明显加快了。从4月份的Redmi、一加,再到5月份一大堆vivo、OPPO新机型的发布。而近日,有关小米14即将发售的消息也是悄咪咪的放了出来。 去年发售的小米14可以说是狠狠地让…...
深度优先搜索汇总
常用英文 最近公共祖先(Lowest Common Ancestor,简称LCA) posterity,英语单词,主要用作名词,作名词时译为“子孙,后裔;后代”。 什么是深度优先搜索 深度优先搜索,D…...
【虚拟仿真】Unity3D中实现对大疆无人机遥控器手柄按键响应
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 最近项目中需要用到大疆无人机遥控器对程序中无人机进行控制,遥控器是下图这一款: 博主发…...
Python学习之路 | Python基础语法(一)
数据类型 Python3 中常见的数据类型有: Number(数字)String(字符串)bool(布尔类型)List(列表)Tuple(元组)Set(集合)Dict…...
【已解决】AttributeError: module ‘clip‘ has no attribute ‘load‘
问题描述:运行YOLO-world时出现AttributeError: module clip has no attribute load。 情况分析: 1. 未安装clip包。 2. clip包中没有load方法。 解决办法: 1.重新安装clip包。 pip install clip pip install openai-clip 2. 安装后仍然报…...
安卓实现连接wesokcet
在build.gradle里引入依赖: implementation org.java-websocket:Java-WebSocket:1.5.2 在Androidmanifest.xml 文件里加入网络权限: <uses-permission android:name"android.permission.INTERNET" /> 代码: package com.x…...
Xinstall助力App下载量精准统计,洞悉推广效果
在移动互联网时代,App的下载量是衡量一个应用受欢迎程度的重要指标。然而,要精准统计App的下载量并不是一件容易的事情。为了解决这一难题,越来越多的开发者选择了Xinstall这一专业的App全渠道统计服务商。 Xinstall作为国内领先的App统计平…...
CSS字体修饰
1)文字大小 ( font-size ) /* 设置文字大小为24个像素 */ font-size: 24px; 2)字体粗细 ( font-weight ) /* 字体粗细在100-900之间可以进行调整 */ /* 字体加粗 */ font-weight: bolder; /* 或 fon…...
高并发缓存服务的构建要点与陷阱
1. 缓存基础与特征 在讨论高并发环境下构建缓存服务的问题前,我们需要先了解缓存的基础和特征。缓存(Cache)是一种高速数据存储层,它可以存储临时数据,以便将来的请求能更快地获取到这些数据。从本质上讲,…...
Electron学习笔记(五)
文章目录 相关笔记笔记说明 七、系统1、系统对话框2、自定义窗口菜单3、系统右键菜单4、快捷键(1)、监听网页按键事件 (窗口需处于激活状态)(2)、监听全局按键事件 (窗口无需处于激活状态)(3)、补充:自定义窗口菜单快捷…...
【jest 调试 - vscode debug】
jest 测试typescript,如果想对测试文件本身断点调试。 安装jest相关依赖 # jest本体 npm install --save-dev jest # jest的类型声明 npm install --save-dev types/jest # typescript中使用 npm install --save-dev ts-jestlaunch.json 配置参考 {"type&qu…...
华为OD机试【分奖金】(java)(100分)
1、题目描述 公司老板做了一笔大生意,想要给每位员工分配一些奖金,想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序,每个人随机抽取一个数字。按照工号的顺序往后排列,遇到第一个数字比自己数字大的,那么&…...
27- ESP32-S3 USB虚拟串口(USB-OTG 外设介绍)
ESP32-S3 USB虚拟串口详解 USB-OTG 外设介绍 USB-OTG: USB-OTG是一种USB规范,允许嵌入式系统(如手机、平板电脑、单片机系统等)在没有主机(如个人电脑)的情况下直接相互通信,同时也能够作为传…...
Pixel Mind Decoder 版本管理与协作:Git工作流在AI项目中的应用
Pixel Mind Decoder 版本管理与协作:Git工作流在AI项目中的应用 1. 为什么AI项目需要版本管理 在开发Pixel Mind Decoder这样的情绪分析系统时,我们会频繁修改代码、调整Prompt模板、更新模型参数。如果没有版本管理,很容易陷入混乱&#x…...
深入解析PCS1800分布式控制系统:架构设计与工业应用实践
1. PCS1800分布式控制系统架构解析 第一次接触PCS1800系统是在2013年某化工厂的DCS改造项目上。当时现场老师傅指着机柜里整齐排列的模块说:"这玩意儿就像人的神经系统,MNet是大脑,SNet是脊髓,CNet就是末梢神经。"这个…...
Domain Randomization不只是“乱调参数”:一份给自动驾驶感知开发的避坑指南
Domain Randomization不只是“乱调参数”:一份给自动驾驶感知开发的避坑指南 在自动驾驶感知算法的开发过程中,仿真环境训练已经成为不可或缺的一环。许多团队在Carla或LGSVL等仿真平台上投入大量精力进行模型训练,却在真实路测时遭遇性能断崖…...
Phi-3-mini-4k-instruct-gguf辅助前端开发:基于VSCode的智能代码补全实践
Phi-3-mini-4k-instruct-gguf辅助前端开发:基于VSCode的智能代码补全实践 1. 引言:当AI遇见前端开发 最近在写前端代码时,我经常遇到这样的情况:明明知道要实现什么功能,却卡在具体语法细节上;或者反复写…...
AgentCPM-Report部署教程:Pixel Epic在Ubuntu/CentOS下的环境配置
AgentCPM-Report部署教程:Pixel Epic在Ubuntu/CentOS下的环境配置 1. 项目介绍 Pixel Epic是一款基于AgentCPM-Report大模型构建的研究报告辅助终端,它将枯燥的科研工作转化为一场像素风格的RPG冒险体验。与传统AI工具不同,Pixel Epic采用了…...
ChatTTS语音合成生产环境部署:负载均衡+API服务化封装实践
ChatTTS语音合成生产环境部署:负载均衡API服务化封装实践 1. 项目背景与价值 ChatTTS是目前开源领域最逼真的中文语音合成模型之一,专门针对对话场景进行了深度优化。与传统的TTS系统不同,ChatTTS能够自动生成极其自然的停顿、换气声、笑声…...
华为eNSP实战:手把手教你用单臂路由打通不同VLAN,附排错命令清单
华为eNSP单臂路由实战:跨VLAN通信配置与深度排错指南 当企业网络规模扩大时,VLAN隔离是保障安全性和广播域控制的必要手段。但实际业务中,不同部门间的数据交互需求常常需要跨越VLAN边界。在华为认证体系HCIA和HCIP的实验环境中,单…...
Skills 到底怎么快速入门?
一、常见误解 很多人第一次接触 Skills,以为它只是“给 Cursor 写规则文档”。这个理解太窄了。 Skills 的本质是可复用的能力模块。它不只是“规定输出格式”,而是可以封装任意需要多步操作、特定上下文或外部工具配合的任务。 二、三种类型类型核心作用…...
Python 闭包与装饰器
在 Python 学习中,闭包和装饰器是两个既关联又容易混淆的知识点,尤其是结合嵌套函数使用时,常常分不清执行逻辑。但其实只要抓住核心原理,再结合简单案例拆解,就能轻松掌握。 一、前置回顾:函数与局部变量的…...
别再死记硬背分度表了!用Python+Arduino动手复现K型热电偶测温全过程
别再死记硬背分度表了!用PythonArduino动手复现K型热电偶测温全过程 温度测量是工程实践中最基础却又最关键的环节之一。想象一下,当你需要监控3D打印机热床温度、测量自制咖啡烘焙机的内部环境,或是记录太阳能热水器的水温变化时,…...
