Yolov5实现视频中的指针式仪表读数 [python]

这篇具有很好参考价值的文章主要介绍了Yolov5实现视频中的指针式仪表读数 [python]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Yolov5实现视频中的指针式仪表读数 [python]

背景:根据巡航机器人拍摄的视频,读出其中两个电流表和两个电压表的度数。

Yolov5

Yolov5的star数高达37.5k,是Yolo系列最为经典的版本。本项目在Yolov5 v5.0的基础上进行修改,来实现指针式仪表的读数功能。

prepare

数据集:对机器人拍摄的视频进行抽帧标注。
标注工具:labelImg
预训练权重:yolov5s.pt
环境:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

指针式仪表

整体思路

注:(train过程省略)

  1. 通过sftp协议从服务器下载机器人拍摄的视频;
  2. 当同时检测到四个表时才进行保存;
  3. 表的位置确定:通过重新排列label标签标注表的位置(0、1、2、3);
  4. 找到检测过程中最清晰的四张表:通过分别计算各个表的Laplacian,得到最清晰的表图像;
  5. 在检测完毕时,将最清晰的四张表存放在clock文件夹中;
  6. 利用OpenCV中的Canny算子进行图像的边缘检测,识别指针和零刻度线,计算角度得出度数。
  7. 通过接口发送到服务器。
1. 从远程服务器下载视频

getVideo:

import paramiko
import os
# 从服务器获取视频
HOST_IP = '10.16.42.172'  # 服务器地址
PORT = 8989  // 端口
REMOTE_PATH = '/home/eini/SG/water'  # 视频在服务器的位置
REMOTE_FILENAME = 'cut4.mp4'  # 文件名
LOCAL_PATH = './video'  # 存放本地位置
USERNAME = 'root'  # 登录服务器用户名
PASSWORD = '123456'  # 登录服务器密码

def remote_scp(host_ip, remote_path, local_path, file_name, username, password):
    t = paramiko.Transport((host_ip, PORT))
    t.connect(username=username, password=password)  # 登录远程服务器
    sftp = paramiko.SFTPClient.from_transport(t)  # sftp传输协议
    src = remote_path + '/' + file_name
    des = local_path + '/' + file_name
    sftp.get(src, des)
    t.close()

detect.py:

parser.add_argument('--host_ip', default='10.16.42.172', help='')
parser.add_argument('--port', default=8989, help='')
parser.add_argument('--remote_path', default='/home/eini/SG/water', help='')
parser.add_argument('--remote_filename', default='cut1.mp4', help='')
parser.add_argument('--local_path', default='./video', help='')
parser.add_argument('--username', default='root', help='')
parser.add_argument('--password', default='123456', help='')
remote_scp(opt.host_ip, opt.remote_path, opt.local_path, opt.remote_filename, opt.username, opt.password)
2. 检测仪表

设置变量num_clock记录当前检测目标的数目,当if num_clock == 4:时进行后续操作。

3. 重新排列label标签

此操作是为了对四个表进行标号,根据label标签中的x坐标,从左到右将仪表标为(0、1、2、3)。
detcet.py:

# txt_path用来存放标签信息的文件夹
sorted_label_path = txt_path + '_sorted' + '.txt'
with open(label_path, 'r') as first_file:
    rows = first_file.readlines()
    sorted_rows = sorted(rows, key=lambda x: float(x.split()[1]), reverse=False)
    with open(sorted_label_path, 'w') as second_file:
        for row in sorted_rows:
            second_file.write(row)

labels文件夹
指针仪表数据集,python,YOLO,人工智能
cut1_64.txt注:一共有5列信息,分别为 class、x、y、w、h
指针仪表数据集,python,YOLO,人工智能
cut1_64_sorted.txt
指针仪表数据集,python,YOLO,人工智能

4. 计算拉普拉斯算子,得到最清晰的四张表

注:这个步骤也可以通过直接计算长和宽像素值进行代替

# 事先声明清晰度数组,用来存放比较清晰度值
sharpness_original = [0, 0, 0, 0]  # 清晰度数组


# 读取图像
cv2.imwrite(filename_last, roi)
# 计算清晰度
img = cv2.imread(filename_last)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sharpness = cv2.Laplacian(gray, cv2.CV_64F).var()
print("清晰度值:", sharpness, sharpness_original[n])
if sharpness > sharpness_original[n]:
    sharpness_original[n] = sharpness
    cv2.imwrite(clock_name, roi)
5. 检测完毕后的四张表

将清晰度最高的四张表存放在clock文件夹中,以便于后续读数。
指针仪表数据集,python,YOLO,人工智能

6. 读数

注:本项目中的仪表刻度盘为不均匀分布,后续需要对角度划分进行优化。
将仪表内边框的上边线作为零刻度线的辅助线,通过计算辅助线与指针之间的夹角计算度数

