[PYTHON] Générez une image incorrecte du classificateur en cascade en la coupant de l'endroit où l'image correcte de l'image correcte n'est pas affichée.

Ceci est le premier message. C'est presque mon propre mémorandum.

introduction

Le classificateur en cascade est un algorithme de détection de l'objet cible à partir de l'image. Lors de l'apprentissage du classificateur en cascade, il est nécessaire de préparer une image correcte, un fichier qui spécifie où se trouve l'objet cible et une image qui n'affiche pas l'objet cible (image incorrecte). Il existe de nombreux exemples d'utilisation d'images collectées au hasard sur le net comme des réponses incorrectes lorsqu'elles sont recherchées sur Google. Cependant, étant donné la propriété du classificateur en cascade qui "continue à apprendre jusqu'à ce que le taux de faux positifs devienne inférieur à un certain niveau", la collecte aléatoire d'images incorrectes n'est pas toujours possible compte tenu de la situation où le classificateur en cascade créé est utilisé dans un nombre limité de situations. Je pense que ce n'est peut-être pas une bonne idée. (Le calcul prend plus de temps que nécessaire. Le taux de faux négatifs augmente trop pour atteindre la norme de taux de faux positifs. En premier lieu, l'image qui devrait être la bonne réponse est mélangée dans l'image de réponse incorrecte (il y a pas mal de visages de personnes, etc.) Puis?)) En d'autres termes, en supposant que l'entrée est limitée, j'ai écrit le programme introduit cette fois sur la base de l'idée que les réponses incorrectes à préparer devraient être limitées aux réponses incorrectes dans les conditions limitées. .. Ou il peut être utilisé dans des situations où vous souhaitez augmenter le nombre d'images incorrectes qui semblent être efficaces rapidement. Je l'ai utilisé pour détecter les yeux à partir d'un jeu de données qui "déplaçait le visage d'une personne de l'avant (distance de la caméra, etc.)".

Qu'est-ce qu'un classificateur en cascade?

Voici un lien avec une explication facile à comprendre du classificateur en cascade

code

Cliquez avec le bouton gauche de la souris et relâchez pour spécifier une zone rectangulaire. à l'image suivante avec un Effacez le dernier rectangle avec d Terminer le programme avec esc Lorsqu'il est terminé, il est censé enregistrer sa progression, mais les opérations détaillées n'ont pas été confirmées. Puisqu'il s'agit d'un programme défectueux, il ne fonctionnera que si vous mettez un fichier texte (le nom du fichier est log.txt) avec «0 0» écrit dans le répertoire go-path.

make_neg_img.py


#
# written by hdnkt 2020/8/28
#

import os
import cv2
import numpy as np
#Gestion des événements de souris et préservation des zones carrées
class Img_maker:
    sx = 0
    sy = 0
    gx = 0
    gy = 0
    boxes = []
    state = 0#0:Avant d'appuyer sur 1:Au milieu de pousser
    def __init__(self):
        self.sx = 0
        self.sy = 0
        self.gx = 0
        self.gy = 0
        self.boxes = []
        self.state = 0

    #Gestion des événements de souris
    def mouse_event(self,event,x,y,flags,param):
        self.gx = x
        self.gy = y
        if event == cv2.EVENT_LBUTTONDOWN:
            self.sx = x
            self.sy = y
            self.state = 1
        if event == cv2.EVENT_LBUTTONUP:
            self.gx = x
            self.gy = y
            self.boxes.append([self.sx,self.sy,self.gx,self.gy])
            self.state = 0
    
    #Supprimer la zone rectangulaire la plus récente
    def pop_box(self):
        if len(self.boxes)<=0:
            return
        self.boxes.pop(len(self.boxes)-1)
    
    #Je vais vous apprendre tous les domaines
    def get_boxes(self):
        for i in self.boxes:
            yield i
    
    #Que faites-vous maintenant? 0:Non poussé 1:Pousser
    def get_state(self):
        return self.state

    #Je renvoie les coordonnées du carré que je dessine maintenant. Appelez uniquement en appuyant sur
    def get_nowRect(self):
        if self.state == 0:
            return
        else:
            return self.sx,self.sy,self.gx,self.gy
        


if __name__ == "__main__":

    #Pour prepath, spécifiez le dossier contenant l'image d'origine.
    pre_path =
    #Pour gopath, spécifiez le dossier dans lequel placer l'image incorrecte générée.
    go_path =
    subject_num = os.listdir(pre_path)

    #Je veux enregistrer le compteur et quelle image j'ai vue la dernière fois. Dois-je l'écrire dans un fichier texte?
    counter = 0
    start = 0
    with open(go_path+"log.txt") as f:
        s = f.read()
        counter,start = map(int,s.split())

    for i in range(start,len(subject_num)):
        with open(go_path+"log.txt",mode="w") as f:
            f.write(str(counter)+" "+str(i))

        i = subject_num[i]
        #Charger l'image
        tmp_img = cv2.imread(pre_path+i)
        raw = tmp_img.copy()
        cv2.namedWindow(i)
        #Configurer le créateur d'images
        img_Maker = Img_maker()
        cv2.setMouseCallback(i,img_Maker.mouse_event)
        #Afficher l'image à l'écran
        while 1:
            #Préparer une copie pour le dessin
            tmp_img=raw.copy()
            for j in img_Maker.get_boxes():
                cv2.rectangle(tmp_img, (j[0],j[1]),(j[2],j[3]), (255,255,255), thickness=2)
            #Dessinez également le carré que vous dessinez maintenant
            if img_Maker.get_state()==1:
                sx,sy,gx,gy = img_Maker.get_nowRect()
                cv2.rectangle(tmp_img, (sx,sy),(gx,gy), (255,255,255), thickness=2)

            cv2.imshow(i,tmp_img)

            end = False
            #Opération clé
            k = 0
            k = cv2.waitKey(1)
            if k==ord("a"):#Vers l'image suivante
                break
            if k==ord("d"):#Supprimer l'image précédente
                img_Maker.pop_box()
            if k==27:#Enregistrez le résultat et quittez
                end = True
                break
        
        #Exporter l'image
        for j in img_Maker.get_boxes():
            counter+=1
            print(go_path+str(counter)+".bmp")
            cv2.imshow("a",raw[j[1]:j[3],j[0]:j[2]])
            cv2.imwrite(go_path+str(counter)+".bmp",raw[j[1]:j[3],j[0]:j[2]])
        
        #Détruire.
        cv2.destroyAllWindows()

        if end:
            break

Résumé

Après avoir appris le classificateur en cascade, additionnez les résultats.

Recommended Posts

Générez une image incorrecte du classificateur en cascade en la coupant de l'endroit où l'image correcte de l'image correcte n'est pas affichée.
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
Autour de l'endroit où la valeur d'Errbot est stockée
À en juger par l'image du chien Shiba en apprenant en profondeur si c'est mon enfant (1)
Juger si c'est mon enfant à partir de l'image du chien Shiba par apprentissage en profondeur (2) Augmentation des données / transfert d'apprentissage / réglage fin