这个项目属于哪个课程 | 2024数据采集与融合技术实践 |
---|---|
组名 | 从你的全世界爬过 |
项目简介 | 项目名称:博物识植 项目logo: 项目介绍:在探索自然奥秘的旅途中,我们常与动植物相伴而行,却无法准确识别它们,更难以深入了解他们的特征。为了更好地理解和欣赏自然界的多样性,提升我们对动植物的认识和保护意识,我们需要一个智能系统。该系统能够根据用户拍摄的动植物照片,智能识别并匹配相应的信息,同时为用户提供丰富的学习资源,帮助人们更深入地了解和学习动植物知识。通过这样的方式,我们不仅能够更准确地识别和欣赏周围的生命,还能够在日常生活中,随时随地增长见识,体验探索自然的乐趣。 项目背景:人类的生活离不开动植物的支持,动植物的多样性是一切地球生物的依赖。在生活中随处可见很多动植物,动植物是人类生活必不可少的一部分。 保护大自然保护动植物就是在保护人类自己。在保护动植物的过程中,首先要解决的是动植物识别的问题。 项目意义:提供了一种我们与自然界互动的方式。其应用场景广泛,渗透到了教育、旅游等多个领域。在学校,它可以是生物课程的辅助工具,通过实践学习生物多样性;在旅游行业,它可以帮助游客更好地了解他们所参观的自然景观,提升旅行体验 |
团队成员学号 | 042201401陈高菲、102202107王勤琛、102202108王露洁、102202115孙佳会、102202123张铭心、102202130林烨、102202138徐婉瑜、102202140郭心怡 |
项目目标 | 本系统旨在实现以下功能: a.图片识别功能:用户上传动植物图片,系统通过图像识别技术自动识别物种,返回准确的物种名称。 b.物种详细信息:识别后,用户将获取该物种的详细信息,包括外形特点、生长环境、分布区域等相关数据。 c.物种图片展示:系统将提供该物种的高质量图片,帮助用户更直观地了解物种特征。 d.名称搜索功能:用户可以手动输入动植物的名称,系统将返回该物种的相关信息,方便快速查询。 e.网站部署上线:通过华为云的弹性计算服务部署网站,确保系统高可用和稳定运行,实现网站上线。 |
其他参考文献 | 1.yanjingang/pigimgclassification: 图像分类 2.基于改进SE-MnasNet骨干网络YOLOv5的动植物树木识别系统_开源 树木识别 |
gitee链接 | 2024学年数据采集与融合技术大作业——博物识植 团队:从你的全世界爬过 |
一、系统总体技术概述
1.系统架构概述
系统分为前端、后端、数据库、AI接口、爬虫模块、部署等多个层级。前后端之间通过RESTful API进行通信。具体分为以下几个部分:
- 前端:使用HTML、CSS和JavaScript进行界面设计,实现用户与系统的交互。用户可以上传文本、图片等文件。
- 后端:使用Python语言和Flask框架实现,处理图像识别、查询请求、调用AI接口和爬虫数据存储等业务逻辑。
- 数据库:存储动植物物种的详细信息,包括图像、分布、特点等。
- 图像识别与AI接口:利用图像识别模型或调用第三方AI服务(如百度AI、Google Vision等)识别图片并返回结果。
- 爬虫:提前爬取动植物相关网站数据,补充物种数据库。使用Selenium框架进行实时图片爬取。
- 部署平台:使用华为云平台部署系统,保证系统的高可用和稳定性。
2 各模块技术实现
2.1 图像识别模块
- 目标:用户上传图片,系统通过图像识别技术返回物种名称。
- 技术方案:
使用深度学习模型:基于改进SE-MnasNet骨干网络YOLOv5和卷积神经网络cnn opencv进行图像分类和识别。
调用第三方云服务百度智能云的动植物识别API提供快速而准确的图像识别。 - 流程:
用户上传图片,前端将图片通过API发送至后端。
后端调用模型或AI图像识别API分析图片,获取可能的物种标签。
后端将物种名称返回给前端,前端展示识别结果。
2.2 物种信息查询功能
- 目标:根据识别后的物种名称或用户输入的名称,返回该物种的详细信息。
- 技术方案:
利用selenium技术和scrapy框架爬取信息网站所有物种信息(如外形特点生长环境、分布区域等)存储在csv表导入数据库并定期更新。
利用查询语句在数据库中进行查找并返回详细信息。
若数据库中没有相关信息,则调用百度智能云的千帆大模型识别物种名称,查询物种相关信息。 - 流程:
后端识别出物种名称时,系统首先查询数据库,若没有该物种的信息,再调用AI接口获取。
2.3 相似图片展示
- 目标:根据用户上传的图片,返回物种的相似图片,帮助用户直观了解物种。
- 技术方案:
运用selenium爬虫技术实时爬取百度识图返回的相似图片 - 流程:
后端接收前端传入的图片后,将图片作为输入文件传入百度识图网站实时爬取相似图片,在系统返回物种详细信息时,将图片URL一并返回。
2.4 部署与部署架构
- 目标:将整个系统部署到华为云服务器上,让非本地用户可以访问。
- 技术方案:
使用华为云ECS(Elastic Cloud Server)部署后端服务。
使用华为云OBS 存储图片等静态资源。
使用RDS(Relational Database Service)存储物种信息数据库。
前端可以使用 Nginx 进行负载均衡和反向代理 - 流程:
前后端文件上传部署完成后即可实现非本地用户的访问。
二、个人分工及具体实现
1.动物信息爬取与存储
1.1 技术实现
- 使用了
selenium
库来模拟浏览器操作,通过自动化的方式访问目标网站http://museum.ioz.ac.cn/index.html。 - 在网页中,首先定位到搜索框,通过输入动物名称进行搜索。然后等待搜索结果页面加载,切换到
iframe
中,提取结果表格中的数据。 - 对于每一个动物名称,尝试点击 “详细” 按钮,打开新窗口获取详细信息。使用
BeautifulSoup
库解析网页内容,提取动物的名称、拉丁名、门、纲、目、科、资源编码和描述等信息。 - 将提取到的信息存储到
CSV
文件中,以便后续的分析和使用。
核心代码展示:
try:
for animal_name in animal_names:
# 确保访问主页(如果需要刷新状态)
driver.get(home_url)
# 等待搜索框加载
search_box = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.NAME, "chinaname"))
)
search_box.clear() # 清空搜索框
search_box.send_keys(animal_name) # 输入当前动物名称
# 定位搜索按钮并点击
search_button = WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.ID, "button_search"))
)
search_button.click()
print(f"正在搜索:{animal_name},等待结果页面加载...")
# 切换到 iframe
WebDriverWait(driver, 20).until(
EC.frame_to_be_available_and_switch_to_it((By.ID, "rightFrame"))
)
print("已切换到结果 iframe")
# 等待结果表格加载
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CLASS_NAME, "mod_list"))
)
print("结果表格已加载")
# 提取表格中的每一行
rows = driver.find_elements(By.XPATH, "//table[@class='mod_list']/tbody/tr")
for row in rows:
try:
# 尝试点击“详细”按钮(使用 contains() 进行模糊匹配)
detail_button = row.find_element(By.XPATH, ".//a[contains(text(),'详细')]")
print(f"找到详细链接:{detail_button.text}")
detail_button.click()
# 切换到新窗口
WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2))
new_window_handle = driver.window_handles[-1]
driver.switch_to.window(new_window_handle)
# 等待详细页面加载
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.CLASS_NAME, "item_con_2"))
)
# 提取详细页面的数据
soup = BeautifulSoup(driver.page_source, "html.parser")
# 处理描述信息,避免 'NoneType' 错误
description_element = soup.select_one(".item_con_2 li:nth-of-type(8) p")
description = description_element.text.strip() if description_element else "描述信息缺失"
# 构建详细信息字典
details = {
"动物名": soup.select_one(".item_con_2 li:nth-of-type(1) p").text.strip() if soup.select_one(".item_con_2 li:nth-of-type(1) p") else "缺失",
"拉丁名": soup.select_one(".item_con_2 li:nth-of-type(2) p").text.strip() if soup.select_one(".item_con_2 li:nth-of-type(2) p") else "缺失",
"门": soup.select_one(".item_con_2 li:nth-of-type(3) p").text.strip() if soup.select_one(".item_con_2 li:nth-of-type(3) p") else "缺失",
"纲": soup.select_one(".item_con_2 li:nth-of-type(4) p").text.strip() if soup.select_one(".item_con_2 li:nth-of-type(4) p") else "缺失",
"目": soup.select_one(".item_con_2 li:nth-of-type(5) p").text.strip() if soup.select_one(".item_con_2 li:nth-of-type(5) p") else "缺失",
"科": soup.select_one(".item_con_2 li:nth-of-type(6) p").text.strip() if soup.select_one(".item_con_2 li:nth-of-type(6) p") else "缺失",
"资源编码": soup.select_one(".item_con_2 li:nth-of-type(7) p").text.strip() if soup.select_one(".item_con_2 li:nth-of-type(7) p") else "缺失",
"描述": description
}
print(f"详细数据:{details}")
# 将详细数据写入CSV文件
with open('animal_details.csv', 'a', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow([details["动物名"], details["拉丁名"], details["门"], details["纲"], details["目"], details["科"], details["资源编码"], details["描述"]])
# 关闭详细页面并切回主窗口
driver.close()
driver.switch_to.window(driver.window_handles[0])
# 返回主页面后退出当前循环
break # 如果只需要第一个结果,退出循环
except NoSuchElementException:
print("未找到详细链接,跳过此行")
finally:
driver.quit()
1.2 遇到的问题及解决方案
- 问题:在爬取过程中,经常会遇到加载超时的情况。有时候还会出现找不到元素的错误,导致程序中断。
- 解决方案:对于加载超时的情况,使用
WebDriverWait
设置合理的等待时间,并在超时后保存截图和网页源代码,以便进行调试。对于找不到元素的错误,通过打印错误信息,分析可能出现问题的地方,调整定位元素的方式。
1.3 成果展示
成功地爬取了大量动物的详细信息,并存储到了animal_details.csv
文件中。这个文件包含了动物的各种属性,为后续的图像识别和信息展示提供了丰富的数据支持。
2. 相似图片爬取
2.1 技术实现
- 同样使用
selenium
库,打开百度识图页面https://graph.baidu.com/pcpage/index?tpl_from=pc。 - 模拟点击相机图标,上传图片,然后等待搜索结果加载。
- 提取前三个相似图片的 URL,并将其保存到
CSV
文件中。
核心代码展示:
try:
# 打开百度识图页面
url = "https://graph.baidu.com/pcpage/index?tpl_from=pc"
driver.get(url)
# 等待页面加载并点击相机图标
wait = WebDriverWait(driver, 10)
camera_button = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "graph-d20-search-wrapper-camera")))
camera_button.click()
# 上传图片
file_input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='file']")))
file_path = r"C:\Users\86183\Desktop\scrapy\20210620225849_c85c6.jpg" # 替换为图片的绝对路径
file_input.send_keys(file_path)
# 等待搜索结果加载
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.general-imgcol > a")))
# 获取前三个相似图片的URL
result_links = driver.find_elements(By.CSS_SELECTOR, "div.general-imgcol > a")
similar_images = []
for link in result_links[:3]: # 只取前三个
img_url = link.get_attribute("href")
if img_url:
similar_images.append(img_url)
# 保存为 CSV 文件
output_file = "similar_images.csv"
with open(output_file, mode="w", encoding="utf-8", newline="") as file:
writer = csv.writer(file)
writer.writerow(["Image URL"])
writer.writerows([[url] for url in similar_images])
print(f"相似图片的URL已保存到 {output_file}")
finally:
# 关闭浏览器
driver.quit()
2.2 遇到的问题及解决方案
- 问题:在上传图片时,需要找到正确的文件路径。同时,要确保能够准确地定位到相似图片的链接。
- 解决方案:将图片的绝对路径设置正确,并通过
CSS
选择器准确地定位到相似图片的链接。在定位元素时,使用WebDriverWait
等待元素加载完成,确保程序的稳定性。
2.3 成果展示
成功地爬取了指定图片的前三个相似图片的 URL,并保存到了similar_images.csv
文件中。这些相似图片可以为用户提供更多的参考信息,增强了系统的实用性。
3. 心得体会
回顾这次大学爬虫课程项目,心中满是感慨。为了解决加载超时和元素定位的问题,我花费了大量的时间和精力,反复调试、查阅资料,这个过程虽然艰辛,但当成功爬取到动物信息和相似图片时,那种喜悦无与伦比。小组合作中,大家互相支持、共同进步,让我感受到团队的温暖。这次经历不仅提升了我的技术能力,更让我懂得了坚持和协作的意义,是我大学生活中一段难忘且珍贵的回忆。