详细记录swfit微调interVL2-8B多模态大模型进行目标检测(附代码)

大模型相关目录

大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。

  1. RAGOnMedicalKG:大模型结合知识图谱的RAG实现
  2. DSPy:变革式大模型应用开发
  3. 最简明的Few-shot Prompt指南
  4. Semantic Kernel:微软大模型开发框架——LangChain 替代
  5. 对话大模型Prompt是否需要礼貌点?
  6. swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)
  7. 多模态大模型Internvl-1.5-26B微调后部署及测试实录(附代码)
  8. 多模态大模型Internvl-2-26B的OCR赋能方案(附代码)
  9. miniconda+xinference的大模型推理部署指南
  10. Mem0:大模型最强赋能“有记忆的LLM”
  11. 再谈Agent:Dify智能体实现Txet2SQL
  12. Moe模式:或将是最好的大模型应用开发路径
  13. 一文带你了解大模型RAG
  14. 详细记录swfit微调interVL2-8B多模态大模型进行目标检测(附代码)

文章目录

  • 大模型相关目录
  • 前言
  • 模型选型
  • 数据集制作
  • 模型微调
  • 训练后的模型部署及测试
      • 合并权重
      • 推理部署
      • 测试
  • 总结


前言

目标检测任务已经不是一个新鲜事了,但是多模态大模型作目标检测任务并不多见,本文详细记录swfit微调interVL2-8B多模态大模型进行目标检测的过程,旨在让更多人了解多模态大模型微调技术、共享微调经验。

模型选型

并不是所有开源多模态大模型都有目标检测能力。
在这里插入图片描述
如图所示,哪怕是闭源模型,也并都不具备目标检测能力。
经调研,我们选用interVL2-8B模型,在模型性能指标上,该模型胜过interVL1.5-26B的同时,还具备目标检测能力,且与interVL2-26B、40B、70B模型性能差不并没有非常巨大。

其回答格式也很有意思,此处分享:

<ref>zs_code</ref><box>[[476,1221,814,1259]]</box>

数据集制作

本文任务数据集均为自行制作,其中,数据分布如下图:
在这里插入图片描述
其中,test文件夹用于性能测试,tain文件夹用于模型训练。pic子文件夹表示图像存储路径,xml表示标注存储路径,图像与标注一一对应。

具体内容如下:

图像示例:
在这里插入图片描述
对应标注示例

<annotation><folder>code_data</folder><filename>xxx-本科毕业证.jpg</filename><path>C:\Users\12258\Desktop\code_data\xxx-本科毕业证.jpg</path><source><database>Unknown</database></source><size><width>842</width><height>596</height><depth>3</depth></size><segmented>0</segmented><object><name>zs_code</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>142</xmin><ymin>422</ymin><xmax>351</xmax><ymax>446</ymax></bndbox></object>
</annotation>

该数据集使用labelimg手动标注,每张图像为典型毕业证、学位证、学历验证、资质证书影像,只含一个标签名称zs_code。

其中,测试图像30张,训练图像250张。

编写脚本,构建可用于微调训练的数据集jsonl,jsonl配合图像即可完成swift框架下的多模态模型微调。