电压表读数:

def reading_V(img):
    k1 = 0
    k2 = 0
    W = Image.open(img).width
    H = Image.open(img).height
    img = cv2.imread(img)
    kernel = np.ones((6, 6), np.float32) / 25
    gray_cut_filter2D = cv2.filter2D(img, -1, kernel)
    gray_img = cv2.cvtColor(gray_cut_filter2D, cv2.COLOR_BGR2GRAY)
    ret, thresh1 = cv2.threshold(gray_img, 180, 255, cv2.THRESH_BINARY)
    tm = thresh1.copy()
    test_main = tm[int(W / 25):int(W * 23 / 25), int(H / 25):int(H * 23 / 25)]
    edges = cv2.Canny(test_main, 50, 150, apertureSize=3)
    lines = cv2.HoughLines(edges, 1, np.pi / 180, 55)
    lines = lines[:, 0, :]
    result = edges.copy()
    for rho, theta in lines:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        x1 = int(x0 + result.shape[1] * (-b))
        y1 = int(y0 + result.shape[1] * a)
        x2 = int(x0 - result.shape[0] * (-b))
        y2 = int(y0 - result.shape[0] * a)
        # 零刻度线
        if y1 >= H / 20 and y1 < H * 1 / 3:
            k1 = line_k(x1, y1, x2, y2)
            cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
        # 指针
        if y2 >= H / 2 and y2 <= H * 4 / 5 and x2 >= H / 8:
            k2 = line_k(x1, y1, x2, y2)
            cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    Cobb = int(math.fabs(np.arctan((k1 - k2) / (float(1 + k1 * k2))) * 180 / np.pi) + 0.5)
    print("度数为:", int(Cobb * 250 / 90))
    return int(Cobb * 250 / 90)

电流表读数:

def reading_A(img):
    k1 = 0
    k2 = 0
    W = Image.open(img).width
    H = Image.open(img).height
    img = cv2.imread(img)
    kernel = np.ones((6, 6), np.float32) / 25
    gray_cut_filter2D = cv2.filter2D(img, -1, kernel)
    gray_img = cv2.cvtColor(gray_cut_filter2D, cv2.COLOR_BGR2GRAY)
    ret, thresh1 = cv2.threshold(gray_img, 180, 255, cv2.THRESH_BINARY)
    tm = thresh1.copy()
    test_main = tm[int(W / 25):int(W * 23 / 25), int(H / 25):int(H * 23 / 25)]
    edges = cv2.Canny(test_main, 50, 150, apertureSize=3)
    lines = cv2.HoughLines(edges, 1, np.pi / 180, 50)
    lines = lines[:, 0, :]
    result = edges.copy()
    for rho, theta in lines:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        x1 = int(x0 + result.shape[1] * (-b))
        y1 = int(y0 + result.shape[1] * a)
        x2 = int(x0 - result.shape[0] * (-b))
        y2 = int(y0 - result.shape[0] * a)
        # 零刻度线
        if y1 >= H / 20 and y1 < H * 1 / 3:
            k1 = line_k(x1, y1, x2, y2)
            cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
        # 指针
        if y2 >= H / 2 and y2 <= H * 4 / 5 and x2 >= H / 8:
            k2 = line_k(x1, y1, x2, y2)
            cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
    Cobb = int(math.fabs(np.arctan((k1 - k2) / (float(1 + k1 * k2))) * 180 / np.pi) + 0.5)
    print("度数为:", int(Cobb * 40 / 90))
    return int(Cobb * 40 / 90)
7. 保存结果

将结果保存在图片上:

def save_clock(img, read, path):
    # 设置字体,如果没有,也可以不设置
    font = ImageFont.truetype("C:\WINDOWS\FONTS\MSYHL.TTC", 50)
    # 打开底版图片
    tp = Image.open(img)
    # 在图片上添加文字 1
    draw = ImageDraw.Draw(tp)
    draw.text((50, 50), str(read), (255, 255, 0), font=font)
    # 保存
    tp.save(path)

由于裁剪框的位置不同,最终结果存在一定误差
指针仪表数据集,python,YOLO,人工智能

向http接口发送结果(也可以使用postman工具测试):
sendAns.py文章来源地址https://www.toymoban.com/news/detail-728839.html

def send(rack1_res):
    conn = http.client.HTTPConnection("192.168.0.103:5000")
    rack1_1 = rack1_res[0]
    rack1_2 = rack1_res[1]
    rack1_3 = rack1_res[2]
    rack1_4 = rack1_res[3]
    payload = "{\n    \"username\" : \"asd123\"," \
              "\n    \"password\" : \"123\"," \
              "\n    \"rack1_1\" : \"%s\" ," \
              "\n    \"rack1_2\" : \"%s\"," \
              "\n    \"rack1_3\" : \"%s\"," \
              "\n    \"rack1_4\" : \"%s\"" \
              "\n}" % (rack1_1, rack1_2, rack1_3, rack1_4)
    headers = {
        'content-type': "application/json",
        'cache-control': "no-cache",
        'postman-token': "a1fa6df2-a806-fdbd-6963-4342f9eb4227"
    }
    conn.request("POST", "/get", payload, headers)
    res = conn.getresponse()
    data = res.read()

