예제 #1
0
    def _get_resources(self, url):
        encontrou_img = 0  #inicializa a variavel
        # rastreia a página
        self.nome_arquivo, self.titulo_noticia, encontrou_img = self.crawler.crawl_page(url)
        print("aq")
        if encontrou_img == 1 and os.path.exists(self.nome_arquivo):  # se achou imagem na notícia
            if self.titulo_noticia != "":  # se a noticia existe em ingles
                # le o arquivo e guarda na variavel
                self.noticia = self.crawler.file_to_variavel(self.nome_arquivo)
                # Remove caracteres estranhos das noticias
                self.titulo_noticia = self._remover_caracteres_especiais(self.titulo_noticia)

                self.titulo_diretorio = self.titulo_noticia.replace(" ", "")  #titulo do diretorio

                #grava no txt o titulo - noticias/nomenoticia/titulo.txt
                utils.escrever_arquivo(self.titulo_noticia, "noticia_atual/titulo.txt")

                #grava  a legenda da imagem--noticias/nomenoticia/caption.txt
                self.legenda = self.crawler.file_to_variavel(self.nome_arquivo + "_caption.txt")
                self.legenda = self.legenda.replace("\n", "")
                

                self.path_imagem = self.nome_arquivo + ".jpg"  # caminho da imagem original
                shutil.copy2(self.path_imagem,'static/alinhamento2.jpg')
                print("imagem copiada")
                self.path_legenda = self.nome_arquivo + "_caption.txt"  #caminho da legenda

                self.path_titulo = "noticia_atual/titulo.txt"  #caminho do título

                self.path_noticia = self.nome_arquivo  # path da noticia

                self.directory = "noticias/" + self.titulo_diretorio  #nome do diretorio que será criado

                # if os.path.exists(self.directory):  # se a noticia ainda não foi coletada
                #         shutil.rmtree(self.directory)

                if not os.path.exists(self.directory):  # se a noticia ainda não foi coletada
                    os.makedirs(self.directory)  #cria o diretorio da noticia
                    #envia a imagem original para o dir da noticia
                    os.rename(self.path_imagem, self.directory + "/img_original.jpg")
                    #envia a  noticia original para o dir da noticia
                    os.rename(self.nome_arquivo, self.directory + "/noticia.txt")
                    #envia a  legenda  para o dir da noticia
                    os.rename(self.path_legenda, self.directory + "/caption.txt")
                    #envia o titulo para o dir da noticia
                    os.rename(self.path_titulo, self.directory + "/titulo.txt")
                    # novo path da imagem original
                    self.path_imagem = self.directory + "/img_original.jpg"
                    self.path_noticia = self.directory + "/noticia.txt"  #novo path da noticia
                   

            else:  # Se a noticia não estiver em inglês
                os.remove(self.nome_arquivo + ".jpg")
                os.remove(self.nome_arquivo + "_caption.txt")
        else:
            self.noticia_sem_imagem = True
예제 #2
0
    def _set_manual_resources(self):
            self.titulo_diretorio = self.titulo_noticia.replace(" ", "")  #titulo do diretorio
            #grava no txt o titulo - noticias/nomenoticia/titulo.txt
            utils.escrever_arquivo(self.titulo_noticia, "noticia_atual/titulo.txt")
            
            shutil.copy2(self.path_imagem,'static/alinhamento2.jpg')
            print("imagem copiada")

            self.directory = "noticias/" + self.titulo_diretorio  #nome do diretorio que será criado
            utils.escrever_arquivo(self.noticia,"noticia_manual.txt")
            self.path_noticia = "noticia_manual.txt"  # path da noticia
            # if os.path.exists(self.directory):  # se a noticia ainda não foi coletada
            #             shutil.rmtree(self.directory)
            if not os.path.exists(self.directory):  # se a noticia ainda não foi coletada
                os.makedirs(self.directory)  #cria o diretorio da noticia
            shutil.copy2(self.path_imagem, self.directory + "/img_original.jpg")    
