Ceci est le premier message. C'est presque mon propre mémorandum.
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.)".
Voici un lien avec une explication facile à comprendre du classificateur en cascade
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
Après avoir appris le classificateur en cascade, additionnez les résultats.
Recommended Posts