版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据爬取-标注-可视化实验手册实验手册【项目目标】(1)掌握使用行业主流的API技术,根据指定主题(关键词)批量获取图像数据的方法。(2)学习并实践使用LabelMe工具对获取的图像数据进行基础的人工标注(如目标检测框)。(3)学习使用Matplotlib库对获取的数据集进行初步的特征分析与可视化。(4)完整体验人工智能项目中“数据获取->数据标注->数据分析”的核心流程。任务一基于API的通用图像数据获取(1)使用浏览器访问/zh-cn/api/。(2)点击“加入”,按照提示注册一个Pexels账号。(3)登录后,进入个人主页,找到API相关的菜单,根据提示填写相关信息,申请API密钥。(4)申请成功后,会得到一串由数字和字母组成的字符串,即API密钥。请妥善保管,后续代码中会用到。在向Pexels服务器发送请求之前,首先要搭建好代码的基本框架。本步骤代码实现的功能主要有:导入将要使用的requests、os和time库。定义函数download_images_from_pexels,并将所有需要的参数(如API密钥、搜索关键词等)作为函数的输入。在函数内部,先检查用于保存图片的文件夹是否存在,如果不存在,就自动创建一个。新建一个名为download_data_single_page.py的Python文件,将下列代码复制至文件中。#代码块1:准备工作与函数框架importrequestsimportosimporttime#导入time模块用于添加延迟defdownload_images_from_pexels(api_key,query,per_page=15,save_path='downloaded_images_single_page'):"""使用PexelsAPI根据关键词下载图片,带有上限控制。参数:api_key(str):你的PexelsAPI密钥。query(str):你想搜索的图片关键词。per_page(int):你期望下载的图片数量,但不会超过设定的最大上限MAX_DOWNLOAD_LIMIT。save_path(str):图片保存的文件夹名称。"""#设定一个全局的下载上限(根据Pexels网站API限制,单页返回结果数最大值为80,故此处数值应≤80)MAX_DOWNLOAD_LIMIT=50#确定本次实际要请求下载的数量#在用户期望的数量和上限之间取较小值num_to_download=min(per_page,MAX_DOWNLOAD_LIMIT)#检查并创建保存图片的文件夹ifnotos.path.exists(save_path):os.makedirs(save_path)print(f"创建文件夹:{save_path}")框架搭好后,需要填充核心的“网络请求”部分。本步骤代码实现的功能主要有:定义好PexelsAPI的网址、请求头(包含身份认证APIKey)和请求参数(告诉API我们想搜索什么)。使用requests.get()函数将该请求发送出去。接收服务器返回的响应,并将其从JSON格式解析为Python可以理解的字典和列表格式,从中提取出包含所有图片信息的列表photos。在params中,我们使用了上一步计算出的num_to_download作为per_page的值。从返回的data中解析出total_results字段,并将其打印出来。这样就能清楚地知道,虽然我们只下载一部分,但网站上总共有多少资源。请将以下代码继续添加至函数download_images_from_pexels内。#代码块2:配置并发送API请求#PexelsAPI的URL地址api_url='/v1/search'#设置请求头headers={'Authorization':api_key}#设置请求参数,使用计算好的下载数量params={'query':query,'per_page':num_to_download,'locale':'zh-CN'}try:#发起GET请求print("正在向Pexels服务器发送请求...")response=requests.get(api_url,headers=headers,params=params,timeout=10)#添加超时response.raise_for_status()#检查API请求是否成功#解析返回的JSON数据data=response.json()#读取并打印符合条件的总图片数total_results=data.get('total_results',0)print(f"Pexels网站上共找到{total_results}张关于'{query}'的图片。")photos=data.get('photos',[])ifnotphotos:print("未能找到相关图片,请尝试更换关键词。")returnprint(f"根据上限设定,准备下载其中的{len(photos)}张...")在获取了所有图片的信息之后需要遍历该信息列表(上一步中得到的photo),从中提取出每张图片真正的下载地址(img_url),然后再次使用requests库将图片一张张下载并保存到本地文件夹中。注意在下载过程中添加短暂延迟,避免对服务器的请求过于频繁。最后添加程序的“主入口”(if__name__=='__main__':),设置好API密钥和搜索词,并调用我们刚刚完成的函数。在主函数中通过变量EXPECTED_AMOUNT控制预期的下载量,而函数内部的逻辑会保证最终下载量不会超出代码块1中MAX_DOWNLOAD_LIMIT变量所规定的数值。#代码块3:循环下载图片与程序主入口#遍历图片列表并下载fori,photoinenumerate(photos):try:img_url=photo['src']['original']print(f"({i+1}/{len(photos)})准备下载图片URL:{img_url}")#发起图片下载请求,添加超时img_response=requests.get(img_url,stream=True,timeout=30)img_response.raise_for_status()#检查图片下载请求是否成功file_name=f"{query}_{i+1}.jpg"file_path=os.path.join(save_path,file_name)print(f"保存路径:{file_path}")#以二进制写入模式打开文件并写入图片内容withopen(file_path,'wb')asf:forchunkinimg_response.iter_content(8192):ifchunk:#过滤掉keep-alive新块f.write(chunk)print(f"已下载:{file_name}")#添加短暂延迟,避免请求过于频繁(例如0.2秒)time.sleep(0.2)exceptrequests.exceptions.RequestExceptionase:print(f"下载图片{img_url}时发生网络错误:{e}")exceptIOErrorase:print(f"保存图片{file_path}时发生文件错误:{e}")exceptExceptionase:print(f"下载图片{img_url}时发生未知错误:{e}")print("\n所有图片下载完成!")exceptrequests.exceptions.RequestExceptionase:print(f"请求PexelsAPI时发生网络错误:{e}")exceptExceptionase:print(f"发生未知错误:{e}")#主程序入口if__name__=='__main__':#********************需要修改的区域********************#请在这里粘贴你从Pexels获取的有效API密钥MY_API_KEY="Nki0RSycdk28Zl10uzPcuQdo1fGTx0EF6g3H2irST0yk6bIdk6ahYCgY"#请在这里修改你想搜索的关键词SEARCH_QUERY="长城"#你期望下载多少张?(但最多不会超过MAX_DOWNLOAD_LIMIT变量所规定的数值)EXPECTED_AMOUNT=10#你可以根据需要修改这个数量#**********************************************************ifMY_API_KEY=="在这里粘贴你的API密钥":print("错误:请先在代码中填入你的PexelsAPI密钥!")else:#调用函数开始下载download_images_from_pexels(api_key=MY_API_KEY,query=SEARCH_QUERY,per_page=EXPECTED_AMOUNT)将步骤二、三、四的代码块按顺序整合到一个完整的Python文件(例如download_data_single_page.py)中。找到代码中“需要修改的区域”,填入在步骤一中获取的API密钥和想搜索的关键词(例如“故宫”、“小狗”、“机器人”等)。运行该Python文件。程序会自动创建一个名为downloaded_images_single_page的文件夹,并将下载的图片保存在里面。打开文件夹,检查图片是否已成功下载。图2-12在目标文件夹中下载的图片在Pexels网站上有数量庞大的图片数据资源,当我们以某个关键词进行搜索时可能会得到成千上万的返回结果。根据PexelsAPI文档中的描述,当结果较多时,会以分页的形式返回结果,每页最多80个数据。在任务一的代码中,我们未考虑结果分页的情形,因此最大的下载量即为单页数据的最大值(80)。在实际应用中,如果希望下载更多数量的结果,就需要根据API文档的指示,在代码中加入分页处理的功能,逐页下载数据,直至达到我们需要的数量。读者可以自行尝试修改代码增加分页下载的功能,或运行配套资源中的示例代码(download_data_multi_pages.py),查看大数量情景下的图片数据爬取结果。在应用中需要注意遵守目标网站的相关规定,合法合规的下载数据,杜绝滥用的情况。任务二图像场景目标标注Labelme是一个图形界面的图像标注软件。它是用Python语言编写的,图形界面使用的是Qt(PyQt)。其Python的源代码在GitHub的位置:/wkentaro/labelme。Labelme能够进行多种形式的图像数据标注,其以JSON文件存储标注信息,主要功能如下:(1)对图像进行多边形,矩形,圆形,多段线,线段,点形式的标注(可用于目标检测,图像分割,等任务);(2)对图像进行进行flag形式的标注(可用于图像分类和清理任务);(3)生成VOC、COCO等格式的数据集;(4)自定义图片+标签的自定义数据集。本任务具体实施步骤如下。启动anaconda3中的anacondaprompt,运行如下代码安装labelme。pipinstallpyqt5pipinstalllabelme因最新版本的labelme需要python3.9以上的环境,若使用的环境是python3.8,则需使用如下命令安装旧版本的labelme:pipinstalllabelme==4.6.0在anacondaprompt中,运行如下代码激活project2环境,并启动labelme。condaactivateproject2labelme在LabelMe界面中,点击左侧菜单的“OpenDir”按钮。在弹出的对话框中,选择我们刚才在任务一中创建并保存图片的downloaded_images_single_page文件夹。图2-13labelme软件导入待标注图片上一步选择文件夹后,LabelMe将自动加载文件夹中的第一张图片。点击左侧菜单的“CreatePolygons”进行描点标注,或点击上方的“Edit”选择标注工具。对于目标检测任务,通常使用矩形框(Rectangle)。在图片上,用鼠标左键点击与拖拽操作,框出你想要标注的目标。例如,如果下载的是“长城”的图片,就框出图片中的城墙、烽火台等。框选完成后,会弹出一个对话框让你输入标签(Label)。输入对应的名称,例如chengqiang(城墙),然后点击OK。可以对一张图片中的多个目标进行标注。图2-14标注图片完成一张图片的标注后,点击左侧菜单的“Save”按钮。LabelMe会在原图片所在的文件夹下,生成一个同名的.json文件。该文件就包含了所有的标注信息(框的位置、标签等)。点击“NextImage”处理下一张图片,重复步骤三和四,直至所有图片都标注完成。图2-15原始图片及标注后生成的json文件任务三数据可视化在拥有数据集后,我们不仅可以对其进行标注,还可以对数据本身进行分析。一个优秀的人工智能工程师需要具备从数据中发现模式和特点的能力。可视化是实现这一目标最直观的手段。在本次任务中,我们将从两个不同的维度对下载的图片数据集进行分析:个体特征:每张图片的具体尺寸是怎样的?我们将使用散点图来展示宽度和高度的分布。宏观特征:数据集中横向、纵向和方形的图片各有多少?我们将使用柱状图来进行分类统计和对比。完成这一任务所使用的工具是matplotlib,它是Python中最常用、最著名的数据可视化模块,该模块的子模块pyplot包含大量用于绘制各类图表的函数,例如柱状图、折线图、散点图、饼图、气泡图等。任务实施具体步骤如下。本步骤代码将导入所有必需的工具库(os,PIL,matplotlib),然后遍历我们下载的图片文件夹,读取每一张图片的宽度和高度,并将这些尺寸数据存储在两个列表(widths和heights)中,为后续的绘图做好数据准备。新建一个名为visualize_data.py的Python文件,将以下代码复制至文件中。#代码块1:数据准备importosfromPILimportImageimportmatplotlib.pyplotaspltdefanalyze_and_visualize_image_sizes(folder_path='downloaded_images_single_page'):"""分析指定文件夹中所有图片的特征,并生成可视化图表。"""image_files=[fforfinos.listdir(folder_path)iff.lower().endswith(('.jpg','.jpeg','.png'))]ifnotimage_files:print(f"在文件夹'{folder_path}'中没有找到图片文件。")returnwidths=[]heights=[]#遍历所有图片,获取尺寸print("开始读取图片尺寸...")forfilenameinimage_files:try:withImage.open(os.path.join(folder_path,filename))asimg:width,height=img.sizewidths.append(width)heights.append(height)exceptExceptionase:print(f"无法读取图片{filename}:{e}")print("所有图片尺寸读取完毕!")在步骤一获取了所有图片的宽度和高度数据后,我们现在可以利用这些数据绘制第一张图表——散点图。每一张图片都将作为图上的一个点,其横坐标是图片的宽度,纵坐标是图片的高度。这可以帮助我们直观地看到数据集中所有图片尺寸的分布情况。#代码块2:绘制散点图#设置Matplotlib支持中文显示plt.rcParams['font.sans-serif']=['MicrosoftYaHei','SimHei']plt.rcParams['axes.unicode_minus']=False#绘制散点图plt.figure(figsize=(10,6))#创建一个新的图形窗口plt.scatter(widths,heights,alpha=0.6,edgecolors='w',s=80)plt.title('下载图片尺寸分布图(散点图)',fontsize=16)plt.xlabel('宽度(像素)',fontsize=12)plt.ylabel('高度(像素)',fontsize=12)plt.grid(True)除了观察每个数据点的个体情况,我们还关心数据集的整体特征。本步骤将对已获取的尺寸数据进行一次简单的统计:计算“横向”、“纵向”和“方形”的图片各有多少张。然后,利用统计结果绘制第二张图表——柱状图,以清晰地对比不同朝向图片的数量。#代码块3:绘制柱状图并显示#首先,根据宽高数据统计图片朝向orientations={'横向':0,'纵向':0,'方形':0}forw,hinzip(widths,heights):ifw>h:orientations['横向']+=1elifh>w:orientations['纵向']+=1else:orientations['方形']+=1categories=list(orientations.keys())counts=list(orientations.values())#绘制柱状图plt.figure(figsize=(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 景泰蓝制作工标准化考核试卷含答案
- 2026届河北保定市唐县第一中学高三下学期二模化学试题(含答案)
- 施工降水井点施工环境保护方案
- 重庆市西南大学视觉传达设计专业设计素描模拟试卷及答案
- 农林岗2026面试习题汇编含答案含解析配套答题思路
- (2026年)廊坊市文安县辅警协警笔试真题(附答案)
- 2026直流调速系统试题及答案
- 2026年行政执法人员行政执法资格证试题库及答案
- 2026江苏大禹水务股份有限公司招聘笔试历年参考题库附带答案
- 2026年自学考试考试《公共经济学(05722)》模考试卷及答案
- 宁波西摩电器有限公司存货内部控制制度优化设计
- 激光脱毛培训课件教案
- GB/T 40006.12-2025塑料再生塑料第12部分:聚甲基丙烯酸甲酯(PMMA)材料
- 创伤性前房积血护理
- 【2025秋 新教材】统编版 二年级上册道德与法治 第16课《祖国我为您自豪》(第二课时)
- 杭州雷峰塔图文课件
- 危废处置合同框架协议
- 领队知识培训内容课件
- 无人机维护与保养课件
- 乒乓球教练基本知识培训课件
- GA/T 2161-2024法庭科学非法集资类案件资金数据分析规程
评论
0/150
提交评论