2026/2/16 20:07:42
网站建设
项目流程
建设一个网站 最好是官网那种,网站建设vipjiuselu,莱芜雪野湖风景区门票多少钱,百度怎么制作网页基于yolov8posecrnn的水表刻度识别
数据集包含1类别
收集数据共1500张
如何训练自己的yolo格式数据集ppocr识别格式数据集及如何训练自己的模型以及onnx的工作流推理代码文章代码仅供参考#xff1a;构建一个基于 YOLOv8Pose 和 CRNN 的水表刻度识别系统。以下是详细的步骤crnn的水表刻度识别数据集包含1类别收集数据共1500张如何训练自己的yolo格式数据集ppocr识别格式数据集及如何训练自己的模型以及onnx的工作流推理代码文章代码仅供参考构建一个基于 YOLOv8Pose 和 CRNN 的水表刻度识别系统。以下是详细的步骤数据准备确保数据集格式正确。环境部署安装必要的库。模型训练使用 YOLOv8Pose 进行人脸关键点检测模拟水表指针位置。使用 CRNN 进行数字识别。推理工作流将 YOLOv8Pose 和 CRNN 结合起来进行端到端的水表刻度识别。可视化和验证展示训练过程中的各项指标并验证最终结果。数据集结构假设你的数据集已经准备好并且是以 YOLO 格式存储的。以下是数据集的标准结构dataset/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ │ └── ... │ └── val/ │ ├── image3.jpg │ ├── image4.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── image1.txt │ │ ├── image2.txt │ │ └── ... │ └── val/ │ ├── image3.txt │ ├── image4.txt │ └── ... └── dataset.yamldataset.yaml内容如下train:./images/trainval:./images/valnc:1names:[water_meter]每个图像对应的标签文件是一个文本文件每行表示一个边界框和关键点格式为class_id x_center y_center width height keypoint_x1 keypoint_y1 visibility1 ... keypoint_xN keypoint_yN visibilityN环境部署说明首先确保你已经安装了必要的库。以下是详细的环境部署步骤安装依赖# 创建虚拟环境可选conda create -n water_meter_envpython3.9conda activate water_meter_env# 安装PyTorchpipinstalltorch1.9torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu111# 安装其他依赖pipinstallopencv-python pyqt5 ultralytics scikit-learn pandas matplotlib seaborn onnxruntime模型训练权重和指标可视化展示我们将使用 YOLOv8Pose 进行人脸关键点检测模拟水表指针位置并使用 CRNN 进行数字识别。训练 YOLOv8Pose[titleTraining YOLOv8Pose for Water Meter Pointer Detection]fromultralyticsimportYOLOimportos# Define pathsdataset_pathpath/to/datasetweights_pathruns/train/exp/weights/best.pt# Create dataset.yamlyaml_contentf train:{os.path.join(dataset_path,images/train)}val:{os.path.join(dataset_path,images/val)}nc: 1 names: [water_meter] withopen(os.path.join(dataset_path,dataset.yaml),w)asf:f.write(yaml_content)# Train YOLOv8PosemodelYOLO(yolov8n-pose.pt)# Load a pretrained pose model (recommended for training)resultsmodel.train(dataos.path.join(dataset_path,dataset.yaml),epochs100,imgsz640,saveTrue)# Save the best weightsbest_weights_pathos.path.join(runs,train,exp,weights,best.pt)shutil.copy(best_weights_path,weights_path)请将path/to/dataset替换为实际的数据集路径。训练 CRNN我们将使用 PyTorch 来训练 CRNN 模型进行数字识别。数据预处理[titleData Preprocessing for CRNN]importosimportcv2importnumpyasnpfromtorch.utils.dataimportDataset,DataLoaderfromtorchvisionimporttransformsfromPILimportImageclassWaterMeterDataset(Dataset):def__init__(self,root_dir,transformNone):self.root_dirroot_dir self.transformtransform self.image_files[fforfinos.listdir(root_dir)iff.endswith(.jpg)]def__len__(self):returnlen(self.image_files)def__getitem__(self,idx):img_nameos.path.join(self.root_dir,self.image_files[idx])imageImage.open(img_name).convert(L)label_fileos.path.splitext(img_name)[0].txtwithopen(label_file,r)asf:labelf.readline().strip()ifself.transform:imageself.transform(image)returnimage,label transformtransforms.Compose([transforms.Resize((32,100)),transforms.ToTensor(),])train_datasetWaterMeterDataset(root_dirpath/to/images/train,transformtransform)train_loaderDataLoader(train_dataset,batch_size32,shuffleTrue)val_datasetWaterMeterDataset(root_dirpath/to/images/val,transformtransform)val_loaderDataLoader(val_dataset,batch_size32,shuffleFalse)CRNN 模型定义[titleCRNN Model Definition]importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassCRNN(nn.Module):def__init__(self,num_classes):super(CRNN,self).__init__()self.conv1nn.Conv2d(1,64,kernel_size3,stride1,padding1)self.pool1nn.MaxPool2d(kernel_size2,stride2,padding0)self.conv2nn.Conv2d(64,128,kernel_size3,stride1,padding1)self.pool2nn.MaxPool2d(kernel_size2,stride2,padding0)self.rnnnn.LSTM(128*7,256,bidirectionalTrue,batch_firstTrue)self.fcnn.Linear(256*2,num_classes)defforward(self,x):xself.pool1(F.relu(self.conv1(x)))xself.pool2(F.relu(self.conv2(x)))xx.view(x.size(0),x.size(1)*x.size(2),x.size(3)).permute(0,2,1)x,_self.rnn(x)xself.fc(torch.cat((x[:,-1,:128],x[:,0,128:]),dim1))returnx num_classes10# Assuming digits 0-9model_crnnCRNN(num_classes)训练 CRNN[titleTraining CRNN Model]importtorch.optimasoptim criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model_crnn.parameters(),lr0.001)devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)model_crnn.to(device)num_epochs100forepochinrange(num_epochs):model_crnn.train()running_loss0.0forimages,labelsintrain_loader:images,labelsimages.to(device),labels.to(device)optimizer.zero_grad()outputsmodel_crnn(images)losscriterion(outputs,labels)loss.backward()optimizer.step()running_lossloss.item()print(fEpoch [{epoch1}/{num_epochs}], Loss:{running_loss/len(train_loader):.4f})# Validationmodel_crnn.eval()correct0total0withtorch.no_grad():forimages,labelsinval_loader:images,labelsimages.to(device),labels.to(device)outputsmodel_crnn(images)_,predictedtorch.max(outputs.data,1)totallabels.size(0)correct(predictedlabels).sum().item()print(fValidation Accuracy:{100*correct/total:.2f}%)推理工作流将编写代码来结合 YOLOv8Pose 和 CRNN 进行端到端的水表刻度识别。推理脚本inference.py[titleInference Script for Water Meter Reading]importcv2importnumpyasnpimporttorchimportonnxruntimeasortfromultralyticsimportYOLOfromtorch.autogradimportVariable# Load YOLOv8Pose modelyolo_modelYOLO(runs/train/exp/weights/best.pt)# Load CRNN ONNX modelort_sessionort.InferenceSession(crnn.onnx)defpreprocess_image(image,target_size(32,100)):imagecv2.resize(image,target_size)imagecv2.cvtColor(image,cv2.COLOR_BGR2GRAY)imageimage.astype(np.float32)/255.0imagenp.expand_dims(image,axis0)imagenp.expand_dims(image,axis0)returnimagedefinfer_crnn(image):input_tensorpreprocess_image(image)ort_inputs{ort_session.get_inputs()[0].name:input_tensor}ort_outsort_session.run(None,ort_inputs)outputort_outs[0]_,predictedtorch.max(torch.tensor(output),1)returnpredicted.item()defread_water_meter(image_path):imagecv2.imread(image_path)resultsyolo_model(image)forresultinresults:boxesresult.boxes.cpu().numpy()keypointsresult.keypoints.cpu().numpy()forbox,keypointinzip(boxes,keypoints):rbox.xyxy[0].astype(int)clsint(box.cls[0])confbox.conf[0]ifcls0:# Assuming class 0 is water meterpointer_x,pointer_ykeypoint[0][:2]pointer_x,pointer_yint(pointer_x),int(pointer_y)# Extract region around the pointerroiimage[r[1]:r[3],r[0]:r[2]]# Infer digit using CRNNdigitinfer_crnn(roi)print(fDigit:{digit})# Example usageread_water_meter(path/to/test/image.jpg)可视化和验证我们将编写代码来可视化训练过程中的各项指标并验证最终结果。可视化脚本visualize_metrics.py[titleVisualizing Training Metrics for YOLOv8Pose and CRNN]importosimportjsonimportmatplotlib.pyplotaspltimportnumpyasnpfromsklearn.metricsimportconfusion_matrix,ConfusionMatrixDisplay# Load metrics for YOLOv8Poseresults_dirruns/train/expmetrics_pathos.path.join(results_dir,results.json)withopen(metrics_path,r)asf:resultsjson.load(f)# Extract metricsloss[entry[loss]forentryinresultsiflossinentry]precision[entry[metrics/precision(m)]forentryinresultsifmetrics/precision(m)inentry]recall[entry[metrics/recall(m)]forentryinresultsifmetrics/recall(m)inentry]mAP_05[entry[metrics/mAP50(m)]forentryinresultsifmetrics/mAP50(m)inentry]# Plot loss curveplt.figure(figsize(15,5))plt.subplot(1,3,1)plt.plot(loss,labelLoss)plt.xlabel(Epochs)plt.ylabel(Loss)plt.title(YOLOv8Pose Training Loss Curve)plt.legend()# Plot precision and recall curvesplt.subplot(1,3,2)plt.plot(precision,labelPrecision)plt.plot(recall,labelRecall)plt.xlabel(Epochs)plt.ylabel(Score)plt.title(YOLOv8Pose Precision and Recall Curves)plt.legend()# Plot mAP0.5 curveplt.subplot(1,3,3)plt.plot(mAP_05,labelmAP0.5)plt.xlabel(Epochs)plt.ylabel(mAP0.5)plt.title(YOLOv8Pose mAP0.5 Curve)plt.legend()plt.tight_layout()plt.show()# Confusion matrix for YOLOv8Pose# Assuming you have predictions and true labels# For demonstration, lets create some dummy datanum_classes1true_labelsnp.random.randint(0,num_classes,size100)# Random true labelspredictionsnp.random.randint(0,num_classes,size100)# Random predicted labelscmconfusion_matrix(true_labels,predictions,labelslist(range(num_classes)))labels[water_meter]dispConfusionMatrixDisplay(confusion_matrixcm,display_labelslabels)disp.plot(cmapplt.cm.Blues)plt.title(YOLOv8Pose Confusion Matrix)plt.xticks(rotation90)plt.yticks(rotation0)plt.tight_layout()plt.show()# Visualization for CRNN# Assuming you have saved validation accuracy during trainingvalidation_accuracy[85,87,88,89,90,91,92,93,94,95]# Dummy dataplt.figure(figsize(10,5))plt.plot(validation_accuracy,labelValidation Accuracy)plt.xlabel(Epochs)plt.ylabel(Accuracy (%))plt.title(CRNN Validation Accuracy Curve)plt.legend()plt.tight_layout()plt.show()总结构建一个完整的基于 YOLOv8Pose 和 CRNN 的水表刻度识别系统包括数据集准备、环境部署、模型训练、指标可视化展示和推理工作流。以下是所有相关的代码文件训练 YOLOv8Pose 脚本(train_yolov8pose.py)数据预处理脚本(data_preprocessing.py)CRNN 模型定义(crnn_model.py)训练 CRNN 脚本(train_crnn.py)推理脚本(inference.py)可视化脚本(visualize_metrics.py)