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 torchsam_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 nppicture = 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.