deeplab语义分割训练自定数据集

链接:https://pan.baidu.com/s/1KkkM1rLfyiMPtYLycpnxmg?pwd=j2rd

提取码:j2rd

--来自百度网盘超级会员V2的分享

采用数据集: https://aistudio.baidu.com/datasetdetail/130647

采用代码:

https://github.com/jfzhang95/pytorch-deeplab-xception

本文会讲解两种方法:一种是使用开源数据集(不是deeplab支持的数据集)完成在deeplab上训练,另一种是通过标注自定义数据集来完成训练

第一种用开源数据集训练

将carvana image masking challenge数据集转化为Pascal VOC 格式

以下讲述你需要更改的一些地方以及怎么更改

首先要看你的模型支持什么样的数据集,一般通过train.py文件或者通过github文档查看

或者通过train.py

可见deeplab支持这4种VOC, SBD, Cityscapes and COCO datasets

要自定义数据集就需要把你的数据集转化以上4种即可,本文是将数据集转化为VOC 格式

下载数据集https://aistudio.baidu.com/datasetdetail/130647后,结构如下

也就是这个数据集只有train_mask和train_hq,test一般都是没有模板的,在语义分割中test是不需要模板的,其他的数据集也是这样,test只用来看最后的效果。

VOC 格式如下:

也就是需要提供JPEGImages、SegmentationClass、ImageSets

或者你可以查看代码中

通过这个代码也大概知道需要提供什么文件夹

整理好需求,然后直接跟deepseek进行沟通:

将需求拆解开来一步一步来,

1、首先将carvana image masking challenge的train_mask中的git后缀改成png

2、因为VOC 格式的标签和图像的名称是对应的,所以需要将carvana image masking challenge的_mask.gif改为.png

然后他会生成一个代码,你可以跑一下,看是否解决问题了,如果这个问题解决了就解决下一个需求

也就是目前解决了SegmentationClass,接下来需要解决JPEGImages

 

因为carvana image masking challenge的train_hq的图片格式也是jpg,所以你只需要将train_hq文件夹的名称改成JPEGImages即可

也就是解决了SegmentationClass、JPEGImages,接下来解决ImageSets

然后生成新的代码,就完成了数据集的格式转化。

也就是这个过程你主要做的是怎么将需求转化成多个步骤,一步一步完成需求就可以,以后不管是要转化成coco格式还是Cityscapes 都可以用这种方法。

比如Cityscapes 我可能先将train_hq拆分成train文件夹、val文件夹、test文件夹,train_masks也是拆分成3个文件夹,并且图片和标签的路径需要一致,名称需要根据Cityscapes 定义。然后我们知道Cityscapes 的train、val下还会有城市名称,我们随便起一个城市名称北京,路径格式对应就可以

最后我的carvana image masking challenge就转化成这种Cityscapes 风格

说话carvana image masking challenge转化为VOC 格式,我们已经完成了所有步骤,我把这个程序命名为了拆分.py,运行我们的程序“拆分.py”

第二种方法通过标注训练自定数据集

一、准备数据集

1. 数据集文件夹目录

  • ImageSets 文件夹内还有一个文件夹Segmentation,里面存放的是训练集、测试集txt文件

  • JPEGImages 存放原图image

  • SegmentationClass 存放原图对应的mask,要和JPEGImages里的图片一一对应

2. yolo格式转json格式

我使用的标注方式是: Sign in to Roboflow ,大大减少了标注时间,推荐!!!

导出yolo格式之后进行转json格式,代码如下