예제 #3
0
    def _experiment_2(self):
        """Experimento 4 + Experimento  3 """
        arquivo_embedding = "/embedding_top5.txt"
        img_original = cv2.imread("static/alinhamento2.jpg")
        bbox_objects = self._get_bounding_objects()
        dic_alinhamento = {}
        lst_palavras_visuais = self.read_words_visual("visual_words.txt")
        num_objeto = 0

        # for bbox in bbox_objects:
        #     bbox.lst_cnn.remove('torch')
        #     bbox.lst_cnn.append(bbox.objeto)

        #     for palavra in self.lst_substantivos:
        #         if palavra in bbox.lst_cnn:

        #             dic_alinhamento[palavra] = num_objeto
        #             num_objeto += 1
        #             break

        dic_json = {}

        # for palavra, value in dic_alinhamento.items():

        #     dic_json[palavra] = "Objeto " + str(dic_alinhamento[palavra])
        #     x, y, w, h = bbox_objects[0].Rect()

        #     #draw bounding box in img_original
        #     cv2.rectangle(img_original, (x, y), (x + w, y + h), (0, 255, 0), 2)
        #     cv2.putText(img_original, "Objeto" + str(dic_alinhamento[palavra]), (x + 15, y + 30),
        #                 cv2.FONT_HERSHEY_TRIPLEX, 0.9, (0, 255, 0), 1)

        #     #remove a bounding box
        #     print("REMOVIDA:" + palavra)
        #     bbox_objects.pop(0)

        # cv2.imwrite("static/" + "alinhamento2.jpg", img_original)
        # img_original = cv2.imread("static/alinhamento2.jpg")
        #bbox_objects = self._get_bounding_objects()
        dic_alinhamento = {}

        #  A P L I C A Ç Ã O  - W O R D   E M B E D D I N G S
        # w_embeddings = WordEmbeding(100)  #inicializa as word embeddings
        # w_embeddings.CarregarWordEmbeddings()
        dic_top_5 = {}
        # coloca todos substantivos em Lower Case e
        # Organiza os substantivos por ordem alfabética
        for i in range(0, len(self.lst_substantivos)):
            self.lst_substantivos[i] = self.lst_substantivos[i].lower()
        self.lst_substantivos.sort()

        #gera e obtém todas W Embeddings dos substantivos
        w = WordEmbeding(100)  # instancia a classe wordEmbedding
        w.CarregarWordEmbeddings()
        dicionario_embeddings = w.RetornarDicionario(self.lst_substantivos)
        palavra_ranqueada = ""

        if not bbox_objects:
            return dic_json

        for bbox in bbox_objects:
            #cria uma pasta com nome {num_foto-nome_objeto}
            object_name = str(bbox.imagem) + "-" + bbox.objeto
            if not os.path.exists(self.path_folder + "/" + object_name):
                os.mkdir(self.path_folder + "/" + object_name)
            dir_objeto = self.path_folder + "/" + object_name
            index_maior_palavra = 0
            palavra_ranqueada = ""
            distancia_ranqueada = 100
            #dicionario para calcular as distancias da palavra da Bbox para todos substantivos
            dicionario_distancias = {}

            for substantivo in self.lst_substantivos:  # para cada substantivo
                for palavra in bbox.lst_cnn:
                    palavra_bbox = palavra  # obtém a palavra que está na Bbox
                    palavra_bbox = TrocarNomes(palavra_bbox)

                    maior_distancia = 0
                    index_maior_palavra = 0

                    #retorna a WOrd Embedding da palavra da Bbox
                    embedding_cnn = w.RetornarVetor(palavra_bbox)
                    if embedding_cnn is None:
                        continue

                    if substantivo not in dicionario_embeddings:
                        continue

                    if dicionario_embeddings[substantivo] is None:
                        continue

                    distancia_we = 0
                    # Calcula a distância entre a Wvec_palavra e substantivo_vec
                    for x in range(0, 100):
                        try:
                            distancia_we = distancia_we + (
                                dicionario_embeddings[substantivo][x] -
                                embedding_cnn[x])**2
                        except:
                            continue
                    distancia_we = sqrt(distancia_we)
                    # armazena no dicionario a distância
                    dicionario_distancias[palavra_bbox] = distancia_we

                # ordena o dicionario de acordo com menor distancia
                sorted_we = sorted(dicionario_distancias.items(),
                                   key=operator.itemgetter(1))
                # texto = ""
                # for z in range(0, 5):  #prepara o texto do arquivo
                #     try:
                #         texto += sorted_we[z][0] + "\n"
                #     except:
                #         pass
                # utils.escrever_arquivo(texto, dir_objeto + arquivo_embedding)

                if sorted_we:
                    if sorted_we[0][1] < distancia_ranqueada:
                        distancia_ranqueada = sorted_we[0][1]
                        palavra_ranqueada = substantivo
                    dic_top_5[substantivo] = sorted_we[0][1]

                # ordena o dicionario de acordo com menor distancia
            sorted_we = sorted(dic_top_5.items(), key=operator.itemgetter(1))
            if sorted_we[0][0] not in lst_palavras_visuais:
                we_deque = deque()
                for z in range(0, 5):
                    try:
                        #verifica se esta na lista das palavras visuais
                        if sorted_we[z][0].lower() in lst_palavras_visuais:
                            we_deque.appendleft(sorted_we[z][0])
                        else:
                            we_deque.append(sorted_we[z][0])
                    except:
                        pass

                    # se estiver sobe uma posicao na lista
                palavra_ranqueada = we_deque[0]

            if palavra_ranqueada != '':
                dic_alinhamento[palavra_ranqueada] = num_objeto
                num_objeto += 1
                print(palavra_ranqueada)
            # ESCREVE NO DIRETORIO O TOP-5
            top5 = ""
            for z in range(0, 5):
                try:
                    top5 += self.dict_lematizado[sorted_we[z]
                                                 [0]] + "-------" + str(
                                                     sorted_we[z][1]) + "\n"
                except:
                    pass
            utils.escrever_arquivo(top5, dir_objeto + arquivo_embedding)

        for palavra, value in dic_alinhamento.items():

            # dic_json[palavra] = "Objeto " + str(dic_alinhamento[palavra])
            palavra_radio_button = palavra.replace(" ", "_")
            dic_json[
                palavra] = '<label><input type="radio" value="sim" name="radio_' + palavra_radio_button + '">Sim</label><span style="margin: 0 10px 0 10px;"></span>  <label><input type="radio"  value="nao" name="radio_' + palavra_radio_button + '">Não</label>'
            x, y, w, h = bbox_objects[0].Rect()

            # size_caracters = len(palavra) * 15
            #draw bounding box in img_original
            cv2.rectangle(
                img_original, (x, y), (x + w, y + h),
                self.colors_bounding_box[self.index_cor_bounding_box], 2)
            # cv2.rectangle(img_original,(x,y),(x + size_caracters, y + 30),(0,0,0),thickness=-1)
            # cv2.putText(img_original, palavra, (x + 3, y + 20),
            #             cv2.FONT_HERSHEY_DUPLEX, 0.8, (255, 255, 255), 1)
            self.index_cor_bounding_box += 1

            #remove a bounding box
            bbox_objects.pop(0)

        cv2.imwrite("static/" + "alinhamento2.jpg", img_original)
        return dic_json
