蓝莓成熟检测
1.新建文件夹之后用
#一模一样的结构命名 blueberry_82/ ├── images/ │ ├── train/ # 放 80% 的图片 │ └── val/ # 放 20% 的图片 └── labels/ ├── train/ # 放对应 80% 图片的 txt 标签 └── val/ # 放对应 20% 图片的 txt 标签2. 安装 LabelMe
#打开 PyCharm 终端,直接用 pip 安装: pip install labelme#安装完成后,输入下面的命令就能打开,打开界面 labelme如下图(左上角点点击“打开”,打开需要标签的图片文件)
3.标签具体步骤
- 先点左侧工具栏的「多边形」按钮。
- 直接在图片上,随便点一下,先画一个简单的形状(哪怕点一个点也行)。
- 画多边形:沿着它的边缘,用鼠标点一圈轮廓,双击闭合。
- 画完后,会自动弹出一个「输入标签」的对话框!这时候就能正常输入了。输入
immature,点 OK(表示未成熟);输入mature,点 OK(表示成熟)。 - 保存按
Ctrl + S,软件会自动在你的图片文件夹里,生成一个和图片同名的.json文件,比如你的图片是Camera 1(1)_1.bmp,保存后就会生成Camera 1(1)_1.json。所有图片打完标签后,搜索图片后缀.json,全选把.json文件另存用于后续标签生成。
如下图就是打过标签的图片,一定要记得按Ctrl + S,之后点击左上角的下一张就可以直接跳转到下一张图片
4.安装 YOLOv8(最好先获取Python 3.12解释器
#打开 PyCharm 底部的 Terminal(终端)先升级 python -m pip install --upgrade pip #再安装 ultralytics(YOLOv8 的官方库) pip install ultralytics #国内镜像下载yolov8n-seg https://mirror.ghproxy.com/https://github.com/ultralytics/ultralytics/releases/download/v8.2.0/yolov8n-seg.pt5.复制下面代码,生成YOLO能够识别的txt文件记得更改文件输入、输出路径
# ##生成txt标签文件######################### # import json # import os # import numpy as np # # def labelme_to_yolo(json_path, output_dir, class_map, img_dir): # """ # 将LabelMe的JSON文件转换为YOLO分割格式的TXT文件 # """ # # 读取JSON文件 # with open(json_path, 'r', encoding='utf-8') as f: # data = json.load(f) # # # 获取图片宽高 # img_w = data['imageWidth'] # img_h = data['imageHeight'] # # 生成输出文件名 # base_name = os.path.splitext(os.path.basename(json_path))[0] # output_path = os.path.join(output_dir, f"{base_name}.txt") # # # 写入YOLO格式 # with open(output_path, 'w', encoding='utf-8') as out_f: # for shape in data['shapes']: # # 获取类别ID # label = shape['label'] # if label not in class_map: # print(f"警告:发现未定义标签 '{label}',已跳过") # continue # class_id = class_map[label] # # # 归一化多边形坐标 # points = np.array(shape['points'], dtype=np.float32) # points[:, 0] /= img_w # points[:, 1] /= img_h # # # 拼接成一行字符串:class_id x1 y1 x2 y2 ... # points_str = " ".join([f"{x:.6f} {y:.6f}" for x, y in points]) # out_f.write(f"{class_id} {points_str}\n") # print(f"✅ 已转换:{base_name}.txt")6.在image同级文件下新建blueberry.yaml文件 注意修改文件后缀为.yaml记得修改数据集目录
# 数据集根目录 path: D:\BaiduNetdiskDownload\29222462\DB-1\DB-1 # 训练/验证集路径(相对于path) train: images val: images # 类别数量和名称 nc: 2 names: ['immature', 'mature']7.开始训练专属模型这是学习100次的代码最好查一下每个参数的意思 好针对你的电脑性能修改
#pycharm终端输入 yolo segment train data=blueberry.yaml model=yolov8n-seg.pt epochs=100 imgsz=640 device=0如下图,大面积的0代表有问题,请检查步骤1中创建的文件夹是否对,是否每个子文件夹都有文件
注意!运行完后显示训练好的模型,如图为E:\new perjectl\pythonProject3\runs\segment\train-4
8.实际蓝莓成熟识别注意输入输出文件的位置修改
from ultralytics import YOLO # 加载你训练好的模型 model = YOLO("runs/segment/train-5/weights/best.pt") # 批量处理你的蓝莓图片 results = model.predict( source=r"D:\BaiduNetdiskDownload\29222462\DB-3\Generated Images", save=True, conf=0.25, save_dir=r"D:\BaiduNetdiskDownload\29222462\DB-3\Images_results" # 改成你自己的路径 ) # 统计每一张图的成熟度 for i, result in enumerate(results): mature_count = sum(1 for box in result.boxes if int(box.cls[0]) == 1) immature_count = sum(1 for box in result.boxes if int(box.cls[0]) == 0) print(f"图片{i+1}: 成熟蓝莓{mature_count}颗, 未成熟蓝莓{immature_count}颗") device=cpu其中runs/segment/train-5/weights/best.pt 是你模型的位置,具体命名及查看方式步骤7及如下两种
跑完这部分代码就可以查看运行结果 至此完成了所有的蓝莓识别步骤