import json
import os# 输入TXT标注文件夹路径
txt_folder_path = "E:/VScode project/pytorch-deeplab-xception-master111/Seg552/txt/"
# 输出JSON文件夹路径
json_folder_path = "E:/VScode project/pytorch-deeplab-xception-master111/Seg552/json/"# 确保输出文件夹存在
os.makedirs(json_folder_path, exist_ok=True)# 类别ID映射(如有需要可以修改)
label_mapping = {1: "ripe fruits", 0: "branch"}# 遍历TXT文件夹
for txt_file in os.listdir(txt_folder_path):if txt_file.endswith('.txt'):txt_file_path = os.path.join(txt_folder_path, txt_file)json_file_path = os.path.join(json_folder_path, txt_file.replace('.txt', '.json'))# JSON模板json_data = {"version": "5.2.1","flags": {},"shapes": [],"imagePath": txt_file.replace('.txt', '.jpg'),  # 假设图像名与TXT文件名相同"imageHeight": 1080,"imageWidth": 1920}# 解析TXT文件并构造JSON结构with open(txt_file_path, 'r') as file:for line in file:# 分割类别ID和坐标数据parts = line.strip().split()class_id = int(parts[0])  # 类别IDlabel = label_mapping.get(class_id, "unknown")  # 类别名称coordinates = list(map(float, parts[1:]))  # 坐标数据# 将坐标数据转换为(x, y)点对,并按比例转换为实际像素位置points = []for i in range(0, len(coordinates), 2):x = coordinates[i] * json_data["imageWidth"]y = coordinates[i + 1] * json_data["imageHeight"]points.append([x, y])# 添加标注信息到JSONshape_data = {"label": label,"points": points,"group_id": None,"description": "","shape_type": "polygon","flags": {}}json_data["shapes"].append(shape_data)# 保存为JSON文件with open(json_file_path, 'w') as json_file:json.dump(json_data, json_file, indent=2)print(f"已成功将 {txt_file} 转换为 JSON 文件:{json_file_path}")

3. 文件夹重命名

虽然用网页标注导出来的image和TXT文件的名称是一致的,但为了避免在后续格式转换中出现冲突,现在需要将image图片和txt文件重新命名。相应代码:

import os# 文件夹路径
folder1 = 'E:/VScode project/pytorch-deeplab-xception-master111/Seg552/txt/'  # 替换为您的文件夹路径
folder2 = 'E:/VScode project/pytorch-deeplab-xception-master111/Seg552/img/'  # 替换为您的文件夹路径# 获取文件名列表
files1 = os.listdir(folder1)
files2 = os.listdir(folder2)# 对文件进行排序,确保顺序一致
files1.sort()
files2.sort()# 确保两个文件夹的文件数相同
if len(files1) != len(files2):print("警告:两个文件夹的文件数量不同!")# 重命名第一个文件夹的文件
for idx, filename in enumerate(files1):new_name = f"{idx:03d}{os.path.splitext(filename)[1]}"  # 保留后缀os.rename(os.path.join(folder1, filename), os.path.join(folder1, new_name))# 重命名第二个文件夹的文件
for idx, filename in enumerate(files2):new_name = f"{idx:03d}{os.path.splitext(filename)[1]}"os.rename(os.path.join(folder2, filename), os.path.join(folder2, new_name))print("重命名完成。")

4. json格式转mask图片

