Skip to content

complexobject_detection

Moscowsky Anton edited this page Apr 12, 2022 · 18 revisions

Распознавание "сложных" объектов

!!! Для использования этой части пакета, необходима установка библиоткеки igraph.

1. Аннотация

Сложные (или составные) объекты представляют собой набор простых объектов с заданными отношениями между ними. На текущий момент отношения носят сравнительный (больше, меньше) или пространственный (быть внутри, быть на расстоянии) характер. Имея данный инструмент, можно сильно расширить набор объектов, которые могут быть распознаны системой. Часто в научной литературе для такого определения объектов используют термин "сцена" или "ситуация", иногда дополняя его различными конструкциями, например контекстом. На изображении снизу приведен пример всем хорошо известной картины, на которой показаны, как между объектами могут быть заданы отношения.

Задачей алгоритмов распознавания сложных объектов на данном примере может быть "найти человека с веревкой" или "найти человека, стоящего на дороге перед кустом", "найти двух людей, держащихся за руки". В первом случае ответом будет одна группа объектов, во втором две, в третьем тоже две. Для задачи распознавания сложных объектов используется теория графов. Наблюадемая сцена и описание сложного объекта представляется в виде графов, где простые объекты - вершины, а отношения - ребра. Далее решается задача поиска изоморфных подграфов.

2. Жесткое и мягкое распознавание

Аналогично задаче распознавания простых объектов, распознавание сложных должно быть произведено в двух режимах: жестком и мягком.

  • Жесткий - когда наличие всех объектов и связей обязательно для распознавания.
  • Мягкий - когда берутся группы объектов, частично попадающие под заданное описание, и рассчитывается коэффициент уверенности для этой группы.

Расчет коэффициента уверенности для сложных объектов прорисходит по следюущей формуле:

3. XML-описание

Описания сложных объектов располагаются в теге ComplexObjectBase, ссылаясь на простые объекты из SimpleObjectBase и отношения из RelationLib.

3.1. Отношения

Как уже говорилось, отношения указываются в теге RelationLib. Для каждого отношения создается тег RelationShip, у которого имеются следующие параметры:

  1. Name (string, must be set) Уникальное имя отношения.
  2. Type (string, must be set) Тип отношения, должно быть одним из таблицы ниже.
  3. Другие параметры специфичны для каждого типа отношения.
Тип Описание Рабочее пространство* Коммутативно Ссылка на раздел
ImageRange Отношение расстояния между объектами на изображении I ✔✔❌ (зависит от режима) link
3DRange Отношение расстояние между объектами в трехмерном пространстве 3D link
LogicAnd Логическое И над двумя отношениями Унаследовано** Унаследовано** link
LogicOr Логическое ИЛИ над двумя отношениями Унаследовано** Унаследовано** link
LogicNot Логическое НЕ к отношению Унаследовано** Унаследовано** link
SpaceIn Проверяет что один объект полностью внутри другого I link
SpaceOut Проверяет что один объект полностью вне другого I link
SpaceUp Проверяет что центр объекта выше центра другого I link
SpaceDown Проверяет что центр объекта ниже центра другого I link
SpaceLeft Проверяет что центр объекта левее центра другого I link
SpaceRight Проверяет что центр объекта правее центра другого I link
SizeSame Проверят идентичность площади объектов I link
SameExtractedInfo Проверят совпадение ключей извлекаемой информации - link

* - Может быть как I, что означает что объекты сравниваются в координатах изображения, так и 3D, что означает что отношение оперирует в трехмерном пространстве, однако для этого варианта, объекты должны иметь признаки, определяющие трехмерное положение.

** - Логические отношения принимают параметры отношений, к которым они применены.

3.2. Сложные объекты

Все сложные объекты описываются внутри тега ComplexObjectBase, и каждый из них должен быть заключен в тег ComplexObject.

3.2.1. Параметры тега ComplexObject.

  1. ID (int, must be set) Уникальный идентификатор сложного объекта. Может совпадать с идентификаторами простых объектов.
  2. Name (string, must be set) Уникальное имя сложного объекта.
  3. Mode (string, default: hard) Режим распознавания, принимает варианты Hard и Soft.
  4. Probability (double, default: 0.75) Максимальный порог степени уверенности.