예제 #4
0
    def _experiment_1(self):
        """Experimento 4 + Experimento 2"""
        arquivo_wup = "/wup_top5.txt"
        img_original = cv2.imread("static/alinhamento2.jpg")
        bbox_objects = self._get_bounding_objects()
        dic_alinhamento = {}
        num_objeto = 0
        lst_palavras_visuais = self.read_words_visual("visual_words.txt")

        for bbox in bbox_objects:
            bbox.lst_cnn.append(bbox.objeto)

        #     for palavra in self.lst_substantivos:
        #         if palavra in bbox.lst_cnn:
        #             dic_alinhamento[palavra] = num_objeto
        #             num_objeto += 1
        #             break

        dic_json = {}

        # for palavra, value in dic_alinhamento.items():

        #     dic_json[palavra] = "Objeto " + str(dic_alinhamento[palavra])
        #     x, y, w, h = bbox_objects[0].Rect()

        #     #draw bounding box in img_original
        #     cv2.rectangle(img_original, (x, y), (x + w, y + h), (0, 255, 0), 2)
        #     cv2.putText(img_original, "Objeto" + str(dic_alinhamento[palavra]), (x + 15, y + 30),
        #                 cv2.FONT_HERSHEY_TRIPLEX, 0.9, (0, 255, 0), 1)

        #     #remove a bounding box
        #     print("REMOVIDA:" + palavra)
        #     bbox_objects.pop(0)

        # cv2.imwrite("static/" + "alinhamento2.jpg", img_original)
        # img_original = cv2.imread("static/alinhamento2.jpg")
        #bbox_objects = self._get_bounding_objects()

        #               S I M I L A R I D A D E       W U P
        dic_alinhamento = {}

        if not bbox_objects:
            return dic_json

        for bbox in bbox_objects:
            #cria uma pasta com nome {num_foto-nome_objeto}
            object_name = str(bbox.imagem) + "-" + bbox.objeto
            if not os.path.exists(self.path_folder + "/" + object_name):
                os.mkdir(self.path_folder + "/" + object_name)
            dir_objeto = self.path_folder + "/" + object_name

            # dicionario para calcular as distancias da palavra da Bbox para todos substantivos
            dicionario_distancias_wup = {}
            index_maior_palavra = 0
            palavra_ranqueada = ""
            distancia_ranqueada = 0

            for substantivo in self.lst_substantivos:
                maior_distancia = 0
                lst_synsets = wn.synsets(substantivo, pos=wn.NOUN)
                for j in range(0, len(lst_synsets)):
                    #pega um dos synsets referentes ao substantivo
                    synset = str(lst_synsets[j])
                    synset = synset.replace("Synset('", "")
                    synset = synset.replace("')", "")
                    word_substantivo = wn.synset(synset)
                    for palavra in bbox.lst_cnn:
                        palavra_bbox = palavra  # obtém a palavra que está na Bbox
                        palavra_bbox = TrocarNomes(palavra_bbox)
                        word_bounding = TrazerSynsetBoundingBox(
                            palavra_bbox)  #synset da bbox

                        if word_bounding is None:
                            lst_synsets_cnn = wn.synsets(palavra_bbox,
                                                         pos=wn.NOUN)
                            for k in range(0, len(lst_synsets_cnn)):
                                synset = str(
                                    lst_synsets_cnn[k]
                                )  #pega um dos synsets referentes ao substantivo
                                synset = synset.replace("Synset('", "")
                                synset = synset.replace("')", "")
                                word_bounding = wn.synset(synset)

                                try:
                                    distancia_wup = word_substantivo.wup_similarity(
                                        word_bounding)

                                except:
                                    distancia_wup = 0
                                if distancia_wup > maior_distancia:
                                    maior_distancia = distancia_wup
                                    # index_maior_palavra = i
                                    #palavra_ranqueada = substantivo
                        else:
                            try:
                                distancia_wup = word_substantivo.wup_similarity(
                                    word_bounding)

                            except:
                                distancia_wup = 0
                                if distancia_wup > maior_distancia:
                                    maior_distancia = distancia_wup
                dicionario_distancias_wup[substantivo] = maior_distancia

            sorted_wup = sorted(dicionario_distancias_wup.items(),
                                key=operator.itemgetter(1),
                                reverse=True)

            wup_deque = deque()

            palavra_ranqueada = sorted_wup[0][0]

            #para cada palavra da sorted wup (0 a 4)
            if sorted_wup[0][0] not in lst_palavras_visuais:
                for z in range(0, 5):
                    try:
                        #verifica se esta na lista das palavras visuais
                        if sorted_wup[z][0].lower() in lst_palavras_visuais:
                            wup_deque.appendleft(sorted_wup[z][0])
                        else:
                            wup_deque.append(sorted_wup[z][0])
                    except:
                        pass

                    # se estiver sobe uma posicao na lista
                palavra_ranqueada = wup_deque[0]

            dic_alinhamento[palavra_ranqueada] = num_objeto
            num_objeto += 1
            print(maior_distancia)
            print(palavra_ranqueada)
            # ESCREVE NO DIRETORIO O TOP-5
            top5 = ""
            for z in range(0, 5):
                try:
                    top5 += self.dict_lematizado[sorted_wup[z][0].lower(
                    )] + "-------" + str(sorted_wup[z][1]) + "\n"
                except:
                    pass
            utils.escrever_arquivo(top5, dir_objeto + arquivo_wup)

        # _________________ALINHAMENTO________________
        for palavra, value in dic_alinhamento.items():
            # dic_json[palavra] = "Objeto " + str(dic_alinhamento[palavra])
            palavra_radio_button = palavra.replace(" ", "_")
            dic_json[
                palavra] = '<label><input type="radio" value="sim" name="radio_' + palavra_radio_button + '">Sim</label><span style="margin: 0 10px 0 10px;"></span>  <label><input type="radio"  value="nao" name="radio_' + palavra_radio_button + '">Não</label>'
            x, y, w, h = bbox_objects[0].Rect()
            size_caracters = len(palavra) * 15

            #draw bounding box in img_original

            cv2.rectangle(
                img_original, (x, y), (x + w, y + h),
                self.colors_bounding_box[self.index_cor_bounding_box], 2)
            # cv2.rectangle(img_original,(x,y),(x + size_caracters, y + 30),(0,0,0),thickness=-1)
            # cv2.putText(img_original, palavra, (x + 3, y + 20),
            #             cv2.FONT_HERSHEY_DUPLEX, 0.8, (255, 255, 255), 1)
            self.index_cor_bounding_box += 1

            #remove a bounding box
            bbox_objects.pop(0)

        cv2.imwrite("static/" + "alinhamento2.jpg", img_original)
        return dic_json