import argparse
import base64
import json
import os
import os.path as osp
import imgviz
import PIL.Image
from labelme.logger import logger
from labelme import utils
import glob
import yamldef main():logger.warning("This script is aimed to demonstrate how to convert the ""JSON file to a single image dataset.")logger.warning("It will handle multiple JSON files to generate a ""real-use dataset.")parser = argparse.ArgumentParser()parser.add_argument("--json_dir", required=True)parser.add_argument("-o", "--out", required=True)args = parser.parse_args()json_dir = args.json_diroutput_dir = args.outif osp.isfile(json_dir):json_list = [json_dir] if json_dir.endswith('.json') else []else:json_list = glob.glob(os.path.join(json_dir, '*.json'))for json_file in json_list:logger.info(f"Processing file: {json_file}")json_name = osp.basename(json_file).split('.')[0]out_dir = osp.join(output_dir, json_name)if not osp.exists(out_dir):os.makedirs(out_dir)try:data = json.load(open(json_file))except Exception as e:logger.error(f"Error loading JSON file {json_file}: {e}")continue  # Skip to the next fileimageData = data.get("imageData")if not imageData:image_filename = osp.basename(data["imagePath"])imagePath = osp.join("E:/VScode project/pytorch-deeplab-xception-master111/Seg552/JPEGImages", image_filename)try:with open(imagePath, "rb") as f:imageData = f.read()imageData = base64.b64encode(imageData).decode("utf-8")except FileNotFoundError:logger.error(f"File not found: {imagePath}")continue  # Skip to the next JSON fileexcept Exception as e:logger.error(f"Error reading image file {imagePath}: {e}")continuetry:img = utils.img_b64_to_arr(imageData)label_name_to_value = {"_background_": 0}for shape in sorted(data["shapes"], key=lambda x: x["label"]):label_name = shape["label"]if label_name in label_name_to_value:label_value = label_name_to_value[label_name]else:label_value = len(label_name_to_value)label_name_to_value[label_name] = label_valuelbl, _ = utils.shapes_to_label(img.shape, data["shapes"], label_name_to_value)label_names = [None] * (max(label_name_to_value.values()) + 1)for name, value in label_name_to_value.items():label_names[value] = namelbl_viz = imgviz.label2rgb(lbl, imgviz.asgray(img), label_names=label_names, loc="rb")# Save files to corresponding subdirectoryPIL.Image.fromarray(img).save(osp.join(out_dir, "img.png"))utils.lblsave(osp.join(out_dir, "label.png"), lbl)PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, "label_viz.png"))with open(osp.join(out_dir, "label_names.txt"), "w") as f:for lbl_name in label_names:f.write(str(lbl_name if lbl_name is not None else "unknown") + "\n")yaml_data = {"label_name_to_value": label_name_to_value,"label_names": label_names}with open(osp.join(out_dir, "labels.yaml"), "w") as yaml_file:yaml.dump(yaml_data, yaml_file)logger.info(f"Saved to: {out_dir}")except Exception as e:logger.error(f"Error processing file {json_file}: {e}")if __name__ == "__main__":main()

运行指令为:

python My_json_to_dataset.py --json_dir "E:/VScode project/pytorch-deeplab-xception-master111/Seg552/json" -o "E:/VScode project/pytorch-deeplab-xception-master111/Seg552/labelme_json"

生成的文件为

需要将labelme_json文件下的每个文件中的label.png文件重新命名,相应代码:

import os# 替换为你的json文件夹所在的目录
json_dir = "E:/VScode project/pytorch-deeplab-xception-master111/Seg552/labelme_json"for root, dirs, files in os.walk(json_dir):for dr in dirs:file_dir = os.path.join(root, dr)# 确认label.png文件存在label_file = os.path.join(file_dir, 'label.png')if os.path.exists(label_file):# 将文件夹名分割,得到原图名original_name = dr.split('_')[0] + '.png'new_file_name = os.path.join(file_dir, original_name)# 执行重命名操作os.rename(label_file, new_file_name)print(f"Renamed '{label_file}' to '{new_file_name}'")

最后将提取出所有文件夹中的000.png 并放在指定目录中,相应代码:

import os
from shutil import copyfilefor root, dirs, names in os.walk("E:/VScode project/pytorch-deeplab-xception-master111/Seg552/labelme_json"):  # 改成你自己的json文件夹所在的目录for dr in dirs:file_dir = os.path.join(root, dr)print(dr)file = os.path.join(file_dir, dr + '.png')print(file)new_name = dr.split('_')[0] + '.png'new_file_name = os.path.join(file_dir, new_name)print(new_file_name)tar_root = 'E:/VScode project/pytorch-deeplab-xception-master111/Seg552/Segmentationclass'  # 目标路径tar_file = os.path.join(tar_root, new_name)copyfile(new_file_name, tar_file)

该代码运行得到的文件,就是我们所需要的SegmentationClass

5. 生成txt文件

生成的训练集txt和验证集txt,里面的图片名称( 去掉后缀 )的分配是随机的。相应代码:

