网站首页 > 技术文章 正文
在一篇文中,讲到对水表盘的读数进行语义分割后的数据处理和文字识别。可以参看:73.Python——语义分割后期处理:水表读数。本文主要是对水表盘的读数进行语义分割。
数据集:150张水表图片:
一、标签标注
使用labelme工具,标注过程是枯燥、机械、无聊的,把水表盘数字的区域框选出来。
二、数据格式转换和划分数据集
LabelMe标注后的数据还需要进行转换为SEG格式,才可以用于语义分割任务的训练。
paddlex --data_conversion --source labelme --to SEG --pics jpegimages --annotations annotations --save_dir meter-water-seg
生成一个label.txt文件,内容
_background_
number
划分数据集:
>paddlex --split_dataset --format SEG --dataset_dir meter-water-seg --val_value 0.2 --test_value 0.1
三、准备好数据后,开启训练,并把训练模型转出部署模型,用于后面的分割预测
这先使用的是fastscnn网络模型。训练代码:
import paddlex as pdx
from paddlex import transforms as T
#数据集格式转换
#数据集划分
#paddlex --data_conversion --source labelme --to SEG --pics holder\JPEGImages --annotations holder\Annotations --save_dir holder-seg
#paddlex --split_dataset --format SEG --dataset_dir holder-seg --val_value 0.2 --test_value 0.1
# 输出推理模型
# paddlex -export_inference --model_dir best_model --save_dir inference
# 定义训练和验证时的transforms
train_transforms = T.Compose([
T.Resize(target_size=512),
T.RandomHorizontalFlip(),
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
eval_transforms = T.Compose([
T.Resize(target_size=512),
T.Normalize(
mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),
])
# 定义训练和验证所用的数据集
train_dataset = pdx.datasets.SegDataset(
data_dir='meter-water-seg',
file_list='meter-water-seg/train_list.txt',
label_list='meter-water-seg/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.SegDataset(
data_dir='meter-water-seg',
file_list='meter-water-seg/val_list.txt',
label_list='meter-water-seg/labels.txt',
transforms=eval_transforms,
shuffle=False)
# 初始化模型,并进行训练
num_classes = len(train_dataset.labels)
model = pdx.seg.FastSCNN(num_classes=num_classes)
model.train(
num_epochs=10,
train_dataset=train_dataset,
train_batch_size=4,
eval_dataset=eval_dataset,
learning_rate=0.05,
save_dir='output/fastscnn-water-meter-seg')
#训练最后一轮评估
[INFO] Start to evaluate(total_samples=30, total_steps=30)...
[INFO] [EVAL] Finished, Epoch=10, miou=0.926228, category_iou=[0.9961706 0.8562857]
, oacc=0.996256, category_acc=[0.99774253 0.93541026], kappa=0.920662, category_F1-score=[0.99808163 0.92257
966] .
输出部署模型
paddlex --export_inference --model_dir best_model --save_dir infer
四、语义分割模型预测
import paddlex as pdx
import cv2
import os
import numpy as np
#os.environ["CUDA_VISBLE_DEVICES"]="0,1"
predictor=pdx.deploy.Predictor("output/fastscnn-water-meter-seg/inference_model",use_gpu=True)
image_name="meter-water-seg/JPEGImages/train_136.jpg"
img=cv2.imread(image_name)
result=predictor.predict(img)
lblmap=result["label_map"]
#返回label_map的轮廓多边形顶点坐标
def get_contours(lblmap):
lblmap=lblmap.astype(np.uint8)
contours,hir=cv2.findContours(lblmap,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
epoll=0.01*cv2.arcLength(contours[0], True)
ap=cv2.approxPolyDP(contours[0], epoll, True)
return ap
#画多边形
cv2.polylines(img,[get_contours(lblmap)],True,(0,0,255),4)
cv2.imshow("result",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
猜你喜欢
- 2024-10-12 智能监测:皮带输送系统堵料问题的解决方案
- 2024-10-12 Python-OpenCV 10. 图像边缘算法 opencv边缘识别
- 2024-10-12 Net AI学习笔记系列第五章 net教程
- 2024-10-12 深度学习和神经网络——图像读取和显示
- 2024-10-12 十三句Python搞定找茬游戏 找茬游戏规则
- 2024-10-12 「深度学习」手把手教你用PythonOpenCV物体识别-识别水果
- 2024-10-12 python代码实现OpenCV 轮廓近似原理
- 2024-10-12 OpenCV找出图片中的圆并标注圆心 opencv检测圆代码
- 2024-10-12 分享3个干货满满的Python实战项目,点赞收藏
- 2024-10-12 OpenCV(28)——凸包 opencv轮廓凹凸
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)