Eine Aufgabe zum Erkennen "objektähnlicher" Teile in einem Bild. Bereiten Sie als groben Fluss mehrere Rechtecke vor und schieben Sie sie auf das Bild, um "objektähnliche" Teile zu finden. Beachten Sie, dass nicht nur erkannt wird, was ein Objekt oder ein bestimmtes Objekt ist. Zum Beispiel ist es nicht möglich, nur ein Auto im Bild zu finden. Es ist eine berühmte Aufgabe, die auch in R-CNN verwendet wird, das für seine Objekterkennungsmethode bekannt ist, aber als ich es nachgeschlagen habe, gab es überraschend wenige Artikel, deshalb habe ich es in diesem Artikel zusammengefasst.
Einfache Installation mit Pip
pip install selective-search
Installieren Sie opencv mit pip
Versuchen Sie, die folgenden vier Bilder auszuführen. Das Bild ist Pascal VOC.
Wagen | Hund | Möbel |
---|---|---|
random Es gibt einen zufälligen Parameter, aber die Referenz sagt:
If random set to True, function will carry out pseudo random sorting. It only alters sequences of bounding boxes, instead of locations, which prevents heavily emphasis on large regions as combing proposals from up to 80 different strategies[1]. This only has a significant impact when selecting a subset of region proposals with high rankings, as in RCNN.
Offensichtlich werden bei der selektiven Suche großen Rechtecken Vorrang eingeräumt und dargestellt. Wenn ein Objekt mit RCNN usw. erkannt wird, ist es unmöglich, kleine Objekte zu erkennen. Durch zufälliges Setzen können also nur große Objekte verhindert werden.
mode Bei der selektiven Suche gibt es drei Modi
Entsprechend der Referenz gibt es die folgenden Unterschiede.
Das heißt, als einzelne, schnelle Qualität nimmt die Anzahl der Rechtecke zu, mit anderen Worten, die Anzahl der Versuche nimmt zu. Andererseits gibt es auch das Problem der Verlangsamung. Das Folgende ist das Versuchsergebnis.
Modus | Wagen | Möbel | Hund |
---|---|---|---|
single | |||
fast | |||
quality |
Geschätzte Objekte nehmen als einzelne, schnelle Qualität zu, aber es gibt fast keine Fälle, in denen so viele Rechtecke erforderlich sind. Es scheint, dass es ausreicht, die Grundlagen mit Single zu implementieren.
Selbst wenn single festgelegt ist, gibt es zu viele Rechtecke. Bei der Implementierung dieses Mal haben wir beschlossen, die Ausgabe von Rechtecken zu unterdrücken, die keine bestimmte Größe haben.
Verzeichnisaufbau
├── pic #Original Bild
├── result #Ergebnisbild
│ ├── fast
│ ├── quality
│ └── single
└── exe.py #Ausführungsdatei
Ausführungsdatei
import cv2
import glob
from selective_search import selective_search
###Parametereinstellungen
MODE="single"
#MODE="fast"
#MODE="quality"
MINH=100
MINW=100
###E / A-Verzeichniseinstellungen
ORGDIR="./pic/"
RSTDIR="./result/"+MODE+"/"
def search():
###Pfad der Eingabedatei lesen
tgtpaths=glob.glob(ORGDIR+"*")
for tgtpath in tgtpaths:
###Einstellung des Ausgabedateipfads
rstpath=tgtpath.replace(ORGDIR,RSTDIR)
###Zielbild lesen
tgtimg = cv2.imread(tgtpath, cv2.IMREAD_COLOR)
###Führen Sie die selektive Suche aus
boxes = selective_search(tgtimg, mode=MODE,random=False)
for box in boxes:
###Zeigen Sie keine Rechtecke ohne eine bestimmte Länge an
if abs(box[2]-box[0]) < MINW or abs(box[3]-box[1])<MINH:
continue
###Rechteckige Zeichnung
cv2.rectangle(tgtimg, (box[0],box[1]), (box[2],box[3]), (0,255,0), thickness=1)
###Ausgabe
print(rstpath)
cv2.imwrite(rstpath, tgtimg)
if __name__=="__main__":
search()
Wagen | Möbel | Hund |
---|---|---|
Der "objektähnliche" Teil wurde durch selektive Suche dargestellt. In RCNN usw. wird die Objekterkennung durchgeführt, indem diese Kandidaten auf einen Klassifizierer angewendet werden.
Recommended Posts