import os
import random# 设置图像目录和输出目录
image_dir = 'E:/VScode project/pytorch-deeplab-xception-master111/Seg552/JPEGImages'  # 替换为你的图像目录
output_dir = 'E:/VScode project/pytorch-deeplab-xception-master111/Seg552/ImageSets/Segmentation'  # 替换为输出目录# 获取所有图像文件名(去掉后缀)
image_files = [f.split('.')[0] for f in os.listdir(image_dir) if f.endswith(('.jpg', '.png'))]# 随机打乱图像文件名
random.shuffle(image_files)# 分割训练集和验证集
train_files = image_files[:int(len(image_files) * 0.8)]  # 80% 为训练集
val_files = image_files[int(len(image_files) * 0.8):]  # 20% 为验证集# 写入 train.txt
with open(os.path.join(output_dir, 'train.txt'), 'w') as f:for file in train_files:f.write(f"{file}\n")# 写入 val.txt
with open(os.path.join(output_dir, 'val.txt'), 'w') as f:for file in val_files:f.write(f"{file}\n")print("train.txt 和 val.txt 已生成。")

 

修改deeplab代码

然后就是改代码,train.py中的dataset改成我们自定义的llmCver数据集,名称随便起

修改训练层数和学习率,当然这个可能不需要修改,因为在上面parser.add_argument也有个层数和学习率,但是我看到了以防万一也改动了。

修改mypath.py,加入你的路径

修改dataloaders\utils.py,因为我自定义的数据集只有两个类别

 

def decode_segmap(label_mask, dataset, plot=False):我们加入了label_colours = get_llmCver_labels(),

也就是我们调用了get_llmCver_labels()函数,我们需要在下面把get_llmCver_labels()的定义写清楚。

怎么定义你可以get_cityscapes_labels和get_pascal_labels函数怎么写的,你模仿着写。

我看到carvana image masking challenge只有两个类别,车和背景,也就是模板里面只有[0, 0, 0]和[255, 255, 255]两个颜色,所以我的get_llmCver_labels函数里就定义了这两个颜色,[0, 0, 0]存储第一位,所以他是对应类别0,[255, 255, 255]存储第二位对应类别1。这样代码就区分出了两种类别。

carvana image masking challenge数据集有多少个类别可以直接问ai,这种信息类的ai一般通过网络信息整理会找的比人快。或者根据经验判断。

dataloaders\datasets\llmCver.py在这个路径下加入llmCver.py,用于代码解析自定义数据集路径信息。这个代码怎么写?可以参考pascal.py(因为我们模仿的是pascal voc,所以voc有什么代码我们跟着做就可以)

复制pascal.py后将改一下文件名称,我改成了llmCver.py

下面的if name == '__main__':里的函数也需要改一下,但是不改也可以。

顺便讲一下if name == '__main__',假如我们在做一个机器人项目,那么我们会将这个项目手.py、脚.py、头.py等等还有一个整体调用.py。我做到最后肯定是调用整体调用.py就能完成整个机器人的运动,这时候只会用到整体调用.py里的if name == '__main__',而手.py、脚.py、头.py里面的if name == '__main__'是不会执行,因为此时整体调用.py是主函数。

当我们的手部出现异常了,为了调试手部的一些功能我们就只会调用手.py,这个时候我们的手.py是主函数,所以手.py里面的if name == '__main__'会生效,也就是我们每次运行程序最多只有一个程序能调用if name == '__main__'。你运行哪个程序,哪个程序里的if name == '__main__'就会生效。

dataloaders\__init__.py中加入

修改完基本就差不多了

然后修改train.py里面的参数,根据自己想要用什么主干网,多少学习率这些都不是固定,可以根据自己想法来,配置完直接按下右上角的运行键就可以跑起来了。

我的程序有个bug,不知道是本来就有的还是,就是训练的时候看不到进度,但是不影响训练。