예제 #5
0
    def _experiment_3(self):
        bbox_pessoas = self._get_bounding_persons()

        qtd_bbox_pessoas = len(bbox_pessoas)
        qtd_pessoas_legenda = len(self.pessoas_legenda)
        qtd_pessoas_texto = len(self.pessoas_texto)
        nomes_alinhamento = []
        img_original = None  # imagem original

        if qtd_bbox_pessoas > 0:  # Se existirem pessoas para serem alinhadas
            if qtd_pessoas_legenda > 0:  # Se não houver nomes na legenda
                nomes_alinhamento = list(
                    self.pessoas_legenda
                )  #copia para a lista oficial de nomes que serão alinhados
            else:  # pega nomes do texto para completar a lista de nomes para alinhamento
                for nome in self.pessoas_texto:  # para cada nome do texto
                    nomes_alinhamento.append(
                        nome.palavra)  # adiciona o nome na lista
                    if len(
                            nomes_alinhamento
                    ) == qtd_bbox_pessoas:  # se o número de pessoas for o mesmo da quantidade de pessoas
                        break

            nomes_dlib = utils.file_to_List(
                "/data/alinhador/database_names.txt")
            dic_alinhamento = {}
            removed_Bbox = None  # variavel que armazena o bbox que sera removido caso encontre

            names_to_remove = []
            face_recognition = FaceRecognition()
            # Varre a lista de nomes
            for nome in nomes_alinhamento:
                nome = utils.removerAcentosECaracteresEspeciais(nome)
                if nome in nomes_dlib:  # se o nome existir nos dados do DLIB
                    img_original = cv2.imread("static/alinhamento2.jpg")
                    for bBox in bbox_pessoas:  # para cada bounding box
                        new_sample = img_original.copy()
                        crop = new_sample[bBox.top:bBox.bot,
                                          bBox.left:bBox.right]
                        cv2.imwrite("bBoxImage.jpg", crop)
                        distancia = 1
                        distancia = face_recognition.comparar_pessoas(
                            "bBoxImage.jpg", nome)
                        if isinstance(distancia, int) or isinstance(
                                distancia, float):
                            print(distancia)
                            if distancia < 0.50:  #a face da Bbox corresponde com alguma imagem do nome no dlib
                                names_to_remove.append(nome)
                                dic_alinhamento[
                                    nome] = bBox  # grava o crop da imagem no dicionario
                                bBox.label = nome  # grava o nome na bBox
                                DIR_pessoa = "/data/alinhador/faceDB/lfw/" + nome.replace(
                                    " ", "_") + "/"
                                qtd_imagens = len(
                                    [i for i in os.listdir(DIR_pessoa)]) + 1
                                #envia a crop da imagem para a pasta do dlib correspondente
                                os.rename(
                                    "bBoxImage.jpg",
                                    DIR_pessoa + nome.replace(" ", "_") + "_" +
                                    str(qtd_imagens) + ".jpg")
                                removed_Bbox = bBox

                                break  # vai para o proximo nome

                    if removed_Bbox in bbox_pessoas:
                        bbox_pessoas.remove(
                            removed_Bbox
                        )  #remove das Bbox uma face já alinhada
                else:
                    #busca as imagens da pessoa no google imagens
                    folder_g_image = g_image.get_images(nome)
                    print("CRIOU NOME: " + nome)
                    img_original = cv2.imread("static/alinhamento2.jpg")
                    face_recognition.criar_db_g_images(folder_g_image)
                    for bBox in bbox_pessoas:  # para cada bounding box
                        new_sample = img_original.copy()
                        crop = new_sample[bBox.top:bBox.bot,
                                          bBox.left:bBox.right]  #corta a Bbox
                        cv2.imwrite("bBoxImage.jpg",
                                    crop)  # cria a imagem da Bbox
                        distancia = face_recognition.comparar_pessoas_google_imagens(
                            "bBoxImage.jpg", nome)
                        if isinstance(distancia, int) or isinstance(
                                distancia, float):
                            print(distancia)
                            if distancia < 0.50:  #a face da Bbox corresponde com alguma imagem do google imagens
                                names_to_remove.append(nome)
                                dic_alinhamento[
                                    nome] = bBox  # grava o crop da imagem no dicionario
                                bBox.label = nome  # grava o nome na bBox
                                DIR_pessoa = "/data/alinhador/faceDB/lfw/" + nome.replace(
                                    " ", "_") + "/"
                                if not os.path.exists(DIR_pessoa):
                                    os.makedirs(DIR_pessoa)
                                qtd_imagens = len(
                                    [i for i in os.listdir(DIR_pessoa)]) + 1
                                #envia a crop da imagem para a pasta do dlib correspondente
                                os.rename(
                                    "bBoxImage.jpg",
                                    DIR_pessoa + nome.replace(" ", "_") + "_" +
                                    str(qtd_imagens) + ".jpg")
                                nomes_dlib.append(nome)
                                utils.escrever_arquivo_from_list(
                                    nomes_dlib,
                                    "/data/alinhador/database_names.txt")
                                removed_Bbox = bBox

                                break  # Quando encontra sai e vai para o próximo nome
                    if removed_Bbox in bbox_pessoas:
                        bbox_pessoas.remove(
                            removed_Bbox
                        )  #remove das Bbox uma face já alinhada

            texto = ""
            num_pessoa = 0
            dic_json = {}
            for key, value in dic_alinhamento.items():
                #showfig(value, key)
                texto += key + "= " + str(value.imagem) + "\n"
                num_pessoa += 1
                dic_json[key] = "Pessoa " + str(num_pessoa)
                x, y, w, h = value.Rect()
                cv2.rectangle(img_original, (x, y), (x + w, y + h),
                              (0, 0, 255), 2)
                cv2.putText(img_original, "Pessoa " + str(num_pessoa),
                            (x + 15, y + 15), cv2.FONT_HERSHEY_TRIPLEX, 0.5,
                            (0, 255, 0), 1)

            PATH_PROJETO = os.path.dirname(os.path.abspath(__file__)) + "/"
            #cv2.imwrite(PATH_PROJETO+"/static/" + "alinhamento2.jpg", img_original)
            path_arquivo = self.path_noticia + "alinhamento_pessoas.txt"
            utils.escrever_arquivo(texto, path_arquivo)

            print(names_to_remove)
            #remove os nomes ja alinhados
            for name in names_to_remove:
                nomes_alinhamento.remove(name)

            #TODO: remover isso
            nomes_alinhamento.append("DESCONHECIDO")

            #aplica o experimento 1
            while len(bbox_pessoas) > 0 and len(nomes_alinhamento) > 0:
                entidade = nomes_alinhamento[0]
                texto += entidade + "= " + str(bbox_pessoas[0].imagem) + "\n"
                x, y, w, h = bbox_pessoas[0].Rect()
                num_pessoa += 1
                dic_json[entidade] = "Pessoa " + str(num_pessoa)

                #draw bounding box in img_original
                cv2.rectangle(img_original, (x, y), (x + w, y + h),
                              (0, 0, 255), 2)
                cv2.putText(img_original, "Pessoa " + str(num_pessoa),
                            (x + 15, y + 15), cv2.FONT_HERSHEY_TRIPLEX, 0.5,
                            (0, 255, 0), 1)

                #remove a pessoa e a bounding box
                nomes_alinhamento.pop(0)
                bbox_pessoas.pop(0)

            cv2.imwrite("static/" + "alinhamento2.jpg", img_original)
            path_arquivo = self.path_noticia + "alinhamento_pessoas.txt"
            utils.escrever_arquivo(texto, path_arquivo)
            return dic_json
