Есть ли способ использовать OCR для извлечения определенных данных из технического чертежа САПР?

Я пытаюсь использовать OCR для извлечения только базовых размеров модели САПР, но есть и другие ассоциативные размеры, которые мне не нужны (например, углы, длина от базовой линии до отверстия и т. д.). Вот пример технического рисунка. (Числа в красных кружках — это базовые размеры, остальные, выделенные фиолетовым, — те, которые следует игнорировать.) Как я могу указать своей программе извлекать только базовые размеры (высоту, длину и ширину блока перед его отправкой? через ЧПУ)?

Проблема в том, что чертежи, которые я получаю, не имеют определенного формата, поэтому я не могу сказать OCR, где находятся размеры. Это должно выясняться само по себе контекстуально.

Должен ли я обучать программу с помощью машинного обучения, запустив несколько итераций и исправив ее? Если да, то какие методы существуют? Единственное, о чем я могу думать, это каскадные классификаторы Opencv. Или есть другие методы решения этой проблемы? Извините, за длинную статью. Спасибо.

Почему бы не распознавать все и не создавать правила для того, что вы хотите извлечь?

Kalpit 23.12.2020 10:21

Вот, я отредактировал вопрос. Как вы можете видеть на картинке, очень много нерелевантных чисел. Плюс цифры не всегда находятся в одном и том же месте, в зависимости от формы модели, а также от человека, который делал чертежи. Единственное решение, которое я могу придумать, - это обучить OpenCV обнаруживать отдельные стрелки и идентифицировать их как базовые измерения. Если есть какие-либо другие решения, о которых вы можете подумать, это было бы очень признательно. Спасибо.

Joshua Park 24.12.2020 01:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
434
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я чувствую вас... это очень сложная проблема, и мы потратили последние 3 года на поиски ее решения. Простите меня за упоминание собственного решения, но оно обязательно решит вашу проблему: pip install werk24


from werk24 import Hook, W24AskVariantMeasures
from werk24.models.techread import W24TechreadMessage
from werk24.utils import w24_read_sync
    
from . import get_drawing_bytes # define your own
    
    
def recv_measures(message: W24TechreadMessage) -> None:
    for cur_measure in message.payload_dict.get('measures'):
        print(cur_measure)
    
if __name__ == "__main__":
    # define what information you want to receive from the API
    # and what shall be done when the info is available.
    hooks = [Hook(ask=W24AskVariantMeasures(), function=recv_measures)]
    
    # submit the request to the Werk24 API
    w24_read_sync(get_drawing_bytes(), hooks)

В вашем примере он вернет, например, следующую меру

    {
        "position": <STRIPPED>
        "label": {
            "blurb": "ø30 H7 +0.0210/0",
            "quantity": 1,
            "size": {
                "blurb": "30",
                "size_type":" "DIAMETER",
                "nominal_size": "30.0",
            },
            "unit": "MILLIMETER",
            "size_tolerance": {
                "toleration_type": "FIT_SIZE_ISO",
                "blurb": "H7",
                "deviation_lower": "0.0",
                "deviation_upper": "0.0210",
                "fundamental_deviation": "H",
                "tolerance_grade": {
                    "grade":7,
                    "warnings":[]
                },
            "thread": null,
            "chamfer": null,
            "depth":null,
            "test_dimension": null,
         },
         "warnings": [],
         "confidence": 0.98810
    }

или для GD&T

{
    "position": <STRIPPED>,
    "frame": {
        "blurb": "[⟂|0.05|A]",
        "characteristic": "⟂",
        "zone_shape": null,
        "zone_value": {
            "blurb": "0.05",
            "width_min": 0.05,
            "width_max": null,
            "extend_quantity": null,
            "extend_shape": null,
            "extend": null,
            "extend_angle": null
        },
        "zone_combinations": [],
        "zone_offset": null,
        "zone_constraint": null,
        "feature_filter": null,
        "feature_associated": null,
        "feature_derived": null,
        "reference_association": null,
        "reference_parameter": null,
        "material_condition": null,
        "state": null,
        "data": [
            {
                "blurb": "A"
            }
         ]
    }
}

Подробности смотрите в документации на Werk24.

Хотя Mixpeek является управляемым предложением, это один из бесплатных вариантов:

pip install mixpeek

from mixpeek import Mixpeek  
  
mix = Mixpeek(  
    api_key = "my-api-key"  
)  
  
mix.upload(file_name = "design_spec.dwg", file_path = "s3://design_spec_1.dwg")

Эта конечная точка /upload извлечет содержимое вашего файла DWG, а затем при поиске терминов будет включать file_path, чтобы вы могли отобразить его в своем HTML.

За кулисами он использует библиотеку с открытым исходным кодом LibreDWG для запуска ряда собственных команд AutoCAD, таких как ИЗВЛЕЧЕНИЕ ДАННЫХ.

Теперь вы можете искать термин, и будет возвращен соответствующий файл DWG (в дополнение к контексту, в котором он существует):

mix.search(query = "retainer", include_context=True)

[  
    {  
        "file_id": "6377c98b3c4f239f17663d79",  
        "filename": "design_spec.dwg",  
        "context": [  
            {  
                "texts": [  
                    {  
                        "type": "text",  
                        "value": "DV-34-"  
                    },  
                    {  
                        "type": "hit",  
                        "value": "RETAINER"  
                    },  
                    {  
                        "type": "text",  
                        "value": "."  
                    }  
                ]  
            }  
        ],  
        "importance": "100%",  
        "static_file_url": "s3://design_spec_1.dwg"  
    }  
]

Больше документации здесь: https://docs.mixpeek.com/

Другие вопросы по теме