рдорд╛рд╕реНрдХ-рдЖрд░ CNN рд╢реБрд░реБрдЖрдд рд╕реЗ рдкреЗрд╢реЗрд╡рд░ рддрдХ


рдПрдХ рдмрд╛рд░ рдЬрдм рдореБрдЭреЗ рдЫрд╡рд┐ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╡рд╕реНрддреБ рдХреЗ рдкреНрд░рдХрд╛рд░, рдЙрд╕рдХреЗ рдкреНрд░рдХрд╛рд░, рдФрд░ рднреА, рдлрд╝реНрд░реЗрдо рдХреА рд╕рдордЧреНрд░рддрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореБрдЭреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рдлреНрд░реЗрдо рдореЗрдВ рдмрд┐рддрд╛рдП рдЧрдП рд╕рдордп рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреИрд╕реЗ рдЪрд▓ рд░рд╣рд╛ рдерд╛ рдФрд░ рдХреМрди рд╕реЗ рдХреИрдорд░реЗ рджреГрд╢реНрдп рдореЗрдВ рдЖрдПред рдЖрдЗрдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж, рдкрд╣рд▓реЗ рджреЛ рдХреЗ рд╕рд╛рде, рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХреБрд▓ рдХрд░реНрдорд┐рдпреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред


рдареАрдХ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ:


  • рд▓реЛрдЧреЛрдВ рдФрд░ рдХрд╛рд░реЛрдВ рдХреЛ рдареАрдХ рдХрд░реЗрдВ - рдЙрдиреНрд╣реЗрдВ рдЫрд╡рд┐ рдореЗрдВ рдЪреБрдиреЗрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзрд┐рдд рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред
  • рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреИрдорд░реЗ рдХреЗ рдлреНрд░реЗрдо рдореЗрдВ рдЧрд┐рд░ рдЧрдИ
  • рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рдлреНрд░реЗрдо рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рд╣рдо рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреЗрдВ

рдареАрдХ рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдФрд░ рдПрдХ рдореЛрдЯреА рд╕рд╛рдВрдк, рдЕрдЬрдЧрд░ рдХреЛ рдЙрдард╛рдпрд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИред рдЗрд╕рдХреА рд╕рд░рд▓рддрд╛ рдФрд░ рдЖрдзреБрдирд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдорд╛рд╕реНрдХ рдЖрд░-рдПрдирдПрди рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣рдо рдЫрд╡рд┐ рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП OpenCV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛


рд╣рдо рд╡рд┐рдВрдбреЛрдЬ 10 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 64 рдмрд┐рдЯ рдкрд╛рдпрдерди рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдк рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рд╕реЗ


рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрдирд╛


git clone https://github.com/matterport/Mask_RCNN cd Mask_RCNN pip3 install -r requirements.txt python3 setup.py install 

рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕реНрд░реЛрдд рд╕реЗ рд╕рдВрдХрд▓рди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд╛рдЗрдк рд╕реЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:


 pip3 install mrcnn --user 

рдкреИрдХреЗрдЬ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред


рдЪрд░рдг 1. рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ред


рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рдд рдХрд░реЗрдВрдЧреЗ


 import os import cv2 import mrcnn.config import mrcnn from mrcnn.model import MaskRCNN 

рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ


 class MaskRCNNConfig(mrcnn.config.Config): NAME = "coco_pretrained_model_config" GPU_COUNT = 1 IMAGES_PER_GPU = 1 DETECTION_MIN_CONFIDENCE = 0.8 #     NUM_CLASSES = 81 

рддрд░рд╛рдЬреВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧрд╛ред


 import mrcnn.utils DATASET_FILE = "mask_rcnn_coco.h5" if not os.path.exists(DATASET_FILE): mrcnn.utils.download_trained_weights(DATASET_FILE) 

рдЖрдЗрдП рдКрдкрд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдореЙрдбрд▓ рдмрдирд╛рдПрдВ


 model = MaskRCNN(mode="inference", model_dir="logs", config=MaskRCNNConfig()) model.load_weights(DATASET_FILE, by_name=True) 

рдФрд░ рд╢рд╛рдпрдж рд╣рдо рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ images рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред


 IMAGE_DIR = os.path.join(os.getcwd(), "images") for filename in os.listdir(IMAGE_DIR): image = cv2.imread(os.path.join(IMAGE_DIR, filename)) rgb_image = image[:, :, ::-1] detections = model.detect([rgb_image], verbose=1)[0] 

рд╣рдо рдирд┐рд░реЛрдзреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рджреЗрдЦреЗрдВрдЧреЗ?


  print(detections) 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЗрд╕реА рддрд░рд╣:


 {'rois': array([[ 303, 649, 542, 1176],[ 405, 2, 701, 319]]), 'class_ids': array([3, 3]), 'scores': array([0.99896, 0.99770015], dtype=float32), 'masks': array()} 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, 2 рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рдП рдЧрдП рдереЗред