예제 #6
0
    def _experiment_2(self):
        dic_json = {}
        bbox_pessoas = self._get_bounding_persons()

        qtd_bbox_pessoas = len(bbox_pessoas)
        qtd_pessoas_legenda = len(self.pessoas_legenda)
        qtd_pessoas_texto = len(self.pessoas_texto)
        nomes_alinhamento = []

        img_original = None  # imagem original

        if qtd_bbox_pessoas > 0:  # Se existirem pessoas para serem alinhadas
            if qtd_pessoas_legenda > 0:  # Se não houver nomes na legenda
                nomes_alinhamento = list(
                    self.pessoas_legenda
                )  #copia para a lista oficial de nomes que serão alinhados

            for nome in self.pessoas_texto:  # para cada nome do texto
                if nome.palavra not in nomes_alinhamento:
                    nomes_alinhamento.append(
                        nome.palavra)  # adiciona o nome na lista

            nomes_dlib = utils.file_to_List(
                "/data/alinhador/database_names.txt")

            dic_alinhamento = {}
            removed_Bbox = None  # variavel que armazena o bbox que sera removido caso encontre

            names_to_remove = []
            face_recognition = FaceRecognition()
            # Varre a lista de nomes

            for nome in nomes_alinhamento:
                print(nome)
                nome = utils.removerAcentosECaracteresEspeciais(nome)
                if nome in nomes_dlib:  # se o nome existir nos dados do DLIB
                    img_original = cv2.imread("static/alinhamento2.jpg")
                    for bBox in bbox_pessoas:  # para cada bounding box
                        new_sample = img_original.copy()
                        crop = new_sample[bBox.top:bBox.bot,
                                          bBox.left:bBox.right]
                        cv2.imwrite("bBoxImage.jpg", crop)
                        distancia = 1
                        distancia = face_recognition.comparar_pessoas(
                            "bBoxImage.jpg", nome)
                        if isinstance(distancia, int) or isinstance(
                                distancia, float):

                            if distancia < 0.55:  #a face da Bbox corresponde com alguma imagem do nome no dlib
                                names_to_remove.append(nome)
                                dic_alinhamento[
                                    nome] = bBox  # grava o crop da imagem no dicionario
                                bBox.label = nome  # grava o nome na bBox
                                DIR_pessoa = "/data/alinhador/faceDB/lfw/" + nome.replace(
                                    " ", "_") + "/"
                                qtd_imagens = len(
                                    [i for i in os.listdir(DIR_pessoa)]) + 1
                                #envia a crop da imagem para a pasta do dlib correspondente
                                os.rename(
                                    "bBoxImage.jpg",
                                    DIR_pessoa + nome.replace(" ", "_") + "_" +
                                    str(qtd_imagens) + ".jpg")
                                removed_Bbox = bBox
                                names_to_remove.append(nome)
                                break  # vai para o proximo nome

                    if removed_Bbox in bbox_pessoas:
                        bbox_pessoas.remove(
                            removed_Bbox
                        )  #remove das Bbox uma face já alinhada
                else:
                    #busca as imagens da pessoa no google imagens
                    folder_g_image = g_image.get_images(nome)
                    print("CRIOU NOME: " + nome)
                    img_original = cv2.imread("static/alinhamento2.jpg")
                    face_recognition.criar_db_g_images(folder_g_image)
                    for bBox in bbox_pessoas:  # para cada bounding box
                        new_sample = img_original.copy()
                        crop = new_sample[bBox.top:bBox.bot,
                                          bBox.left:bBox.right]  #corta a Bbox
                        cv2.imwrite("bBoxImage.jpg",
                                    crop)  # cria a imagem da Bbox
                        distancia = face_recognition.comparar_pessoas_google_imagens(
                            "bBoxImage.jpg", nome)
                        if isinstance(distancia, int) or isinstance(
                                distancia, float):

                            if distancia < 0.6:  #a face da Bbox corresponde com alguma imagem do google imagens
                                names_to_remove.append(nome)
                                dic_alinhamento[
                                    nome] = bBox  # grava o crop da imagem no dicionario
                                bBox.label = nome  # grava o nome na bBox
                                DIR_pessoa = "/data/alinhador/faceDB/lfw/" + nome.replace(
                                    " ", "_") + "/"
                                if not os.path.exists(DIR_pessoa):
                                    os.makedirs(DIR_pessoa)
                                qtd_imagens = len(
                                    [i for i in os.listdir(DIR_pessoa)]) + 1
                                #envia a crop da imagem para a pasta do dlib correspondente
                                os.rename(
                                    "bBoxImage.jpg",
                                    DIR_pessoa + nome.replace(" ", "_") + "_" +
                                    str(qtd_imagens) + ".jpg")
                                nomes_dlib.append(nome)
                                utils.escrever_arquivo_from_list(
                                    nomes_dlib,
                                    "/data/alinhador/database_names.txt")
                                removed_Bbox = bBox
                                names_to_remove.append(nome)
                                break  # Quando encontra sai e vai para o próximo nome
                    if removed_Bbox in bbox_pessoas:
                        bbox_pessoas.remove(
                            removed_Bbox
                        )  #remove das Bbox uma face já alinhada

            texto = ""
            num_pessoa = 0

            for entidade, value in dic_alinhamento.items():
                #showfig(value, key)
                texto += entidade + "= " + str(value.imagem) + "\n"
                num_pessoa += 1
                # dic_json[entidade] = "Pessoa "+str(num_pessoa)
                palavra_radio_button = entidade.replace(" ", "_")
                dic_json[
                    entidade] = '<label><input type="radio" value="sim" name="radio_' + palavra_radio_button + '">Sim</label><span style="margin: 0 10px 0 10px;"></span>  <label><input type="radio"  value="nao" name="radio_' + palavra_radio_button + '">Não</label>'
                x, y, w, h = value.Rect()
                # cv2.rectangle(img_original, (x, y), (x + w, y + h), (0, 0, 255), 2)
                # cv2.putText(img_original, entidade, (x + 15, y + 30), cv2.FONT_HERSHEY_TRIPLEX, 0.9, (0, 255, 0), 1)
                # size_caracters = len(entidade) * 15

                print("ENTIDADE:" + entidade)
                cv2.rectangle(
                    img_original, (x, y), (x + w, y + h),
                    self.colors_bounding_box[self.index_cor_bounding_box], 2)
                self.index_cor_bounding_box += 1
                # cv2.rectangle(img_original,(x,y),(x + size_caracters, y + 30),(0,0,0),thickness=-1)
                # cv2.putText(img_original, entidade, (x + 3, y + 20),
                #         cv2.FONT_HERSHEY_DUPLEX, 0.8, (255, 255, 255), 1)

            PATH_PROJETO = os.path.dirname(os.path.abspath(__file__)) + "/"
            cv2.imwrite("static/" + "alinhamento2.jpg", img_original)
            path_arquivo = self.path_noticia + "alinhamento_pessoas.txt"
            utils.escrever_arquivo(texto, path_arquivo)
            return dic_json