Я пытаюсь использовать OCR для извлечения только базовых размеров модели САПР, но есть и другие ассоциативные размеры, которые мне не нужны (например, углы, длина от базовой линии до отверстия и т. д.). Вот пример технического рисунка. (Числа в красных кружках — это базовые размеры, остальные, выделенные фиолетовым, — те, которые следует игнорировать.) Как я могу указать своей программе извлекать только базовые размеры (высоту, длину и ширину блока перед его отправкой? через ЧПУ)?
Проблема в том, что чертежи, которые я получаю, не имеют определенного формата, поэтому я не могу сказать OCR, где находятся размеры. Это должно выясняться само по себе контекстуально.
Должен ли я обучать программу с помощью машинного обучения, запустив несколько итераций и исправив ее? Если да, то какие методы существуют? Единственное, о чем я могу думать, это каскадные классификаторы Opencv. Или есть другие методы решения этой проблемы? Извините, за длинную статью. Спасибо.
Вот, я отредактировал вопрос. Как вы можете видеть на картинке, очень много нерелевантных чисел. Плюс цифры не всегда находятся в одном и том же месте, в зависимости от формы модели, а также от человека, который делал чертежи. Единственное решение, которое я могу придумать, - это обучить OpenCV обнаруживать отдельные стрелки и идентифицировать их как базовые измерения. Если есть какие-либо другие решения, о которых вы можете подумать, это было бы очень признательно. Спасибо.
Я чувствую вас... это очень сложная проблема, и мы потратили последние 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/
Почему бы не распознавать все и не создавать правила для того, что вы хотите извлечь?