import os
import random
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import json
from PIL import Image, ExifTags
import xml.etree.ElementTree as ETdef create_directory(path):"""Create a new directory at the given path."""try:os.makedirs(path, exist_ok=True)return f"Directory created at {path}"except Exception as e:return f"An error occurred: {e}"def list_files(directory):"""List all files in the given directory."""return [file for file in os.listdir(directory) if os.path.isfile(os.path.join(directory, file))]def list_files_with_absolute_paths(directory):"""List all files in the given directory with their absolute paths."""return [os.path.abspath(os.path.join(directory, file)) for file in os.listdir(directory) if os.path.isfile(os.path.join(directory, file))]def extract_xml_info(xml_file_path):with open(xml_file_path, 'r',encoding='utf-8') as file:xml_content = file.read()# 解析XML内容root = ET.fromstring(xml_content)# 初始化一个列表来保存提取的信息extracted_info = []# 遍历所有<object>标签for obj in root.findall('object'):name = obj.find('name').textbndbox = obj.find('bndbox')xmin = int(bndbox.find('xmin').text)ymin = int(bndbox.find('ymin').text)xmax = int(bndbox.find('xmax').text)ymax = int(bndbox.find('ymax').text)# 将提取的信息保存到列表中extracted_info.append({'name': name, 'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax})name = str(extracted_info[0]['name'])xmin = str(extracted_info[0]['xmin'])ymin = str(extracted_info[0]['ymin'])xmax = str(extracted_info[0]['xmax'])ymax = str(extracted_info[0]['ymax'])# 仅仅用于单标注图像result = f'<ref>{name}</ref><box>[[{xmin},{ymin},{xmax},{ymax}]]</box>'return resultdef get_elements_with_string(lst, target_string):return [element for element in lst if target_string in element]train_pic_path = '/home/super/lyq/zsbm_mbjc/data/train/pic'
train_xml_path = '/home/super/lyq/zsbm_mbjc/data/train/xml'
test_pic_path = '/home/super/lyq/zsbm_mbjc/data/test/pic'
test_xml_path = '/home/super/lyq/zsbm_mbjc/data/test/xml'train_pic_absolute_paths = list_files_with_absolute_paths(train_pic_path)
train_xml_absolute_paths = list_files_with_absolute_paths(train_xml_path)
test_pic_absolute_paths = list_files_with_absolute_paths(test_pic_path)
test_xml_absolute_paths = list_files_with_absolute_paths(test_xml_path)train_pic_paths = list_files(train_pic_path)
train_xml_paths = list_files(train_xml_path)
test_pic_paths = list_files(test_pic_path)
test_xml_paths = list_files(test_xml_path)dataset = []for train_pic_absolute_path in train_pic_absolute_paths:# 图像路径mid_dict = {}file_head = train_pic_absolute_path.split('/')[-1].split('.')[0]# print(file_head,train_pic_absolute_path)xml_path = get_elements_with_string(train_xml_absolute_paths,file_head)[0]# print(xml_path)xml_info = extract_xml_info(xml_path) # responsemid_dict = {'system':'''职位:你是一个面向证书图像的目标检测大师,具备精准识别、定位图像中证书编码的能力。职能:从毕业证、学历验证报告、证书等图像中检测到证书编码区域并给出边界框。**注意**:仅以给定格式返回检测结果,不要给出其它任何解释。**注意**:若图片中没有典型违章场景,返回<ref> class_name </ref><box>[[0, 0, 0, 0]]</box>即可。''','query':'请目标检测图像中的证书编码并给出边界框','response':xml_info,'images':train_pic_absolute_path}dataset.append(mid_dict)# 指定输出文件的名称
output_file = 'train_dataset.jsonl'# 打开文件并写入JSONL格式的数据
with open(output_file, 'w', encoding='utf-8') as f:for item in dataset:# 将字典转换为JSON字符串并写入文件,每个字典占一行json_string = json.dumps(item,ensure_ascii=False)f.write(json_string + '\n')dataset = []for test_pic_absolute_path in test_pic_absolute_paths:# 图像路径mid_dict = {}file_head = test_pic_absolute_path.split('/')[-1].split('.')[0]xml_path = get_elements_with_string(test_xml_absolute_paths,file_head)[0]xml_info = extract_xml_info(xml_path) # responsemid_dict = {'system':'''职位:你是一个面向证书图像的目标检测大师,具备精准识别、定位图像中证书编码的能力。职能:从毕业证、学历验证报告、证书等图像中检测到证书编码区域并给出边界框。**注意**:仅以给定格式返回检测结果,不要给出其它任何解释。**注意**:若图片中没有典型违章场景,返回<ref> class_name </ref><box>[[0, 0, 0, 0]]</box>即可。''','query':'请目标检测图像中的证书编码并给出边界框','response':xml_info,'images':test_pic_absolute_path}dataset.append(mid_dict)# 指定输出文件的名称
output_file = 'test_dataset.jsonl'# 打开文件并写入JSONL格式的数据
with open(output_file, 'w', encoding='utf-8') as f:for item in dataset:# 将字典转换为JSON字符串并写入文件,每个字典占一行json_string = json.dumps(item,ensure_ascii=False)f.write(json_string + '\n')