到了这里,关于Yolov5实现视频中的指针式仪表读数 [python]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于深度学习的指针式仪表倾斜校正方法——论文解读

    中文论文题目:基于深度学习的指针式仪表倾斜校正方法 英文论文题目:Tilt Correction Method of Pointer Meter Based on Deep Learning 周登科、杨颖、朱杰、王库.基于深度学习的指针式仪表倾斜校正方法[J].计算机辅助设计与图形学学报, 2020, 32(12):9.DOI:10.3724/SP.J.1089.2020.18288.        针对仪

    2024年02月12日
    浏览(34)
  • 一个指针式的时钟,12小时内时针和分针重复多少次,分别是什么时间

    之前看过一个鸡汤,说中国学生和国外学生,老师提出这个问题,仅是问重合多少次。中国学生拿出笔闷头算,国外学生直接拿出表直接调时间………… 但是这个问题如果是重合的具体时间如何用C语言算 结果 重复时间 小时: 1  分钟 5  重复时间 小时: 1  分钟 6  重复时间

    2024年02月10日
    浏览(62)
  • 使用YOLOV5实现视频中的车辆计数

    目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),确定它们的类别和位置,是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具有挑战性的问题。

    2024年01月25日
    浏览(33)
  • PYTHON+YOLOV5+OPENCV,实现数字仪表自动读数,并将读数结果进行输出显示和保存

    最近完成了一个项目,利用python+yolov5实现数字仪表的自动读数,并将读数结果进行输出和保存,现在完成的7788了,写个文档记录一下, 若需要数据集和源代码可以私信。 最后实现的结果如下: 首先查阅文献和文档,好家伙,不看不知道,做相似项目的很多资料都是硕士研

    2024年02月03日
    浏览(34)
  • 使用YOLOv5实现图片、视频的目标检测

    接下来我将从官方代码开始,一步一步展示如何进行图片、视频识别 首先从GitHub下载官方代码(也可以从下面链接获取): 链接:https://pan.baidu.com/s/16wzV899D90TY2Xwhx4TwhA 提取码:vzvj (你的环境名可能和我不一样) 可以看到 \\\'--weights\\\' 参数(参数解读详见4.a)的默认值为\\\'yolov

    2023年04月15日
    浏览(31)
  • 基于YOLOv5的视频计数 — 汽车计数实现

    在视频中计数对象可能看起来有挑战性,但借助Python和OpenCV的强大功能,变得令人意外地易于实现。在本文中,我们将探讨如何使用YOLO(You Only Look Once)目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单的步骤,使初学者能够轻松跟随。 本文将分为以下几

    2024年02月04日
    浏览(32)
  • YOLOv5训练自己的数据集实现视频的识别

    写在前面 我本来是使用这个模型进行手写签名的定位,但是因为比赛的主办方原因,数据不允许公开,所以我使用动物世界的一段开头视屏来制作我的数据集。这整个模型跑通的过程中,我参考了很多不错的博客,写这篇博客的原因是记录一下我的所见所感。我的模型是在

    2024年02月02日
    浏览(59)
  • 使用flask将Yolov5部署到前端页面实现视频检测(保姆级)

    首先,开发工具我们选择jetbrains公司的Pycharm,打开Pycharm,选择new Project,flask,路径根据自己的自身情况改,最好点击create创建成功! 此时,新建好的flask工程目录长这样 static文件夹下存放一些文件,比如css,js,images等,templates文件夹存放一些html的文件,便于日后flask部署。

    2024年01月24日
    浏览(40)
  • Yolov5对本地视频进行推理时,实现跳帧检测,提高推理效率

    今天在使用Yolov5的detect.py对本地视频进行推理时,发现推理速度受硬件性能影响比较大,为提高检测效率,在部分没必要逐帧检测的情况下,可以考虑设置跳帧检测。 对detect.py观察了一番之后,发现视频读取靠的是dataloaders.py库,于是继续观察。 最终得出了以下解决方案:

    2024年02月12日
    浏览(43)
  • 基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

    前段时间打算做一个目标行为检测的项目,翻阅了大量资料,也借鉴了不少项目,最终感觉Yolov5+Deepsort+Slowfast实现实时动作检测这个项目不错,因此进行了实现。 总的来说,我们需要能够实现实时检测视频中的人物,并且能够识别目标的动作,所以我们拆解需求后,整理核心

    2024年01月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包