1
📦 纸箱堆叠计数检测数据集概览表
| 项目 | 内容 |
|---|---|
| 数据集名称 | 纸箱堆叠计数检测数据集(Cardboard Carton Counting Dataset) |
| 总图像数量 | 21,199 张 |
| 目标类别数 | 1 类 |
| 类别名称(英文) | cardboard-carton |
| 类别名称(中文) | 纸箱 / 瓦楞纸箱 |
| 标注工具 | LabelImg(生成 PASCAL VOC 格式,后转为 YOLO 格式) |
| 标注格式 | YOLO 格式(.txt文件,每行:class_id x_center y_center width height,坐标归一化) |
| 应用场景 | - 仓储物流自动化盘点- 智能叉车/AGV 货物识别- 电商仓库纸箱堆叠高度与数量统计 |
📊 数据划分详情表
| 数据集类型 | 图像数量 | 占比 | 说明 |
|---|---|---|---|
| 训练集(train) | 16,959 张 | 80% | 用于模型参数学习 |
| 验证集(val) | 2,119 张 | 10% | 用于超参数调优与早停 |
| 测试集(test) | 2,121 张 | 10% | 用于最终性能评估(不参与训练) |
| 总计 | 21,199 张 | 100% | — |
✅ 划分比例严格遵循8:1:1,符合工业级数据集标准。
📁 推荐目录结构(YOLO 格式)
cardboard_carton_dataset/ ├── images/ │ ├── train/ # 16,959 张 │ ├── val/ # 2,119 张 │ └── test/ # 2,121 张 ├── labels/ │ ├── train/ # 对应 .txt 标签 │ ├── val/ │ └── test/ └── data.yaml # 配置文件📄data.yaml配置文件示例
# cardboard_carton_dataset/data.yamltrain:./images/trainval:./images/valtest:./images/testnc:1names:['cardboard-carton']💡 补充说明
- 单类检测优势:模型专注学习纸箱的尺度、遮挡、堆叠形态,收敛更快、精度更高。
- 计数实现方式:
- 直接通过检测框数量 = 纸箱数量(适用于可分辨单个纸箱)
- 若严重堆叠不可分,可结合实例分割(如 YOLOv8-seg)或回归头预测堆叠层数
- 典型挑战:
- 纸箱颜色/尺寸多样
- 高度堆叠导致遮挡
- 光照变化与反光(尤其在仓库环境)
该数据集规模大(>21k)、划分规范、标注统一,非常适合用于工业仓储自动化、智能物流机器人、AI 盘点系统等场景的模型训练与部署。
✅ 一、数据集目录结构(确认无误)
cardboard_carton_dataset/ ├── images/ │ ├── train/ # 16,959 张 │ ├── val/ # 2,119 张 │ └── test/ # 2,121 张 ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml内容:
train:./images/trainval:./images/valtest:./images/testnc:1names:['cardboard-carton']✅ 二、YOLOv8 完整训练代码
保存为train_cardboard.py:
# -*- coding: utf-8 -*-""" 纸箱堆叠计数检测 - YOLOv8 训练脚本 类别:1 类(cardboard-carton) 图像数:21,199 张(8:1:1 划分) 作者:AI助手 """importosfromultralyticsimportYOLOimporttorch# -----------------------------# 1. 配置路径与设备# -----------------------------DATASET_PATH="cardboard_carton_dataset"ifnotos.path.exists(DATASET_PATH):raiseFileNotFoundError(f"❌ 数据集路径 '{DATASET_PATH}' 不存在!")device='cuda'iftorch.cuda.is_available()else'cpu'print(f"🚀 使用设备:{device}")# -----------------------------# 2. 加载预训练模型# -----------------------------# 推荐 yolov8s(平衡速度与精度)# 若部署到边缘设备(如 Jetson),可用 yolov8nmodel=YOLO('yolov8s.pt')# -----------------------------# 3. 启动训练(针对纸箱堆叠优化)# -----------------------------results=model.train(data=os.path.join(DATASET_PATH,'data.yaml'),# ⏱️ 训练参数epochs=100,imgsz=1280,# 关键!提升密集小纸箱检出率batch=16,# 根据 GPU 调整(RTX 3060 可设 16~32)name='cardboard_yolov8s_1280',device=device,# 🎨 数据增强(仓库场景定制)hsv_h=0.015,# 色调扰动(应对不同纸箱颜色)hsv_s=0.7,# 饱和度hsv_v=0.5,# 亮度(应对仓库光照不均)degrees=10.0,# 旋转(模拟叉车视角)translate=0.2,scale=0.5,mosaic=1.0,# ✅ 必开!将小纸箱拼接到新背景,提升召回mixup=0.1,flipud=0.0,fliplr=0.5,# 🧠 训练策略patience=25,# 早停save_period=10,workers=8,cache=False# 若内存充足可设 True)print("✅ 训练完成!")print(f"📌 最佳模型路径: runs/detect/cardboard_yolov8s_1280/weights/best.pt")💡命令行替代方案:
yolo detect traindata=cardboard_carton_dataset/data.yamlmodel=yolov8s.ptepochs=100imgsz=1280batch=16
✅ 三、纸箱计数系统核心代码
保存为carton_counter.py:
# -*- coding: utf-8 -*-""" 纸箱堆叠计数系统 支持:单图 / 视频 / 摄像头 实时计数 输出:带计数结果的图像 + JSON 作者:AI助手 """importcv2importosfromultralyticsimportYOLOfromcollectionsimportdequeimporttimeclassCartonCounter:def__init__(self,model_path='best.pt',conf_thres=0.4):""" 初始化计数器 :param model_path: YOLOv8 模型路径 :param conf_thres: 置信度阈值 """self.model=YOLO(model_path)self.conf_thres=conf_thres self.font=cv2.FONT_HERSHEY_SIMPLEXdefcount_from_image(self,image_path,save_result=True):"""单图计数"""img=cv2.imread(image_path)results=self.model(img,conf=self.conf_thres)forrinresults:boxes=r.boxes count=len(boxes)# 每个检测框 = 1 个纸箱# 绘制检测框annotated_img=r.plot()# 添加计数文本cv2.putText(annotated_img,f'Cartons:{count}',(20,50),self.font,1.5,(0,255,0),3)ifsave_result:output_path=f"counted_{os.path.basename(image_path)}"cv2.imwrite(output_path,annotated_img)print(f"✅ 计数完成:{output_path}| 数量:{count}")returncount,annotated_imgreturn0,imgdefcount_from_video(self,video_path,output_path="counted_output.mp4"):"""视频流计数"""cap=cv2.VideoCapture(video_path)fps=int(cap.get(cv2.CAP_PROP_FPS))width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 视频写入器fourcc=cv2.VideoWriter_fourcc(*'mp4v')out=cv2.VideoWriter(output_path,fourcc,fps,(width,height))frame_count=0whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=self.model(frame,conf=self.conf_thres)forrinresults:count=len(r.boxes)annotated_frame=r.plot()cv2.putText(annotated_frame,f'Cartons:{count}',(20,50),self.font,1.5,(0,255,0),3)out.write(annotated_frame)ifframe_count%30==0:# 每秒打印一次print(f"🕒 视频帧{frame_count}: 纸箱数量 ={count}")frame_count+=1cap.release()out.release()print(f"✅ 视频处理完成:{output_path}")defcount_from_camera(self,camera_id=0):"""实时摄像头计数"""cap=cv2.VideoCapture(camera_id)print("📷 按 'q' 退出摄像头")whileTrue:ret,frame=cap.read()ifnotret:breakresults=self.model(frame,conf=self.conf_thres)forrinresults:count=len(r.boxes)annotated_frame=r.plot()cv2.putText(annotated_frame,f'Cartons:{count}',(20,50),self.font,1.5,(0,255,0),3)cv2.imshow('Carton Counter',annotated_frame)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()# -----------------------------# 使用示例# -----------------------------if__name__=="__main__":counter=CartonCounter(model_path='runs/detect/cardboard_yolov8s_1280/weights/best.pt')# 1. 单图计数count,img=counter.count_from_image("warehouse.jpg")# 2. 视频计数# counter.count_from_video("warehouse_video.mp4")# 3. 摄像头实时计数# counter.count_from_camera()✅ 四、高级功能扩展(可选)
1. 堆叠高度估算(基于 YOLOv8-seg 实例分割)
# 需先训练分割模型model_seg=YOLO('yolov8s-seg.pt')results=model_seg("image.jpg")forrinresults:masks=r.masks# 获取分割掩码ifmasksisnotNone:# 通过掩码垂直方向像素高度估算层数formaskinmasks.data:height_pixels=mask.sum(dim=2).max().item()estimated_layers=int(height_pixels/avg_carton_height)2. Web API 接口(FastAPI)
# api.pyfromfastapiimportFastAPI,File,UploadFilefromcarton_counterimportCartonCounterimportcv2importnumpyasnp app=FastAPI()counter=CartonCounter()@app.post("/count")asyncdefcount_cartons(file:UploadFile=File(...)):contents=awaitfile.read()nparr=np.frombuffer(contents,np.uint8)img=cv2.imdecode(nparr,cv2.IMREAD_COLOR)count,_=counter.count_from_image(None)# 修改 count_from_image 支持 numpy 输入return{"carton_count":int(count)}✅ 五、部署建议
| 场景 | 方案 |
|---|---|
| 仓库固定摄像头 | NVIDIA Jetson AGX Orin + TensorRT(yolov8s.engine) |
| 移动盘点终端 | Android App(ONNX Runtime + CameraX) |
| 云平台分析 | AWS/Azure 上部署 Docker 容器(含 FastAPI) |
| PLC 联动 | 通过 Modbus TCP 发送计数结果到产线控制系统 |