Как загрузить повторяющиеся теги на какое-то изображение для лазурного пользовательского зрения?

У меня вопрос по лазурному нестандартному видению. У меня есть собственный проект видения для обнаружения объектов. И я использую python SDK для создания проекта (см. Это: https://docs.microsoft.com/en-us/azure/cognitive-services/custom-vision-service/python-tutorial-od). Но в процессе загрузки я обнаружил, что что-то не так. Например, есть фотография, на которой изображены 3 человека. Поэтому я помечаю на этой картинке 3 человека из одного и того же класса. Но после загрузки я только что нашел 1 "человека", отмеченного на этой картинке на веб-сайте custom vision. Но другой класс вполне подойдет, например, на этой картинке также могут быть «человек», «автомобиль» и «самокат». Похоже, что на картинке может быть только один и тот же класс.

Я пробовал использовать Python SDK (см. Это: https://docs.microsoft.com/en-us/azure/cognitive-services/custom-vision-service/python-tutorial-od), чтобы загрузить мое изображение и информацию о тегах.

A0_tag = trainer.create_tag(project.id, "A0")
A1_tag = trainer.create_tag(project.id, "A1")
A2_tag = trainer.create_tag(project.id, "A2")

A0_image_regions={
"0001.jpg":[0.432291667,0.28125,0.080729167,0.09765625],
"0001.jpg":[0.34765625,0.385742188,0.131510417,0.135742188],
"0001.jpg":[0.479166667,0.385742188,0.130208333,0.135742188],
"0003.jpg":[0.19921875,0.158203125,0.083333333,0.099609375]
}

Из приведенного выше кода видно, что я загрузил три класса «A0» в 0001.jpg. Но в интерфейсе графического интерфейса на веб-сайте я вижу только, что один класс "A0" наконец-то существует выше 0001.jpg. Есть ли какое-нибудь решение, которое может решить эту проблему?


На основе cthrash-кода. Я внес некоторые изменения в код, чтобы он заработал. Вот модифицированный код:

A0_tag = trainer.create_tag(project.id, "TestA")
A1_tag = trainer.create_tag(project.id, "TestB")
A2_tag = trainer.create_tag(project.id, "TestC")

A0_image_regions = {
    A0_tag.id : [
                ("2300.png",[0.787109375,0.079681275,0.068359375,0.876494024]),
                ("0920.png",[0.2109375,0.065737052,0.059570313,0.892430279]),
                ("0920.png",[0.291015625,0.061752988,0.05859375,0.894422311]),
    ]
}

A1_image_regions = {
        A1_tag.id : [
                    ("2000.png",[0.067382813,0.073705179,0.030273438,0.878486056]),
                    ("2000.png",[0.126953125,0.075697211,0.030273438,0.878486056]),
                    ("2000.png",[0.184570313,0.079681275,0.030273438,0.878486056]),
                    ("2000.png",[0.232421875,0.079681275,0.030273438,0.878486056]),
    ],
}

A2_image_regions = {
        A2_tag.id : [
                ("1400.png",[0.649414063,0.065737052,0.104492188,0.894422311]),
                ("2300.png",[0.602539063,0.061752988,0.106445313,0.892430279]),
                ("0920.png",[0.634765625,0.067729084,0.124023438,0.88247012]),
                ("0800.png",[0.579101563,0.06374502,0.04296875,0.888446215]),
    ],
}



regions_map = {}
for tag_id in A0_image_regions:
    for filename,[x,y,w,h] in A0_image_regions[tag_id]:
        regions = regions_map.get(filename,[])
        regions.append(Region(tag_id=A0_tag.id, left=x, top=y, width=w, height=h))
        regions_map[filename] = regions

for tag_id in A1_image_regions:
     for filename,[x,y,w,h] in A1_image_regions[tag_id]:
        regions = regions_map.get(filename,[])
        regions.append(Region(tag_id=A1_tag.id, left=x, top=y, width=w, height=h))
        regions_map[filename] = regions


for tag_id in A2_image_regions:
     for filename,[x,y,w,h] in A2_image_regions[tag_id]:
        regions = regions_map.get(filename,[])
        regions.append(Region(tag_id=A2_tag.id, left=x, top=y, width=w, height=h))
        regions_map[filename] = regions




tagged_images_with_regions = []
for filename in regions_map:
    regions = regions_map[filename]
    with open("<your path>" + filename, mode="rb") as image_contents:



        tagged_images_with_regions.append(ImageFileCreateEntry(name=filename, contents=image_contents.read(), regions=regions))
upload_result = trainer.create_images_from_files(project.id, images=tagged_images_with_regions)

person Alan Su    schedule 25.03.2019    source источник


Ответы (3)


Вы создали A0_image_regions, но переопределяете ключ всякий раз, когда у вас есть более одного ограничивающего прямоугольника для любого данного изображения. Так что это не сработает.

Но, что, возможно, более важно, вам нужно вызвать трейнер с изображением в качестве основных объектов, со всеми связанными областями изображения, сгруппированными вместе. Другими словами, в вашем примере 0001.jpg имеет три экземпляра A0, но может также иметь экземпляры A1 и / или A2, и это не должно быть одной записью ImageFile. Поэтому я бы изменил образец следующим образом:

A0_tag = trainer.create_tag(project.id, "A0")
A1_tag = trainer.create_tag(project.id, "A1")
A2_tag = trainer.create_tag(project.id, "A2")

image_regions = {
    A0_tag.id : [
        ("0001.jpg", [0.432291667,0.28125,0.080729167,0.09765625]),
        ("0001.jpg", [0.34765625,0.385742188,0.131510417,0.135742188]),
        ("0001.jpg", [0.479166667,0.385742188,0.130208333,0.135742188]),
        ("0003.jpg", [0.19921875,0.158203125,0.083333333,0.099609375])
    ],
    A1_tag.id : [] # add images/bounding boxes for A1
    A2_tag.id : [] # add images/bounding boxes for A2
}

regions_map = {}
for tag_id in image_regions:
    for filename,[x,y,w,h] in image_regions[tag_id]:
        regions = regions_map.get(filename,[])
        regions.append(Region(tag_id, left=x, top=y, width=w, height=h))
        regions_map[filename] = regions

tagged_images_with_regions = []
for filename in regions_map:
    regions = regions_map[filename]
    with open(base_image_url + filename, mode="rb") as image_contents:
        tagged_images_with_regions.append(ImageFileCreateEntry(name=filename, contents=image_contents.read(), regions=regions))

upload_result = trainer.create_images_from_files(project.id, images=tagged_images_with_regions)
person cthrash    schedule 15.04.2019
comment
Спасибо за ответ, эти коды могут работать. И я внес некоторые изменения, чтобы цикл работал. Коды спасают мой вопрос. - person Alan Su; 05.09.2019

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

Таким образом, тег person просто помогает обнаружить факт, что есть один человек, по крайней мере, после обучения модели, а не car или scooter. Если вы хотите обнаружить другого человека, вам необходимо добавить три тега, например person1, person2 и person3, для трех разных людей на изображении.

Пожалуйста, обратитесь к вики-странице Object detection и ссылкам на нее, чтобы узнать больше о принципе работы машины. обучение и глубокое обучение.

person Peter Pan    schedule 25.03.2019

Если вы ничего не меняли в примере кода, то он пытается загрузить изображение «0.001.jpg» с одной ограничивающей рамкой три раза, и последние две загрузки не удаются, потому что они являются дубликатами изображений с вашим первым загруженным изображением.

Загрузите "0.001.jpg" только один раз с тремя ограничивающими рамками или сначала загрузите изображение, а затем три прямоугольника.

person Ping Jin    schedule 11.04.2019