рдкреГрдердХ рд╡рд┐рднрд╛рдЬрди рд╡рд╕реНрддреБрдПрдВ
рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрднреА-рдХрднреА рдЕрдиреБрдорд╛рди рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдкреГрдердХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдиреБрд╕реНрдЦрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИUltralytics рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдбред
рдкрдХрд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдирд╛
-
рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рдд рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ
Ultralytics рдкрджрд╛рд╕реАрди рдХрд░рдирд╛
рджреЗрдЦреЗрдВ Ultralytics рдХреНрд╡рд┐рдХрд╕реНрдЯрд╛рд░реНрдЯ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рддреНрд╡рд░рд┐рдд рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдкрдирд╛ рдЕрдиреБрднрд╛рдЧред
-
рдПрдХ рдореЙрдбрд▓ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ
predict()
рдПрдХ рд╕реНрд░реЛрдд рдкрд░ рд╡рд┐рдзрд┐редfrom ultralytics import YOLO # Load a model model = YOLO('yolov8n-seg.pt') # Run inference results = model.predict()
рдХреЛрдИ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рддрд░реНрдХ рдирд╣реАрдВ?
рд╕реНрд░реЛрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛, рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
рдпрд╣ рддреЗрдЬреА рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реИ
predict()
рд╡рд┐рдзрд┐редрд╡рд┐рднрд╛рдЬрди рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдкрд░ рдЬрд╛рдПрдБ рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛рд░реНрдп рдкреГрд╖реНрдаред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП
predict()
рд╡рд┐рдзрд┐, рджреЗрдЦреЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд╛ рдЕрдиреБрднрд╛рдЧред
-
рдЕрдм рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдЖрдХреГрддрд┐ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдВред рдЙрди рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд┐рд╕реА рдЫрд╡рд┐ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╕реНрд░реЛрдд рдЫрд╡рд┐
base-name
рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдирд╛class-label
рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рд╡реИрдХрд▓реНрдкрд┐рдХ)ред# (2) Iterate detection results (helpful for multiple images) for r in res: img = np.copy(r.orig_img) img_name = Path(r.path).stem # source image base-name # Iterate each object contour (multiple detections) for ci,c in enumerate(r): # (1) Get detection class name label = c.names[c.boxes.cls.tolist().pop()]
- рдбрд┐рдЯреЗрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдореЛрдб рдХреЗ рд▓рд┐рдП рдмреЙрдХреНрд╕реЗрдЬрд╝ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ.
- рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП
predict()
рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛
рдлреЙрд░-рд▓реВрдк
рдПрдХ рдПрдХрд▓ рдЫрд╡рд┐ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкрд╣рд▓реЗ рд▓реВрдк рдХреЛ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдЧреАред рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкрд╣рдЪрд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдЫрд╡рд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░реЗрдЧреАред
-
рд╕реНрд░реЛрдд рдЫрд╡рд┐ рд╕реЗ рдПрдХ рдмрд╛рдЗрдирд░реА рдорд╛рд╕реНрдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдорд╛рд╕реНрдХ рдкрд░ рдПрдХ рднрд░рд╛ рд╣реБрдЖ рд╕рдореЛрдЪреНрдЪ рдЦреАрдВрдЪреЗрдВред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЫрд╡рд┐ рдХреЗ рдЕрдиреНрдп рднрд╛рдЧреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг
bus.jpg
рдкрддрд╛ рдЪрд▓рд╛ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдПperson
рдХреНрд▓рд╛рд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рджрд╛рдИрдВ рдУрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред# Create binary mask b_mask = np.zeros(img.shape[:2], np.uint8) # (1) Extract contour result contour = c.masks.xy.pop() # (2) Changing the type contour = contour.astype(np.int32) # (3) Reshaping contour = contour.reshape(-1, 1, 2) # Draw contour onto mask _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
-
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП
c.masks.xy
рджреЗрдЦрдирд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рд╕реЗ рдорд╛рд╕реНрдХ рдЕрдиреБрднрд╛рдЧ. -
рдпрд╣рд╛рдБ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИ
np.int32
рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдПdrawContours()
рдУрдкрдирд╕реАрд╡реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рдиред -
рдУрдкрдирд╕реАрд╡реА
drawContours()
рдлрд╝рдВрдХреНрд╢рди рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдХреГрддрд┐ рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрдЧрд╛[N, 1, 2]
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ
contour
рдЪрд░ред-
c.masks.xy
:: рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореБрдЦреМрдЯрд╛ рд╕рдореЛрдЪреНрдЪ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ(x, y)
. рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рд╕реЗ рдорд╛рд╕реНрдХ рдЕрдиреБрднрд╛рдЧ. -
.pop()
::рдЬреИрд╕рд╛masks.xy
рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рддрддреНрд╡ рд╣реИ, рдЗрд╕ рддрддреНрд╡ рдХреЛpop()
рд╡рд┐рдзрд┐ред -
.astype(np.int32)
::рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗmasks.xy
рдХреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛float32
, рд▓реЗрдХрд┐рди рдпрд╣ рдУрдкрдирд╕реАрд╡реА рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛drawContours()
рдлрд╝рдВрдХреНрд╢рди, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛint32
рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЗ рд▓рд┐рдПред -
.reshape(-1, 1, 2)
:: рдбреЗрдЯрд╛ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рдореЗрдВ рдкреБрди: рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ[N, 1, 2]
рдХрд╣рд╛рдВN
рд╕рдореЛрдЪреНрдЪ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ1
, рдФрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЗ рдмрдирд╛ рд╣реИ2
рдорд╛рдиред рд╡рд╣реА-1
рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЖрдпрд╛рдо рдХреЗ рд╕рд╛рде рдорд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рдЪреАрд▓реА рд╣реИред
рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддреГрдд рдХрд░реЗрдВ
drawContours()
рд╕рдВрд░реВрдкрдгред-
рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдирд╛
contour
рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ рдХреЗ рднреАрддрд░ рдЪрд░,[contour]
, рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╡рд╛рдВрдЫрд┐рдд рд╕рдореЛрдЪреНрдЪ рдореБрдЦреМрдЯрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред -
рдореВрд▓реНрдп
-1
рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯdrawContours()
рдкреИрд░рд╛рдореАрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЫрд╡рд┐ рдореЗрдВ рдореМрдЬреВрдж рд╕рднреА рдЖрдХреГрддрд┐ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИред -
рд╡рд╣реА
tuple
(255, 255, 255)
рд╕рдлреЗрдж рд░рдВрдЧ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рдЗрдирд░реА рдорд╛рд╕реНрдХ рдореЗрдВ рд╕рдореЛрдЪреНрдЪ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрд┐рдд рд░рдВрдЧ рд╣реИред -
рдХреЗ рдЬреЛрдбрд╝
cv2.FILLED
рд╕рдореЛрдЪреНрдЪ рд╕реАрдорд╛ рд╕реЗ рдШрд┐рд░реЗ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╕рдорд╛рди рд░рдВрдЧ рджреЗрдЧрд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рднреА рд╕рдВрд▓рдЧреНрди рдкрд┐рдХреНрд╕реЗрд▓ рд╕рдлреЗрдж рд╣реЛрдВрдЧреЗред -
рджреЗрдЦрдирд╛ OpenCV рдкреНрд░рд▓реЗрдЦрди рдкрд░
drawContours()
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПред
-
-
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕ рдмрд┐рдВрджреБ рд╕реЗ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП 2 рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдж рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрд▓рдЧрд╛рд╡ рд╡рд┐рдХрд▓реНрдк
# Create 3-channel mask mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) # Isolate object with binary mask isolated = cv2.bitwise_and(mask3ch, img)
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
-
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╛рдЗрдирд░реА рдорд╛рд╕реНрдХ рдХреЛ рдкрд╣рд▓реЗ рд╕рд┐рдВрдЧрд▓-рдЪреИрдирд▓ рдЗрдореЗрдЬ рд╕реЗ рдереНрд░реА-рдЪреИрдирд▓ рдЗрдореЗрдЬ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рдмрд╛рдж рдХреЗ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЦреМрдЯрд╛ рдФрд░ рдореВрд▓ рдЫрд╡рд┐ рд╕рдВрдпреБрдХреНрдд рд╣реИрдВред рд╕рдореНрдорд┐рд╢реНрд░рдг рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЪреИрдирд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
-
рдореВрд▓ рдЫрд╡рд┐ рдФрд░ рддреАрди-рдЪреИрдирд▓ рдмрд╛рдЗрдирд░реА рдорд╛рд╕реНрдХ рдХреЛ OpenCV рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд░реНрдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
bitwise_and()
. рдпрд╣ рдСрдкрд░реЗрд╢рди рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ рдХреЗрд╡рд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдорд╛рди рдЬреЛ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ(> 0)
рджреЛрдиреЛрдВ рддрд╕реНрд╡реАрд░реЛрдВ рд╕реЗред рдЪреВрдВрдХрд┐ рдорд╛рд╕реНрдХ рдкрд┐рдХреНрд╕рд▓ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ(> 0)
рдХреЗрд╡рд▓ рд╕рдореЛрдЪреНрдЪ рдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░, рдореВрд▓ рдЫрд╡рд┐ рд╕реЗ рд╢реЗрд╖ рдкрд┐рдХреНрд╕реЗрд▓ рд╡реЗ рд╣реИрдВ рдЬреЛ рд╕рдореЛрдЪреНрдЪ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реИрдВред
рдмреНрд▓реИрдХ рдкрд┐рдХреНрд╕рд▓ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ: рдЙрдк-рд╡рд┐рдХрд▓реНрдк
рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдХреА рдЫрд╡рд┐
рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдХреА рдЫрд╡рд┐ рд░рдЦрдиреЗ рдкрд░ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрд░реЙрдк рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдЫрд╡рд┐
рдЫрд╡рд┐ рдХреЛ рдХреНрд░реЙрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд╖реЗрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рд╕реЗ рдмреЙрдХреНрд╕ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ
рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
-
рд╡рд╣реА
c.boxes.xyxy.cpu().numpy()
рдХреЙрд▓ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЛ NumPy рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИxyxy
рдкреНрд░рд╛рд░реВрдк, рдЬрд╣рд╛рдВxmin
,ymin
,xmax
рдФрд░ymax
рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдЖрдпрдд рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рджреЗрдЦрдирд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рд╕реЗ рдмрдХреНрд╕реЗ рдЕрдиреБрднрд╛рдЧ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПред -
рд╡рд╣реА
squeeze()
рдСрдкрд░реЗрд╢рди NumPy рд╕рд░рдгреА рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЖрдпрд╛рдо рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдХрд╛рд░ рд╣реИред -
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдордиреНрд╡рдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛
.astype(np.int32)
рдмреЙрдХреНрд╕ рдХреЛ рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИfloat32
рддрдХint32
, рдЙрдиреНрд╣реЗрдВ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдХреНрд░реЙрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧрдд рдмрдирд╛рдирд╛ред -
рдЕрдВрдд рдореЗрдВ, рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрд▓рд╛рдЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рд╕реЗ рдХреНрд░реЙрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдорд╛рдУрдВ рдХреЛ
[ymin:ymax, xmin:xmax]
рдбрд┐рдЯреЗрдХреНрд╢рди рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред
# Isolate object with transparent background (when saved as PNG) isolated = np.dstack([img, b_mask])
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
- NumPy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
dstack()
рдлрд╝рдВрдХреНрд╢рди (рдЧрд╣рд░рд╛рдИ-рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рд╕реНрдЯреИрдХрд┐рдВрдЧ) рдЙрддреНрдкрдиреНрди рдмрд╛рдЗрдирд░реА рдорд╛рд╕реНрдХ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде, рдЪрд╛рд░ рдЪреИрдирд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рдПрдЧрд╛ред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдореЛрдЪреНрдЪ рдХреЗ рдмрд╛рд╣рд░ рдХреЗ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛PNG
рд░реЗрддреАред
рдкрд╛рд░рджрд░реНрд╢реА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ: рдЙрдк-рд╡рд┐рдХрд▓реНрдк
рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдХреА рдЫрд╡рд┐
рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдХреА рдЫрд╡рд┐ рд░рдЦрдиреЗ рдкрд░ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХрджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрд░реЙрдк рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдЫрд╡рд┐
рдЫрд╡рд┐ рдХреЛ рдХреНрд░реЙрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд╖реЗрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рд╕реЗ рдмреЙрдХреНрд╕ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ
рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
-
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп
c.boxes.xyxy.cpu().numpy()
, рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЛ NumPy рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,xyxy
рдмреЙрдХреНрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рд░реВрдк, рдЬреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИxmin, ymin, xmax, ymax
рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ (рдЖрдпрдд) рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рд╕реЗ рдмрдХреНрд╕реЗ рдЕрдиреБрднрд╛рдЧ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПред -
рдЬреЛрдбрд╝рдиреЗ
squeeze()
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдмрд╛рд╣рд░реА рдЖрдпрд╛рдо рдХреЛ NumPy рд╕рд░рдгреА рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред -
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдордиреНрд╡рдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛
.astype(np.int32)
рдмреЙрдХреНрд╕ рдХреЛ рдЗрд╕рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддрд╛ рд╣реИfloat32
рддрдХint32
рдЬреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫрд╡рд┐ рдХреЛ рдХреНрд░реЙрдк рдХрд░рддреЗ рд╕рдордп рд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред -
рдЕрдВрдд рдореЗрдВ рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрд▓рд╛рдЗрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реЙрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
[ymin:ymax, xmin:xmax]
рдбрд┐рдЯреЗрдХреНрд╢рди рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдмреЙрдХреНрд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдкреГрд╖реНрдарднреВрдорд┐ рд╕рд╣рд┐рдд рдлрд╕рд▓реА рд╡рд╕реНрддреБ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ?
рдпрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реБрд╡рд┐рдзрд╛ рд╣реИ Ultralytics рдкреБрд╕реНрддрдХрд╛рд▓рдпред рджреЗрдЦреЗрдВ
save_crop
рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдореЛрдб рдЕрдиреБрдорд╛рди рддрд░реНрдХреЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░реЗрдВ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдПред
-
-
рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЗ рдКрдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдЧрд▓реЗ рдЪрд░рдг рдХрд╛ рдПрдХ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг (рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рд╕рд╣реЗрдЬрдирд╛) рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
- рдиреЛрдЯ: рдпрд╣ рдЪрд░рдг рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рддреЛ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдЕрдВрддрд┐рдо рдЪрд░рдг
- рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
img_name
рд╕реНрд░реЛрдд рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдзрд╛рд░-рдирд╛рдо рд╣реИ,label
рдкрддрд╛ рдЪрд▓рд╛ рд╡рд░реНрдЧ-рдирд╛рдо рд╣реИ, рдФрд░ci
рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ (рдПрдХ рд╣реА рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрдИ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ)ред
рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб
рдпрд╣рд╛рдВ, рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдХреЛрдб рдХреЗ рдПрдХрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рдХреБрдЫ рдпрд╛ рд╕рднреА рдХрдорд╛рдВрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЗрд╖реНрдЯрддрдо рд╣реЛрдЧрд╛ for
-рд▓реВрдк, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рд╣реИред
from pathlib import Path
import cv2
import numpy as np
from ultralytics import YOLO
m = YOLO('yolov8n-seg.pt')#(4)!
res = m.predict()#(3)!
# iterate detection results (5)
for r in res:
img = np.copy(r.orig_img)
img_name = Path(r.path).stem
# iterate each object contour (6)
for ci,c in enumerate(r):
label = c.names[c.boxes.cls.tolist().pop()]
b_mask = np.zeros(img.shape[:2], np.uint8)
# Create contour mask (1)
contour = c.masks.xy.pop().astype(np.int32).reshape(-1, 1, 2)
_ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
# Choose one:
# OPTION-1: Isolate object with black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
# OPTION-2: Isolate object with transparent background (when saved as PNG)
isolated = np.dstack([img, b_mask])
# OPTIONAL: detection crop (from either OPT1 or OPT2)
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]
# TODO your actions go here (2)
- рдЖрдмрд╛рдж рд╣реЛ рд░рд╣реА рд░реЗрдЦрд╛
contour
рдпрд╣рд╛рдВ рдПрдХ рд▓рд╛рдЗрди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдорд▓реНрдЯреАрдкрд▓ рдЕрдк рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред - рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ!
- рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдореЛрдб рджреЗрдЦреЗрдВред
- рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛рд░реНрдп рджреЗрдЦреЗрдВ.
- рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ
- рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдорд╛рд╕реНрдХ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ
2023-11-27 рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ 2024-04-27
рд▓реЗрдЦрдХ: рдЧреНрд▓реЗрди-рдЬреЛрдЪрд░ (6), рд░рд┐рдЬрд╡рд╛рдирдореБрдирд╡реНрд╡рд░ (1), рдмреБрд░рд╣рд╛рди-рдХреНрдпреВ (1)