LLVIP 数据集介绍及YOLO训练格式转换

📅 2026/7/19 14:45:31
LLVIP 数据集介绍及YOLO训练格式转换
LLVIP 数据集介绍、标签转换脚本以及转换前后的完整数据下载转换后的可下载文件整理文章目录一、核心基础信息二、适用研究任务三、标签转换四、BaiDu云下载链接一、核心基础信息LLVIP全称Low-Light Visible-Infrared Paired Dataset论文LLVIP: A Visible-infrared Paired Dataset for Low-light VisionICCV 2021 Workshop北京邮电大学团队发布数据规模15488组可见光-红外图像对总计30976张图像官方划分训练集12025对测试集3463对成像参数可见光原始 1920×1080RGB红外热成像8–14 μm长波红外原始1280×720发布版本统一对齐裁剪为1080×720✅最大亮点双通道图像严格时间空间配准像素级对齐采集场景26个城市街道监控场景绝大多数为夜间极低光照环境傍晚6–22点少量白天样本作为对照监控俯视视角贴近安防夜间监控真实场景标注信息仅单一类别person行人边界框标注XML格式二、适用研究任务LLVIP是目前低光照可见光/红外跨模态领域最主流基准数据集可见光-红外图像融合最常用弱光下跨模态行人检测单模态可见光检测、红外检测、多模态融合检测跨模态图像翻译可见光↔红外图像生成GAN、Diffusion图像配准、低光图像增强、多模态跟踪三、标签转换XML转YOLO的txt格式标签importosimportjsonimportargparseimportsysimportshutilfromlxmlimportetreefromtqdmimporttqdm category_setset()image_setset()bbox_nums0defparse_xml_to_dict(xml): 将xml文件解析成字典形式参考tensorflow的recursive_parse_xml_to_dict Args: xml: xml tree obtained by parsing XML file contents using lxml.etree Returns: Python dictionary holding XML contents. iflen(xml)0:# 遍历到底层直接返回tag对应的信息return{xml.tag:xml.text}result{}forchildinxml:child_resultparse_xml_to_dict(child)# 递归遍历标签信息ifchild.tag!object:result[child.tag]child_result[child.tag]else:ifchild.tagnotinresult:# 因为object可能有多个所以需要放入列表里result[child.tag][]result[child.tag].append(child_result[child.tag])return{xml.tag:result}defwrite_classIndices(category_set):class_indicesdict((k,v)forv,kinenumerate(category_set))json_strjson.dumps(dict((val,key)forkey,valinclass_indices.items()),indent4)withopen(class_indices.json,w,encodingutf-8)asjson_file:json_file.write(json_str)defxyxy2xywhn(bbox,size):bboxlist(map(float,bbox))sizelist(map(float,size))xc(bbox[0](bbox[2]-bbox[0])/2.)/size[0]yc(bbox[1](bbox[3]-bbox[1])/2.)/size[1]wn(bbox[2]-bbox[0])/size[0]hn(bbox[3]-bbox[1])/size[1]return(xc,yc,wn,hn)defparser_info(info:dict,only_catTrue,class_indicesNone):filenameinfo[annotation][filename]image_set.add(filename)objects[]widthint(info[annotation][size][width])heightint(info[annotation][size][height])# 检查 object 键是否存在ifobjectininfo[annotation]:forobjininfo[annotation][object]:obj_nameobj[name]category_set.add(obj_name)ifonly_cat:continuexminint(obj[bndbox][xmin])yminint(obj[bndbox][ymin])xmaxint(obj[bndbox][xmax])ymaxint(obj[bndbox][ymax])bboxxyxy2xywhn((xmin,ymin,xmax,ymax),(width,height))ifclass_indicesisnotNone:obj_categoryclass_indices[obj_name]object[obj_category,bbox]objects.append(object)returnfilename,objectsdefparseXmlFilse(voc_dir,save_dir):assertos.path.exists(voc_dir),ERROR {} does not exists.format(voc_dir)ifos.path.exists(save_dir):shutil.rmtree(save_dir)os.makedirs(save_dir)xml_files[os.path.join(voc_dir,i)foriinos.listdir(voc_dir)ifos.path.splitext(i)[-1].xml]forxml_fileinxml_files:withopen(xml_file,encodingutf-8)asfid:xml_strfid.read()xmletree.fromstring(xml_str)info_dictparse_xml_to_dict(xml)parser_info(info_dict,only_catTrue)withopen(save_dir/classes.txt,w,encodingutf-8)asclasses_file:forcatinsorted(category_set):classes_file.write({}\n.format(cat))class_indicesdict((v,k)fork,vinenumerate(sorted(category_set)))xml_filestqdm(xml_files)forxml_fileinxml_files:withopen(xml_file,encodingutf-8)asfid:xml_strfid.read()xmletree.fromstring(xml_str)info_dictparse_xml_to_dict(xml)filename,objectsparser_info(info_dict,only_catFalse,class_indicesclass_indices)iflen(objects)!0:globalbbox_nums bbox_numslen(objects)withopen(save_dir/filename.split(.)[0].txt,w,encodingutf-8)asf:forobjinobjects:f.write({} {:.5f} {:.5f} {:.5f} {:.5f}\n.format(obj[0],obj[1][0],obj[1][1],obj[1][2],obj[1][3]))if__name____main__:parserargparse.ArgumentParser()parser.add_argument(--voc-dir,typestr,defaultrdatasets/train)parser.add_argument(--save-dir,typestr,defaultrdatasets/labels/train)optparser.parse_args()parseXmlFilse(**vars(opt))四、BaiDu云下载链接