Όλα για YOLOs - Part5 - Πώς να το κωδικοποιήσετε

Σε αυτήν την ανάρτηση, θα σας εξηγήσω πώς να χρησιμοποιήσετε την έκδοση βανίλιας του YOLOv3 για την ανίχνευση αντικειμένων από το σύνολο δεδομένων COCO και επίσης πώς να εκπαιδεύσετε το δικό σας σύνολο δεδομένων για τη δική σας περίπτωση χρήσης.

Ο κώδικας ανίχνευσης Yolo βασίζεται εδώ στην εφαρμογή του Erik Lindernoren για το έγγραφο του Joseph Redmon και του Αl Farhadi.

Ακολουθούν οι σύνδεσμοι για τη σειρά.

Τα πάντα για τους YOLOs - Part1 - λίγο ιστορία

Όλα για το YOLO - Part2 - Το πρώτο YOLO

Όλα για YOLOs - Part3 - Το καλύτερο, γρηγορότερο και ισχυρότερο YOLOv2

Τα πάντα για το YOLOs - Part4 - YOLOv3, μια βελτιωτική βελτίωση

Τα πάντα για τους YOLOs - Part5 - Up and Running

Βρείτε το φάκελο του έργου στο gitrepo μου.

Στο φάκελο του έργου θα βρείτε έναν υποφάκελο που ονομάζεται config με αρχεία config, ονόματα τάξεων και μεταβλητές περιβάλλοντος, φάκελο δεδομένων με σύνολα δεδομένων και φάκελο utils με ορισμένες χρήσιμες λειτουργίες του python.

Αρχικά, κάντε λήψη του αρχείου βάσης YOLOv3 και τοποθετήστε το στο φάκελο config στο έργο, εκτελέστε την ακόλουθη εντολή. (Έχω προσθέσει ένα αρχείο .sh για να γίνει αυτό στο repo)

wget https://pjreddie.com/media/files/yolov3.weights

Μετά τη λήψη του περιεχομένου του φακέλου config θα πρέπει να φαίνεται κάτι σαν το ακόλουθο.

Πώς να πάρετε το YOLOv3 για να εντοπίσετε αντικείμενα COCO;

Ας δούμε την εφαρμογή της βανίλιας YOLO για την εισαγωγή των αντικειμένων COCO.

  • Εισαγάγετε τις απαιτούμενες ενότητες.
από τα μοντέλα εισαγωγής * από τις εισαγωγές utils * εισαγωγή os, sys, ώρα, ημερομηνία, τυχαία εισαγωγή δάδα από torch.utils.data εισαγωγή DataLoader από torchvision σύνολα δεδομένων εισαγωγής, μετατρέπει από torch.autograd εισαγωγής Variableimport matplotlib.pyplot ως plt import matplotlib.patches ως patches από την εικόνα εισαγωγής PIL
  • Τοποθετήστε την προετοιμασμένη διαμόρφωση και βάρη, καθώς και τα ονόματα κλάσεων του συνόλου δεδομένων COCO, στο οποίο εκπαιδεύτηκε το μοντέλο Darknet. Οι img_size, conf_thres και num_thresold είναι παράμετροι που μπορούν να τροποποιηθούν με βάση τη χρήση.
Σημείωση: Ρυθμίστε το μοντέλο στη λειτουργία εκτίμησης για συμβολισμό.
config_path = 'config / yolov3.cfg' weights_path = 'config / yolov3.weights' class_path = 'config / coco.names' img_size = 416 conf_thres = 0.8 nms_thres = 0.4
# Φόρτωση μοντέλου και βάρη μοντέλου = Darknet (config_path, img_size = img_size) model.load_weights (weights_path) model.cuda () model.eval () classes = utils.load_classes (τάξη_διακύμανσης) Tensor = torch.cuda.FloatTensor
  • Γράψτε μια συνάρτηση για να εκτελέσετε τη βασική ανίχνευση που δίνεται σε μια εικόνα. Ανατρέξτε στα σχόλια για το τι κάνει ο κώδικας. Κυρίως προεπεξεργάζεται την εικόνα.
