SegmentAnything ist erstaunlich, weil es alles sauber segmentieren (Objekte ausschneiden) kann | von MLBoy | Juni 2023

0
24


Segmentieren Sie alles
Sie können alles segmentieren.
Denn Sie können ganz einfach die Punkte und Bereiche angeben, die Sie segmentieren möchten.
Dies erleichtert die Segmentierung wie bei einer Bildbearbeitungssoftware.

Sie können es vorerst auf der Demoseite unten ausprobieren.

Installieren

git clone https://github.com/facebookresearch/segment-anything.git
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth

Modellinstanziierung

from segment_anything import sam_model_registry, SamPredictor
import torch

sam_checkpoint = “sam_vit_h_4b8939.pth”
model_type = “vit_h”

gadget = “cuda”

sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(gadget=gadget)

predictor = SamPredictor(sam)

Ausführung

Wir werden es mit dem Bild unten versuchen.


import cv2
import numpy as np

picture = cv2.imread('photos/kyoto.jpg')
picture = cv2.cvtColor(picture, cv2.COLOR_BGR2RGB)
predictor.set_image(picture) # Picture to embedding

Holen Sie sich die Maske über die Eingabeaufforderung.
Es stehen verschiedene Eingabeaufforderungen zur Verfügung.

einen Punkt angeben

Führen Sie dies aus, indem Sie einen Punkt mit einem Objekt auf dem Bild angeben.
Der oben in der Mitte der Flagge angebrachte Stern ist der markierte Punkt.

Die Bezeichnung ist 1 für den Vordergrund und 0 für den Hintergrund.

Es werden drei äußerst zuverlässige Masken erhalten.

input_point = np.array([[4200, 2000]])
input_label = np.array([1])

masks, scores, logits = predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=True,
)

masks ist ein numpy.array aus True und False mit derselben Type wie das Bild (1, Breite, Höhe).

Array([[False, False, False, …, False, False, False],
[False, False, False, …, False, False, False],
[False, False, False, … , False, False, False],
…,
[False, False, False, …, False, False, False],
[False, False, False, …, False, False, False],
[False , False, False, …, False, False, False]],

Durch Setzen von multimask_output=True können Sie drei äußerst zuverlässige Maskenkandidaten erhalten.
Dadurch werden die resultierenden Masken zu einem numpy.array der Type (3, Breite, Höhe).

Geben Sie mehrere Punkte an

Führen Sie es aus, indem Sie mehrere Punkte mit Objekten auf dem Bild angeben.
Zu diesem Zeitpunkt kann das Ergebnis der vorherigen Inferenz für diese Inferenz verwendet werden, indem die Highscore-Maskenausgabe aus der vorherigen Inferenz eines Punktes an die Eingabe übergeben wird. Dadurch erhalten Sie eine genauere Maske.

input_point = np.array([[2000, 600], [3000, 400],  [2000, 190], [1000, 1000]])
input_label = np.array([1, 1, 1, 1])

mask_input = logits[np.argmax(scores), :, :] # Select the mannequin's finest masks

masks, _, _ = predictor.predict(
point_coords=input_point,
point_labels=input_label,
mask_input=mask_input[None, :, :],
multimask_output=False,
)

Durch Angabe eines Punktes im Hintergrund können Sie den Bereich des Vordergrundobjekts einschränken.

Aus der Maske der gesamten Katze können Sie nur den Schwanz segmentieren, indem Sie den Körper wie folgt als Hintergrund (Beschriftung 0) angeben.

input_point = np.array([[390, 1000], [500, 700]])
input_label = np.array([1, 0])

mask_input = logits[np.argmax(scores), :, :] # Select the mannequin's finest masks

masks, _, _ = predictor.predict(
point_coords=input_point,
point_labels=input_label,
mask_input=mask_input[None, :, :],
multimask_output=False,
)

Geben Sie als Aufforderung ein Kästchen ein

Sie können den Begrenzungsrahmen eines Objekts im Bild anfordern.

input_box = np.array([150, 400, 360, 580]

masks, _, _ = predictor.predict(
point_coords=None,
point_labels=None,
field=input_box[None, :],
multimask_output=False,
)

Verwenden Sie eine Kombination aus Punkten und Kästchen

Sie können Nicht-Beeren-Kuchen mit Kästchen und Negativpunkten maskieren.

input_box = np.array([150, 400, 360, 580])
input_point = np.array([[290, 550]])
input_label = np.array([0])

masks, _, _ = predictor.predict(
point_coords=input_point,
point_labels=input_label,
field=input_box,
multimask_output=False,
)

Aufforderung zur Eingabe mehrerer Kartons

input_boxes = torch.tensor([
[35,90,300,450],
[85,250,220,320],
[90,410,215,550],
[220,360,420,520],
], gadget=predictor.gadget)

transformed_boxes = predictor.remodel.apply_boxes_torch(input_boxes, picture.form[:2])
masks, _, _ = predictor.predict_torch(
point_coords=None,
point_labels=None,
containers=transformed_boxes,
multimask_output=False,
)

Visualisierungsfunktionen

def show_mask(masks, ax, random_color=False):
if random_color:
colour = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
else:
colour = np.array([30/255, 144/255, 255/255, 0.6])
h, w = masks.form[-2:]
mask_image = masks.reshape(h, w, 1) * colour.reshape(1, 1, -1)
ax.imshow(mask_image)

def show_points(coords, labels, ax, marker_size=375):
pos_points = coords[labels==1]
neg_points = coords[labels==0]
ax.scatter(pos_points[:, 0], pos_points[:, 1], colour='inexperienced', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)
ax.scatter(neg_points[:, 0], neg_points[:, 1], colour='purple', marker='*', s=marker_size, edgecolor='white', linewidth=1.25)

def show_box(field, ax):
x0, y0 = field[0], field[1]
w, h = field[2] - field[0], field[3] - field[1]
ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='inexperienced', facecolor=(0,0,0,0), lw=2))

for i, (masks, rating) in enumerate(zip(masks, scores)):
plt.determine(figsize=(10,10))
plt.imshow(picture)
show_mask(masks, plt.gca())
show_points(input_point, input_label, plt.gca())
plt.title(f"Masks {i+1}, Rating: {rating:.3f}", fontsize=18)
plt.axis('off')
plt.present()

In Kombination mit Inpainting können Sie ganz einfach eine Funktion zum Löschen von Objekten erstellen.

🐣

Ich bin freiberuflicher Ingenieur.
Arbeitsberatung
Gerne können Sie uns mit einer kurzen Entwicklungsbeschreibung kontaktieren.
rockyshikoku@gmail.com

Ich erstelle Anwendungen mithilfe von maschinellem Lernen und AR-Technologie.

Ich sende Informationen zum maschinellen Lernen/AR.

GitHub

Twitter
Mittel





Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here