3.2.2. Внутренние теги со своими параметрами

  1. SimpleObject - эти теги отписывают, какие простые объекты составляют сложный
  • Class (string, must be set) Имя простого объекта в базе.
  • InnerName (string, must be set) Некоторое внутреннее имя, которое будет использовано при задании отношений.
  • Weight (double, default: 1) Коэффициент значимости объекта.
  1. Relation - эти теги описывают как простые объекты соединены отношениями
  • Obj1 (string) Внутреннее имя первого объекта, соединенного отношением.
  • Obj2 (string) Внутреннее имя второго объекта, соединенного отношением.
  • Relationship (string) Имя отношения из RelationLib.
  • Weight (double, default: 1) Коэффициент значимости отношения.

3.3. Пример

Примером сложного объекта, состоящего из простых, может выступать человек с распознанным лицом. Для этого отдельно распознаются лица и фигуры людей, которые сопоставляются друг другу по принципу нахождения лица в прямоугольнике всей фигуры. Описать такой сложный объект в терминах системы можно следующим образом.

<?xml version="1.0" ?>

<AttributeLib>
    
    <Attribute Name="KeyboardDnn" Type="Dnn" Weight="4" framework="tensorflow" weights="ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb" config="ssd_mobilenet_v1_coco_2017_11_17/config.pbtxt" labels="ssd_mobilenet_v1_coco_2017_11_17/mscoco_label_map.pbtxt" inputWidth="300" inputHeight="300" Probability="0.75" obj_id="76"/>            
    
    <Attribute Name="ScreenDnn" Type="Dnn" Weight="4" framework="tensorflow" weights="ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb" config="ssd_mobilenet_v1_coco_2017_11_17/config.pbtxt" labels="ssd_mobilenet_v1_coco_2017_11_17/mscoco_label_map.pbtxt" inputWidth="300" inputHeight="300" Probability="0.75" obj_id="72"/>   
    
    <Attribute Name="MouseDnn" Type="Dnn" Weight="4" framework="tensorflow" weights="ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb" config="ssd_mobilenet_v1_coco_2017_11_17/config.pbtxt" labels="ssd_mobilenet_v1_coco_2017_11_17/mscoco_label_map.pbtxt" inputWidth="300" inputHeight="300" Probability="0.5" obj_id="74"/>    
    
    <Attribute Name="MouseBlob" Type="Blob" Weight="1" minThreshold="10" maxThreshold="297" blobColor="0" minArea="554" minCircularity="0.10" minConvexity="0.87" minInertiaRatio="0.01"/>
    
    <Attribute Name="MouseBlack" Type="HistColor" Histogram="histograms/Black.yaml" Probability="0.75" Contour="FALSE"/>    
        
</AttributeLib>

<SimpleObjectBase>
    
    <SimpleObject Name="Keyboard" ID="1">
        <Attribute Type="Detect">KeyboardDnn</Attribute>
    </SimpleObject>
    
    <SimpleObject Name="Mouse" ID="2" Mode="Soft" Probability="0.5">
        <Tracker IOU="0.3" decay="0.01" soft_prob="0.2">NONE</Tracker>
        <Attribute Type="Detect">MouseBlack</Attribute>
        <Attribute Type="Detect">MouseDnn</Attribute>
        
    </SimpleObject>
    
    <SimpleObject Name="Screen" ID="3">
        <Attribute Type="Detect">ScreenDnn</Attribute>
    </SimpleObject>
    
</SimpleObjectBase>

<RelationLib>    
    
    <RelationShip Type="SpaceLeft" Name="left"/>
    <RelationShip Type="SpaceUp" Name="up"/>
    <RelationShip Type="SpaceOut" Name="out"/>
    
    <RelationShip Type="LogicAnd" Name="out-left" A="out" B="left"/>
    
</RelationLib>

<ComplexObjectBase>
    
    <ComplexObject ID="1" Name="PC" Mode="Hard" Probability="0.2">
        <SimpleObject Class="Screen" InnerName="Screen" Weight="2"/>
        <SimpleObject Class="Mouse" InnerName="Mouse"/>
        <SimpleObject Class="Keyboard" InnerName="Keyboard"/>        
        
        <Relation Obj1="Keyboard" Obj2="Mouse" Relationship="out-left"/>        
        <Relation Obj1="Screen" Obj2="Keyboard" Relationship="up"/>
        <Relation Obj1="Screen" Obj2="Mouse" Relationship="up"/>
        
    </ComplexObject>
    
</ComplexObjectBase>

Complex PC example

Clone this wiki locally