我以我的一个项目进行介绍,各位如果想运行这些程序的话,可以跳转到相应的百度的页面,我放到底下啦。智慧农业——(油茶视界团队)油茶成熟度检测(原创) - 飞桨AI Studio (baidu.com)
油茶果由于是花果同期,在采摘时费时费力,并且由于误判,极其容易把未成熟的果子摘下,从而影响整体品质,基于此,利用计算机视觉采摘油茶果成为必然,所以本项目通过yolov3构造了一个油茶果成熟度检测模型。
0.绪论:什么是油茶?
油茶(Camellia oleifera) 山茶科山茶属油用物种的总称,是我国特有的木本油料树种,与油棕、油橄榄和椰子并称为世界四大木本食用油料植物。 “油茶”有两千余年的栽种历史,不饱和脂肪酸可达90%以上可抑制和预防心脑血管疾病。
我欲利用计算机视觉技术进行油茶果的相关操作,计算机视觉系统是一种通过计算机视觉代替人工目测的一种设备,将图像信号传递给图像处理系统对其进行分析,具有检测结果准确、检测效率高的特点。深度学习作为机器学习的重要分支,因在数据处理方面呈现出了显著的优势而飞速发展。它通过对相关模型进行预训练,自动提取并不断优化特征,可在短时间内集中、快速地处理大量数据,拥有更好的性能和更高的精度。因此,深度学习越来越受到遥感监测、农作物病害识别、物体识别、场景分割等各个领域的研究学者关注,尤其是一些研究者通过深度学习技术分析物体的RGB图像和特征成功实现对场景中农作物等的识别,并取得一系列重要研究进展。本研究将致力于将计算机视觉与深度学习神经网络相结合,并运用于油茶果的识别与成熟度监测系统上。通过该系统对油茶果进行评估并将分析结果及时反馈给相关负责人员,达到及时采摘、提高茶油果整体的出油率的目的。
基于此,为提高效率,我本人欲利用计算机视觉来识别油茶果以便后期的智能农机的高效采摘;油茶的种植和消费具有广阔前景,也是乡村振兴的支柱产业。而目前市面上对于油茶只仅仅停留于理论阶段,故本人提出——基于计算机视觉的油茶果的识别、计数及成熟度监测,聚焦于利用新科技推动整个油茶产业的发展。
本人利用yolox进行本次成熟度检测
1.安装PaddleX
!pip install "paddlex<=1.3.11" -i https://mirror.baidu.com/pypi/simple
友情提示:注:亲!如果版本不匹配,可以进行运行下一行代码,先不用运行此代码,后面运行不起在运行此代码。
# !pip install "paddlepaddle<=1.8.4"
2.解压缩油茶数据集
这里直接解压缩数据集中的油茶儿即可
亲!底下带有解压代码,在终端运行即可。
# unzip -oq /home/aistudio/data/data180722/dataset.zip 如下图
3.数据准备(这是原创数据集)
数据集中包含了已经标注好的数据。该项目采用目标检测的标注方式,在数据集中提供了VOC数据集格式。
下载后的数据集文件夹无需更改文件名,直接用即可
dataset/ ├── Annotations/ ├── JPEGImages/
数据集分类情况:
mature
,immature
.
- 数据切分 将训练集和验证集按照10:1的比例划分。 PaddleX中提供了简单易用的API,方便用户直接使用进行数据划分。
paddlex --split_dataset --format VOC --dataset_dir dataset --val_value 0.1
dataset/ dataset/ ├── Annotations/ --> ├── Annotations/ ├── JPEGImages/ ├── JPEGImages/ ├── labels.txt ├── train_list.txt ├── val_list.txt
4.模型训练
4.1配置GPU
# 设置使用0号GPU卡(如无GPU,执行此代码后仍然会使用CPU训练模型)
import matplotlib
matplotlib.use('Agg')
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import paddlex as pdx
4.2 定义图像处理流程transforms
定义数据处理流程,其中训练和测试需分别定义,训练过程包括了部分测试过程中不需要的数据增强操作,如在本示例中,训练过程使用了
MixupImage
、RandomDistort
、RandomExpand
、RandomCrop
和RandomHorizontalFlip
共5种数据增强方式。
from paddlex.det import transforms
train_transforms = transforms.Compose([
transforms.MixupImage(mixup_epoch=250),
transforms.RandomDistort(),
transforms.RandomExpand(),
transforms.RandomCrop(),
transforms.Resize(target_size=608, interp='RANDOM'),
transforms.RandomHorizontalFlip(),
transforms.Normalize(),
])
eval_transforms = transforms.Compose([
transforms.Resize(target_size=608, interp='CUBIC'),
transforms.Normalize(),
])
4.3 定义数据集Dataset
目标检测可使用
VOCDetection
格式和COCODetection
两种数据集,此处由于数据集为VOC格式,因此采用pdx.datasets.VOCDetection
来加载数据集,该接口的介绍可参见文档paddlex.datasets.VOCDetection。
train_dataset = pdx.datasets.VOCDetection(
data_dir='dataset',
file_list='dataset/train_list.txt',
label_list='dataset/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
data_dir='dataset',
file_list='dataset/val_list.txt',
label_list='dataset/labels.txt',
transforms=eval_transforms)
4.4 模型开始训练(亲!600epoch大约10个小时即可)、
num_classes = len(train_dataset.labels)
model = pdx.det.YOLOv3(num_classes=num_classes, backbone='DarkNet53')
model.train(
num_epochs=600,
train_dataset=train_dataset,
train_batch_size=4,
eval_dataset=eval_dataset,
learning_rate=0.000125,
lr_decay_epochs=[210, 240],
save_interval_epochs=20,
save_dir='output1/yolov3_darknet53',
use_vdl=True)
5 模型预测
使用模型进行预测,同时使用
pdx.det.visualize
将结果可视化,可视化结果将保存到./output/yolov3_mobilenetv1
下,其中threshold
代表Box的置信度阈值,将Box置信度低于该阈值的框过滤不进行可视化。
此处请在AIStudio Notebook页面的右上角菜单,选择重启执行器,以释放显存,重新加载训练好的模型
import paddlex as pdx
model = pdx.load_model('output1/yolov3_darknet53/best_model')
image_name = 'dataset/JPEGImages/IMG835.jpg'
result = model.predict(image_name)
pdx.det.visualize(image_name, result, threshold=0.3, save_dir='./output1/yolov3_darknet53')
6.总结:
效果还是很好滴!,后续我们团队会用语义分割进行成熟度的检测!