上述代码结果为test_dataset.jsonltrain_dataset.jsonl两个jsonl文件,分别对应train、test文件夹。

test_dataset.jsonl

{"system": "职位:你是一个面向证书图像的目标检测大师,具备精准识别、定位图像中证书编码的能力。\n        职能:从毕业证、学历验证报告、证书等图像中检测到证书编码区域并给出边界框。\n        **注意**:仅以给定格式返回检测结果,不要给出其它任何解释。\n        **注意**:若图片中没有典型违章场景,返回<ref> class_name </ref><box>[[0, 0, 0, 0]]</box>即可。\n        ", "query": "请目标检测图像中的证书编码并给出边界框", "response": "<ref>zs_code</ref><box>[[67,761,302,798]]</box>", "images": "/home/super/lyq/zsbm_mbjc/data/train/pic/xxx-专科毕业证.jpg"}
{"system": "职位:你是一个面向证书图像的目标检测大师,具备精准识别、定位图像中证书编码的能力。\n        职能:从毕业证、学历验证报告、证书等图像中检测到证书编码区域并给出边界框。\n        **注意**:仅以给定格式返回检测结果,不要给出其它任何解释。\n        **注意**:若图片中没有典型违章场景,返回<ref> class_name </ref><box>[[0, 0, 0, 0]]</box>即可。\n        ", "query": "请目标检测图像中的证书编码并给出边界框", "response": "<ref>zs_code</ref><box>[[455,1272,1083,1356]]</box>", "images": "/home/super/lyq/zsbm_mbjc/data/train/pic/xxx-本科毕业证.jpg"}
{"system": "职位:你是一个面向证书图像的目标检测大师,具备精准识别、定位图像中证书编码的能力。\n        职能:从毕业证、学历验证报告、证书等图像中检测到证书编码区域并给出边界框。\n        **注意**:仅以给定格式返回检测结果,不要给出其它任何解释。\n        **注意**:若图片中没有典型违章场景,返回<ref> class_name </ref><box>[[0, 0, 0, 0]]</box>即可。\n        ", "query": "请目标检测图像中的证书编码并给出边界框", "response": "<ref>zs_code</ref><box>[[90,484,329,508]]</box>", "images": "/home/super/lyq/zsbm_mbjc/data/train/pic/xxx-本科毕业证.jpg"}

其中内容大概如上,人名已脱敏。

数据集于swift框架进行注册:
可参考我的历史文章

https://blog.csdn.net/qq_43128256/article/details/140314241

在这里插入图片描述

在这里插入图片描述

模型微调

本文不再采取UI,纯指令如下:

CUDA_VISIBLE_DEVICES=0,1,2,3  swift sft \
--model_id_or_path /data/hfd/InternVL2-8B \
--template_type internvl2 \
--dataset /home/super/lyq/train_dataset.jsonl \
--lora_target_modules ALL \
--lora_lr_ratio 16.0 \
--lora_rank 16 \
--learning_rate 1e-4 \
--num_train_epochs 5 \
--use_flash_attn True \
--gradient_accumulation_steps 4 \
--batch_size 2 \
--eval_steps 50 \
--save_steps 500 \
--neftune_noise_alpha 5 \
--model_type internvl2-8b \
--device_max_memory 15GB 15GB 15GB 15GB \
--output_dir /home/super/sgq/swift/llm-yolo/detection2/v1 \
--logging_dir /home/super/sgq/swift/llm-yolo/detection2/v1/runs

其中需注意:

–model_id_or_path /data/hfd/InternVL2-8B
该参数为模型路径

–dataset /home/super/lyq/train_dataset.jsonl
该参数为微调数据集

