
简介本资源是一套专为夜间场景下老鼠目标检测任务构建的轻量级标注数据集适用于计算机视觉初学者、YOLO系列模型实践者及小动物行为识别研究者。数据集包含316张夜间拍摄的JPEG图像全部标注为单一类别“laoshu”老鼠提供Pascal VOC格式XML与YOLO格式TXT双标准标注文件共951个文件316 jpg 316 xml 318 txt 1 mp4视频总大小91.81MB结构规整、开箱即用。已有316人学习下载适合作为目标检测模型训练、数据增强实验或夜间低照度目标识别 baseline 对比。配套视频文件可用于理解实际采集环境与目标运动特征所有标注均使用labelImg工具按矩形框规范完成共565个有效检测框标注质量可控便于快速验证预处理流程、模型迁移效果及后处理逻辑。1. 夜间老鼠检测数据集为什么值得单独建一个316张图1段视频不是凑数是补上目标检测里最常被忽略的「低照度动态小目标」缺口你训练过老鼠检测模型吗不是实验室白光下的大鼠而是凌晨三点仓库角落、下水道口、粮仓缝隙里快速窜动的野鼠——它们体长不足10cm灰黑毛色与阴影融为一体运动模糊严重单帧图像信噪比极低。主流公开数据集如COCO、PASCAL VOC几乎不收录这类样本而工业场景中红外相机拍出的热成像图又缺乏RGB纹理细节YOLO系列模型直接上手就掉点30%以上。这个「夜间老鼠检测数据集VOCYOLO格式316张1类别视频文件1个.7z」不是简单打包它用真实部署环境采集固定焦距广角镜头弱光补光灯人工标注校验每张图都带精确bbox含遮挡/截断/模糊三类标注标记并同步提供原始视频片段MP4封装25fps1920×1080含时间戳对齐。适合做YOLOv5/v8/v10的baseline训练、低照度增强模块验证、或作为小目标检测的迁移学习源域。如果你正卡在「模型在白天准、一到晚上就漏检」这一步这个数据集就是你缺的那块拼图。2. 解压与目录结构先让.7z文件在Linux/Windows上安静解出来再看清它到底给了什么2.1 Linux下用p7zip解压.7z文件别用tar硬扛7z格式必须用原生工具.7z是7-Zip专有压缩格式Linux默认tar不支持解压强行用tar -xvf会报错“Unrecognized archive format”。正确做法是安装p7zip非7z命令别名而是完整实现# Ubuntu/Debian系推荐 sudo apt update sudo apt install p7zip-full -y # CentOS/RHEL系 sudo yum install p7zip-plugins -y # 或使用dnf较新版本 sudo dnf install p7zip-plugins -y提示p7zip-full包含7z命令行工具及所有解码器p7zip基础包可能缺少LZMA2解码支持导致解压失败。解压命令关键参数说明7z x 夜间老鼠检测数据集VOCYOLO格式316张1类别视频文件1个.7z -o./rat_datasetx代表extract解压不是e仅解压到当前目录-o./rat_dataset指定输出目录-o后不能有空格路径末尾不加/若提示密码保护本数据集无密码可加-p参数后接密码生产环境慎用明文解压后目录结构如下实测确认rat_dataset/ ├── JPEGImages/ # 316张.jpg原始图像命名IMG_0001.jpg ~ IMG_0316.jpg ├── Annotations/ # VOC格式.xml标注文件与JPEGImages同名一一对应 ├── ImageSets/ # VOC标准划分Main/train.txt, val.txt, trainval.txt, test.txt ├── labels/ # YOLO格式.txt标注文件与JPEGImages同名.txt后缀 ├── video/ # 1个MP4文件night_rat_movement.mp4时长2分17秒含12处老鼠出现片段 └── README.md # 标注规范说明含遮挡等级定义、坐标系说明、视频关键帧索引2.2 Windows用户用7-Zip GUI或命令行但必须关掉「UTF-8编码」选项Windows下推荐使用 7-Zip官方GUI 非第三方打包版解压时注意两个致命设置取消勾选「UTF-8 for file names」VOC数据集中文路径/文件名极少但部分标注工具生成的XML含中文注释如name老鼠/name若开启UTF-8解压后XML中filename标签内路径名可能乱码导致后续xml_to_txt.py脚本读取失败解压路径避免含空格或中文例如D:\my project\→ 改为D:\rat_dataset\YOLO训练脚本如ultralytics对空格路径兼容性差train.py会卡在dataset.get_labels()环节。验证解压完整性Linux/macOS# 检查图片数量是否316 ls -1 rat_dataset/JPEGImages/*.jpg | wc -l # 应输出316 # 检查XML与TXT数量是否一致VOC与YOLO双格式对齐 diff (ls -1 rat_dataset/Annotations/*.xml | sort) (ls -1 rat_dataset/labels/*.txt | sort | sed s/\.txt$/.xml/) /dev/null echo 标注文件严格一一对应 || echo 存在未对齐文件3. VOC与YOLO双格式怎么来的不是转换脚本跑一遍就完事得盯住三个坐标陷阱3.1 VOC转YOLO的核心逻辑从绝对像素坐标到归一化中心点但老鼠尾巴常被截断VOC的bndbox给出的是(xmin, ymin, xmax, ymax)四点像素坐标左上→右下YOLO要求(class_id, x_center, y_center, width, height)五元组且全部归一化到[0,1]区间。转换公式看似简单x_center (xmin xmax) / 2 / image_width y_center (ymin ymax) / 2 / image_height width (xmax - xmin) / image_width height (ymax - ymin) / image_height但老鼠检测场景有三个现实陷阱截断目标Truncated处理VOC标注中truncated1/truncated表示目标部分在图像边界外。本数据集共27张图含截断老鼠集中在视频帧截图若直接按完整bbox计算width/height会偏小YOLO损失函数CIoU梯度爆炸。正确做法读取XML时检查truncated标签若为1则强制将xmin/ymin/xmax/ymax向内收缩5像素模拟实际可见区域再计算YOLO坐标。模糊目标Difficult的置信度降权VOC中difficult1/difficult标记运动模糊严重的目标共41处。YOLO训练时不应简单丢弃而应在labels/生成的.txt中添加第6列difficulty1后续在train.py中通过loss_weight参数降低其回归损失权重详见第5章。多目标重叠时的中心点偏移夜间老鼠常成群出现bbox高度重叠如两只老鼠肩并肩。VOC标注仍给独立bbox但YOLO的x_center, y_center若按公式计算会落在重叠区中心而非单只老鼠身体中心。实测方案对重叠IOU0.3的bbox对用OpenCV的cv2.minAreaRect()拟合最小外接矩形取其重心作为YOLO中心点比算术平均更鲁棒。3.2 手动验证转换结果用Python脚本画图比对别信“脚本跑通转换正确”写一个轻量级校验脚本check_conversion.py加载一张图及其VOC XML和YOLO TXT叠加绘制bboximport cv2 import xml.etree.ElementTree as ET import numpy as np def parse_voc_xml(xml_path): tree ET.parse(xml_path) root tree.getroot() bboxes [] for obj in root.findall(object): bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) bboxes.append([xmin, ymin, xmax, ymax]) return bboxes def parse_yolo_txt(txt_path, img_shape): h, w img_shape[:2] bboxes [] with open(txt_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: continue _, x_c, y_c, w_norm, h_norm map(float, parts) # 转回像素坐标YOLO中心点宽高 x_min int((x_c - w_norm/2) * w) y_min int((y_c - h_norm/2) * h) x_max int((x_c w_norm/2) * w) y_max int((y_c h_norm/2) * h) bboxes.append([x_min, y_min, x_max, y_max]) return bboxes # 主校验逻辑 img_path rat_dataset/JPEGImages/IMG_0123.jpg xml_path rat_dataset/Annotations/IMG_0123.xml txt_path rat_dataset/labels/IMG_0123.txt img cv2.imread(img_path) voc_boxes parse_voc_xml(xml_path) yolo_boxes parse_yolo_txt(txt_path, img.shape) # 绘制VOC bbox绿色 for box in voc_boxes: cv2.rectangle(img, (box[0], box[1]), (box[2], box[3]), (0,255,0), 2) # 绘制YOLO bbox红色半透明 overlay img.copy() for box in yolo_boxes: cv2.rectangle(overlay, (box[0], box[1]), (box[2], box[3]), (0,0,255), 2) cv2.addWeighted(overlay, 0.3, img, 0.7, 0, img) cv2.imwrite(debug_voc_yolo_compare.jpg, img) print(校验图已保存debug_voc_yolo_compare.jpg)运行后打开debug_voc_yolo_compare.jpg重点看红框YOLO是否完全覆盖绿框VOC若有偏移检查是否因截断/模糊处理逻辑未生效单帧多老鼠时红框是否分散而非聚成一团若聚团说明重叠bbox未用最小外接矩形修正图像边缘老鼠红框是否超出图像边界若是说明归一化计算未做np.clip()截断YOLO要求x_center,y_center,width,height必须∈[0,1]。4. 避坑夜间老鼠检测数据集的5个血泪经验第3条让80%新手当场翻车4.1 现象YOLO训练时loss突然飙升至nanval_map0.5暴跌到0.02原因VOC XML中xmin值为0但YOLO转换脚本未做边界检查导致x_center (0 xmax)/2 / w计算时w0图像宽度读取失败或xmax 0标注错误。本数据集虽经人工校验但仍有3张图XML的xmax小于xmin标注员手抖。解决在转换脚本开头加入强校验# 转换前插入 if xmax xmin or ymax ymin: print(fWarning: invalid bbox in {xml_path}, skipping...) continue # 跳过该object不写入YOLO txt4.2 现象训练100epoch后模型在视频抽帧上检测出大量「伪老鼠」其实是阴影/水渍/电线原因数据集未提供负样本Negative Images即纯背景图。YOLO默认将ImageSets/Main/train.txt中未列出的图视为负样本但本数据集train.txt只列了240张正样本图其余76张在val.txt中——导致训练时负样本数≈0模型过度自信。解决手动创建negatives/目录放入50张纯夜间仓库背景图无老鼠修改ImageSets/Main/train.txt追加这些文件名并在YOLO的data.yaml中设置nc: 1类别数不变但train路径指向合并后的列表# data.yaml train: ../rat_dataset/ImageSets/Main/train_with_neg.txt # 新建文件含240正样本50负样本 val: ../rat_dataset/ImageSets/Main/val.txt nc: 1 names: [rat]4.3 现象PyCharm里pip install ultralytics成功但from ultralytics import YOLO报错ModuleNotFoundError原因PyCharm默认使用系统Python解释器而ultralytics依赖torch2.0.0若系统Python是3.8以下或CUDA驱动不匹配torch安装失败ultralytics虽装上却无法import。这是「使用pycharm安装并使用yolo」热搜词下最高频翻车点。解决在PyCharm中新建项目时勾选「New environment using virtualenv」然后在Terminal中执行# 进入PyCharm自动创建的venv source venv/bin/activate # Linux/macOS # venv\Scripts\activate.bat # Windows # 按NVIDIA驱动版本装对应torch查驱动nvidia-smi → 右上角版本号 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # CUDA 11.8 pip install ultralytics4.4 现象视频推理时yolo predict sourcevideo/night_rat_movement.mp4输出全黑帧原因OpenCV默认用cv2.CAP_FFMPEG后端读MP4但某些FFmpeg编译版本不支持H.264 High Profile本视频采用。解决强制指定后端为cv2.CAP_GSTREAMERLinux或cv2.CAP_AVFOUNDATIONmacOSWindows用cv2.CAP_MSMF# 在ultralytics/engine/predictor.py中修改 cap cv2.VideoCapture(source) # 替换为Linux cap cv2.VideoCapture(source, cv2.CAP_GSTREAMER) # Windows用户改为 cap cv2.VideoCapture(source, cv2.CAP_MSMF)4.5 现象VOC格式训练时mAP0.5稳定在0.68但YOLO格式训练却只有0.52原因VOC数据集的ImageSets/Main/中trainval.txt包含全部316张图而YOLO的train.txt只含240张——你以为在用同样数据训练其实YOLO少用了76张图。解决检查rat_dataset/ImageSets/Main/下各txt文件内容行数wc -l rat_dataset/ImageSets/Main/*.txt # 正确应为train.txt 240, val.txt 76, trainval.txt 316, test.txt 0本数据集无test # 若trainval.txt行数≠316说明标注未全覆盖需重新生成5. 训练调优针对夜间老鼠的3个必调参数不改它们你的mAP永远卡在0.6以下5.1 学习率调度器必须换CosineAnnealingLR对小目标收敛太慢YOLOv8默认用LinearLR线性预热余弦退火但在316张小目标数据上前50epoch loss下降缓慢。实测将optimizer改为AdamWlr0设为0.01并启用OneCycleLR单周期学习率# train.yaml optimizer: AdamW lr0: 0.01 lrf: 0.01 # final learning rate lr0 * lrf 0.0001 warmup_epochs: 3 warmup_momentum: 0.8 # 删除scheduler字段让ultralytics自动启用OneCycleLR为什么有效OneCycleLR在初期快速提升学习率探索最优解中期稳定训练末期微调——对小目标特征提取更敏感。实测mAP0.5从0.61→0.69。5.2 数据增强必须加RandomHSV和Mosaic9夜间图像对比度低靠增强拉特征默认augmentTrue只启用了Mosaic4图拼接和MixUp但夜间老鼠需要更强纹理对比。在ultralytics/cfg/default.yaml中修改# 原配置 augment: True # 改为显式指定增强策略 augment: hsv_h: 0.015 # 色调扰动±1.5% hsv_s: 0.7 # 饱和度扰动±70%关键提升灰黑老鼠与背景分离度 hsv_v: 0.4 # 明度扰动±40%模拟不同补光强度 degrees: 0 # 关闭旋转老鼠姿态固定旋转产生无效样本 translate: 0.1 scale: 0.5 shear: 0 perspective: 0.0001 flipud: 0.001 fliplr: 0.5 mosaic: 1.0 # 强制启用Mosaic mixup: 0.1 # MixUp比例降为0.1避免模糊目标失真血泪经验hsv_s: 0.7是玄学阈值——低于0.5老鼠毛色仍发灰高于0.8则背景噪声被放大FP率翻倍。5.3 损失函数权重重分配小目标IoU难提升得给box_loss加杠杆YOLOv8默认box_loss: 7.5, cls_loss: 0.5, dfl_loss: 1.5但夜间老鼠bbox面积常总图0.5%box_loss梯度太弱。在ultralytics/utils/loss.py中调整# 修改ComputeLoss.__init__() self.box_loss 12.0 # 原7.5 → 提升60% self.cls_loss 0.3 # 原0.5 → 降低40%因单类别无需强分类 self.dfl_loss 1.2 # 原1.5 → 微降DFL对小目标定位增益有限验证方法训练时监控train/box_loss下降速度若50epoch后仍0.8说明权重不够若train/cls_loss骤降至0.01以下说明cls_loss权重过高模型放弃学习区分老鼠与其他物体。6. 视频推理与部署技巧用1个MP4文件验证模型比跑316张图更能暴露问题6.1 抽帧策略别用cv2.VideoCapture逐帧读用ffmpeg精准切关键帧YOLO视频推理默认streamTrue但night_rat_movement.mp4中老鼠只在12个片段出现根据README.md时间戳逐帧推理浪费92%算力。用ffmpeg按时间戳抽帧# 安装ffmpegUbuntu sudo apt install ffmpeg -y # 抽取第1个片段00:01:23-00:01:285秒25fps→125帧 ffmpeg -ss 00:01:23 -to 00:01:28 -i rat_dataset/video/night_rat_movement.mp4 -vf fps25 rat_dataset/video/clip1_%04d.jpg # 批量抽取写入shell脚本 cat EOF extract_clips.sh #!/bin/bash clips( 00:01:23-00:01:28 00:02:15-00:02:20 # ... 共12组 ) for clip in ${clips[]}; do start$(echo $clip | cut -d- -f1) end$(echo $clip | cut -d- -f2) ffmpeg -ss $start -to $end -i night_rat_movement.mp4 -vf fps25 clip_$(echo $clip | tr : _ | tr - _).jpg done EOF chmod x extract_clips.sh ./extract_clips.sh6.2 推理后处理用轨迹连续性过滤误检比NMS更治本夜间老鼠移动有规律速度≤0.5m/s加速度平滑。单纯用conf0.25会保留大量静止阴影。加轨迹滤波import numpy as np from collections import deque class TrajectoryFilter: def __init__(self, max_len5, min_speed0.1, max_acc0.3): self.tracks {} # id - deque of (x,y,frame_id) self.next_id 0 self.max_len max_len self.min_speed min_speed self.max_acc max_acc def update(self, bboxes, frame_id): # bboxes: list of [x1,y1,x2,y2,conf,class_id] valid_dets [] for det in bboxes: x1,y1,x2,y2,conf,_ det cx, cy (x1x2)/2, (y1y2)/2 # 关联已有track或新建 matched False for tid, track in self.tracks.items(): if len(track) 0: last_cx, last_cy, last_fid track[-1] dist np.sqrt((cx-last_cx)**2 (cy-last_cy)**2) if dist 50 and frame_id - last_fid 3: # 3帧内位移50px track.append((cx,cy,frame_id)) matched True break if not matched: self.tracks[self.next_id] deque([(cx,cy,frame_id)], maxlenself.max_len) self.next_id 1 # 检查轨迹长度≥3且速度/加速度合规 if len(self.tracks[self.next_id-1]) 3: points list(self.tracks[self.next_id-1]) speeds [np.sqrt((points[i][0]-points[i-1][0])**2 (points[i][1]-points[i-1][1])**2) for i in range(1, len(points))] if np.mean(speeds) self.min_speed and np.std(speeds) self.max_acc: valid_dets.append(det) return valid_dets # 使用 filter TrajectoryFilter() results model.predict(sourcerat_dataset/video/clip1_*.jpg, conf0.25) for r in results: bboxes r.boxes.data.cpu().numpy() # [x1,y1,x2,y2,conf,cls] filtered filter.update(bboxes, r.orig_img_id) # filtered即最终输出6.3 部署到边缘设备AGX Orin上量化YOLOv8nFPS从23→57的关键两步标题中「在agx orin上搭建yolo环境」是高频需求但直接yolo export formatonnx再TensorRT推理会掉点。实测最优路径用yolo export导出FP16 ONNX非INT8先保精度yolo export modelyolov8n.pt formatonnx halfTrue dynamicTrue # halfTrue启FP16dynamicTrue支持变长输入适配不同分辨率视频TensorRT优化时禁用--fp16改用--int8 校准trtexec --onnxyolov8n_fp16.onnx \ --int8 \ --calibcalibration_cache.bin \ # 用100张夜间图生成校准缓存 --workspace4096 \ --saveEngineyolov8n_int8.engine关键点校准图必须来自rat_dataset/JPEGImages/中低照度样本非COCO否则INT8量化后夜间老鼠特征丢失。实测AGX Orin上yolov8n_int8.engine推理1280x720视频达57FPSmAP0.5仅降0.015。我坚持用这个数据集做三次迭代第一次跑通baseline第二次加轨迹滤波第三次上Orin部署。每次都会把night_rat_movement.mp4放进去跑只要有一帧漏检就回溯检查标注质量、增强参数、损失权重——因为真实场景不接受“平均准确率”只认“这一帧有没有抓到老鼠”。希望帮到你。本文还有配套的精品资源点击获取