综合设计 ——多源异构数据采集与融合应用综合实践

综合设计 ——多源异构数据采集与融合应用综合实践

码云地址

这个项目属于哪个课程 <班级的链接>
组名、项目简介 组名:黑马楼:直面爬虫
项目需求:实现宠物具体种类的识别
项目目标:根据用户上传的文本和图片识别具体的宠物种类
项目开展技术路线:html,css,js,flask
团队成员学号 102202113许煊宇,102202103王文豪,102202148路治,102202129林伟宏,102102151黄靖,172209028伊晓,102202102王子聪,102202116李迦勒
这个项目的目标 根据用户上传的文本和图像,识别图像内容和文本信息,确定具体的宠物种类(例如:贵宾犬,比熊犬等)
其他参考文献 如何使用Python和大模型进行数据分析和文本生成
Python 调用常见大模型 API 全解析

项目介绍

名称:福宠
背景:宠物在人们的生活中扮演着越来越重要的角色,对于宠物的准确识别和分类有助于宠物饲养者更好地了解宠物的品种等信息,同时也有利于宠物相关产业的精细化管理。
意义:传统的宠物识别方法主要依赖人工观察和经验判断,效率较低且准确性难以保证。随着大模型技术在图像识别和自然语言处理领域的快速发展,利用计算机视觉和自然语言处理技术实现宠物信息的自动识别和分类成为可能。本项目旨在设计并实现一个综合的宠物信息识别与分类系统,通过整合图像分类和文本分析技术,提高宠物信息识别的准确性和效率。
功能需求:
1.用户上传图片和文本:用户能够上传宠物的照片,并填写相关描述文本(生活习惯,性格特征等)。
2.图像处理与分析:通过调用星火认知大模型(图片理解)识别宠物种类(如狗、猫等)。
3.文本分析与匹配:通过调用星火认知大模型(spark4.0 ultra)分析文本描述,以补充图像分类的结果。
4.比对和分类:将图像和文本信息与本地数据库中的宠物信息进行比对,得出最终的宠物分类。
5.展示结果:将识别的宠物类型呈现给用户。
6.反馈机制:用户可以对分类结果提供反馈,帮助优化系统。

系统架构设计

前端设计

用户界面(UI):提供简洁的上传界面,支持图片上传和文本输入。前端可以显示上传的图片预览和输入的文本。
图像和文本预处理:前端可以对图像进行压缩或格式检查,确保上传的图像符合要求。

后端设计

图像分类模块:后端需要接收图片并通过星火认知大模型(图片理解)的调用来进行宠物种类的识别(目前图片部分只进行大致种类的分类,例如猫,狗等)。
文本处理模块:对用户输入的文本进行分析,通过星火认知大模型(spark4.0 ultra)的调用来提取相关的宠物信息(如生活习惯,性格特征等),并与图像分类结果结合。
数据库模块:爬取网站宠物大全_宠搜网的宠物信息(具体种类,关键词,图片url),提供查询功能。
比对与分类模块:根据图像和文本的分析结果,从数据库中匹配出相似的宠物类别。

数据流

用户上传图像和文本 → 前端发送请求到后端
图像上传处理 → 后端使用图像分类模型处理
文本分析处理 → 后端使用文本处理模型分析
图像与文本匹配 → 与本地数据库中的宠物数据进行比对
返回分类结果 → 后端返回宠物类型,前端展示给用户

个人分工

前端保存用户上传的文本和图像

点击查看代码
<!-- 在页面最上方添加图片元素,这里的src路径需替换为实际有效的图片路径,可根据需求调整宽高样式等 -->
    <img class="top-image" src="../static/logo.png" alt="页面顶部图片">

    <form action="/upload" method="post" enctype="multipart/form-data">
        <label for="text">请对上传的福宠进行介绍</label><br>
        <input type="text" id="text" name="text"><br>

        <!-- 模拟上传按钮及相关文本区域 -->
        <div id="upload-container">
            <p id="upload-text">将福宠放入精灵球</p>
            <!-- 隐藏的文件输入框及相关元素 -->
            <input type="file" id="image" name="image" style="display: none" onchange="updateTextAndPreview(this)">
            <img id="preview" alt="Preview" style="display: none;">
            <img id="upload-img" src="../static/upload.png" alt="将福宠放入精灵球">
        </div>

        <br><br>
        <input class="submit" type="submit" value="捕捉福宠">
    </form>

    <script>
        const uploadContainer = document.getElementById('upload-container');
        const fileInput = document.getElementById('image');
        const uploadText = document.getElementById('upload-text');
        const previewImageElement = document.getElementById('preview');
        const uploadImg = document.getElementById('upload-img');

        // 当点击模拟上传按钮及相关区域时,触发隐藏文件输入框的点击事件
        uploadContainer.addEventListener('click', function () {
            fileInput.click();
        });

        function updateTextAndPreview(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();

                reader.onload = function (e) {
                    previewImageElement.src = e.target.result;
                    previewImageElement.style.display = 'block';
                    uploadText.textContent = '精灵球内的福宠';
                    uploadImg.style.display = 'none';
                }

                reader.readAsDataURL(input.files[0]);
            }
        }
    </script>

