Sat. Oct 1st, 2022

Un breve y agradable tutorial sobre el descubrimiento de correlaciones entre los objetos en los datos de imágenes.

Una pregunta crítica que surge después de identificar los objetos (o etiquetas de clase) en una base de datos de imágenes es: “¿Cómo se correlacionan entre sí los diversos objetos descubiertos en una base de datos de imágenes?” Este artículo intenta responder a esta pregunta proporcionando un marco genérico que puede ayudar a los lectores a descubrir correlaciones ocultas entre objetos en la base de datos de imágenes. (El propósito de este artículo es alentar a los futuros investigadores a publicar artículos de investigación de calidad en las principales conferencias y revistas. La parte de este artículo se extrae de nuestro trabajo publicado en IEEE BIGDATA 2021 [1].) El marco para descubrir la correlación entre los objetos en una base de datos de imágenes se muestra en la Figura 1. Implica los siguientes tres pasos: Extraiga los objetos (o etiquetas de clase) y sus puntajes de probabilidad para cada imagen en el repositorio. Los usuarios pueden extraer objetos utilizando técnicas de detección de objetos/segmentación de instancias/segmentación semántica. Transforme los objetos y sus puntajes de probabilidad en una base de datos de su elección. (Si es necesario, elimine los objetos poco interesantes que tengan puntajes de probabilidad bajos para reducir el ruido). Según la base de datos generada y el conocimiento necesario, aplique la técnica de minería de patrones correspondiente para descubrir correlaciones emocionantes entre los objetos en los datos de imágenes.Figura 1: Marco para descubrir patrones interesantes en datos de imágenesDemostración: En esta demostración, primero pasamos los datos de la imagen a un modelo entrenado (p. ej., resnet50) y extraemos los objetos y sus puntajes. A continuación, los datos extraídos se transforman en una base de datos transaccional. Finalmente, realizamos minería de patrones frecuentes (máxima) en la base de datos transaccional generada para descubrir conjuntos de objetos que ocurren con frecuencia en los datos de imágenes. La figura 2 muestra la descripción general de nuestra demostración.Figura 2: Descripción general del descubrimiento de patrones en datos de imágenesRequisito previo:Suponemos que los lectores están familiarizados con los temas de segmentación de instancias/semántica y minería de patrones. Recomendamos las videoconferencias de Phillipe sobre minería de patrones. Instale los siguientes paquetes de Python: pip install pami torchvision Descargue la base de datos de imágenes de [2](Instale los paquetes adicionales necesarios según su entorno informático).Paso 1: Extracción de objetos y sus puntajes de datos de imágenesPaso 1.1: Cargue el modelo de detección de objetos previamente entrenadoGuarde el siguiente código como objectDetection.py. Este código acepta la carpeta de imágenes como entrada, implementa el modelo resnet50 previamente entrenado y genera una lista (es decir, self.predicted_classes) que contiene etiquetas de clase y sus puntajes. Cada elemento de esta lista representa las etiquetas de clase que se encuentran en un globo image.import
importar sistema operativo
importar csv
importar antorcha visión
de las transformaciones de importación de torchvision
antorcha de importación
de antorcha importar no_grad
importar cv2
de imagen de importación PIL
importar numpy como np
sistema de importación
importar matplotlib.pyplot como plt
desde IPython.display importar imagen como Imagedisplay
de PAMI.extras.imageProcessing import imagery2Databases as obclass objectDetection:
def __init__(uno mismo):
self.model_ = torchvision.models.detection.fasterrcnn_resnet50_fpn(preentrenado=Verdadero)
self.model_.eval()
para nombre, parámetro en self.model_.named_parameters():
param.requires_grad = Falsedef modelo(self, x):
con antorcha.no_grad():
self.y_sombrero = self.modelo_(x)
return self.y_hatdef model_train(self, image_path):
# nombres de etiquetas
self.coco_instance_category_names = [
‘__background__’, ‘person’, ‘bicycle’, ‘car’, ‘motorcycle’, ‘airplane’, ‘bus’,
‘train’, ‘truck’, ‘boat’, ‘traffic light’, ‘fire hydrant’, ‘N/A’, ‘stop sign’,
‘parking meter’, ‘bench’, ‘bird’, ‘cat’, ‘dog’, ‘horse’, ‘sheep’, ‘cow’,
‘elephant’, ‘bear’, ‘zebra’, ‘giraffe’, ‘N/A’, ‘backpack’, ‘umbrella’, ‘N/A’, ‘N/A’,
‘handbag’, ‘tie’, ‘suitcase’, ‘frisbee’, ‘skis’, ‘snowboard’, ‘sports ball’,
‘kite’, ‘baseball bat’, ‘baseball glove’, ‘skateboard’, ‘surfboard’, ‘tennis racket’,
‘bottle’, ‘N/A’, ‘wine glass’, ‘cup’, ‘fork’, ‘knife’, ‘spoon’, ‘bowl’,
‘banana’, ‘apple’, ‘sandwich’, ‘orange’, ‘broccoli’, ‘carrot’, ‘hot dog’, ‘pizza’,
‘donut’, ‘cake’, ‘chair’, ‘couch’, ‘potted plant’, ‘bed’, ‘N/A’, ‘dining table’,
‘N/A’, ‘N/A’, ‘toilet’, ‘N/A’, ‘tv’, ‘laptop’, ‘mouse’, ‘remote’, ‘keyboard’, ‘cell phone’,
‘microwave’, ‘oven’, ‘toaster’, ‘sink’, ‘refrigerator’, ‘N/A’, ‘book’,
‘clock’, ‘vase’, ‘scissors’, ‘teddy bear’, ‘hair drier’, ‘toothbrush’
]
self.transform = transforma.Compose([transforms.ToTensor()])
self.image_path = image_path
self.imagen = Imagen.open(self.image_path)
# redimensionar y trazar la imagen
auto.imagen.redimensionar([int(0.5 * s) for s in self.image.size])
del self.image_path
self.image = self.transform(self.image)# predicciones sin ningún umbral
self.predecir = self.modelo([self.image])
self.predicted_classes = [(self.coco_instance_category_names[i]pag) para
yo, p en
zip(lista(self.predict[0][‘labels’].numpy()),
auto.predecir[0][‘scores’].separar().numpy())]devolver self.predicted_classesPaso 1.2: Detectar objetos de cada imagenEl siguiente código identifica varios objetos en cada imagen y los agrega a una lista llamada lista_de_objetos_detectados. Esta lista se transformará en una base de datos transaccional en el siguiente paso. from PAMI.extras.imageProcessing import imagery2Databases as ob
# carpeta de ruta de imágenes de entrada
images_path = ‘aizu_dataset’# lista para almacenar elementos de salida
lista_objetos_detectados = []# abriendo la carpeta de imágenes y leyendo cada imagen
para nombre de archivo en glob.glob(os.path.join(images_path,’*.JPG’)):
con open(os.path.join(os.getcwd(),filename),’r’) como f:# cargando el modelo resnet-50 preentrenado para entrenar en nuestro conjunto de datos
model_predict = objectDetection()# ingrese cada imagen al modelo pre-entrenado
# modelo devuelve objetos detectados
objetos_detectados = model_predict.model_train(nombre de archivo)
lista_objetos_detectados.append(objetos_detectados)Paso 2: crear una base de datos transaccionalElimine las etiquetas de clase poco interesantes utilizando el siguiente código. Guarde los datos restantes como una base de datos transaccional. #Elimine los objetos poco interesantes cuya puntuación de probabilidad sea menor que un valor particular, digamos 0.2
obj2db = ob.createDatabase(detected_objects_list,0.2)#guardar los objetos identificados en las imágenes como una base de datos transaccional
obj2db.saveAsTransactionalDB(‘aizu_dataset0.2.txt’,’,’)Vea el archivo de base de datos transaccional generado escribiendo el siguiente comando:!head -10 aizu_dataset0.2.txtEl resultado será el siguiente:motocicleta,mochila,persona
libro,bate de béisbol,nevera,taza,tostadora
botella, tazón, televisor, inodoro, silla, mouse, refrigerador, teléfono celular, microondas, control remoto, fregadero
microondas,refrigerador,tazón,botella,celular,horno,coche,persona
mesa de trabajo
planta en maceta
botella,bolso,maleta,libro
libro, laptop, tv, paraguas
horno
parquímetro, cochePaso 3: Extraer patrones en la base de datos transaccional.Aplique el algoritmo de crecimiento de patrón frecuente máximo en la base de datos transaccional generada para descubrir los patrones ocultos. En el siguiente código, encontramos patrones (es decir, los conjuntos de etiquetas de clase) que han ocurrido al menos diez veces en la base de datos de imágenes. from PAMI.frequentPattern.maximal import MaxFPGrowth as algobj = alg.MaxFPGrowth(‘aizu_dataset0.2. texto’,10, ‘,’)
obj.startMine()
imprimir(obj.obtenerPatrones())
obj.savePatterns(‘aizuDatasetPatterns.txt’)
print(‘Tiempo de ejecución: ‘ + str(obj.getRuntime()))
print(‘Memory: ‘ + str(obj.getMemoryRSS()))Vea los patrones generados escribiendo el siguiente comando:
!head -10 aizuDatasetPatterns.txtLa salida será la siguiente:refrigerador microondas :11
baño: 10
celular :11
semáforo :12
camión: 12
planta en maceta :12
reloj :15
banco :17
horno :17
coche: 18 El primer patrón/línea dice que las 11 imágenes en el depósito de imágenes contenían las etiquetas de clase del refrigerador y el microondas. Se pueden hacer afirmaciones similares con los patrones/líneas restantes. Conocer la correlación entre las diferentes etiquetas de objetos/clases puede beneficiar a los usuarios a la hora de tomar decisiones.Conclusión:La identificación eficiente de objetos en datos de imágenes ha sido ampliamente estudiada en la industria y la academia. Una pregunta clave después de identificar los objetos es, ¿cuál es la correlación subyacente entre los diversos objetos en los datos de las imágenes? Este blog intenta responder a esta pregunta crucial proporcionando una metodología genérica para transformar los objetos descubiertos en los datos de imagen en una base de datos transaccional, aplicando técnicas de minería de patrones y descubriendo patrones interesantes.Descargo de responsabilidad:Todas las imágenes que se muestran en esta página fueron dibujadas por el autor. La base de datos de imágenes fue creada por el propio autor y es de código abierto para ser utilizada con fines comerciales y no comerciales.Referencias:[1] Tuan-Vinh La, Minh-Son Dao, Kazuki Tejima, Rage Uday Kiran, Koji Zettsu: Mejorar la conciencia de las ciudades inteligentes sostenibles mediante el análisis de imágenes de Lifelog y datos de contaminación del aire de IoT. Datos masivos de IEEE 2021: 3589–3594[2] Conjunto de datos de imágenes: aizu_dataset.zip