疫病对养殖场来说是巨大威胁,一旦爆发会造成惨重损失。为防范疫病传播,他们严禁外来人员进入,将风险拒之门外。面对养殖场,尤其是生猪养殖场,养殖险承保验标人员,是无法进入养殖场的。因此也无法准确地验证养殖场到底有多少头生猪,骗保的问题也很难杜绝。目前已经有一些科技公司利用照片目标识别的方法,对摄像头、手机等拍摄的照片进行识别,确定生猪的数量。但对于很多初创公司或小的团队来说,训练模型的样本很难获得,在生猪目标识别上止步于前。
以前我也觉得基于养殖场的猪舍点数识别是受制于样本的,没有可靠的数据源,无法进行。这里我介绍一种方法,从样本采集、到样本标注、模型训练与验证,只需要1天时间。而且不需要额外的费用,而且只要有一台普通的笔记本,也不需要显卡就可以实现,小白也可以轻松上手。
一、样本采集
很多模型都已经很成熟了,但都受制于样本。由于采集样本十分困难。这里我选择直接从百度图片上爬取,相关代码,可以参考我之前的博文使用scrapy爬取指定内容相关的百度图片。因为我们的模型要识别各种来源的图片,百度图片来源广泛,涵盖了不同的网站、作者和拍摄者,因此能够反映出现实世界中各种场景和对象的多样性。这使得爬取的图片样本更具有代表性,能够较好地涵盖各种可能的情况,从而提高基于这些样本进行分析、训练或研究的准确性和可靠性。
很遗憾的是,即使在百度图片上,我更换了3个关键词,也是只爬虫了到600张左右的图片,其中还有重复的。从训练结果来看,效果已经达到预期了。
如果不会爬虫的话,可以直接下载我标注好的样本。
二、样本标注
样本标注的工具很多,如Labelme等,亲测稳定性并不好。因为这里我只有一个人,查阅相关资料后,发现现在有很多免费的AI标注软件,如T-Rex LAbel。全程使用这个软件标注,对AI标注的结果进行修改,可以极大的节省时间。标注完成也支持导出yolo和colo格式。

三、模型选择
这里我选择了YOLO模型。YOLO模型(You Only Look Once)是一种用于目标检测的深度学习模型,由Joseph Redmon等人在2015年首次提出。
YOLO模型的核心思想是将目标检测问题转化为回归问题,通过单次前向传播同时预测多个边界框和类别概率。其网络结构主要包括输入层、卷积层、下采样层和检测头。YOLO通常接受固定大小的输入图像,并通过一系列卷积层提取图像特征。检测头用于生成最终的检测结果,YOLOv3及之后的版本引入了多尺度检测机制,以提高对不同大小目标的检测能力。
YOLO模型的优点包括速度快、准确率高、可解释性强和适用性广。由于其快速和准确的特性,YOLO在众多领域得到了广泛应用,如实时视频监控、自动驾驶汽车中的障碍物检测、无人机导航和体育赛事分析等。此外,YOLO也逐渐应用于图像分割和姿态估计任务,提供物体精确的轮廓信息和识别人体姿态和动作。
YOLO模型经历了多个版本的迭代,从最初的YOLOv1到最新的YOLOv8,这里我使用的是v8n。
四、模型训练
- 样本处理
将样本分为两部分,1部分训练用,1部分验证使用,这里我分别以yolo格式保存在train和val文件夹下。
- 配置文件准备
根目录下,创建daya.yaml文件
train: D:/pythonproject/dealImage/dealImage/train/dataset # 训练集图像路径
val: D:/pythonproject/dealImage/dealImage/val/dataset # 验证集图像路径
test: # 测试集图像路径
nc: 1 # 类别数量
names: ['pig'] # 类别名称从https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/models/v8/yolov8.yaml下载最新的模型参数文件,保存到根目录下,将nc改为自己标注的分类数量。
- 训练代码
pip install ultralyticsfrom ultralytics import YOLO
if __name__ == '__main__':
# 初始训练
print("开始训练")
model = YOLO("yolov8.yaml").load("yolov8n.pt")# 加载预训练模型,如果本地没有会自动下载
print("下载完成")
results = model.train(data="data.yaml", epochs=100, imgsz=640,device='cpu')
print("训练完成")这里是训练100批次,固定图片大小为640,由于电脑没有gpu,使用了cpu。训练完成后,会在当前项目目录下生成runs文件夹,runs里即为训练结果。
runs/detect/train/weights/best.pt为最好的权重结果,runs/detect/train/weights/last.pt为最后的训练结果。
注意,第一次执行时,代码会自动下载yolov8n.pt预训练模型,启动会比较慢。
五、模型验证
验证代码
from ultralytics import YOLO
import cv2
if __name__ == '__main__':
# 加载训练好的模型
model = YOLO('runs/detect/train/weights/best.pt') # 根据实际情况修改路径
# 对单张图像进行目标识别
results = model('点数识别2.jpg')
# 显示识别结果
for r in results:
im_array = r.plot() # 绘制识别结果到图像上
# 弹窗展示识别结果
cv2.imshow('YOLOv8 Inference', im_array)
cv2.waitKey(0)
cv2.destroyAllWindows()
# # 保存图像
# print(len(r.boxes))
# print(im_array[0])
# output_image_path = '点数识别2output_image.jpg' # 保存的图像路径
# cv2.imwrite(output_image_path, im_array)
# print(f"识别结果已保存到 {output_image_path}")验证效果

