–num_train_epochs 5
该参数为训练轮次,视情况调整

–use_flash_attn True
加速项,服务器未配置可不选

–output_dir /home/super/sgq/swift/llm-yolo/detection2/v1
为训练结果保存路径,结果包含微调训练参数和精度损失记录等

–logging_dir /home/super/sgq/swift/llm-yolo/detection2/v1/runs
为tensorboard查看结果内容存储路径

在这里插入图片描述

结果如上,其中checkpoint-135为训练后的lora权重;images为训练曲线;其他文件为训练参数。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

训练后的模型部署及测试

合并权重

CUDA_VISIBLE_DEVICES=0,1,2,3 swift export --ckpt_dir '/home/super/lyq/zsbm_mbjc/train_240731_1/internvl2-8b/v0-20240731-154920/checkpoint-135' --merge_lora true

生成合并模型:
在这里插入图片描述

推理部署

在这里插入图片描述

测试

api_ask.py

from openai import OpenAI
import base64client = OpenAI(api_key='YOUR_API_KEY', base_url='http://172.20.32.127:23333/v1')
model_name = client.models.list().data[0].id#图片转base64函数
def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')#原图片转base64
def get_response(input_image_path):base64_image = encode_image(input_image_path)response = client.chat.completions.create(model=model_name,messages=[{"role": "system","content": '''职位:你是一个面向证书图像的目标检测大师,具备精准识别、定位图像中证书编码的能力。职能:从毕业证、学历验证报告、证书等图像中检测到证书编码区域并给出边界框。**注意**:仅以给定格式返回检测结果,不要给出其它任何解释。**注意**:若图片中没有典型违章场景,返回<ref> class_name </ref><box>[[0, 0, 0, 0]]</box>即可。'''},{"role": "user","content":[{"type": "text","text": '请目标检测图像中的证书编码并给出边界框'},{"type": "image_url","image_url":{"url":f"data:image/jpeg;base64,{base64_image}"# "url": 'https://i-blog.csdnimg.cn/direct/253ad27104b7466792511f78e9f636a9.png'}},]}],temperature=0.8,top_p=0.8)return response.choices[0].message.content

get_llm_response.py

import json
import api_ask as llm_api
def read_jsonl(file_path):"""Read a JSONL file and return a list of dictionaries.:param file_path: Absolute path of the JSONL file to be read.:return: List of dictionaries representing the JSON objects in the file."""data = []with open(file_path, 'r', encoding='utf-8') as file:for line in file:data.append(json.loads(line))return datadata = read_jsonl('/home/super/lyq/test_dataset.jsonl')result = []
for single_data in data:img_path = single_data['images']single_result = llm_api.get_response(img_path)print(single_result)result.append({'images':img_path,'response':single_result})import pandas as pdpd.DataFrame(result).to_excel('llm_response.xlsx',index=False)

结果如下图:
在这里插入图片描述
result_test.py

import pandas as pd
from PIL import Image, ImageDraw
import re
import json
from PIL import Image, ExifTags
# 添加这个函数来处理图片方向
def correct_image_orientation(image):try:for orientation in ExifTags.TAGS.keys():if ExifTags.TAGS[orientation] == 'Orientation':breakexif = dict(image._getexif().items())if exif[orientation] == 3:image = image.rotate(180, expand=True)elif exif[orientation] == 6:image = image.rotate(270, expand=True)elif exif[orientation] == 8:image = image.rotate(90, expand=True)except (AttributeError, KeyError, IndexError):# 如果没有EXIF信息,就不做任何处理passreturn imagedef draw_rectangle(image_path, coordinates, output_path):"""在图像上标出矩形框。:param image_path: 图像的路径:param coordinates: 包含矩形框坐标的列表,格式为 [x1, y1, x2, y2]:param output_path: 输出图像的路径"""# 打开图像with Image.open(image_path) as img:img = correct_image_orientation(img)img = correct_image_orientation(img)# 创建一个可以在给定图像上绘图的对象draw = ImageDraw.Draw(img)# 计算矩形的左上角和右下角坐标x1, y1, x2, y2 = coordinates# 在图像上绘制矩形draw.rectangle([x1, y1, x2, y2], outline="red", width=2)# 保存修改后的图像img.save(output_path)def extract_string(s):"""从给定的字符串中提取方括号内的内容。:param s: 包含方括号的字符串:return: 提取出的字符串"""# 使用正则表达式匹配方括号内的内容match = re.search(r'\[(.*?)\]', s)if match:# 提取匹配的内容extracted_str = match.group(0)return eval(extracted_str+']')else:return Nonedef read_jsonl(file_path):"""读取JSONL文件并返回一个包含所有条目的列表。:param file_path: JSONL文件的路径:return: 包含JSON对象的列表"""data = []with open(file_path, 'r', encoding='utf-8') as file:for line in file:data.append(json.loads(line))return datadata = pd.read_excel('/home/super/lyq/llm_response.xlsx')images = data['images'].tolist()
responses = data['response'].tolist()
n = len(images)print(images)
for index in range(n):print(images[index])img_path = images[index]zuobiao = extract_string(responses[index])draw_rectangle(img_path,zuobiao[0],'/home/super/lyq/zsbm_mbjc/test_result_pic'+'/'+img_path.split('/')[-1])

在这里插入图片描述
在这里插入图片描述

总结

实际上,interVL2-8B多模态大模型在该任务上微调后的表现并不好。与此同时,我们还就电力巡检场景进行了微调测试,精度达到了80左右,其实也比较一般,综合来看,大模型其实并不那么擅长目标检测。

此处引申一个结论,大模型在分类任务上表现则好得多,且提升精度微调是必要的。
最近做了实验,测试集微调前精度57%,微调后97%,不过面向的是单轮问答。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity使用UGUI制作无限滑动列表

原理参照上一篇使用NGUI的制作无限滑动列表的文章 Unity 使用NGUI制作无限滑动列表_unity 滑动列表很多物体-CSDN博客 准备工作&#xff1a; 新建一个空物体命名为LoopList&#xff0c;并调整其大小&#xff0c; 并增加Scroll Rect组件&#xff08;用于滑动&#xff09;、Re…

Docker数据管理,端口映射与容器互联

1.Docker 数据管理 在生产环境中使用 Docker&#xff0c;往往需要对数据进行持久化&#xff0c;或者需要在多个容器之间进行数据共享&#xff0c;这必然涉及容器的数据管理操作。 容器中的管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumns&#xff09;&a…

Unity Shader编程】之基础纹理

一&#xff0c;单张纹理 好的&#xff0c;用户想学习Unity Shader中的单张纹理章节。我需要根据提供的搜索结果来整理相关内容。首先&#xff0c;查看搜索结果中的相关部分&#xff0c;特别是‌、‌、‌、‌、‌这几条&#xff0c;因为它们提到了基础纹理、单张纹理的实现方法…

QT系列教程(18) MVC结构之QItemSelectionModel模型介绍

视频教程 https://www.bilibili.com/video/BV1FP4y1z75U/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 QItemSelectionModel Qt的MVC结构支持多个View共享同一个model&#xff0c;包括该model的选中状态等。我们可以通过设置QItemSelectionModel&#xff0c;来更改View的选…

全网最详解答OSPF基础

目录 此图片为思科的&#xff08;有些地方不对&#xff09; 总结状态机&#xff1a; OSPF的工作过程&#xff1a; 结构突变 1 突然新增一个网段--触发更新 2 突然断开一个网段--触发更新 3 无法通信---dead time OSPF的配置 ​编辑条件匹配&#xff1a; ​编辑1&…

Flink深入浅出之05:CEP复杂事件

深入浅出Flink-第五天 1️⃣深入理解Flink的CEP的机制和使用&#xff0c;Flink实时处理应用案例。 4️⃣ 要点 &#x1f4d6; 1. Flink的复杂事件处理机制CEP 1.1 CEP概念 CEP是Complex Event Processing三个单词的缩写&#xff0c;表示复杂事件处理&#xff0c;是一种基于…

AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异

背景 字节跳动正式发布中国首个AI原生集成开发环境工具&#xff08;AI IDE&#xff09;——AI编程工具Trae国内版。 该工具模型搭载doubao-1.5-pro&#xff0c;支持切换满血版DeepSeek R1&V3&#xff0c; 可以帮助各阶段开发者与AI流畅协作&#xff0c;更快、更高质量地完…

基于腾讯云高性能HAI-CPU的跨境电商客服助手全链路解析

跨境电商的背景以及痛点 根据Statista数据&#xff0c;2025年全球跨境电商市场规模预计达6.57万亿美元&#xff0c;年增长率保持在12.5% 。随着平台规则趋严&#xff08;如亚马逊封店潮&#xff09;&#xff0c;更多卖家选择自建独立站&#xff0c;2024年独立站占比已达35%。A…

神经网络探秘:原理、架构与实战案例

神经网络探秘&#xff1a;原理、架构与实战案例 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。https://www.captainbed.cn/ccc 在人工智能的浪潮中&#xff0c;神经网络作为核心驱动力之一…

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点&#xff08;无 js&#xff09; 这段HTML代码展示了一个简单的注册页面&#xff0c;包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面&#xff0c;包含了常见的HTML元素和表单控件。通过CSS样…

win32汇编环境,对话框中使用树形视图示例四

;运行效果,当点击张辽时,展示张辽的图像 ;当点击曹仁时,展示曹仁的图像 ;win32汇编环境,对话框中使用树形视图示例四 ;当点击树形视图treeview控件中的某项时,展示某些功能。这里展示的是当点到某个将领时,显示某个将领的图像 ;直接抄进RadAsm可编译运行。重要部分加备注。…

基于SpringBoot的“体育购物商城”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“体育购物商城”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体模块设计 前台用户登录界面 系统首页界面…

c#面试题整理9

1.遍历xml文档 2.解释一下这段 String s new String("xyz"); 这段在C#平台中&#xff0c;编译失败 3.说明一下抽象类 抽象类可以有构造函数 抽象类不能是静态和密封的类&#xff0c;密封的类表示无法继承&#xff0c;抽象类本身就不可实例化&#xff0c;加不好…

第85期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

如何安全处置旧设备?

每年&#xff0c;数百万台旧设备因老化、故障或被新产品取代而被丢弃&#xff0c;这些设备上存储的数据可能带来安全风险。 如果设备没有被正确删除数据&#xff0c;这些数据往往仍可被恢复。因此&#xff0c;安全处置旧设备至关重要。 旧设备可能包含的敏感数据 旧设备中可能…

【物联网-WIFI】

物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-

Linux——system V共享内存

共享内存区是最快的IPC(进程内通信)形式&#xff0c;不再通过执行进入内核的系统调用来传递彼此的数据 1.共享内存的原理 IPC通信的本质是让不同的进程先看到同一份资源&#xff0c;然后再进行通信&#xff0c;所以想要通过共享内存进行通信&#xff0c;那么第一步一定是让两个…

爱普生可编程晶振SG-8200CJ特性与应用

在高速发展的电子技术领域&#xff0c;时钟源作为电子系统的“心脏”&#xff0c;其性能直接影响设备的稳定性与可靠性。爱普生SG-8200CJ可编程晶振凭借其优秀的频率精度、低抖动性能及广泛的环境适应性&#xff0c;正成为众多领域的得力之选&#xff0c;为各类设备的高效运行与…

基于YOLO11深度学习的运动品牌LOGO检测与识别系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

小程序 wxml 语法 —— 36 wxml 语法 - setData() 修改数据

在小程序中修改数据不推荐通过赋值的方式进行修改&#xff0c;通过赋值的方式修改数据无法改变页面的数据&#xff1b; 在微信小程序中&#xff0c;推荐调用 setData() 方式进行修改&#xff0c;setData() 方法接收对象作为参数&#xff0c;key 是需要修改的数据&#xff0c;v…