(img): # κλίμακα και αναλογία εικόνας pad = min (img_size / img.size [0], img_size / img.size [1]) imw = (imh, imw)), transforms.Pad ((max (int ((imh-imw) / 2), 0), max (μεταβολή img.size [1] 1), max (int ((imw-imh) / 2), 0)), (128, 128, 128) ), transforms.ToTensor (),]) # μετατρέπει την εικόνα σε Tensor image_tensor = img_transforms (img) .float () image_tensor = image_tensor.unsqueeze_ (0) input_img = Μεταβλητή (Tensor) και να πάρετε ανιχνεύσεις με torch.no_grad (): detections = μοντέλο (input_img) detectings = utils.non_max_suppression (ανίχνευση, 80, conf_thres, nms_thres) ανίχνευση επιστροφής [0]
  • Τώρα ο κώδικας για τη χρήση αυτής της συνάρτησης για να πάρετε συμπεράσματα. Αυτό λειτουργεί με οποιοδήποτε αντικείμενο υπάρχει στο σύνολο δεδομένων COCO. Και πάλι, ο περισσότερος κώδικας ασχολείται με την προεπεξεργασία της εικόνας και τη σχεδίαση των πλαισίων οριοθέτησης.
# load image και λάβετε ανιχνεύσεις img_path = "images / blueangels.jpg" prev_time = time.time () img = image.open (img_path) detections = detect_image (img) inference_time = datetime.timedelta (δευτερόλεπτα = (i) για i σε np.linspace (0, 1, 2, 3, 4, 5) 20)] img = np.array (img) plt.figure () fig, ax = plt.subplots (1, figsize = (12,9)) ax.imshow img pad_x = - img.shape [1], 0) * (img_size / max (img.shape)) pad_y = max (img.shape [1] - img.shape [0] ) unpad_h = img_size - pad_y unpad_w = img_size - pad_xif ανίχνευση δεν είναι Κανένα: unique_labels = ανίχνευση [:, -1] .cpu () # περιηγηθείτε σε ανιχνεύσεις και σχεδιάζετε πλαίσια συμβολοσειρών για x1, y1, x2, y2, conf, cls_conf, cls_pred στις ανιχνεύσεις: box_h = (y2 - y1) / unpad_h) * img.shape [0] box_w = (x2 - x1) / unpad_w) * i [1] y1 = ((y1 - pad_y // 2) / unpad_h) * img.shape [0] x1 = ((x1 - pad_x // 2) / unpad_w) * img.shape [1] bbox_colors [int (np.where) (unique_labels == int (cls_pred)) [0]) bbox = patches.Rectangle (box1, y1), box_w, box_h, linewidth = ) ax.add_patch (bbox) plt.text (x1, y1, s = κλάσεις [int (cls_pred)], color = 'λευκό', verticalalignment = 'top', bbox = {'χρώμα'; 0}) plt.axis ('off') # αποθηκεύστε την εικόνα plt.savefig (img_path.replace (". Jpg", "-det.jpg"), bbox_inches = 'σφιχτό', pad_inches =
  • Το παραπάνω script χειρίζεται την ανίχνευση εικόνων. Τώρα ας δούμε πώς να το δουλέψουμε για βίντεο.
videopath = 'video / sample_video.mp4'
% pylap inline import cv2 από IPython.display εισαγωγή clear_outputcmap = plt.get_cmap ('tab20b') χρώματα = [cmap (i) [: 3] για i στο np.linspace (0, 1, 20)] # initialize vid = cv2 .VideoCapture (videopath) #while (True): για το ii στην περιοχή (40): ret, frame = vid.read () frame = cv2.cvtColor (frame, cv2.COLOR_BGR2RGB) pilimg = (img.shape / max (img.shape)) pad_y = max (img.shape [img.shape [img.shape [img.shape] [1] - img.shape [0], 0) * (img_size / max (img.shape)) unpad_h = img_size - pad_y unpad_w = img_size - pad_x αν οι ανιχνεύσεις δεν είναι Κανένα: unique_labels = ανίχνευση [:, -1]. () () () () () (y1) / unpad_h) * img.shape [0] ) () () ()) x1 = int (((x2 - x1) / unpad_w) * img.shape [1]) y1 = int ((y1 - pad_y // 2) ((x1 - pad_x // 2) / unpad_w) * img.shape [1]) χρώμα = χρώματα [int (cls_conf. (x1, y1), (x1 + box_w, y1 + κιβώτιο_h ()) () ), το χρώμα, 4) cv2.rectangle (πλαίσιο, (x1, y1-35), (x1 + len (cls) * 19 + 60, y1), χρώμα, -1) cv2.putText "+ str (cls_conf.item ()), (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, 255.255.255, 3 = fig = figsize = εμφάνιση (frame) εμφάνιση () clear_output (wait = True)
Σημείωση: Ο παραπάνω κώδικας μπορεί να χρησιμοποιηθεί και για ζωντανή μετάδοση, αλλάζοντας τη διαδρομή βίντεο σε μια ροή κάμερας IP.