rois - рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдБ рдФрд░ рдКрдкрд░реА рджрд╛рдПрдБ рдХреЛрдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд░рдгрд┐рдпрд╛рдБ
class_ids рдкрд╛рдИ рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ 1 рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╣реИ, 3 рдПрдХ рдХрд╛рд░ рд╣реИ, 8 рдПрдХ рдЯреНрд░рдХ рд╣реИред
scores - рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореЙрдбрд▓ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ, рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рднреА рдЕрдиреБрдЪрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХрд╛рдЯрдХрд░, рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ DETECTION_MIN_CONFIDENCE рдорд╛рдзреНрдпрдо рд╕реЗ DETECTION_MIN_CONFIDENCE рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
masks - рд╡рд╕реНрддреБ рдХрд╛ рд╕рдореЛрдЪреНрдЪред рдСрдмреНрдЬреЗрдХреНрдЯ рдорд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХрд╛рдлреА рд╕рдордЭрджрд╛рд░ рд╣реИрдВ, рдФрд░ рдорд╛рдирд╡ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ; рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЙрджреНрдзреГрдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред


рдареАрдХ рд╣реИ, рд╣рдо рд╡рд╣рд╛рдВ рд░реБрдХ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрд╕ рдЫрд╡рд┐ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдЪрдпрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рддреА рд╣реИ?


рдлрд╝рдВрдХреНрд╢рди рдХреЛ mrcnn.visualize.display_instances рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦреЗрдВрдЧреЗред


рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЫрд╡рд┐ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкрд╣рд▓реЗ рдЪрд░рдгреЛрдВ рд╕реЗ рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ред


 def visualize_detections(image, masks, boxes, class_ids, scores): import numpy as np bgr_image = image[:, :, ::-1] CLASS_NAMES = ['BG',"person", "bicycle", "car", "motorcycle", "bus", "truck"] COLORS = mrcnn.visualize.random_colors(len(CLASS_NAMES)) for i in range(boxes.shape[0]): y1, x1, y2, x2 = boxes[i] classID = class_ids[i] label = CLASS_NAMES[classID] font = cv2.FONT_HERSHEY_DUPLEX color = [int(c) for c in np.array(COLORS[classID]) * 255] text = "{}: {:.3f}".format(label, scores[i]) size = 0.8 width = 2 cv2.rectangle(bgr_image, (x1, y1), (x2, y2), color, width) cv2.putText(bgr_image, text, (x1, y1-20), font, size, color, width) 


рд╕реНрд░реЛрдд рдЫрд╡рд┐


рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдПрдХ рдореБрдЦреНрдп рд▓рд╛рдн рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ - рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХреГрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рд╣рдордиреЗ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдо рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред


рдореБрдЦреМрдЯреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдпрдд рдмрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВред


 mask = masks[:, :, i] #   image = mrcnn.visualize.apply_mask(image, mask, color, alpha=0.6) #   

рдкрд░рд┐рдгрд╛рдо:


рд╕рдлреЗрдж рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг


рд╕реНрдЯреЗрдЬ IIред рдкрд╣рд▓реА рд╕рдлрд▓рддрд╛ред рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдорд╛рдиреНрдпрддрд╛ред


рдорд╛рдиреНрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд╛рд░ рдХреЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдлреНрд░реЗрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪреЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗ рдХреЗрд╡рд▓ рдлреНрд░реЗрдо рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рд╕рдорд╛рдирддрд╛ (рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ) рд╕реЗ рдХреАред рдпрд╣ рд╡рд┐рдзрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд╢реБрджреНрдзрд┐ рджреЗрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдорд╢реАрдиреЗрдВ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рди рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдореЗрд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрднреА рднреА рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдирд╣реАрдВ рдмрдЪ рд╕рдХрддрд╛ рд╣реИред


рдпрд╣ рдпреВрдХреНрд░реЗрдиреА рдирд┐рд░реНрдорд╛рддрд╛ рдиреЙрдорд░реЙрдлрд╝-рдиреЗрдЯ (рд╡рд┐рдЬреНрдЮрд╛рдкрди рдирд╣реАрдВ) рд╕реЗ рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрднрдЧ рд╕рднреА рдХреЛрдб рдореЙрдбрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдореИрдВрдиреЗ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рджрд┐рдпрд╛ред


рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдореВрд▓ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдорд╢реАрди рдХреЛ рдлреНрд░реЗрдо рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 import sys import matplotlib.image as mpimg import os sys.path.append(cfg.NOMEROFF_NET_DIR) from NomeroffNet import filters, RectDetector, TextDetector, OptionsDetector, Detector, textPostprocessing nnet = Detector(cfg.MASK_RCNN_DIR, cfg.MASK_RCNN_LOG_DIR) nnet.loadModel("latest") rectDetector = RectDetector() optionsDetector = OptionsDetector() optionsDetector.load("latest") textDetector = TextDetector.get_static_module("ru")() textDetector.load("latest") def detectCarNumber(imgPath: str) -> str: img = mpimg.imread(imgPath) NP = nnet.detect([img]) cvImgMasks = filters.cv_img_mask(NP) arrPoints = rectDetector.detect(cvImgMasks) zones = rectDetector.get_cv_zonesBGR(img, arrPoints) regionIds, stateIds, _c = optionsDetector.predict(zones) regionNames = optionsDetector.getRegionLabels(regionIds) # find text with postprocessing by standart textArr = textDetector.predict(zones) textArr = textPostprocessing(textArr, regionNames) return textArr 

рдЖрдЙрдЯрдкреБрдЯ textArr рдлреНрд░реЗрдо рдкрд░ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдорд╢реАрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рддрд╛рд░ рдХреА рдПрдХ рд╕рд░рдгреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
["293163"] , рдпрд╛ [""] , [] - рдпрджрд┐ рдХреЛрдИ рдорд┐рд▓рд╛рди рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред


рд╕реНрдЯреЗрдЬ IIIред рд╕рдорд╛рдирддрд╛ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВред


рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рдмрд╛рд░ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд╣ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдореЗрдВ рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдХреИрдорд░рд╛ рд╣реИ рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕рд╕реЗ рдЕрд▓рдЧ рдлреНрд░реЗрдо рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░реЗрдВрдЧреЗред


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗред


рдореИрдВ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ sift рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦреВрдВрдЧрд╛ ред рд╣рдо рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ OpenCV рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХрдВрдЯреНрд░рд╛рдм рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкреЗрдЯреЗрдВрдЯ рдХрд░рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдорд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЕрдиреБрд╕рдВрдзрд╛рди рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣реИ рдирд╛?


 pip3 install opencv-contrib-python --user 

~~ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░реЗрдВ == ~~ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ 2 рддреБрд▓рдирд╛рддреНрдордХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди cv2.open(path) рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ


рд╣рдо рдЕрдкрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред


 def compareImages(img1, img2) -> bool: sift = cv2.xfeatures2d.SIFT_create() 

SIFT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рд╢рд╛рдпрдж рдореИрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ help(somefunc) рд░реВрдк рдореЗрдВ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╢реЗрд▓ рдореЗрдВ рдХрд╣ рд╕рдХрддреЗ help(somefunc)


  kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) 

рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред


  FLANN_INDEX_KDTREE = 0 indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) searchParams = dict(checks=50) flann = cv2.FlannBasedMatcher(indexParams, searchParams) 

рдЕрдм рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВред


  matches = flann.knnMatch(des1, des2, k=2) 

рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рдирддрд╛рдПрдВ рдЧрд┐рдиреЗрдВред


  matchesCount = 0 for m, n in matches: if m.distance < cfg.cencitivity*n.distance: matchesCount += 1 return matchesCount > cfg.MIN_MATCH_COUNT 

рдЕрдм, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рдЫрд╡рд┐ рд╕реЗ рдХрд╛рдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рдореИрдВ рдЗрд╕реЗ рдзреАрдореА рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдлрд┐рд░ рд╡рд╣рд╛рдВ рд╕реЗ рдкрдврд╝рд╛ред


  def extractObjects(objects, binaryImage, outputImageDirectory, filename=None): for item in objects: y1, x1, y2, x2 = item.coordinates #       cropped = binaryImage[y1:y2, x1:x2] beforePoint, afterPoint = filename.split(".") outputDirPath = os.path.join(os.path.split(outputImageDirectory)[0], "objectsOn" + beforePoint) if not os.path.exists(outputDirPath): os.mkdir(outputDirPath) coordinates = str(item).replace(" ", ",") pathToObjectImage = "{}{}.jpg".format(item.type, coordinates) cv2.imwrite(os.path.join(outputDirPath, str(pathToObjectImage)), cropped) 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ <outputImageDirectory>/objectsOn<imageFilename> рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╣реИрдВ


рдЕрдм, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо 2 рдРрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдирдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рдлрдВрдХреНрд╢рди рдХреЛ рд░рди рдХрд░реЗрдВ


 if compareImages(previousObjects, currentObjects): print(тАЬ  !тАЭ) 

рдпрд╛ рд╣рдо рдПрдХ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдорд╛рди рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ред


рдмреЗрд╢рдХ, рд╕рднреА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рддрд░рд╣, рдпрд╣ рдХрднреА-рдХрднреА рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд 3 рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдВрдЧреЗред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рдЖрдБрдЦреЗрдВ рдЦреЛрд▓реАрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдЫрд╡рд┐ рдорд╛рдиреНрдпрддрд╛ / рдЫрд╡рд┐ рд╡рд┐рднрд╛рдЬрди рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреА рдорджрдж рдХреА)ред


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/hi483018/


All Articles