【class9】人工智能初步(处理单张图片)

news2025/1/24 22:49:25

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。

Psos.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,处理多张图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1681147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt---TCP文件传输服务器

文件传输流程&#xff1a; 服务器端&#xff1a; serverwidget.ui serverwidget.h #ifndef SERVERWIDGET_H #define SERVERWIDGET_H#include <QWidget> #include<QTcpServer>//监听套接字 #include<QTcpSocket>//通信套接字 #include<QFile> #includ…

查看Linux系统是Ubuntu还是CentOS

要查看Linux系统是Ubuntu还是CentOS&#xff0c;可以通过多种方式进行确认&#xff1a; 查看/etc/os-release文件&#xff1a; 在终端中执行以下命令&#xff1a; cat /etc/os-release 如果输出中包含"IDubuntu"&#xff0c;则表示系统是Ubuntu&#xff1b;如果输出中…

构建智能电子商务系统:数字化引领未来商业发展

随着互联网技术的飞速发展和消费者行为的变革&#xff0c;电子商务系统的重要性日益凸显。在这一背景下&#xff0c;构建智能电子商务系统成为推动商业数字化转型的关键举措。本文将深入探讨智能电子商务系统的构建与优势&#xff0c;助力企业把握数字化转型的主动权。 ### 智…

【Linux】19. 习题②

2022-11-12_Linux环境变量 1. 分页存储(了解) 一个分页存储管理系统中&#xff0c;地址长度为 32 位&#xff0c;其中页号占 8 位&#xff0c;则页表长度是__。 A.2的8次方 B.2的16次方 C.2的24次方 D.2的32次方 【答案解析】A 页号即页表项的序号&#xff0c;总共占8个二进制…

数字化智能:Web3时代的物联网创新之路

引言 随着科技的不断发展&#xff0c;物联网&#xff08;IoT&#xff09;技术正在迅速普及和应用。而随着Web3时代的到来&#xff0c;物联网将迎来新的发展机遇和挑战。本文将探讨Web3时代的物联网创新之路&#xff0c;深入分析其核心技术、应用场景以及未来发展趋势。 Web3时…

C语言性能深度剖析:从底层优化到高级技巧及实战案例分析

C语言以其接近硬件的特性、卓越的性能和灵活性&#xff0c;在系统编程、嵌入式开发和高性能计算等领域中占据着举足轻重的地位。本文将深入探讨C语言性能优化的各个方面&#xff0c;包括底层原理、编译器优化、内存管理和高级编程技巧&#xff0c;并结合多个代码案例来具体分析…

2024042002-计算机网络 - 应用层

计算机网络 - 应用层 计算机网络 - 应用层 域名系统文件传送协议动态主机配置协议远程登录协议电子邮件协议 1. SMTP2. POP33. IMAP 常用端口Web 页面请求过程 1. DHCP 配置主机信息2. ARP 解析 MAC 地址3. DNS 解析域名4. HTTP 请求页面 域名系统 DNS 是一个分布式数据库&…

ApiHug - 闭门造车, 出门合辙

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

Python函数之旅专栏(导航)

Python内置函数(参考版本:3.11.8)AELRabs( )enumerate( )len( )range( )aiter( )eval( )list( )repr( )all( )exec( )locals( )reversed( )anext( )round( )any( ) ascii( )FM  filter( )map( )S float( )max( )set( )Bformat( )memoryview( )setattr( )bin( )frozenset( )…

TensorFlow的学习

0.基础概念 术语表&#xff1a; https://developers.google.cn/machine-learning/glossary?hlzh-cn#logits 1.快速入门 https://tensorflow.google.cn/tutorials/quickstart/beginner?hlzh-cn 2.基于Keras进行图像分类 https://tensorflow.google.cn/tutorials/keras/cl…

SMB攻击利用之-mimikatz上传/下载流量数据包逆向分析

SMB协议作为windows环境下最为常见的一种协议,在历史上出现过无数的通过SMB协议进行网络攻击利用的案例,包括针对SMB协议本身以及通过SMB协议实施网络攻击。 本文将介绍一种通过SMB协议的常见利用方式,即向远程主机传输mimikatz,作为我的专栏《SMB攻击流量数据包分析》中的…

【Python】图像批量合成视频,并以文件夹名称命名合成的视频

一个文件夹中有多个子文件夹&#xff0c;子文件夹中有多张图像。如何把批量把子文件夹中的图像合成视频&#xff0c;视频名称是子文件夹的名称&#xff0c;生成的视频保存到指定文件夹&#xff0c;效果记录。 代码 import os import cv2def create_video_from_images(image_f…

Mamba:7 VENI VIDI VICI

若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。 序列模型的效率与有效性之间的权衡取决于状态编…

[Java基础揉碎]多线程基础

多线程基础 什么是程序, 进程 什么是线程 什么是单线程,多线程 并发, 并行的概念 单核cpu来回切换, 造成貌似同时执行多个任务, 就是并发; 在我们的电脑中可能同时存在并发和并行; 怎么查看自己电脑的cpu有几核 1.资源监视器查看 2.此电脑图标右键管理- 设备管理器- 处理器…

安防监控视频平台智能边缘分析一体机视频存储系统客流统计检测算法

智能边缘分析一体机的客流统计检测算法是一种基于人工智能与边缘计算技术的解决方案&#xff0c;专门设计用来实时、准确地统计通过特定区域的人流量。这项技术广泛应用于零售、交通、场馆管理、智慧城市等领域&#xff0c;以帮助管理者更好地理解顾客行为、优化资源配置、提升…

百度百舸 AIAK-LLM 的大模型训练和推理加速实践

本文整理自 4 月 16 日的 2024 百度 Create 大会的公开课分享《百舸 AIAK-LLM&#xff1a;大模型训练和推理加速实践》。 今天要分享的主题是 AI Infra 相关的内容&#xff0c;主要内容分为四部分。 首先和大家一起讨论大模型给基础设施带来的挑战。第二部分则是向大家介绍一个…

深度优先搜索汇总

常用英文 最近公共祖先&#xff08;Lowest Common Ancestor&#xff0c;简称LCA&#xff09; posterity&#xff0c;英语单词&#xff0c;主要用作名词&#xff0c;作名词时译为“子孙&#xff0c;后裔&#xff1b;后代”。 什么是深度优先搜索 深度优先搜索&#xff0c;D…

linux安装python3.8

一、卸载损坏的yum并安装 本来想直接下载安装python3.8,结果过程中损坏了yum,导致yum无法使用。 参考了【故障】6、yum不可用_yum命令无法使用-CSDN博客 1、删除python #删除现有的python rpm -qa|grep python|sudo xargs rpm -ev --allmatches --nodeps #强制删除已安装程…

tomcat--应用部署

tomcat根目录结构 Tomcat中默认网站根目录是/usr/local/apache-tomcat-8.5.100/webapps/在Tomcat的webapps目录中&#xff0c;有个非常特殊的目录ROOT&#xff0c;它就是网站默认根目录。将eshop解压后的文件放到这个/usr/local/apache-tomcat-8.5.100/webapps/ROOT中。bbs解压…

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem

QT在场景中利用freetype实现独立的文字绘制子类QxFreeTypeTextItem&#xff0c;继上一章节讲过qt中如何编译freetype Qt编译和使用freetype矢量字库方法https://blog.csdn.net/wangningyu/article/details/138927379#QT利用freetype提取字库图片_qt freetype-CSDN博客文章浏览…