File "d:\YOLO\pytorch-deeplab-xception-master\train.py", line 305, in <module> main() File "d:\YOLO\pytorch-deeplab-xception-master\train.py", line 298, in main trainer.training(epoch) File "d:\YOLO\pytorch-deeplab-xception-master\train.py", line 115, in training self.summary.visualize_image(self.writer, self.args.dataset, image, target, output, global_step) File "d:\YOLO\pytorch-deeplab-xception-master\utils\summaries.py", line 18, in visualize_image grid_image = make_grid(decode_seg_map_sequence(torch.max(output[:3], 1)[1].detach().cpu().numpy(), File "D:\APP\conda\envs\yolov5prune\lib\site-packages\torch\utils\_contextlib.py", line 115, in decorate_context return func(*args, **kwargs) TypeError: make_grid() got an unexpected keyword argument 'range'

如果报了这个错误是因为你的torch版本太高,修改一下程序就可以了

修改pytorch-deeplab-xception-master\utils\summaries.py

把range去掉就可以了

        # 处理输出图像grid_image = make_grid(decode_seg_map_sequence(torch.max(output[:3], 1)[1].detach().cpu().numpy(), dataset=dataset),nrow=3, normalize=False, scale_each=False)writer.add_image('Predicted label', grid_image, global_step)# 处理目标图像grid_image = make_grid(decode_seg_map_sequence(torch.squeeze(target[:3], 1).detach().cpu().numpy(), dataset=dataset),nrow=3, normalize=False, scale_each=False)

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

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

相关文章

【Pandas】pandas DataFrame mod

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…

12、高阶组件:魔法增幅器——React 19 HOC模式

一、魔法增幅器的本质 "高阶组件是魔法师用咒语叠加的炼金术&#xff0c;"霍格沃茨魔咒研究院院长凝视着发光的增幅器&#xff0c;"通过函数式能量场的嵌套&#xff0c;让基础组件获得预言家日报式的逻辑继承&#xff01;" ——以神秘事务司的「维度叠加理…

Qt creator 16.0.1 语言家失效解决方法

一、在菜单“工具-->外部”里面没有语言家、更新翻译、发布翻译工具。 二、解决方法 手工添加 1、添加目录 2、添加工具 更新翻译 (lupdate) %{CurrentDocument:Project:QT_INSTALL_BINS}\lupdate %{CurrentDocument:Project:FilePath} %{CurrentDocument:Project:Path}…

Apple AirTag定位原理

AirTag 是苹果公司推出的一款用于追踪物品的设备&#xff0c;触及到我的知识盲区。所以特地记录一下技术原理。其工作所用的技术原理主要涉及以下几个方面&#xff1a; 蓝牙技术&#xff1a;AirTag 使用蓝牙低功耗技术&#xff08;BLE&#xff09;与用户的 iPhone 或其他苹果设…

计算机网络 实验五 RIP的配置与应用

摘要 本实验基于华为eNSP平台构建多路由器网络拓扑&#xff0c;旨在通过实战掌握路由器配置、RIP协议部署及网络故障排查等核心技能。实验分为拓扑设计、设备初始化、协议配置、连通性测试四个阶段&#xff0c;重点研究RIPv2版本特性及自动汇总抑制机制。 在配置过程中&#…

MQTTX + MCP:MQTT 客户端秒变物联网 Agent

引言&#xff1a;MQTTX 与 MCP 的融合 作为最受欢迎的 MQTT 客户端工具&#xff0c;MQTTX 在 1.12.0 beta 版本中集成了模型上下文协议&#xff08;MCP&#xff09;到 Copilot AI 功能中&#xff0c;显著提升了服务能力。这一融合让 MQTTX 转变为 MCP Host&#xff08;也就是发…

UML统一建模

UML UML&#xff08;统一建模语言&#xff09;介绍 UML&#xff08;统一建模语言&#xff09;介绍 面向对象软件开发需要经过OOA面向对象分析、OOD面向对象设计和OOP面向对象编程三个阶段。OOA对目标系统进行分析并寄哪里分析模型&#xff0c;并将之文档化&#xff0c;OOD用面向…

CPP_类和对象

面向对象&#xff1a; 更接近真实世界&#xff08;关注各对象之间的关系&#xff0c;而非各步骤的进行&#xff09; 将结构体升级成立类 类里面可以有&#xff1a;成员函数&#xff0c;成员变量 class Stack { public:void Init(int defaultCapacity4 ) {_a (int*)malloc(s…

极狐GitLab 如何撤销变更?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 还原更改 (BASIC ALL) 在极狐GitLab 中&#xff0c;您可以还原单个提交或整个合并请求。 当您在 Git 中还原一个提交时&…

PNG透明免抠设计素材大全26000+

在当今的数字设计领域&#xff0c;寻找高质量且易于使用的素材是每个设计师的日常需求。今天&#xff0c;我们将为大家介绍一个超全面的PNG透明免抠设计素材大全&#xff0c;涵盖多种风格、主题和应用场景&#xff0c;无论是平面设计、网页设计还是多媒体制作&#xff0c;都能轻…

uniapp小程序使用echarts

1、引入插件 在Dcloud插件市场下载echarts插件&#xff1a;插件地址 2、页面使用简单示例&#xff1a; <template><view class"pie-view flex-center"><view style"width: 100%; height: 600rpx"><l-echart ref"chartRef&quo…

7-1 三种语言的单词转换

编写程序实现&#xff1a;首先从键盘输入若干个中文与英文单词的偶对&#xff0c;以空行作结束标记&#xff1b;再输入若干个英文与丹麦文单词的偶对&#xff0c;以空行作结束标记。然后输入一个中文单词&#xff0c;输出对应的丹麦文单词&#xff1b;若不存在该单词&#xff0…

开源AI守护童心——幼儿跌倒报警系统的智能安全革命

幼儿园是孩子们成长的乐园&#xff0c;但跌倒事件却时常让家长和园方忧心。教室、走廊、操场&#xff0c;幼儿的每一次意外跌倒都可能带来安全隐患。传统人工监管难以全天候覆盖&#xff0c;反应速度也常受限。如何让幼儿园更安全、更放心&#xff1f;幼儿跌倒报警系统&#xf…

Halcon应用:相机标定

提示&#xff1a;若没有查找的算子&#xff0c;可以评论区留言&#xff0c;会尽快更新 Halcon应用&#xff1a;相机标定 前言一、Halcon应用&#xff1f;二、应用实战1、图像理解1.1、开始标定 前言 本篇博文主要用于记录学习Halcon中算子的应用场景&#xff0c;及其使用代码和…

Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏

Arduino示例代码讲解:Project 08 - Digital Hourglass 数字沙漏 Project 08 - Digital Hourglass 数字沙漏程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数计时和点亮LED:读取倾斜开关状态:重置LED和计时器:运行过程注意事项Project 08 - …

《计算机视觉度量:从特征描述到深度学习》—深度学习图像特征工程

传统算法的图像特征分析和描述&#xff0c;一直贯穿图像算法的发展。2017年深度学习的出现&#xff0c;很多开发人员和技术人员认为&#xff0c;图像特征分析这个概念可以被深度学习完全取代。很长一段时间以深度学习为主的视觉方案成为主流&#xff0c;逐渐淡化了传统视觉的特…

零部件三维激光扫描检测

制造业竞争激烈&#xff0c;零部件的精准检测与三维数据的高效获取&#xff0c;已成为企业确保产品质量、提升生产效率的核心要素。传统检测手段&#xff0c;往往因效率低下、精度不足&#xff0c;难以满足复杂零部件的检测需求。 传统零部件检测&#xff0c;检测人员通常是手…

KafkaSpark

Kafka Kafka基本概念 卡夫卡是一个分布式、分布订阅的消息系统&#xff0c;作为消息中间件使用。 设计上是一个分布式的、分区的和可复制的提交日志服务。 Kafka的优势 分布式系统&#xff0c;易于扩展。 高吞吐量&#xff0c;支持发布和订阅模式。 支持多地复制&#xff…

图文结合 - 光伏系统产品设计PRD文档 -(慧哥)慧知开源充电桩平台

光伏系统产品设计PRD文档 ‌版本号‌&#xff1a;1.0 ‌修订日期‌&#xff1a;2023年10月 ‌作者‌&#xff1a; 一、文档概述 1.1 背景与目标 ‌行业背景‌&#xff1a;全球光伏装机量年增长20%&#xff0c;数字化运维需求迫切‌用户痛点‌&#xff1a;现有系统存在数据延…

Eyecare-100K:首个覆盖多模态、多任务的高质量眼科视觉指令数据集

2025-04-18 , 由浙江大学、哈尔滨工业大学、郴州市第一人民医院、新加坡国立大学等机构合作创建了 Eyecare-100K数据集&#xff0c;这是首个涵盖多种模态、任务和疾病的高质量眼科视觉指令数据集&#xff0c;为眼科智能诊断领域提供了关键资源&#xff0c;推动了医学视觉语言模…