Πώς να τελειοποιήσετε το μοντέλο βανίλιας YOLOv3 για να εργαστείτε για προσαρμοσμένα αντικείμενα;

Ας δούμε την προσαρμοσμένη εκπαίδευση YOLOv3 για τη δική μας περίπτωση χρήσης. Είναι πολλοί τρόποι για να επιτευχθεί αυτό. Αλλά τα παρακάτω βήματα εξηγούν τον ευκολότερο τρόπο που βρήκα στο Διαδίκτυο.

Προϋποθέσεις

Δεδομένα

Το πρώτο βήμα θα ήταν να δημιουργήσετε τα δεδομένα εκπαίδευσης, δηλαδή να προσθέσετε ετικέτες στις εικόνες με ένα πλαίσιο οριοθέτησης και ετικέτα κλάσης για την οποία θέλετε να πραγματοποιηθούν οι ανιχνεύσεις.

Υπάρχουν πολλά εργαλεία για να γίνει αυτό. Ο ευκολότερος τρόπος που βρήκα είναι η χρήση του LabelImg. Πρόκειται για ένα γραφικό εργαλείο σχολιασμού εικόνας. Μπορείτε να εγκαταστήσετε χρησιμοποιώντας την εντολή pip.

pip install labelImg

Κάντε κλικ στο σύνδεσμο για να βρείτε ένα ωραίο φροντιστήριο σχετικά με τον τρόπο χρήσης του.

Η επισήμανση μιας απλής εικόνας σημαίνει την επισήμανση των συντεταγμένων και της κλάσης του πλαισίου οριοθέτησης. Επομένως, για κάθε εικόνα η δημιουργηθείσα ετικέτα (αρχείο .txt) θα έχει μία μόνο γραμμή. Αυτό είναι κάτι που ονομάζεται μορφή YOLO.

Σημείωση: Βεβαιωθείτε ότι έχετε επιλέξει τη μορφή YOLO κατά την επισήμανση των εικόνων χρησιμοποιώντας το εργαλείο LabelImg.
#class xy ​​ύψος πλάτους 1 0.351466 0.427083 0.367168 0.570486

Μόλις δημιουργηθούν ετικέτες με ετικέτες και δημιουργηθούν ετικέτες (αρχεία .txt), εκτελέστε μια δέσμη ενεργειών για να διαιρέσετε το σύνολο δεδομένων για την κατάρτιση και την επικύρωση. Για να το επιτύχετε, εκτελέστε τον ακόλουθο κώδικα Python μόνο μία φορά. Το datasplit.py είναι το αρχείο με αυτόν τον κώδικα στο repo.

Εισαγωγή σφαιρικής εισαγωγής os εισαγωγής numpy ως np εισαγωγής syscurrent_dir = "./data/artifacts/images" split_pct = 10 # 10 σύνολο επικύρωσης file_train = ανοικτό ("data / artefacts / train.txt", "w") file_val = "data / artifacts / val.txt", "w") counter = 1 index_test = στρογγυλό (100 / split_pct) ext = os.path.splitext (os.path.basename (fullpath)) αν μετρητής == index_test: counter = 1 file_val.write (τρέχουσα_δίσκος + "/" + τίτλο + '.JPG' + "\ n" αρχείο_train.close () file_train.write (current_dir + "/" + τίτλο + '.JPG' + "\ n") counter =

Αυτό θα δημιουργήσει 2 αρχεία, το τρένο.txt και το αρχείο val.txt που θα περιέχει τις πλήρεις διαδρομές όλων των εικόνων με 90% σε τρένο και 10% σε val.

Αφού γίνει, βεβαιωθείτε ότι έχετε πάρει το σύνολο δεδομένων στην ακόλουθη δομή φακέλου.

Κύριος φάκελος --- δεδομένα --- όνομα ομάδας δεδομένων --- εικόνες --- img1.jpg --- img2.jpg .......... --- ετικέτες --- img1.txt --- img2.txt .......... --- train.txt --- val.txt

Config

Τώρα για τα αρχεία ρυθμίσεων στο φάκελο config / folder. Πρώτον, το coco.data θα έμοιαζε έτσι:

