[PYTHON] Generieren Sie ein falsches Bild des Kaskadenklassifikators, indem Sie es an der Stelle ausschneiden, an der das richtige Bild des richtigen Bildes nicht angezeigt wird.

Dies ist der erste Beitrag. Es ist fast mein eigenes Memorandum.

Einführung

Der Kaskadenklassifikator ist ein Algorithmus zum Erkennen des Zielobjekts aus dem Bild. Beim Erlernen des Kaskadenklassifikators müssen ein korrektes Bild, eine Datei, die angibt, wo sich das Zielobjekt befindet, und ein Bild, das das Zielobjekt nicht anzeigt (falsches Bild), vorbereitet werden. Es gibt viele Beispiele für die Verwendung von Bildern, die zufällig aus dem Netz gesammelt wurden, als falsche Antworten beim Googeln. Angesichts der Eigenschaft des Kaskadenklassifikators, dass "das Lernen fortgesetzt wird, bis die Falsch-Positiv-Rate unter ein bestimmtes Niveau fällt", ist die zufällige Erfassung falscher Bilder nicht immer möglich, wenn man bedenkt, dass der erstellte Kaskadenklassifikator in einer begrenzten Anzahl von Situationen verwendet wird. Ich denke, es ist vielleicht keine gute Idee. (Die Berechnung dauert länger als nötig. Die Falsch-Negativ-Rate steigt zu stark an, um die Falsch-Positiv-Rate-Norm zu erreichen. Erstens wird das Bild, das die richtige Antwort sein sollte, in das falsche Antwortbild gemischt (Es gibt einige Gesichter von Menschen usw.). Dann?)) Mit anderen Worten, unter der Annahme, dass die Eingabe begrenzt ist, schrieb ich das diesmal eingeführte Programm auf der Grundlage der Idee, dass die zu erstellenden falschen Antworten innerhalb der begrenzten Bedingungen auf die falschen Antworten beschränkt sein sollten. .. Oder es kann in Situationen verwendet werden, in denen Sie die Anzahl falscher Bilder erhöhen möchten, die schnell wirksam zu sein scheinen. Ich habe es verwendet, um Augen aus einem Datensatz zu erkennen, der "das Gesicht einer Person von vorne bewegt hat (Abstand von der Kamera usw.)".

Was ist ein Kaskadenklassifikator?

Hier ist ein Link mit einer leicht verständlichen Erklärung des Kaskadenklassifikators

Code

Klicken Sie mit der linken Maustaste auf Halten + Loslassen, um einen rechteckigen Bereich anzugeben. zum nächsten Bild mit a Löschen Sie das neueste Rechteck mit d Programm mit esc beenden Wenn es fertig ist, soll es speichern, wie weit es fortgeschritten ist, aber detaillierte Operationen wurden nicht bestätigt. Da es sich um ein fehlerhaftes Programm handelt, funktioniert es nur, wenn Sie eine Textdatei (Dateiname ist log.txt) mit "0 0" in das Verzeichnis "go-path" schreiben.

make_neg_img.py


#
# written by hdnkt 2020/8/28
#

import os
import cv2
import numpy as np
#Umgang mit Mausereignissen und Erhalt quadratischer Flächen
class Img_maker:
    sx = 0
    sy = 0
    gx = 0
    gy = 0
    boxes = []
    state = 0#0:Vor dem Drücken von 1:Mitten im Schieben
    def __init__(self):
        self.sx = 0
        self.sy = 0
        self.gx = 0
        self.gy = 0
        self.boxes = []
        self.state = 0

    #Umgang mit Mausereignissen
    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
    
    #Löschen Sie den neuesten rechteckigen Bereich
    def pop_box(self):
        if len(self.boxes)<=0:
            return
        self.boxes.pop(len(self.boxes)-1)
    
    #Ich werde Ihnen alle Bereiche beibringen
    def get_boxes(self):
        for i in self.boxes:
            yield i
    
    #Was machst du jetzt? 0:Nicht eingeschoben 1:Einschieben
    def get_state(self):
        return self.state

    #Ich gebe die Koordinaten des Quadrats zurück, das ich jetzt zeichne. Rufen Sie nur beim Drücken an
    def get_nowRect(self):
        if self.state == 0:
            return
        else:
            return self.sx,self.sy,self.gx,self.gy
        


if __name__ == "__main__":

    #Geben Sie als Vorpfad den Ordner an, der das Originalbild enthält.
    pre_path =
    #Geben Sie für gopath den Ordner an, in dem das generierte falsche Bild abgelegt werden soll.
    go_path =
    subject_num = os.listdir(pre_path)

    #Ich möchte den Zähler speichern und welches Bild ich zuletzt gesehen habe. Soll ich es in eine Textdatei schreiben?
    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]
        #Bild laden
        tmp_img = cv2.imread(pre_path+i)
        raw = tmp_img.copy()
        cv2.namedWindow(i)
        #Richten Sie den Image Maker ein
        img_Maker = Img_maker()
        cv2.setMouseCallback(i,img_Maker.mouse_event)
        #Bild auf dem Bildschirm anzeigen
        while 1:
            #Bereiten Sie eine Kopie zum Zeichnen vor
            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)
            #Zeichnen Sie auch das Quadrat, das Sie gerade zeichnen
            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
            #Tastenbedienung
            k = 0
            k = cv2.waitKey(1)
            if k==ord("a"):#Zum nächsten Bild
                break
            if k==ord("d"):#Löschen Sie das vorherige Bild
                img_Maker.pop_box()
            if k==27:#Speichern Sie das Ergebnis und beenden Sie es
                end = True
                break
        
        #Bild exportieren
        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]])
        
        #Zerstören.
        cv2.destroyAllWindows()

        if end:
            break

Zusammenfassung

Addieren Sie nach dem Erlernen des Kaskadenklassifikators die Ergebnisse.

Recommended Posts

Generieren Sie ein falsches Bild des Kaskadenklassifikators, indem Sie es an der Stelle ausschneiden, an der das richtige Bild des richtigen Bildes nicht angezeigt wird.
Den Namen der Methode, die ihn aufgerufen hat, finden Sie in der Python-Methode
Um den Ort, an dem der Wert von Errbot gespeichert ist
Nach dem Bild des Shiba-Hundes zu urteilen, indem man tief lernt, ob es mein Kind ist (1)
Beurteilung, ob es sich um mein Kind handelt oder nicht, nach dem Bild des Shiba-Hundes durch tiefes Lernen (2) Datenerhöhung, Transferlernen, Feinabstimmung