结合图像和文本大模型调用,将返回的结果与爬取的知识库进行比对,识别宠物的具体种类

点击查看代码
def find_most_similar_data(text_result, json_data_list):
    """
    根据文本分析结果,在给定的JSON数据列表中找到相似度最高的数据
    """
    result_dict = {}
    text_words = text_result.split("、")
    i=0
    for data in json_data_list:
        id_value = data.get('id',i)  # 获取唯一标识字段的值
        keywords = data.get('关键词', [])
        i += 1
        count = 0
        for word in text_words:
            if word in keywords:
                count += 1
        result_dict[id_value] = count  # 使用唯一标识作为键

    sorted_results = sorted(result_dict.items(), key=lambda x: x[1], reverse=True)

    # 返回前五个相似度最高的结果对应的完整数据
    return [json_data_list[result[0]] for result in sorted_results[:5]]

if __name__ == "__main__":
    image_answer = analyze_image()
    print(image_answer)
    text_answer = analyze_text()
    print(text_answer)
    json_folder_path = os.path.join(os.getcwd(), 'chongwulist')
    if image_answer == "猫。":
        image_answer = "cat"
    if image_answer == "狗。":
        image_answer = "dog"
    json_file_name = f"{image_answer.lower()}.json"
    print(json_file_name)
    json_file_path = os.path.join(json_folder_path, json_file_name)

    if os.path.exists(json_file_path):
        json_data_list = read_json_file(json_file_path)
        most_similar_data = find_most_similar_data(text_answer, json_data_list)

        if most_similar_data:
            print("最相似的5个数据:")
            for data in most_similar_data:
                print("宠物名称:", data.get('宠物名称', '未找到宠物名称'))
        else:
            print("未找到与分析结果匹配的相关数据")
    else:
        print(f"未找到对应的JSON文件: {json_file_path}")

知识库的爬取

例如:

点击查看代码
import requests
from bs4 import BeautifulSoup
import json

# 基础URL,假设类别ID为355,页码从1到11
base_url = 'https://www.chongso.com/chongwulist_355_0_0_0_0_0_{}.html'

# 初始化一个空列表来存储所有宠物信息
dog_breeds_data = []

# 遍历1到11页
for page in range(1, 12):
    # 构造当前页的URL
    url = base_url.format(page)
    
    # 发送HTTP请求
    response = requests.get(url)
    response.encoding = 'utf-8'  # 根据网页的实际编码设置
    
    # 检查请求是否成功
    if response.status_code == 200:
        # 使用BeautifulSoup解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 找到包含宠物信息的<div class="dqlist">
        dqlist_div = soup.find('div', class_='dqlist')
        
        # 在<div class="dqlist">中找到<ul class="clearfix">
        dog_list = dqlist_div.find('ul', class_='clearfix')
        
        # 遍历<ul class="clearfix">中的每个<li>标签
        for dog in dog_list.find_all('li'):
            dog_info = {}
            # 获取图片链接
            img = dog.find('img')
            if img:
                img_url = img.get('src')
                dog_info['图片链接'] = img_url
            
            # 获取宠物名称
            name_div = dog.find('div', style=lambda value: value and 'font-size: 16px;' in value)
            if name_div:
                name = name_div.text.strip()
                dog_info['宠物名称'] = name
            
            # 获取关键词
            keywords_div = dog.find('div', style=lambda value: value and 'font-size:12px;' in value)
            if keywords_div:
                keywords = keywords_div.text.strip()
                # 去除“关键词:”并分割关键词
                dog_info['关键词'] = keywords.replace('关键词:', '').split('|')
            
            # 将宠物信息添加到列表中
            dog_breeds_data.append(dog_info)
        print(f'第{page}页爬取完成')
    else:
        print(f'第{page}页请求失败,状态码: {response.status_code}')

# 将数据保存为JSON文件
with open('dog.json', 'w', encoding='utf-8') as f:
    json.dump(dog_breeds_data, f, ensure_ascii=False, indent=4)

print('所有数据已保存到dog.json文件中')

所有的爬取包括

心得体会

作为组长,和组员们从零开始手搓一个自己制作的网站,虽然其中遇到了很多挫折,但也使我收获颇丰。我认识到即使作为一个团体项目,成员之间的合作至关重要,某个成员的懈怠会导致整个项目进度缓慢甚至停滞不前(血的教训)。我也在这次的项目实现过程中提高了自己的编程能力,更加熟悉flask的使用以及python调用大模型的方法。

posted @ 2024-12-15 22:50  许煊宇  阅读(13)  评论(0编辑  收藏  举报