? ? ? ? 上一篇圓形表盤指針式儀表的項目受到很多人的關注,咱們一鼓作氣,把數字式工業儀表的智能讀數也研究一下。本篇主要講如何用YOLOV8實現數字式工業儀表的自動讀數,并將讀數結果進行輸出,若需要完整數據集和源代碼可以私信。
目錄
🍓🍓1.yolov8實現數字型儀表智能讀數?
🙋🙋2.數字儀表表盤目標檢測
🍋2.1準備數據
🍋2.2模型選擇
🍋2.3加載預訓練模型
🍋2.4數據組織?
🍉🍉3.目標檢測訓練代碼
🐸🐸4.目標檢測推理代碼
整理不易,歡迎一鍵三連!!!
送你們一條美麗的--分割線--
🍓🍓1.yolov8實現數字型儀表智能讀數?
????????首先介紹下數字型儀表的數據集如下所示,包含了各種數字型儀表:
???????
?????????最后實現的效果如下:
????????從原始數據輸入至最后輸出儀表讀數,共需要3步:
- 從原始影像中通過目標檢測識別出表盤的位置;
- 基于第一步的結果將表盤的位置切分出來,再進一步通過目標檢測識別表盤中的數字;
- 基于第二步的結果對表盤中的數字進行智能讀數。
???????
?????????此篇主要介紹第一步【從原始影像中通過目標檢測識別出表盤的位置】
🙋🙋2.數字儀表表盤目標檢測
????????通過目標檢測方法對數字儀表表盤進行目標識別的方法不限,本文仍以YOLOv8為例進行說明。
🍋2.1準備數據
????????訓練數據集共包含390張,驗證集140張,測試集139張。部分訓練數據如下圖所示。
????????label部分采用YOLO格式的txt文件,格式如下所示:
🍋2.2模型選擇
? ? ? ? 以YOLOv8n為例,模型選擇代碼如下:
model = YOLO('yolov8n.yaml') ?# build a new model from YAML
model = YOLO('yolov8n.pt') ?# load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt') ?# build from YAML and transfer weights
? ? ? ? 其中yolov8n.yaml為./ultralytics/cfg/models/v8/yolov8n.yaml,可根據自己的數據進行模型調整,打開yolov8n.yaml顯示內容如下:
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPss: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPsl: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 12- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 15 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 18 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]] # cat head P5- [-1, 3, C2f, [1024]] # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)
????????主要需要修改的地方為nc,也就是num_class,此處如果是自己的表盤識別數據,那就要換成自己的表盤類別,此處我的輸入影像中只有表盤這一個類別,所以nc=1。
????????如果其他的模型參數不變的話,就默認保持原版yolov8,需要改造模型結構的大佬請繞行。
🍋2.3加載預訓練模型
????????加載預訓練模型yolov8n.pt,可以在第一次運行時自動下載,如果受到下載速度限制,也可以自行下載好(下載鏈接),放在對應目錄下即可。
?
🍋2.4數據組織?
?????????yolov8還是以yolo格式的數據為例,./ultralytics/cfg/datasets/data.yaml的內容示例如下:
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images
test: # test images (optional)# Classes (80 COCO classes)
names:0: person1: bicycle2: car# ...77: teddy bear78: hair drier79: toothbrush
????????此處建議根據自己的數據集設置新建一個shuziyibiao_data.yaml文件,放在./ultralytics/cfg/datasets/目錄下,最后數據集設置就可以直接用自己的shuziyibiao_data.yaml文件了。以我的shuziyibiao_data.yaml文件為例:
path: /home/datasets/shuziyibiao_dataset # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images
test: images/test # test images (optional)names:0: biao
🍉🍉3.目標檢測訓練代碼
? ? ? ? 準備好數據和模型之后,就可以開始訓練了,train.py的內容顯示為:
from ultralytics import YOLO# Load a model
model = YOLO('yolov8n.yaml') ?# build a new model from YAML
model = YOLO('yolov8n.pt') ?# load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt') ?# build from YAML and transfer weights# Train the model
results = model.train(data='shuziyibiao_data.yaml', epochs=50, imgsz=640)
訓練完成后的結果如下:
????????其中weights文件夾內hi包含2個模型,一個best.pth,一個last.pth。
????????至此就可以使用best.pth進行推理預測表盤位置了。
在此貼上我的訓練結果:
?
🐸🐸4.目標檢測推理代碼
批量推理python代碼如下:
from ultralytics import YOLO
from PIL import Image
import cv2
import osmodel = YOLO('/yolov8/runs/detect/train4/weights/best.pt') # load a custom model
path = '/home/數字儀表/dataset/images/test/' #test_image_path_dir
img_list = os.listdir(path)
for img_path in img_list:
### =============detect=====================im1 = Image.open(os.path.join(path,img_path))results = model.predict(source=im1, save=True,save_txt=True)
?推理得到的可視化結果如下:
????????為了方便下一步的表盤中的數字識別任務,可以將框內的表盤提取并裁剪出來,方便后續使用。裁剪后的表盤如下所示。
【YOLOv8】 用YOLOv8實現數字式工業儀表智能讀數(二)
【YOLOv8】 用YOLOv8實現數字式工業儀表智能讀數(三)-CSDN博客
整理不易,歡迎一鍵三連!!!
送你們一條美麗的--分割線--
🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸????🍎🍎👍👍🌷🌷?