Оцифровка показників приладів на Python та Tesseract

 Останнім часом я перейшов на автоматизовану перевірку модулів та проектних схем. Для цього використовую обладнання, яке під'єднується до комп'ютера, і таким чином автоматично знімаються покази. Але не все обладнання може передавати цифрові дані.

Наприклад, інфрачервоний тепловізор дає лише зображення, і немає можливості отримати температуру у вигляді числових даних. Це лише USB-камера. Під час тестування зображення записуються, і в результаті автоматизованого тестування я отримую багато записів такого виду:

id,time,prog_current,bat_current,load_voltage,load_current,bat_voltage,ir_image
0,2024-08-30T19:30:01.260730,100.0,145.000,5.053,103.0,4.03,./img/test_2311_discharge_temp__1725035401.557107.png
1,2024-08-30T19:30:02.116880,100.0,145.000,5.055,98.0,4.03,./img/test_2311_discharge_temp__1725035402.762693.png
2,2024-08-30T19:30:03.344875,100.0,145.000,5.055,98.0,4.03,./img/test_2311_discharge_temp__1725035403.615202.png
3,2024-08-30T19:30:04.152445,100.0,145.000,5.054,104.0,4.03,./img/test_2311_discharge_temp__1725035404.52685.png
4,2024-08-30T19:30:05.072659,100.0,146.000,5.053,102.0,4.03,./img/test_2311_discharge_temp__1725035405.466401.png
5,2024-08-30T19:30:06.064686,100.0,145.000,5.054,99.0,4.03,./img/test_2311_discharge_temp__1725035406.369785.png
6,2024-08-30T19:30:06.945230,100.0,145.000,5.055,98.0,4.03,./img/test_2311_discharge_temp__1725035407.294545.png

Звідси й виникає задача — для аналізу мені потрібно отримати температуру у вигляді числового значення. Щоб не робити це вручну, потрібна якась програма, яка автоматично розпізнає кілька тисяч зображень.

Варіанти вирішення

Звісно, перше, що приходить на думку — це щось на кшталт "давайте завантажимо всі ці файли в ChatGPT/Gemini (оберіть улюблену опцію) і нехай AI виконає цю роботу". Але цей метод у мене не спрацював. ChatGPT не хоче обробляти більше кількох файлів одночасно.

Наступна думка — добре, тоді використаємо нейронну мережу, яку можна запустити локально, щоб обійти всі обмеження. Це дійсно може спрацювати, але часу на це піде дуже багато.

І ось тут ChatGPT нагадав мені, що колись давно існувала досить проста й невибаглива бібліотека для розпізнавання текстів, а особливо чисел — Tesseract. Саме цю бібліотеку я і спробую використати для вирішення задачі.

Налаштування середовища

Встановимо необхідні пакети для Python:

pip install pytesseract
pip install opencv-python

Встановлюємо Tesseract OCR

  • для Windows - завантажити неофіційні збірки можна за цим посиланням: https://github.com/UB-Mannheim/tesseract/wiki.
    Я встановив його в папку: C:\Program Files\Tesseract-OCR.
  • для Linux Tesseract зазвичай доступний у стандартних пакетах. Нічого завантажувати не потрібно — досить встановити його через пакетний менеджер.

Реалзіація

Зображення з тепловізора я отримаю ось такого виду:



Щоб розпізнати текст потрібно вирізати і перетворити зображення на монохромне.

Далі реалзіація на Python для роспізнавання та запису результатів в CSV файл.

import pandas as pd
import pytesseract
import cv2
import platform
import re


def crop_top_left_number(image_path, left=24, upper=10, right=80, lower=36):
    image = cv2.imread(image_path)
    ## Обрізаємо лише потрібну для роспізнавання частину зображення
    cropped_image = image[upper:lower, left:right]
    gray_image = cv2.cvtColor(cropped_image, cv2.COLOR_BGR2GRAY)
    _, thresh_image = cv2.threshold(gray_image, 150, 255, cv2.THRESH_BINARY_INV)
    ## Роспізнаємо текст на зображені
    text = pytesseract.image_to_string(thresh_image, config='--psm 6')
    ## Прибираємо зайвий текст, залишаємо лише цифри
    match = re.search(r'(\d+\.\d+).*', text)
    if match:
        return match.group(1)
    return "error"


## Для OS Windows потрібно вказати шлях до Tesseract OCR
if platform.system() == "Windows":
    pytesseract.pytesseract.tesseract_cmd = 
        'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

## Читаємо вхідний CSV файл
output_data = pd.read_csv("input.csv")
for i in range(len(output_data)):
    image_file = output_data.loc[i, 'ir_image']
    temperature = crop_top_left_number(image_file)
    image_to_temp_map[image_file] = temperature
    output_data.at[i, 'ir_image'] = temperature
## Записуємо все в вихідний CSV файл
output_data.to_csv("output.csv", index=False)

І вже за декілька хвилин я маю в результуючому файлі оцифровані значення.

id,time,prog_current,bat_current,load_voltage,load_current,bat_voltage,ir_image
0,2024-08-30T19:30:01.260730,100.0,145.0,5.053,103.0,4.03,30.1
1,2024-08-30T19:30:02.116880,100.0,145.0,5.055,98.0,4.03,30.1
2,2024-08-30T19:30:03.344875,100.0,145.0,5.055,98.0,4.03,30.1
3,2024-08-30T19:30:04.152445,100.0,145.0,5.054,104.0,4.03,30.1
4,2024-08-30T19:30:05.072659,100.0,146.0,5.053,102.0,4.03,30.1
5,2024-08-30T19:30:06.064686,100.0,145.0,5.054,99.0,4.03,30.1
6,2024-08-30T19:30:06.945230,100.0,145.0,5.055,98.0,4.03,30.1
...
Насправді не все було ідеально — близько десятка записів були розпізнані некоректно, але я це помітив на етапі обробки даних і виправив згодом.

Висновки

Як бачимо, метод працює. І головне — його можна застосовувати і для інших приладів. Наприклад, не так вже й легко знайти мультиметр з підключенням до комп'ютера, не витрачаючи купу грошей. А з цим методом можна взяти будь-який цифровий мультиметр (та хоч DT830) і найдешевшу вебкамеру — і готово, отримуємо цифровий реєстратор.


Коментарі

Популярні дописи з цього блогу

Огляд DC-DC Step-down Buck перетворювачів

ESP8266 модуль з OLED екраном (HW-364A)

Модуль PD тригер IP2721 на 15 та 20 вольт