• [技术干货] RFID测温技术:提升电缆安全监测的理想选择
    随着电力系统规模的扩大,电缆作为电能传输的核心载体,其运行状态直接影响供电安全。电缆过热是导致绝缘老化、短路甚至火灾的主要原因之一。传统测温手段(如红外测温、光纤测温)存在实时性差、成本高或部署复杂等问题。RFID(射频识别)测温技术凭借无线传输、无源传感、多点监测等优势,成为电缆温度监测的理想解决方案。  一、RFID测温技术原理RFID(射频识别技术)基于射频信号实现非接触式信息交互以达成识别。在电缆测温系统里,其主要由RFID读写器、测温标签及数据处理系统构成。读写器发射射频信号,测温标签进入其工作范围后,标签天线感应信号转化为电能,为内部电路供电。温度传感器实时感知温度,将数据转化为电信号,经编码调制后以射频信号回传。读写器接收信号后,解调、解码并把温度数据传输给数据处理系统。该系统对数据进行分析、存储与显示,温度超出阈值时立即报警。二、RFID测温技术优势无源无线特性:RFID测温标签无需外接电源,靠读写器射频信号取能,完成温度测量与数据传输。这种设计让标签安装便捷,免布线困扰,适合绝缘要求高、布线难的地下电缆、电缆隧道等场景。无源设计避免了电池电量耗尽导致的监测中断,提升了系统可靠性与稳定性。高精度测量:RFID测温技术精度可达±1℃,能敏锐捕捉电缆温度细微变化,精准判断运行状态,为提前预警故障提供可靠数据。强抗干扰性:电力环境电磁干扰复杂,RFID系统通过优化天线设计、选用合适频段、采用编码调制技术等手段,在强电磁噪声中稳定运行,保障温度数据准确可靠。实时数据传输:该系统可实时采集电缆温度并快速传输至处理系统。运维人员借助监控终端能实时查看温度变化,及时察觉异常并采取措施,有效预防事故。多目标识别:单个RFID读写器可同时识别多个测温标签,能同步监测同一电缆线路上的多个测温点,大幅提升监测效率、降低成本,适用于大规模电缆网络。环境适应性佳:RFID测温标签经特殊封装,可在高温、高压、潮湿、腐蚀等恶劣环境下稳定工作,无论是户外变电站还是地下电缆沟,都能确保温度监测的连续与准确。  三、RFID测温技术在电缆测温中的应用方案电缆关键部位监测1. 电缆接头:作为故障高发点,在导体连接部位、绝缘层表面和屏蔽层布置RFID测温标签,全方位监测温度。2. 电缆本体:根据电缆长度、负载及运行环境,长距离电缆每隔100-200米设测温点;负载大或环境恶劣段适当加密。3. 交叉互联箱:在箱内电缆连接部位、开关触头及箱体外壳布置测温标签,监测温度异常。系统架构搭建1. 感知层:采用卡扣式、绑扎式、镶嵌式等RFID测温标签,依安装位置和环境选择,采集温度数据。2. 传输层:由RFID读写器和通信网络组成。读写器读取数据,通过有线(光纤、以太网)或无线网络传输至数据处理系统,依场景选择通信方式。3. 数据处理层:数据处理系统分析、存储、处理温度数据,预测温度趋势;监控平台直观展示数据、状态和报警信息,支持多终端访问。系统功能实现1. 实时监测:实时采集温度,在监控平台以数字、图表呈现,展示整体温度分布。2. 报警功能:用户设报警阈值,超阈值时系统发出声光、短信报警,记录报警信息。3. 历史数据处理:自动存储不少于1年的历史数据,支持查询和分析,如绘制趋势曲线、统计异常次数。4. 故障诊断预测:利用算法结合运行参数和环境温度诊断故障,通过历史数据建模预测异常,提前预警。  四、总结与展望RFID测温技术是电缆测温的理想方案,在电缆关键部位部署测温标签,搭建系统架构,就能实时、精准监测电缆温度,有效预防过热事故,保障电力系统安全。伴随物联网等技术发展,RFID测温技术应用前景广阔。未来,其系统将更智能,可自动诊断故障、预测维护,进一步提升电力运维效率,为电力系统稳定运行保驾护航。(图片来源于网络 侵删)
  • [技术干货] RFID技术:冷链物流的品质与追溯革新者
    在如今快节奏的生活中,生鲜食品已经成为我们日常饮食中不可或缺的一部分。无论是新鲜的水果、蔬菜,还是肉类、海鲜,人们对于生鲜的品质和安全都有着越来越高的要求。而冷链物流作为保障生鲜品质的关键环节,其重要性不言而喻。如今,一项先进的技术 ——RFID(无线射频识别),正悄然改变着冷链物流的格局,为生鲜品质提升与追溯效率带来了新的突破。   一、RFID技术:开启冷链物流智能新时代RFID技术,本质上是利用无线射频信号,实现对目标对象的自动识别和数据获取。打个比方,它就像是给每个物品都配备了一个独一无二的 “电子身份证”,无需人工近距离接触,只要在一定范围内,就能快速、精准地读取和写入信息。在对时效性和精准度要求极高的冷链物流行业,RFID 技术的应用,有效解决了传统物流长期面临的诸多难题,为行业发展注入了全新活力。二、RFID如何全方位提升生鲜品质1. 精准温控,为新鲜保驾护航:生鲜食品对温度极为敏感,稍有不慎就可能变质。RFID技术与温度传感器相结合,就像给冷链运输和储存环节安装了一个 24 小时的 “温度卫士”。在漫长的运输途中,一旦温度偏离预设的最佳范围,系统便会即刻发出警报,提醒工作人员迅速采取措施进行调整。2. 快速盘点与智能补货,降低损耗增效益:在传统的生鲜仓库和超市中,人工盘点货物不仅耗时费力,而且容易出现人为失误。而有了RFID技术的助力,工作人员只需手持便捷式读写器,在货架间轻松走过,就能快速完成所有商品的识别与数量统计。当库存水平降至预设阈值时,系统会自动发出补货提醒,确保商品供应的连续性,避免因缺货造成的销售损失。同时,也能有效减少因货物积压导致的过期损耗,大大提升了企业的运营效率和经济效益。    三、RFID让追溯变得高效便捷1. 全程追溯,信息一目了然:从农产品的种植采摘,到食品的加工包装,再到漫长的运输销售环节,RFID标签全程记录着每个环节的信息。消费者只需拿出手机,轻轻扫描商品上的RFID二维码,就能轻松获取包括产地、生产日期、采摘时间、检测报告等在内的详细信息。真正实现了从农田到餐桌的全程可视化追溯,让消费者吃得明白、吃得放心。2. 快速响应食品安全问题,筑牢安全防线:一旦发生食品安全问题,RFID技术强大的追溯功能就能迅速发挥作用。它能在短时间内精准定位问题源头,无论是原材料供应商、生产加工环节,还是运输途中的某个节点,都能一查到底。企业可以根据追溯信息,快速召回问题产品,将损失和负面影响降到最低。同时,监管部门也能借助这些详实的数据,迅速展开调查,采取有效措施,保障公众的食品安全。四、RFID在冷链物流各环节的深度应用1. 生产环节:精准管理,从源头把控品质:在原材料采购阶段,为每一批次的原材料贴上RFID标签,详细记录其来源、产地、批次号、检验结果等关键信息。这不仅有助于实现原材料的精准追溯,还能实时监控库存水平,确保生产的连续性。在生产加工过程中,通过RFID技术对产品进行全程跟踪,自动记录每一道工艺流程的参数和检测结果,一旦发现质量问题,能够迅速定位问题环节,及时采取纠正措施,从源头上保障产品质量。2. 存储环节:智能管控,提升仓储效率:在仓库管理方面,RFID技术让货物识别与追踪变得更加高效。通过在仓库内布置读写设备,能够实时定位货物的位置,实现精准的批次管理。同时,内置温度传感器的RFID标签能够实时监测货物存储环境的温度变化,一旦出现异常,立即发出警报,并自动记录温度历史数据。此外,借助RFID技术实现的自动盘点和库存预警功能,大大提高了仓储管理的智能化水平,降低了人工成本,提升了仓储效率。3. 运输环节:实时监控,确保运输安全:在冷链运输过程中,将RFID技术与卫星定位系统(GPS)相结合,实现了货物位置和运输轨迹的实时跟踪。无论是在高速公路上疾驰,还是在偏远山区穿梭,都能随时掌握货物的动态。同时,通过RFID温度传感器对运输车内的温度进行精准监测与控制,确保货物在整个运输过程中始终处于适宜的温度环境,有效避免了因温度波动导致的品质下降。  五、未来展望:无限可能,引领行业新变革随着技术的不断发展和应用的深入,RFID技术在冷链物流中的前景一片光明。它将持续推动冷链物流向智能化、数字化方向深度转型,进一步提升整个行业的运营效率和服务质量。同时,也将为消费者带来更加新鲜、安全、优质的生鲜食品。(图片来源于网络 侵删)
  • [技术干货] RFID测温技术:为生产安全与稳定保驾护航
           在科技浪潮汹涌澎湃的当下,工业生产对于安全性和稳定性的追求达到了全新高度。各类保障生产安全的技术百花齐放,而RFID测温技术凭借其独树一帜的特性,在其中崭露头角,如同一位坚毅可靠的守护者,全方位筑牢生产安全的坚固防线,让生产流程得以高效、稳定地运转。一、RFID测温技术的定义与原理        RFID测温技术,即射频识别无线测温技术,是一种基于射频信号传播的无线测温方法。它通过发射端发射无线信号,与接收端进行通讯,实现对温度的远程、非接触式测量。RFID测温技术的核心是RFID芯片,它将温度信息转换为电信号,并通过无线通信技术将温度数据发送给读写器,读写器再将数据传输给计算机进行处理和分析。这样,我们就可以在远离测量现场的位置实时了解环境温度的变化情况,实现温度测量的无线化、数字化和智能化。二、多领域深度应用,筑牢生产安全网(一)电力行业电力系统庞大繁杂,从变电站中体型巨大的变压器,到开关柜中起着关键连接作用的触头,再到输电线路里的电缆接头,这些设备长期在高负荷、高电压的严苛环境下运行。一旦温度失去控制,严重故障便会接连不断。比如,变压器温度过高会加速内部绝缘材料老化,极有可能引发短路;电缆接头过热则可能引发火灾,致使整个电力系统陷入瘫痪,给社会生产生活带来巨大影响。而RFID测温技术的出现,为电力设备的安全稳定运行带来了曙光。通过在关键部位精准安装RFID测温标签,温度数据能够实时、不间断地无线传输至监控中心。一旦温度超出预先设定的安全范围,系统会即刻发出警报,运维人员收到警报后可迅速响应并及时处理,有效避免因温度异常引发的各类事故,全力保障电力的稳定供应,守护社会正常运转的能源动脉。   (二)煤矿领域煤矿环境恶劣,高温、高压、潮湿的环境以及狭窄逼仄的空间,给电气设备的稳定运行带来了极大挑战。传统的人工巡检方式不仅效率低下,而且在危险重重的井下环境中,存在诸多难以预料的安全隐患。RFID无线测温技术的应用,为煤矿安全生产注入了新的活力。在煤矿电气设备上合理部署RFID读写器和电子标签,能够实时采集设备温度数据,并通过无线传输模块将数据快速传送至监控中心。该系统可广泛应用于高压柜、电机等关键设备,实时掌握设备温度变化,及时发现因过热或接触不良等问题产生的高温隐患,为井下作业人员的生命安全提供了坚实保障,极大地提升了煤矿生产的安全性与效率,让煤矿开采在安全的轨道上高效运行。  (三)水泥厂在水泥厂的生产流程中,电力系统的稳定运行起着至关重要的作用。水泥厂的变电所、配电室等场所设备众多且分布广泛,一旦设备温度出现异常,不仅会严重影响生产效率,导致生产停滞,增加成本,还可能引发严重安全事故。RFID无线测温技术能够对电缆接头、高压开关柜触头、干式变压器等设备的表面温度进行实时监测,通过无线通信技术将监测数据高效传输至后台管理系统。当温度超过警戒值或出现异常波动时,系统迅速发出警报,有效避免因过热引发的火灾事故,最大限度降低重大经济损失的风险,让水泥厂的电力系统运行更加智能、安全,保障水泥厂生产的顺利进行。  三、突出优势显著,助力生产高效腾飞(一)非接触式测量,延长设备使用寿命RFID测温技术采用非接触式测量方式,传感器无需与被测物体直接接触。这一特性从根本上减少了因物理接触导致的设备磨损与损坏,大幅延长了设备的使用寿命,降低了企业的设备更换成本。同时,避免了因接触不良或测量位置不准确而产生的误差,显著提高了测量精度,为生产设备的稳定运行提供了可靠的数据支持,保障生产过程的连续性和稳定性。(二)强大穿透能力,精准洞察潜在隐患其信号具有强大的穿透能力,能够轻松穿透绝缘材料、油漆层等非金属材料,从而实现对设备内部或难以触及区域的温度监测,及时发现潜在的温度异常。以变压器内部绕组温度监测为例,传统测温方式往往难以触及,而RFID测温系统却能精准获取其温度信息,为设备的安全运行提供了有力保障,将安全隐患扼杀在萌芽状态。(三)安装简便,降低维护成本RFID测温传感器安装便捷,无需复杂的布线与连接,不仅大大缩短了安装时间,降低了人力成本,还减少了因布线错误引发的故障风险。此外,部分传感器采用低功耗甚至无源设计,无需外部电源,进一步降低了能源消耗与维护工作量,减轻企业运营负担。(四)实时数据传输,快速响应应急状况一旦出现温度异常,系统能够在第一时间迅速发出警报,帮助运维人员快速响应并采取有效措施。在实际应用中,该系统多次在设备温度异常升高的瞬间发出警报,运维人员及时处理,成功避免了可能发生的严重事故。这种实时高效的数据传输,为生产的安全稳定运行提供了关键保障,让企业在面对突发状况时能够迅速应对,减少损失。         综上所述,RFID测温技术凭借其独特的工作原理、广泛的应用场景和显著的技术优势,已然成为保障生产安全与稳定的中流砥柱。随着技术的不断创新与完善,相信RFID测温技术将在更多领域开疆拓土,发挥更大的作用,为工业生产的安全、高效发展贡献更多的智慧与力量,助力各行业在科技的赋能下蓬勃发展。(图片来源于网络 侵删)
  • [技术干货] ModelArts_AI开发平台之交通信号标志检测与识别
    【任务背景】近年来,随着人工智能和传感器技术的快速进步,自动驾驶汽车技术也取得了长足发展。从最初的辅助驾驶系统到如今可实现完全自主驾驶的汽车,自动驾驶技术正在改变我们的出行方式。其中,交通信号识别技术作为自动驾驶系统的核心功能之一,能够准确感知和识别道路上的各类交通标志、信号灯等,为车辆提供精准的行驶决策依据,确保行车安全性和效率。基于视觉的交通信号标志检测与识别任务旨在开发出精准高效的识别算法,助力自动驾驶汽车技术的进步。任务包含步行、非机动车行驶、环岛行驶、机动车行驶等多种交通信号标志类别,开发者会利用到计算机视觉领域的目标检测、关键点检测、图像分类等基础技术,为提升识别效率,也可以拓展使用剪枝、量化、蒸馏等模型方面的优化技术。ModelArts云平台提供任务相关的数据处理、模型训练、应用部署等技术文档及学习课程材料,助力开发者学习相关技术,了解实践操作。【数据说明】本次任务需要识别以下16种类别的交通标识,类别编号与定义如下表:i1i2i3i4Walk步行Non_motorized vehicles非机动车行驶Round the island 环岛行驶Motor vehicle 机动车行驶i5i6i7i8Keep on the right side of the road靠右侧道路行驶Keep on the left side of the road 靠左侧道路行驶Drive straight and turn right at the grade separation 立体交叉直行和右转弯行驶Drive straight and turn left 立体交叉直行和左转弯行驶i9i10i11i12Honk 鸣喇叭Turn right 向右转弯Turn left and right 向左向右转弯Turn left 向左转弯i13i14i15il50One way, straight 直行Go straight and turn right 直行和向右转弯Go straight and turn left 直行和向左转弯Minimum Speed Limit 最低限速50【任务说明】本任务的测试集为200张图片,这些图片为中国多个城市街景的高分辨率图像,每张图片包含1种交通信号标识。数据集图片示例检测结果以图片为单位输出其中包括交通信号标识的类别、坐标与置信度,每张图片输出一个结果,格式为json字符串,字段说明如下: { "detection_classes": ["i1"], "detection_boxes": [[576, 423, 669, 967]], "detection_scores": [0.4796633720397949] }• detection_classes:指图片中目标的类别,参见上面的数据说明。• detection_boxes:指图片中目标位置的水平矩形框坐标,坐标表示为[ymin,xmin,ymax,xmax]。• detection_scores:指检测结果的置信度。【案例教学】【准备数据集】# 步骤1:从OBS迁移数据集 import moxing as mox mox.file.copy_parallel("obs://trafficbuckets/dataset/update_traffic_sign.zip", "/home/ma-user/work/dataset/update_traffic_sign.zip") # 形参:源文件->指定位置# 步骤2:解压数据集并更改名称为update_traffic_sign import os os.system('unzip /home/ma-user/work/download/update_traffic_sign.zip -d /home/ma-user/work/dataset') os.system('mv /home/ma-user/work/dataset/"update traffic sign" /home/ma-user/work/dataset/update_traffic_sign')# 生成train和val图片名文本文件 from glob import glob import random # hyper parameter train_pic_rate = 0.7 # you can change! # 该目录存储图片数据 patch_fn_list = glob('/home/ma-user/work/dataset/update_traffic_sign/images/*.jpg') # you can change! # 返回存储图片名的列表,不包含图片的后缀 patch_fn_list = [fn for fn in patch_fn_list] # 将图片打乱顺序 random.shuffle(patch_fn_list) # 按照7:3比例划分train和val train_num = int(train_pic_rate * len(patch_fn_list)) train_patch_list = patch_fn_list[:train_num] valid_patch_list = patch_fn_list[train_num:] # produce train/valid/trainval txt file split = ['train', 'val', 'trainval'] # produce train/valid/trainval txt file split = ['train2017', 'val2017', 'trainval2017'] for s in split: # 存储文本文件的地址 save_path = '/home/ma-user/work/dataset/update_traffic_sign/' + s + '.txt' # you can change! if s == 'train2017': with open(save_path, 'w') as f: for fn in train_patch_list: # 将训练图像的地址写入train.txt文件 f.write('%s\n' % fn) elif s == 'val2017': with open(save_path, 'w') as f: for fn in valid_patch_list: # 将验证图像的地址写入val.txt文件 f.write('%s\n' % fn) elif s == 'trainval2017': with open(save_path, 'w') as f: for fn in patch_fn_list: # 将所有图像名的编号写入trainval.txt文件 f.write('%s\n' % fn) print('Finish Producing %s txt file to %s' % (s, save_path))# 按照train.txt和val.txt将images分类 import shutil import os def my_move(trainlistdir,vallistdir,traindir,valdir): # 打开train.txt文件 fopen = open(trainlistdir, 'r') # 读取图片名称 file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') # 图片的路径 traindata = file_name # 把图片复制至traindir路径下 # 如果目标文件夹不存在,则创建它 if not os.path.exists(traindir): os.makedirs(traindir) shutil.move(traindata, traindir) # 同上 fopen = open(vallistdir, 'r') file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') valdata = file_name # 如果目标文件夹不存在,则创建它 if not os.path.exists(valdir): os.makedirs(valdir) shutil.move(valdata, valdir) # 存储训练图片名的txt文件地址 trainlistdir=r'/home/ma-user/work/dataset/update_traffic_sign/train2017.txt' # 存储验证图片名的txt文件地址 vallistdir=r'/home/ma-user/work/dataset/update_traffic_sign/val2017.txt' # coco格式数据集的train2017目录 traindir=r'/home/ma-user/work/dataset/update_traffic_sign/images/train2017' # coco格式数据集的val2017目录 valdir=r'/home/ma-user/work/dataset/update_traffic_sign/images/val2017' my_move(trainlistdir,vallistdir,traindir,valdir)# 按照train.txt和val.txt将labels分类 import shutil import os def my_move(datadir, trainlistdir,vallistdir,traindir,valdir): # 打开train.txt文件 fopen = open(trainlistdir, 'r') # 读取图片名称 file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') # 图片的路径 tmp_list = file_name.split('/') tmp_list[-2] = 'labels' train_sp = os.path.join('/', *tmp_list) traindata = train_sp.split('.jpg')[-2] + '.txt' # 把图片复制至traindir路径下 # 如果目标文件夹不存在,则创建它 if not os.path.exists(traindir): os.makedirs(traindir) shutil.move(traindata, traindir) # 同上 fopen = open(vallistdir, 'r') file_names = fopen.readlines() for file_name in file_names: file_name=file_name.strip('\n') tmp_list_v = file_name.split('/') tmp_list_v[-2] = 'labels' val_sp = os.path.join('/', *tmp_list_v) valdata = val_sp.split('.jpg')[-2] + '.txt' # 如果目标文件夹不存在,则创建它 if not os.path.exists(valdir): os.makedirs(valdir) shutil.move(valdata, valdir) # labels存储地址 datadir=r'/home/ma-user/work/dataset/update_traffic_sign/labels/' # 存储训练图片名的txt文件地址 trainlistdir=r'/home/ma-user/work/dataset/update_traffic_sign/train2017.txt' # 存储验证图片名的txt文件地址 vallistdir=r'/home/ma-user/work/dataset/update_traffic_sign/val2017.txt' # coco格式数据集的train2017目录 traindir=r'/home/ma-user/work/dataset/update_traffic_sign/labels/train2017' # coco格式数据集的val2017目录 valdir=r'/home/ma-user/work/dataset/update_traffic_sign/labels/val2017' my_move(datadir, trainlistdir,vallistdir,traindir,valdir)# 对images和labels重命名 import os def rename_img_label(images_folder, labels_folder): # 获取文件夹中的文件列表 images = sorted(os.listdir(images_folder)) labels = sorted(os.listdir(labels_folder)) # 重新命名文件 for i, (image_file, label_file) in enumerate(zip(images, labels)): # 生成新的文件名 new_name = f"{i + 1:03d}" # 格式化为三位数 image_ext = os.path.splitext(image_file)[1] # 获取图片扩展名 label_ext = os.path.splitext(label_file)[1] # 获取标签扩展名 # 构建新的完整路径 new_image_path = os.path.join(images_folder, f"{new_name}{image_ext}") new_label_path = os.path.join(labels_folder, f"{new_name}{label_ext}") # 重命名文件 os.rename(os.path.join(images_folder, image_file), new_image_path) os.rename(os.path.join(labels_folder, label_file), new_label_path) print("文件重命名完成。") # 设置train文件夹路径 train_images_folder = '/home/ma-user/work/dataset/update_traffic_sign/images/train2017' train_labels_folder = '/home/ma-user/work/dataset/update_traffic_sign/labels/train2017' # 设置val文件夹路径 val_images_folder = '/home/ma-user/work/dataset/update_traffic_sign/images/val2017' val_labels_folder = '/home/ma-user/work/dataset/update_traffic_sign/labels/val2017' rename_img_label(train_images_folder, train_labels_folder) rename_img_label(val_images_folder, val_labels_folder)import os # 设置文件夹路径 folder_train = '/home/ma-user/work/dataset/update_traffic_sign/images/train2017' folder_val = '/home/ma-user/work/dataset/update_traffic_sign/images/val2017' output_file_train = '/home/ma-user/work/dataset/update_traffic_sign/train2017.txt' # 输出的 TXT 文件名 output_file_val = '/home/ma-user/work/dataset/update_traffic_sign/val2017.txt' # 输出的 TXT 文件名 def writetxt(floder_path, outputfilename): # 获取文件夹中的文件列表 file_names = os.listdir(floder_path) file_names.sort() # 将文件名写入 TXT 文件 with open(outputfilename, 'w') as f: for file_name in file_names: f.write(os.path.join(floder_path, file_name) + '\n') print(f"文件名已写入 {outputfilename}。") writetxt(folder_train, output_file_train) writetxt(folder_val, output_file_val)# 生成json文件(可选) import glob import json import os from PIL import Image def yolo_to_coco_for_subset(yolo_images_folder, yolo_labels_folder, categories): # Initialize COCO dataset structure for the subset coco_format = { "images": [], "annotations": [], "categories": [] } # Add category information for i, category in enumerate(categories): coco_format["categories"].append({ "id": i + 1, "name": category, "supercategory": "none" }) image_id = 0 annotation_id = 0 # image_id = -1 # annotation_id = -1 for image_file in glob.glob(f"{yolo_images_folder}/*.jpg"): print(image_file) # Read image to get width and height with Image.open(image_file) as img: width, height = img.size # Add image information with size coco_format["images"].append({ "id": image_id + 1, "file_name": os.path.basename(image_file), "width": width, "height": height }) # Corresponding annotation file yolo_annotation_file = os.path.join(yolo_labels_folder, os.path.basename(image_file).replace(".jpg", ".txt")) if os.path.exists(yolo_annotation_file): with open(yolo_annotation_file, "r") as file: for line in file: category_id, x_center, y_center, bbox_width, bbox_height = map(float, line.split()) # Convert YOLO format to COCO format x_min = (x_center - bbox_width / 2) * width y_min = (y_center - bbox_height / 2) * height coco_bbox_width = bbox_width * width coco_bbox_height = bbox_height * height # change image_id img_id = int(image_file.split('/')[-1].split('.')[-2]) print(img_id) # Add annotation information coco_format["annotations"].append({ "id": annotation_id + 1, "image_id": img_id, # image_id + 1, "category_id": int(category_id) + 1, "bbox": [x_min, y_min, coco_bbox_width, coco_bbox_height], "area": coco_bbox_width * coco_bbox_height, "segmentation": [], # Optional "iscrowd": 0 }) annotation_id += 1 image_id += 1 return coco_format def save_coco_format(coco_format, output_file): with open(output_file, "w") as file: json.dump(coco_format, file, indent=4) # Example usage yolo_base_folder = "/home/ma-user/work/dataset/update_traffic_sign/" # 父级文件夹 file_path = '/home/ma-user/work/dataset/update_traffic_sign/classes.txt' # 替换为你的txt文件路径 train_json_save_path = '/home/ma-user/work/dataset/update_traffic_sign/annotations/instances_train2017.json' # train json保存路径 val_json_save_path = '/home/ma-user/work/dataset/update_traffic_sign/annotations/instances_val2017.json' # val json保存路径 # 判断文件夹是否存在,若不存在则创建 # 判断文件夹是否存在,若不存在则创建 list_name_train = train_json_save_path.split('/')[:-1] if not os.path.exists(os.path.join(*list_name_train)): os.mkdir(os.path.join('/', *list_name_train)) # 读取txt文件并将每一行转换为列表 categories = [] with open(file_path, 'r') as file: lines = file.readlines() # 读取文件的所有行 for line in lines: categories.append(line.strip()) # 输出结果 print(categories) # Convert train set train_coco_format = yolo_to_coco_for_subset( os.path.join(yolo_base_folder, "images/train2017"), os.path.join(yolo_base_folder, "labels/train2017"), categories ) save_coco_format(train_coco_format, train_json_save_path) # Convert val set val_coco_format = yolo_to_coco_for_subset( os.path.join(yolo_base_folder, "images/val2017"), os.path.join(yolo_base_folder, "labels/val2017"), categories ) save_coco_format(val_coco_format, val_json_save_path)# 查看数据集 import os import random import cv2 import numpy as np from matplotlib import pyplot as plt %matplotlib inline # classes = ["open", "short","mousebite","spur","copper",'pin-hole'] # 类别 classes = ['i1', 'i10', 'i11', 'i12', 'i13', 'i14', 'i15', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8', 'i9', 'i50'] file_path = "/home/ma-user/work/dataset/update_traffic_sign/images/train2017" file_list = os.listdir(file_path) img_paths = random.sample(file_list, 4) img_lists = [] for img_path in img_paths: img_path = os.path.join(file_path, img_path) img = cv2.imread(img_path) h, w, _ = img.shape tl = round(0.002 * (h + w) / 2) + 1 color = [random.randint(0, 255) for _ in range(3)] if img_path.endswith('.png'): with open(img_path.replace("images", "labels").replace(".png", ".txt")) as f: labels = f.readlines() if img_path.endswith('.jpg'): with open(img_path.replace("images", "labels").replace(".jpg", ".txt")) as f: labels = f.readlines() for label in labels: l, x, y, wc, hc = [float(x) for x in label.strip().split()] x1 = int((x - wc / 2) * w) y1 = int((y - hc / 2) * h) x2 = int((x + wc / 2) * w) y2 = int((y + hc / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), color, thickness=tl, lineType=cv2.LINE_AA) cv2.putText(img,classes[int(l)],(x1,y1-2), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,111,222), 3, cv2.LINE_AA) img_lists.append(cv2.resize(img, (1280, 720))) image = np.concatenate([np.concatenate(img_lists[:2], axis=1), np.concatenate(img_lists[2:], axis=1)], axis=0) plt.rcParams["figure.figsize"] = (20, 10) plt.imshow(image[:,:,::-1]) plt.axis('off') plt.show()【准备mindyolo模型】链接:mindyolo# 步骤1:从OBS迁移数据集 import moxing as mox mox.file.copy_parallel("obs://trafficbuckets/source_code/mindyolo.zip", "/home/ma-user/work/mindyolo.zip") # 形参:源文件->指定位置【修改配置文件】1.yolov8n.yaml以及其继承的coco.yaml,hyp.scratch.low.yaml,yolov8-base.yaml的配置信息coco.yamldata: dataset_name: update_traffic_sign # you can change! train_set: /home/ma-user/work/dataset/update_traffic_sign/train2017.txt # ./coco/train2017.txt # 118287 images # you can change! val_set: /home/ma-user/work/dataset/update_traffic_sign/val2017.txt # ./coco/val2017.txt # 5000 images # you can change! test_set: /home/ma-user/work/dataset/update_traffic_sign/test2017.txt # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794 # you can change! nc: 16 # class names names: ['i1', 'i10', 'i11', 'i12', 'i13', 'i14', 'i15', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8', 'i9', 'i50'] # you can change! train_transforms: [] test_transforms: []yolov8-base.yamlepochs: 500 # total train epochs # you can change! per_batch_size: 2 # 16 * 8 = 128 img_size: 2048 iou_thres: 0.7 conf_free: True sync_bn: True opencv_threads_num: 0 # opencv: disable threading optimizations network: model_name: yolov8 nc: 16 # number of classes # you can change! reg_max: 16 stride: [8, 16, 32] ...【执行训练】python train.py --config ./configs/yolov8/yolov8n.yaml --run_eval True
  • [问题求助] 无预览接收车牌识别程序开发流程
    设备型号 M2331-T请问如何实现无预览方式,接收摄像头识别的车牌及图片?另外,是否需要在摄像头上做什么配置?我尝试过的方法:1:IVS_PU_RealPlay开启元数据流后,没有收到任何数据2:IVS_PU_AlarmInfoStatesCallBack_V20布防后,没有收到车牌识别事件及数据