class = 80 # αριθμός τάξεων πηγαίνει εδώ train = data / alpha / train.txt # η διαδρομή του train.txt πηγαίνει εδώ valid = data / alpha / val.txt # η διαδρομή του val.txt πηγαίνει εδώ names = config /coco.names # επεξεργαστείτε το αρχείο ονομάτων με ετικέτες κλάσης backup = backup / # Διατηρήστε αυτήν την παράμετρο όπως είναι

Επεξεργαστείτε αυτές τις τιμές σύμφωνα με το προσαρμοσμένο σύνολο δεδομένων σας. Επεξεργαστείτε τις "κλάσεις" για να συμπεριλάβετε τον αριθμό των κατηγοριών που θα ανιχνευθούν στη χρήση σας. Το τρένο και το έγκυρο κρατάει τη διαδρομή προς το τρένο.txt και το val.txt αντίστοιχα. Επεξεργαστείτε το αρχείο "coco.names" με ετικέτες κλάσης. (για το αρχείο σχολιασμών, το πρώτο αντιστοιχεί σε 0, δίπλα στο 1, κ.λπ.)

class1 class2 ...
Σημείωση: Η παράμετρος αντιγράφων ασφαλείας δεν χρησιμοποιείται, αλλά φαίνεται ότι απαιτείται.

Τώρα για το αρχείο yolov3.cfg. Αυτό περιέχει τις αρχιτεκτονικές λεπτομέρειες του αλγορίθμου YOLOv3.

Στην πρώτη [καθαρή] ενότητα, ρυθμίστε την τιμή παρτίδας και τις υποδιαιρέσεις ώστε να ταιριάζει με τη μνήμη GPU. Όσο μεγαλύτερο είναι το μέγεθος της παρτίδας, τόσο καλύτερη και ταχύτερη είναι η εκπαίδευση, αλλά τόσο περισσότερη μνήμη θα χρειαστεί. Επίσης εδώ μπορείτε να προσαρμόσετε το learning_rate.

Για μια GPU Nvidia με μνήμη 11Gb, μια παρτίδα 16 και 1 υποδιαίρεση είναι καλή.

Υπάρχουν δύο άλλα κρίσιμα πράγματα που πρέπει να αλλάξετε, τα οποία είναι οι κλάσεις και οι τελικές τιμές των φίλτρων στρώματος. Και πρέπει να το κάνετε σε τρία διαφορετικά σημεία του αρχείου.

Εάν κάνετε αναζήτηση στο αρχείο, θα βρείτε 3 ενότητες [yolo]. Μέσα σε αυτήν την ενότητα, ορίστε κατηγορίες για τον αριθμό των κλάσεων στο μοντέλο σας.

Επίσης, πρέπει να αλλάξετε την τιμή των φίλτρων στην ενότητα [συνέλιξη] ακριβώς πάνω από το [yolo] στα παρακάτω.

φίλτρα = (κλάσεις + 5) x 3

με όλα τα παραπάνω που έχουν τεθεί σε ισχύ, θα είστε έτοιμοι να εκπαιδεύσετε το μοντέλο.

Κώδικας

Εφαρμογή του βρόχου κατάρτισης

  • Εισαγωγή βιβλιοθηκών
από την __future__ τμήμα εισαγωγής
από τα μοντέλα εισαγωγής * από την εισαγωγή των utils.utils * από την εισαγωγή των utils.datasets * από την εισαγωγή utils.parse_config *
εισαγωγή εισαγωγή import sys εισαγωγή χρόνο εισαγωγής datetime εισαγωγή argparse
εισαγωγή δάδα από torch.utils.data εισαγωγή DataLoader από torchvision εισαγωγή σύνολα δεδομένων από torchvision εισαγωγή μετατρέπει από torch.autograd εισαγωγή Μεταβλητή torch.optim εισαγωγής ως βέλτιστη
  • Ρύθμιση παραμέτρων
epochs = 20 image_folder = "data / dataset / images" batch_size = 16 model_config_path = config / yolov3.cfg data_config_path = config / coco.data weights_path = config / yolov3.weights class_path = config / coco.names "conf_thres = 0,8 nms_thres = 0,4 n_cpu = 0 img_size = 416 checkpoint_interval = 1 checkpoint_dir = 'σημεία ελέγχου' use_cuda = True
  • Χρησιμοποιήστε το CUDA αν είναι διαθέσιμο
cuda = torch.cuda.is_available () και use_cuda
  • Αποκτήστε παραμετροποίηση δεδομένων και παραμέτρους στη μνήμη
