#python #dataframe #for-loop #image-recognition #knime
#python #фрейм данных #for-цикл #распознавание изображений #knime
Вопрос:
Я работаю с Amazon Rekognition, чтобы провести некоторый анализ изображений. С помощью простого скрипта Python я получаю — на каждой итерации — ответ такого типа: (пример для изображения кошки)
{'Labels':
[{'Name': 'Pet', 'Confidence': 96.146484375, 'Instances': [],
'Parents': [{'Name': 'Animal'}]}, {'Name': 'Mammal', 'Confidence': 96.146484375,
'Instances': [], 'Parents': [{'Name': 'Animal'}]},
{'Name': 'Cat', 'Confidence': 96.146484375.....
Я получил все нужные мне атрибуты в списке, который выглядит следующим образом:
[Pet, Mammal, Cat, Animal, Manx, Abyssinian, Furniture, Kitten, Couch]
Теперь я хотел бы создать фрейм данных, в котором элементы в приведенном выше списке отображаются в виде столбцов, а строки принимают значения 0 или 1.
Я создал словарь, в который я добавляю элементы в список, поэтому я получаю {‘Cat’: 1} , затем я добавляю его в фрейм данных и получаю следующую ошибку: TypeError: Index(…) должен вызываться с какой-то коллекцией, ‘Cat’было передано.
Не только это, но я даже, кажется, не могу добавить в один и тот же фрейм данных информацию из разных изображений. Например, если я вставляю данные только в фрейм данных (в виде строк, а не столбцов), я получаю серию из n строк с n элементами (идентифицированными Amazon Rekognition) только последнего изображения, т. Е. Я начинаю с пустого фрейма данных на каждой итерации. Результат, который я хотел бы получить, выглядит примерно так:
Image Human Animal Flowers etc...
Pic1 1 0 0
Pic2 0 0 1
Pic3 1 1 0
Для справки, это код, который я использую сейчас (я должен добавить, что я работаю над программным обеспечением под названием KNIME, но это просто Python):
from pandas import DataFrame
import pandas as pd
import boto3
fileName=flow_variables['Path_Arr[1]'] #This is just to tell Amazon the name of the image
bucket= 'mybucket'
client=boto3.client('rekognition', region_name = 'us-east-2')
response = client.detect_labels(Image={'S3Object':
{'Bucket':bucket,'Name':fileName}})
data = [str(response)] # This is what I inserted in the first cell of this question
d= {}
for key, value in response.items():
for el in value:
if isinstance(el,dict):
for k, v in el.items():
if k == "Name":
d[v] = 1
print(d)
df = pd.DataFrame(d, ignore_index=True)
print(df)
output_table = df
Я определенно ошибаюсь как в цикле for, так и при добавлении чего-либо в мой фрейм данных, но, похоже, ничего не работает!
Извините за сверхдлинный вопрос, надеюсь, это было ясно! Есть идеи?
Комментарии:
1. можете ли вы показать пример ответа (где ваш второй комментарий), над которым вы работаете?
2. @D-E-N Извините, я не уверен, что понял ваш вопрос, но то, что я получаю из «data = [str (response)] «, это [«{‘Labels’: [{‘Name’: ‘Pet’, ‘Confidence’: 96.146484375, ‘Instances’:[], ‘Parents’: [{‘Name’: ‘Animal’}]}, {‘Name’: ‘Cat’, ‘Confidence’: 96.146484375, ‘Instances’: [{‘BoundingBox’: {‘Width’: 0.6686800122261047, ‘Height’: 0.9005332589149475, ‘Слева’: 0.27255237102508545, ‘Top’: 0.03728689253330231}, ‘Confidence’: 96.146484375}], ‘Parents’: [{‘Name’: ‘Pet’}, …»]
Ответ №1:
Я не знаю, полностью ли это отвечает на ваш вопрос, потому что я не знаю, как могут выглядеть ваши данные, но, я думаю, это хороший шаг, который должен вам помочь. Я добавлял одни и те же данные несколько раз, но путь должен быть ясен.
import pandas as pd
response = {'Labels': [{'Name': 'Pet', 'Confidence': 96.146484375, 'Instances': [], 'Parents': [{'Name': 'Animal'}]},
{'Name': 'Cat', 'Confidence': 96.146484375, 'Instances': [{'BoundingBox':
{'Width': 0.6686800122261047,
'Height': 0.9005332589149475,
'Left': 0.27255237102508545,
'Top': 0.03728689253330231},
'Confidence': 96.146484375}],
'Parents': [{'Name': 'Pet'}]
}]}
def handle_new_data(repsonse_data: dict, image_name: str) -> pd.DataFrame:
d = {"Image": image_name}
result = pd.DataFrame()
for key, value in repsonse_data.items():
for el in value:
if isinstance(el, dict):
for k, v in el.items():
if k == "Name":
d[v] = 1
result = result.append(d, ignore_index=True)
return result
df_all = pd.DataFrame()
df_all = df_all.append(handle_new_data(response, "image1"))
df_all = df_all.append(handle_new_data(response, "image2"))
df_all = df_all.append(handle_new_data(response, "image3"))
df_all = df_all.append(handle_new_data(response, "image4"))
df_all.reset_index(inplace=True)
print(df_all)