尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

智慧养殖场肉鸡健康检测数据集:VOC转YOLO与YOLOv8训练实战

智慧养殖场肉鸡健康检测数据集:VOC转YOLO与YOLOv8训练实战 简介本数据集面向智慧养殖与计算机视觉方向的研究者、算法工程师及高校学生用于肉鸡健康状态自动识别模型的训练与验证可支撑异常与正常两类目标的检测任务。资源采用Pascal VOC与YOLO双格式标注包含4657张jpg图片并配有等量的xml与txt标注文件标注工具为labelImg以矩形框方式完成类别划分。压缩包共约2000个文件以xml标注文件为主另含一份使用前必读说明整体大小约396.56MB目录结构清晰便于直接接入主流检测框架。类别涵盖AbNormal与Normal两类框数分别为8447与13163总框数达21610样本分布相对均衡。目前已有395人学习下载适合需要快速构建养殖场景检测基线、验证标注质量或开展迁移学习实验的读者参考使用。1. 智慧养殖场肉鸡健康状态检测数据集从VOC到YOLO4657张图能跑出什么肉鸡养殖场的巡检窗口期很短。鸡群出现精神萎靡、羽毛蓬乱、闭眼缩颈这些异常状态时如果靠人工逐笼观察一个人管几万只鸡根本不现实等发现的时候往往已经扩散了。我最初接触这个方向是因为一个做养殖设备的朋友问我能不能用摄像头自动把“看起来不对劲”的鸡挑出来。当时我第一反应是这事不缺算法缺的是能直接拿来训练的数据。后来拿到这份4657张、2类别、VOC和YOLO双格式的肉鸡健康状态检测数据集才算把从数据到模型这条链路跑通了一遍。这篇文章不讲空泛的行业前景只讲这份数据集长什么样、VOC和YOLO两种格式怎么选、怎么把它喂给YOLO训练、参数怎么调、以及我在实际训练里踩过的坑。适合已经懂一点YOLO、想切入智慧养殖场场景的工程师也适合手里有养殖场资源、想评估这个方向值不值得投入的从业者。2. 肉鸡健康状态检测数据集拆解4657张图、2类别、VOC与YOLO双格式2.1 数据集里到底有什么2类别意味着什么先把这份数据集的骨架说清楚。4657张图像2个类别同时提供VOC格式和YOLO格式两套标注。VOC格式是每张图对应一个XML文件里面记录目标的类别名和边界框的左上角、右下角坐标YOLO格式是每张图对应一个txt文件每行是“类别索引 中心x 中心y 宽 高”坐标全部归一化到0到1之间。两套格式描述的是同一批标注只是坐标系和存储方式不同。2类别这个信息很关键。它意味着模型只做二分类检测不是去区分十几种具体疾病而是把鸡的状态分成“健康”和“异常”两类或者按数据集实际定义的两种状态来分。对落地来说二分类反而是好事类别少模型收敛快标注一致性容易保证误报的排查也简单。你不需要一上来就做细粒度疾病识别先把“哪只鸡不对劲”框出来再交给后续环节判断具体原因这是更务实的路径。从检索到的相关方向看智慧养殖场、肉鸡健康状态检测这类词最近热度在涨配套的数据集却不多。这份4657张的规模说大不大说小也不小。按常见的7:2:1划分训练集大概3200多张验证集900多张测试集460多张。对于二分类检测任务这个量级足够把YOLO系列模型训到一个可用的水平但前提是标注质量过关、场景分布别太单一。2.2 VOC和YOLO格式的差异以及该选哪个很多人拿到双格式数据集会纠结用哪个。我的建议很直接训练YOLO就用YOLO格式别绕VOC。原因不是VOC不好而是YOLO训练框架默认吃的就是归一化的txt标注你硬塞VOC的XML进去要么改数据加载器要么先写转换脚本多一道工序就多一个出错点。但VOC格式也不是没用。它的XML结构可读性强方便你人工抽查标注对不对也方便转成COCO、TFRecord等其他格式。如果你后续要做多模态、要接别的检测框架VOC作为中间格式更通用。所以合理的做法是VOC留作存档和检查YOLO格式直接拿去训练。两者的坐标换算关系必须记牢这是后面写转换脚本的基础。VOC给的是绝对像素坐标(xmin, ymin, xmax, ymax)YOLO要的是归一化后的中心点和宽高x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height width (xmax - xmin) / image_width height (ymax - ymin) / image_height这里最容易翻车的地方是image_width和image_height取错。XML里虽然有size节点但有些标注工具写进去的尺寸和实际图片尺寸对不上尤其是图片被裁剪或缩放过的数据集。稳妥做法是用PIL或OpenCV重新读一遍图片拿真实尺寸别偷懒直接用XML里的值。2.3 目录结构怎么组织训练前必须核对的三件事YOLO训练对目录结构有约定组织错了框架直接报找不到标签。常见做法是这样一个结构dataset/ images/ train/ val/ test/ labels/ train/ val/ test/ data.yamlimages和labels下的子目录名必须一一对应图片和同名txt放在对应位置。比如images/train/abc.jpg对应labels/train/abc.txt。data.yaml里写清楚类别数和类别名path: ./dataset train: images/train val: images/val test: images/test nc: 2 names: [healthy, abnormal]names里的顺序必须和txt里类别索引一致0对应第一个名字1对应第二个。这个顺序错了模型训出来会把健康鸡标成异常而且loss看着还挺正常属于典型的玄学问题。训练前我一般强制核对三件事第一图片数量和标签数量是否一致差一个都可能是漏标第二每张图的标签行数是否和XML里的目标数对得上第三随机抽20张把框画出来肉眼过一遍看框有没有整体偏移。这三步花不了十分钟能省掉后面几小时的无效训练。3. 从VOC转YOLO到跑通第一次训练脚本、命令与参数3.1 写一个能直接用的VOC转YOLO脚本虽然数据集号称双格式但实际拿到的包经常只有VOC是全的或者YOLO格式的划分不合你意。自己写一遍转换脚本最踏实。下面这个脚本处理单个目录下的所有XML输出对应的txtimport os import xml.etree.ElementTree as ET from PIL import Image # 类别名到索引的映射顺序必须和data.yaml一致 CLASS_MAP {healthy: 0, abnormal: 1} def convert_voc_to_yolo(xml_dir, img_dir, out_dir): os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() # 用真实图片尺寸不用XML里的size img_name root.find(filename).text img_path os.path.join(img_dir, img_name) with Image.open(img_path) as im: w, h im.size lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in CLASS_MAP: continue bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化并转中心点格式 xc (xmin xmax) / 2.0 / w yc (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h # 裁剪到0-1防止标注越界 xc, yc min(max(xc, 0), 1), min(max(yc, 0), 1) bw, bh min(max(bw, 0), 1), min(max(bh, 0), 1) lines.append(f{CLASS_MAP[cls_name]} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}) out_name os.path.splitext(xml_file)[0] .txt with open(os.path.join(out_dir, out_name), w) as f: f.write(\n.join(lines)) convert_voc_to_yolo(dataset/annotations, dataset/images, dataset/labels)逻辑说明脚本遍历XML目录对每个object取类别名和边界框用PIL读真实图片尺寸做归一化最后按YOLO格式写txt。参数说明CLASS_MAP必须和data.yaml的names顺序严格一致这是最容易出错的地方归一化后做了0到1的裁剪因为有些标注框会超出图片边界不裁的话训练时可能报坐标非法保留6位小数足够精度再多没必要。3.2 用YOLOv8跑通第一次训练的命令与参数环境配置这块我一般用conda建一个干净环境装ultralytics就行。检索里yolo环境配置、yolov8训练自己的数据集这些词热度一直很高说明卡在环境上的人不少。实际命令不复杂conda create -n poultry python3.10 -y conda activate poultry pip install ultralytics yolo detect train datadataset/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16参数逐个说。modelyolov8n.pt用的是nano版本参数量小、训练快适合先跑通流程验证数据没问题等确认数据无误再换yolov8s或yolov8m提精度。epochs100对4657张图是够的二分类任务通常50到80轮就收敛了设100是留余量。imgsz640是YOLO的默认输入尺寸如果你的图片分辨率远大于640可以调到960或1280但显存占用会明显上升。batch16看显存8G显存跑640尺寸的nano模型16基本是安全值报显存不足就降到8。训练开始后重点看三个输出box_loss、cls_loss和mAP50。box_loss管框的位置cls_loss管分类两个都应该稳定下降。mAP50在验证集上算二分类任务正常能到0.85以上。如果box_loss降但cls_loss不降多半是类别标注有问题如果两个都不降先怀疑学习率或者数据加载路径错了。3.3 训练结果怎么读混淆矩阵和验证集预测训练完别只看最后的mAP数字。YOLO会在runs/detect/train目录下生成一堆结果文件其中confusion_matrix.png和val_batch0_pred.jpg最值得看。混淆矩阵能告诉你两类之间有没有互相误判如果健康被大量判成异常说明两类特征区分度不够或者标注里两类边界模糊。val_batch0_pred.jpg是验证集上的预测可视化直接看框得准不准、有没有漏框。检索里提到yolo混淆矩阵总合不唯一这个现象在二分类里也常见。原因是混淆矩阵统计的是预测框和真实框的匹配结果一个真实框可能匹配多个预测框或者置信度阈值不同导致统计口径变化。别纠结矩阵数字加不加得起来重点看对角线占比也就是正确分类的比例。验证集预测图我一般会挑几张漏检和误检的单独看。漏检通常是目标太小或者遮挡严重肉鸡挤在一起的时候尤其明显误检多半是把笼子、食槽这些背景误判成鸡。这两种情况的处理方式不同前者要加数据或调anchor后者要清理标注里的背景误标。4. 肉鸡检测训练避坑从标注到显存的5个血泪教训4.1 坑一图片和标签文件名对不上训练静默丢样本现象训练正常启动loss也在降但训完发现模型对某些场景完全没反应。原因YOLO加载数据时如果某张图片找不到同名txt默认会跳过这张图不报错。4657张里如果有几十张对不上你根本察觉不到。解决训练前跑一段脚本核对images和labels的文件名集合是否完全一致差集打印出来手动处理。我一般还会检查txt是否为空文件空标签在YOLO里表示负样本但如果是漏标导致的空文件会教坏模型。4.2 坑二类别索引和names顺序错位模型学反现象训练指标看着不错但预测时健康鸡被框成异常。原因txt里的类别索引和data.yaml的names顺序没对齐比如转换脚本里healthy0但yaml里写的是[abnormal, healthy]。解决把CLASS_MAP和names放在同一个配置文件里引用别两处各写一份。改完重新生成一遍标签别只改yaml因为txt里的索引是转换时写死的。4.3 坑三图片尺寸不一致导致归一化坐标偏移现象验证集预测框整体偏移框的位置系统性偏左或偏上。原因转换脚本用了XML里的size节点但部分图片实际尺寸和XML记录不符归一化时分母错了。解决一律用PIL或OpenCV重新读图片拿真实宽高别信XML里的size。这个坑我在别的数据集上也踩过属于通用问题。4.4 坑四显存不足硬扛训练中途崩现象训练跑了几十轮突然报CUDA out of memory。原因batch设太大或者imgsz调太高前期能跑是因为缓存还没满跑久了碎片积累就崩。解决把batch降到8或者开amp混合精度训练YOLOv8默认就带amp确认没被关掉。另外dataloader的workers别设太高设成CPU核数的一半比较稳。4.5 坑五验证集和训练集场景重叠指标虚高现象验证集mAP很高但换一批新视频测试就拉胯。原因随机划分数据集时同一只鸡、同一个笼位的图片被分到了训练集和验证集模型其实在背场景。解决按时间段或按笼位划分让验证集的场景和训练集不重叠。这个坑最隐蔽指标好看但没意义落地时才发现模型不泛化。5. 把二分类检测做扎实置信度阈值调优与误报压制训练跑通只是起点真正决定这套东西能不能用在养殖场的是误报率。养殖场环境里笼子反光、饲料阴影、鸡群重叠都会让模型乱框误报一多巡检人员就不信了。我一般会在验证集上做一轮置信度阈值扫描把conf从0.1到0.9逐个试画一条precision-recall曲线找误报和漏报的平衡点。二分类任务里如果异常类的漏报代价高就把conf调低一点宁可多报也别漏如果误报会让人烦就调高conf牺牲一点召回。另一个实用技巧是加一个最小框面积过滤。肉鸡检测里太小的框基本是噪声可以在推理后处理里把面积小于某个阈值的框直接丢掉。这个阈值按你实际图片分辨率定640输入下小于20x20像素的框我一般直接滤掉。还有如果连续多帧同一位置反复报异常可以做个简单的时序投票只有连续N帧都判异常才触发告警能压掉大量瞬时误报。这套流程我前后调了大概两周最大的体会是数据集质量比模型结构重要得多。4657张图里如果标注干净、场景多样yolov8n就能给出能用的结果标注一乱换多大的模型都救不回来。所以拿到任何检测数据集先花时间把标注核对一遍比急着调参划算。希望帮到你。本文还有配套的精品资源点击获取
返回列表