# Φόροι φόρτωσης os.makedirs ("σημεία ελέγχου", exist_ok = True) classes = load_classes (class_path)
# Λήψη ρυθμίσεων δεδομένων data_config = parse_data_config (data_config_path) train_path = data_config ["τρένο"]
# Get hyper parameters hyperparams = parse_model_config (model_config_path) [0] learning_rate = float (hyperparams ["learning_rate"]) momentum = float (hyperparams ["momentum"]) hyperparams ["burn_in"])
  • Ξεκινήστε το μοντέλο και ρυθμίστε να εκπαιδεύσετε.
# Μοντέλο μοντέλου εκκίνησης = μοντέλο Darknet (model_config_path) model.load_weights (path weight)
αν cuda: model = model.cuda () model.train ()
  • Λάβετε τον φορτωτή δεδομένων και ορίστε το εργαλείο βελτιστοποίησης
# Λήψη dataloader dataloader = torch.utils.data.DataLoader (ListDataset (train_path), batch_size = batch_size, shuffle = False, num_workers = n_cpu)
Tensor = torch.cuda.FloatTensor αν το cuda else torch.FloatTensor
# Λάβετε βελτιστοποιητή βελτιστοποίησης = torch.optim.Adam (φίλτρο (lambda p: p.requires_grad, model.parameters ()))
  • Τώρα για τον κύριο βρόχο κατάρτισης.
