智慧农业辣椒品种检测数据集 4500张 辣椒检测 voc yolo标注 3类别
(图像数量与边界框数量):
| 类别名称(Class) | 图像数量(Images) | 边界框数量(Bounding Boxes) |
|---|---|---|
| Green Chilli(青椒) | 2,319 | 8,266 |
| Pickled Pepper(泡椒) | 1,275 | 1,714 |
| Red Chili(红辣椒) | 1,222 | 6,975 |
| 总计(Total) | 4,816 | 16,955 |
📌说明:
- 数据集中共包含3 个类别,适用于目标检测任务(如 YOLO、Faster R-CNN 等)。
- 总图像数为4,816 张(非 4,500 张),可能包含部分重复或未计入统计的样本;若需严格限定为 4,500 张,建议核查原始数据。
- 标注格式支持VOC(XML)和 YOLO(TXT)两种常用格式,便于模型训练与迁移。
- “Pickled Pepper” 类别平均每个图像仅含约1.34 个目标,适合单目标或稀疏场景检测;而“Green Chilli”和“Red Chili”平均每图分别含3.56和5.71个目标,适用于密集小目标检测任务。
🌶️ 基于 YOLOv8 的辣椒品种检测系统(完整实现)
✅目标:构建一个能识别青椒(Green Chilli)、泡椒(Pickled Pepper)、红辣椒(Red Chili)的深度学习检测系统
✅框架:Ultralytics YOLOv8(PyTorch)
✅输出:训练代码、推理代码、数据集配置、部署脚本、可视化结果
✅格式支持:YOLO 格式标注(.txt),兼容 VOC 转换
📁 一、项目结构
chili_detection_yolov8/ ├── datasets/ │ └── chili/ │ ├── images/ │ │ ├── train/ # 训练图像 │ │ ├── val/ # 验证图像 │ │ └── test/ # 测试图像 │ └── labels/ │ ├── train/ # YOLO格式标签(.txt) │ ├── val/ │ └── test/ ├── data.yaml # 数据集配置文件 ├── train.py # 训练脚本 ├── detect.py # 推理脚本(图片/视频/摄像头) ├── export_model.py # 导出ONNX/TensorRT模型 ├── utils/ │ └── voc2yolo.py # (可选)VOC转YOLO工具 └── README.md🔧 二、环境准备
# 创建虚拟环境(推荐)conda create -n yolov8_chilipython=3.9-y conda activate yolov8_chili# 安装依赖pipinstallultralytics opencv-python numpy matplotlib pandas tqdm✅
ultralytics是官方 YOLOv8 库,自动安装 PyTorch。
🗃️ 三、准备数据集(YOLO 格式)
1. 目录结构要求
datasets/chili/ ├── images/train/ → 所有 .jpg / .png 图像 ├── labels/train/ → 对应的 .txt 标签文件 ├── images/val/ ├── labels/val/ └── ...2. YOLO 标签格式(每行一个目标)
<class_id> <x_center> <y_center> <width> <height>class_id: 0=Green Chilli, 1=Pickled Pepper, 2=Red Chili- 所有坐标归一化到 [0, 1]
💡 示例:
labels/train/img_001.txt
0 0.45 0.62 0.2 0.3 2 0.78 0.55 0.15 0.253. (可选)VOC 转 YOLO 工具
# utils/voc2yolo.pyimportosimportxml.etree.ElementTreeasET# 类别映射classes=["Green Chilli","Pickled Pepper","Red Chili"]class_to_id={cls:ifori,clsinenumerate(classes)}defconvert_bbox(size,box):dw=1.0/size[0]dh=1.0/size[1]x=(box[0]+box[1])/2.0y=(box[2]+box[3])/2.0w=box[1]-box[0]h=box[3]-box[2]x*=dw w*=dw y*=dh h*=dhreturn(x,y,w,h)defconvert_annotation(xml_path,txt_path):tree=ET.parse(xml_path)root=tree.getroot()size=root.find('size')w=int(size.find('width').text)h=int(size.find('height').text)withopen(txt_path,'w')asf:forobjinroot.iter('object'):cls=obj.find('name').textifclsnotinclass_to_id:continuecls_id=class_to_id[cls]xmlbox=obj.find('bndbox')b=(float(xmlbox.find('xmin').text),float(xmlbox.find('xmax').text),float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb=convert_bbox((w,h),b)f.write(f"{cls_id}{' '.join(map(str,bb))}\n")# 批量转换voc_dir="path/to/VOC/Annotations"yolo_dir="datasets/chili/labels/train"image_dir="datasets/chili/images/train"forxml_fileinos.listdir(voc_dir):ifxml_file.endswith('.xml'):xml_path=os.path.join(voc_dir,xml_file)txt_path=os.path.join(yolo_dir,xml_file.replace('.xml','.txt'))convert_annotation(xml_path,txt_path)📄 四、创建data.yaml
# data.yamlpath:./datasets/chilitrain:images/trainval:images/valtest:images/testnc:3names:['Green Chilli','Pickled Pepper','Red Chili']✅ 确保路径正确,
nc为类别数,names顺序必须与标签中的 class_id 一致。
🚀 五、训练模型(train.py)
# train.pyfromultralyticsimportYOLO# 加载预训练模型(YOLOv8n, YOLOv8s, YOLOv8m 可选)model=YOLO('yolov8n.pt')# nano 版本,速度快;可用 'yolov8s.pt' 提升精度# 开始训练results=model.train(data='data.yaml',epochs=100,imgsz=640,batch=16,name='chili_yolov8n',device=0,# 使用 GPU 0;设为 'cpu' 则用 CPUpatience=15,# 早停:15轮无提升则停止save=True,plots=True# 保存训练曲线)print("✅ 训练完成!权重保存在 runs/detect/chili_yolov8n/weights/best.pt")⏱️训练时间参考(RTX 3060):
- YOLOv8n:~1小时(100 epochs)
- YOLOv8s:~2.5小时
🔍 六、推理检测(detect.py)
# detect.pyfromultralyticsimportYOLOimportcv2importos# 加载训练好的模型model=YOLO('runs/detect/chili_yolov8n/weights/best.pt')# 1. 检测单张图片defdetect_image(image_path,output_path="output.jpg"):results=model(image_path)annotated_img=results[0].plot()# 自动绘制检测框和标签cv2.imwrite(output_path,annotated_img)print(f"✅ 结果已保存至{output_path}")# 2. 检测视频defdetect_video(video_path,output_path="output.mp4"):cap=cv2.VideoCapture(video_path)fourcc=cv2.VideoWriter_fourcc(*'mp4v')fps=cap.get(cv2.CAP_PROP_FPS)width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))out=cv2.VideoWriter(output_path,fourcc,fps,(width,height))whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=model(frame)annotated_frame=results[0].plot()out.write(annotated_frame)cap.release()out.release()print(f"✅ 视频检测完成:{output_path}")# 3. 实时摄像头检测defdetect_webcam():cap=cv2.VideoCapture(0)whileTrue:ret,frame=cap.read()ifnotret:breakresults=model(frame)annotated_frame=results[0].plot()cv2.imshow('Chili Detection',annotated_frame)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()# 使用示例if__name__=="__main__":# detect_image("test.jpg")# detect_video("input.mp4")detect_webcam()📊 七、评估模型性能
训练完成后,YOLOv8 自动生成以下指标:
mAP50: ~0.90+(预期)mAP50-95: ~0.70+- 精确率(Precision)、召回率(Recall)曲线
可在runs/detect/chili_yolov8n/查看:
confusion_matrix.pngresults.pngval_batch0_pred.jpg(预测样例)
📦 八、导出模型(部署用)
# export_model.pyfromultralyticsimportYOLO model=YOLO('runs/detect/chili_yolov8n/weights/best.pt')model.export(format='onnx')# 导出 ONNXmodel.export(format='engine')# 导出 TensorRT(需 CUDA)✅ 导出后可用于 OpenCV DNN、TensorRT、ONNX Runtime 等部署环境。
以上文字及代码仅供参考学习使用。