για χρονική περίοδο (epochs): για batch_i, (_, imgs, στόχοι) στο enumerate (dataloader): imgs = Μεταβλητή (imgs.type (Tensor)) targets = Μεταβλητή (targets.type,
optimizer.zero_grad ()
απώλεια = μοντέλο (imgs, στόχοι)
loss.backward () optimizer.step ()
εκτύπωση ("[Εποχή% d /% d, Παρτίδα% d /% d] [Απώλειες: x% f, y% f, w% f, h% f, :% .5f, ακρίβεια:% .5f] "% (εποχή, εποχές, batch_i, len (dataloader), model.losses [" x "], model.losses [" y " ], model.losses ["h"], model.losses ["conf"], model.losses ["cls"], loss.item (), model.losses ["ανάκληση"], model.losses [ "],))
model.seen + = imgs.size (0)
αν η εποχή% checkpoint_interval == 0: print ("αποθήκευση") model.save_weights ("% s /% d.weights"% (checkpoint_dir, "latest"))

Ο παραπάνω βρόχος εκπαιδεύει και αποθηκεύει ένα αρχείο βαρών στον φάκελο των μοντέλων για κάθε εποχή με τον αριθμό εποχής ως το όνομα. Εκτυπώνει επίσης μια δέσμη απωλειών για την παρακολούθηση της προόδου της εκπαίδευσης.

Εφαρμογή του Συμπεράσματος

  • Εισαγωγή βιβλιοθηκών
από τα μοντέλα εισαγωγής * από την εισαγωγή των χρηστών * εισαγωγή cv2 εισαγωγή os, sys, ώρα, datetime, τυχαία εισαγωγή δάδα από torch.utils.data εισαγωγή DataLoader από torchvision σύνολα δεδομένων εισαγωγής, μετατρέπει από torch.autograd εισαγωγής μεταβλητή
εισαγωγή matplotlib.pyplot ως plt εισαγωγή matplotlib.patches ως μπαλώματα από την εισαγωγή PIL Εισαγωγή εικόνας imutils από imutils.video εισαγωγή WebcamVideoStream
  • Ορίστε τις παραμέτρους. Για να χρησιμοποιήσετε το νέο μοντέλο για ανίχνευση, αντικαταστήστε το τελευταίο αρχείο βάσεων που δημιουργήθηκε στον φάκελο των μοντέλων με το αρχείο yolov3.weights στο φάκελο config. Βεβαιωθείτε ότι η διαδρομή βαρών στον κωδικό εξαγωγής υποδεικνύει την τελευταία διαδρομή βάρους.
num_classes = 1 config_path = 'config / yolov3.cfg' weights_path = 'checkpoint_19.weights' class_path = 'config / coco.names' img_size = 416 conf_thres = 0.95 nms_thres = 0.95
  • Φορτώστε το μοντέλο και ρυθμίστε την αξιολόγηση για τις εξαγορές
# Φόρτωση μοντέλου και βάρη μοντέλου = Darknet (config_path, img_size = img_size) model.load_weights (weights_path) # model.cuda () model.eval () classes = load_classes (τάξη_διακύμανσης) Tensor = torch.FloatTensor
  • Ορίστε λειτουργίες για να φορτώσετε κατηγορίες και να ανιχνεύσετε την εικόνα.
def "class_classes" (path): "" "Φορτώνει τις ετικέτες της κλάσης σε" path "" "" fp = open (path, "r") names = fp.read
(img): # κλίμακα και αναλογία εικόνας pad = min (img_size / img.size [0], img_size / img.size [1]) imw = (imh, imw)), transforms.Pad ((max (int ((imh-imw) / 2), 0), max (μεταβολή img.size [1] 1), max (int ((imw-imh) / 2), 0)), (128, 128, 128) ), transforms.ToTensor (),]) # μετατρέπει την εικόνα σε Tensor image_tensor = img_transforms (img) .float () image_tensor = image_tensor.unsqueeze_ (0) input_img = Μεταβλητή (Tensor) και να πάρετε ανιχνεύσεις με torch.no_grad (): detections = μοντέλο (input_img) detectments = utils.non_max_suppression (ανίχνευση, num_classes, conf_thres, nms_thres) ανίχνευση επιστροφής [0]
  • Τώρα για το βρόχο συμπερασμάτων.
videopath = 'video / sample_video.mp4'
% pylap inline import cv2 από IPython.display εισαγωγή clear_outputcmap = plt.get_cmap ('tab20b') χρώματα = [cmap (i) [: 3] για i στο np.linspace (0, 1, 20)] # initialize vid = cv2 .VideoCapture (videopath) #while (True): για το ii στην περιοχή (40): ret, frame = vid.read () frame = cv2.cvtColor (frame, cv2.COLOR_BGR2RGB) pilimg = (img.shape / max (img.shape)) pad_y = max (img.shape [img.shape [img.shape [img.shape] [1] - img.shape [0], 0) * (img_size / max (img.shape)) unpad_h = img_size - pad_y unpad_w = img_size - pad_x αν οι ανιχνεύσεις δεν είναι Κανένα: unique_labels = ανίχνευση [:, -1]. () () () () () (y1) / unpad_h) * img.shape [0] ) () () ()) x1 = int (((x2 - x1) / unpad_w) * img.shape [1]) y1 = int ((y1 - pad_y // 2) ((x1 - pad_x // 2) / unpad_w) * img.shape [1]) χρώμα = χρώματα [int (cls_conf. (x1, y1), (x1 + box_w, y1 + κιβώτιο_h ()) () ), το χρώμα, 4) cv2.rectangle (πλαίσιο, (x1, y1-35), (x1 + len (cls) * 19 + 60, y1), χρώμα, -1) cv2.putText "+ str (cls_conf.item ()), (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, 255.255.255, 3 = fig = figsize = εμφάνιση (frame) εμφάνιση () clear_output (wait = True)

Βρείτε τους φορητούς υπολογιστές jupyter τόσο για την κατάρτιση όσο και για τα συμπεράσματα στο git-repo μου.

Ελπίζω ότι αυτή η σειρά θα σας έδινε μια σαφή εικόνα για όλα όσα πρέπει να ξέρετε για το YOLO και να ξεκινήσετε με τις δικές σας υλοποιήσεις.

Εάν θέλετε να δείτε ένα blog σχετικά με ένα συγκεκριμένο θέμα, μπορείτε να το αναφέρετε στην ενότητα απαντήσεων. Θα κάνω ότι καλύτερο μπορώ :)

Πόροι:

YOLO: https://arxiv.org/pdf/1506.02640.pdf

YOLOv2 και YOLO9000: https://arxiv.org/pdf/1612.08242.pdf

YOLOv3: https: //arxiv.org/pdf/1804.02767.pdf

Σχετικά με μένα

Είμαι ανώτερος εμπειρογνώμονας της AI στο Wavelabs.ai. Εμείς στο Wavelabs σας βοηθάμε να εκμεταλλευτείτε την Τεχνητή Νοημοσύνη (AI) για να επαναφέρετε τις εμπειρίες των χρηστών και να μειώσετε το κόστος. Ενισχύουμε μοναδικά τα προϊόντα σας χρησιμοποιώντας το AI για να φτάσετε στο πλήρες δυναμικό της αγοράς. Προσπαθούμε να προσφέρουμε έρευνα αιχμής στις εφαρμογές σας.

Μπορείτε να εξερευνήσετε περισσότερα στο Wavelabs.ai.

Λοιπόν, αυτό είναι όλο σε αυτό το post. Ευχαριστώ για την ανάγνωση :)

Μείνετε περίεργοι!

Μπορείτε να επικοινωνήσετε μαζί μου στο LinkedIn.