Κοινή χρήση τεχνολογίας

[Machine Learning Practice] Datawhale Summer Camp 2: Ήχος και βίντεο επίθεση και άμυνα (deepfake) Επεξήγηση βασικής πρότασης

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

#Datawhale #AIsummercamp#summercamp

Κατάλογος άρθρων

1. Σύντομη εισαγωγή στις ερωτήσεις του διαγωνισμού

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

2. Σύνολο δεδομένων ερωτήσεων διαγωνισμού

Το αρχείο ετικέτας train_label.txt του συνόλου εκπαίδευσης χρησιμοποιείται για την εκπαίδευση του μοντέλου, ενώ το αρχείο ετικέτας val_label.txt του συνόλου επικύρωσης χρησιμοποιείται μόνο για συντονισμό μοντέλου. Για παράδειγμα, στο train_label.txt ή στο val_label.txt, κάθε γραμμή περιέχει δύο μέρη, χωρισμένα με κόμματα. Το πρώτο μέρος είναι το όνομα του αρχείου (κατάληξη .mp4), το δεύτερο μέρος είναι η πραγματική τιμή.
Η τιμή στόχου 1 υποδηλώνει ψεύτικο ήχο και βίντεο και η τιμή στόχος 0 υποδεικνύει ήχο και βίντεο πραγματικού προσώπου.

Ακολουθούν δείγματα των train_label.txt και val_label.txt:

train_label.txt

video_name,target
96b04c80704f02cb426076b3f624b69e.mp4,0
16fe4cf5ae8b3928c968a5d11e870360.mp4,1
  • 1
  • 2
  • 3
  • 4
  • 5

val_label.txt

video_name,target
f859cb3510c69513d5c57c6934bc9968.mp4,0
50ae26b3f3ea85babb2f9dde840830e2.mp4,1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Κάθε γραμμή στο αρχείο περιέχει δύο μέρη, χωρισμένα με κόμμα. Το πρώτο μέρος είναι το όνομα του αρχείου βίντεο και το δεύτερο μέρος είναι το βαθμολογικό σκορ που αντιστοιχεί στην πρόβλεψη του μοντέλου (δηλαδή, η τιμή πιθανότητας του δείγματος να ανήκει στο deepfake βίντεο). Ανατρέξτε στο παρακάτω πρότυπο υποβολής:

prediction.csv

video_name,score
658042526e6d0c199adc7bfeb1f7c888.mp4,0.123456
a20cf2d7dea580d0affc4d85c9932479.mp4,0.123456
  • 1
  • 2
  • 3
  • 4
  • 5

Η δεύτερη φάση ακολουθεί την πρώτη φάση, στην οποία κυκλοφορεί το δημόσιο σετ δοκιμών. Οι συμμετέχοντες πρέπει να υποβάλουν το αρχείο βαθμολογίας πρόβλεψης prediction_test.csv του σετ δοκιμής στο σύστημα και να σχολιάσουν τα αποτελέσματα της βαθμολογίας του τεστ online σε πραγματικό χρόνο.

Μετά το δεύτερο στάδιο, οι 30 πρώτες ομάδες θα προκριθούν στην τρίτη φάση. Σε αυτό το στάδιο, οι διαγωνιζόμενοι πρέπει να υποβάλουν docker κώδικα και τεχνικές αναφορές. Οι απαιτήσεις του Docker περιλαμβάνουν τον αρχικό κώδικα εκπαίδευσης και το δοκιμαστικό API (η είσοδος της συνάρτησης είναι η διαδρομή της εικόνας και η έξοδος είναι η βαθμολογία deepfake που προβλέπεται από το μοντέλο). Ο χορηγός θα ελέγξει και θα εκτελέσει ξανά τον κώδικα αλγορίθμου για να αναπαράγει τη διαδικασία εκπαίδευσης και τα αποτελέσματα των δοκιμών.

Επιτρέπεται η υποβολή μόνο ενός μοντέλου και οι έγκυρες παράμετροι δικτύου δεν πρέπει να υπερβαίνουν τα 200M (χρήσηthopΠαράμετροι μοντέλου στατιστικών εργαλείου).

Επιτρέπεται μόνο η εκπαίδευση πριν από το μοντέλο με ImageNet1K. Εκτεταμένα δείγματα που δημιουργούνται με βάση το δημοσιευμένο σύνολο εκπαίδευσης (μέσω εργαλείων αύξησης δεδομένων/deepfake) μπορούν να χρησιμοποιηθούν για εκπαίδευση, αλλά αυτά τα εργαλεία πρέπει να υποβληθούν για αναπαραγωγή στο τρίτο στάδιο.

3. Δείκτες αξιολόγησης

Ο δείκτης αξιολόγησης χρησιμοποιεί κυρίως την AUC κάτω από την καμπύλη ROC ως δείκτη Το εύρος τιμών της AUC είναι συνήθως εντός0.5-1μεταξύ, αλλιώς νομίζουμεΑυτό δεν είναι ένα καλό μοντέλο μηχανικής εκμάθησης . Όσο πιο κοντά είναι η AUC στο 1, τόσο καλύτερο είναι το μοντέλο. Εάν η AUC παρουσιάζει διφορούμενα αποτελέσματα κατάταξης, τότε χρησιμοποιούμε το **TPR (αληθινό θετικό ποσοστό)** ως βοηθητική αναφορά. Φυσικά, η αντίστοιχη μέθοδος είναι η FPR.

F1-ΒαθμολογίαΕίναι επίσης ένας δείκτης στον οποίο μπορούμε να αναφερθούμε: είναι ο ρυθμός ακριβείας και ο ρυθμός ανάκλησηςαρμονική μέση

F 1 _ S πυρήνας = 2 ∗ ( TP ) / ( 2 TP + FN + FP ) F1_Score = 2*(TP)/(2TP+FN+FP)φά1_μικρόπυρήνας=2(TP)/(2TP+FN+ΠΠ)

Πριν μάθουμε τη μηχανική μάθηση, θα πρέπει να εξετάσουμε δύο σημαντικές έννοιες:ΑκρίβειακαιΑνάκληση

Ακρίβεια P recision = TPTP + FP Precision = frac{TP}{TP+FP}ΠrecΕγώμικρόΕγώοn=TP+ΠΠTP, το οποίο χρησιμοποιείται για τη μέτρηση του μοντέλουΕλέγξτε την απόδοση, το ποσοστό των δειγμάτων που προβλέπεται να είναι θετικά μεταξύ των σωστά προβλεπόμενων δειγμάτων.

Ανάκληση R ecall = TPTP + FN Recall = frac{TP}{TP+FN}Rεκέναll=TP+FNTP, το οποίο χρησιμοποιείται για τη μέτρηση του μοντέλουΑπόδοση αναζήτησης, το ποσοστό των δειγμάτων που είναι πραγματικά θετικά μεταξύ των δειγμάτων που προβλέπεται να είναι θετικά.

Αληθινό θετικό ποσοστό (TPR):
TPR = TP / (TP + FN)
Εσφαλμένο θετικό ποσοστό (FPR):
FPR = FP / (FP + TN)
σε:
TP: Το δείγμα επίθεσης αναγνωρίζεται σωστά ως επίθεση.
TN: Τα πραγματικά δείγματα αναγνωρίζονται σωστά ως πραγματικά.
FP: Τα πραγματικά δείγματα αναγνωρίζονται εσφαλμένα ως επιθέσεις.
FN: Το δείγμα επίθεσης αναγνωρίζεται εσφαλμένα ως πραγματικό.

Παραπομπές: Aghajan, H., Augusto, JC, & Delgado, RLC (2009).ολόκληρο το βιβλίο)

Εδώ είναι το σενάριο υπολογισμού TPR μου:

l1 = [0,1,1,1,0,0,0,1]
l2 = [0,1,0,1,0,1,0,0]

def accuracy(y_true, y_pred):
    # 正确预测数初始化一个简单计数器
    correct_counter = 0
    # 遍历y_true, y_pred中所有元素
    # zip函数接受多个元组,返回他们组成的列表
    for yt, yp in zip(y_true, y_pred):
        if yt == yp:
            # 如果预测标签与真实标签相同,则增加计数器
            correct_counter += 1
    # 返回正确率,正确标签数/总标签数
    return correct_counter / len(y_true)
    
def false_positive(y_true, y_pred):
    # 初始化假阳性样本计数器
    fp = 0
    # 遍历y_true,y_pred中所有元素
    for yt, yp in zip(y_true, y_pred):
        # 若真实标签为负类但预测标签为正类,计数器增加
        if yt == 0 and yp == 1:
            fp += 1
    return fp

def false_negative(y_true, y_pred):
    # 初始化假阴性样本计数器
    fn = 0
    # 遍历y_true,y_pred中所有元素
    for yt, yp in zip(y_true, y_pred):
        # 若真实标签为正类但预测标签为负类,计数器增加
        if yt == 1 and yp == 0:
            fn += 1
    return fn
    
def true_positive(y_true, y_pred):
    # 初始化真阳性样本计数器
    tp = 0
    # 遍历y_true,y_pred中所有元素
    for yt, yp in zip(y_true, y_pred):
        # 若真实标签为正类且预测标签也为正类,计数器增加
        if yt == 1 and yp == 1:
            tp += 1
    return tp

def true_negative(y_true, y_pred):
    # 初始化真阴性样本计数器
    tn = 0
    # 遍历y_true,y_pred中所有元素
    for yt, yp in zip(y_true, y_pred):
        # 若真实标签为负类且预测标签也为负类,计数器增加
        if yt == 0 and yp == 0:
            tn += 1
    # 返回真阴性样本数
    return tn
    
# 您可以尝试更好的精确度计算方式
def accuracy_v2(y_true, y_pred):
  # 真阳性样本数
  tp = true_positive(y_true, y_pred)
  # 假阳性样本数
  fp = false_positive(y_true, y_pred)
  # 假阴性样本数
  fn = false_negative(y_true, y_pred)
  # 真阴性样本数
  tn = true_negative(y_true, y_pred)
  # 准确率
  accuracy_score = (tp + tn) / (tp + tn + fp + fn)
  return accuracy_score
  
# F1-score的计算方法
def f1(y_true,y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true,y_pred)
    score = 2*p*r/(p+r)
    return score
    

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

Εάν απαιτείται ταξινόμηση, μπορεί να χρειαστείτε ένα όριο. Η σχέση του με την προβλεπόμενη τιμή είναι η εξής:

P rediction = P robability > T threshold Prediction = Probability > ThresholdΠσχετικά μερεΕγώντοtΕγώοn=ΠroμπαμπημεγάλοΕγώty>Τηresηομεγάλορε

Αφού μάθετε την AUC, μια άλλη σημαντική μέτρηση που πρέπει να μάθετε είναι η απώλεια καταγραφής. Για προβλήματα δυαδικής ταξινόμησης, ορίζουμε την απώλεια καταγραφής ως:

L og L oss = − στόχος ∗ log ( p ) − ( 1 − στόχος ) ∗ log ( 1 − p ) LogLoss = -target*log(p) - (1-target)*log(1-p)μεγάλοοgLoss=tέναrσολμιtμεγάλοοσολ(Π)(1tέναrσολμιt)μεγάλοοσολ(1Π)

Μεταξύ αυτών, η τιμή στόχος είναι 0 ή 1 και η προβλεπόμενη τιμή είναι η πιθανότητα το δείγμα να ανήκει στην κατηγορία 1. Η απώλεια ημερολογίου τιμωρεί τόσο τις πολύ βέβαιες όσο και τις πολύ λανθασμένες προβλέψεις. Όσο μικρότερη είναι η απώλεια καταγραφής, τόσο πιο κοντά είναι η πιθανότητα που προβλέπεται από το μοντέλο στην τιμή στόχο.

Μπορούμε επίσης να χρησιμοποιήσουμε αυτούς τους δείκτες σε προβλήματα ταξινόμησης:

  • Μακρο-μέση ακρίβεια: Υπολογίστε την ακρίβεια όλων των κατηγοριών ξεχωριστά και μετά τον μέσο όρο
  • Μικρομέση ακρίβεια: Υπολογίστε την ακρίβεια όλων των κατηγοριών και στη συνέχεια υπολογίστε τον σταθμισμένο μέσο όρο τους.
  • Ζυγισμένη ακρίβεια : Υπολογίστε την ακρίβεια όλων των κατηγοριών και στη συνέχεια υπολογίστε τον σταθμισμένο μέσο όρο τους. Ο σταθμισμένος μέσος όρος είναι το γινόμενο των βαρών κάθε κατηγορίας.

4. Γενική γραμμή βάσης

4.1 Υπολογίστε τον αριθμό των δειγμάτων

# “word count” 的缩写,是一个用于计数的 Unix 命令。-l 只计算行数
!wc -l /kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/train_label.txt
!wc -l /kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/val_label.txt
  • 1
  • 2
  • 3

Απλώς πρέπει να μετρήσουμε τον αριθμό των σειρών, που υποδεικνύει τον αριθμό των δειγμάτων.

4.2 Δημιουργία αντικειμένου βίντεο

from IPython.display import Video
Video("/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/valset/00882a2832edbcab1d3dfc4cc62cfbb9.mp4", embed=True)
  • 1
  • 2

Το βίντεο δημιουργεί ένα αντικείμενο βίντεο και η ενσωμάτωση σημαίνει ότι όταν οριστεί σε True, το πρόγραμμα αναπαραγωγής βίντεο θα εμφανίζεται απευθείας στην έξοδο του κελιού του σημειωματαρίου.
Αφού τρέξετε στη γραμμή βάσης του kaggle, θα πρέπει να δείτε αποτελέσματα όπως αυτό:
Εισαγάγετε την περιγραφή της εικόνας εδώ

4.3 Κατεβάστε τις απαιτούμενες βιβλιοθήκες &&συμπληρωματικές γνώσεις

!pip install moviepy librosa matplotlib numpy timm
  • 1

Σύνδεσμοι τεκμηρίωσης για βιβλιοθήκες που χρησιμοποιούνται:
κινηματογραφικός
librosa(Η librosa είναι μια πολύ ισχυρή βιβλιοθήκη τρίτων για την επεξεργασία σήματος ομιλίας python. Σε αυτήν τη γραμμή βάσης χρησιμοποιούμε κυρίως τη δημιουργία φασματογράμματος MEL και τη μετατροπή φασματογράμματος)
matplotlib
μουδιασμένος
τιμ(Βιβλιοθήκη μοντέλων ταξινόμησης εικόνων, γρήγορη κατασκευή διαφόρων μοντέλων sota)

Τι είναι το SOTA; Το πλήρες όνομα της SOTA είναι State of the arts, που αναφέρεται στο καλύτερο μοντέλο σε αυτόν τον τομέα. Το SOTA βαθμολογείται πολύ ψηλά σε ορισμένα σύνολα δεδομένων αναφοράς.

Non-end-to-end model (pipeline): Πρώτα απ 'όλα, πρέπει να καταλάβουμε τι είναι ένα άκρο Τα δύο άκρα αναφέρονται στο άκρο εισόδου στο άκρο εξόδου. Η παραδοσιακή διαδικασία μηχανικής μάθησης αποτελείται από πολλαπλές ενότητες, οι οποίες είναι ανεξάρτητες μεταξύ τους. Το αποτέλεσμα της τελευταίας ενότητας εξαρτάται από το επίπεδο του προηγούμενου αποτελέσματος, επηρεάζοντας ολόκληρο το αποτέλεσμα της εκπαίδευσης.
Μοντέλο από άκρο σε άκρο (από άκρο σε άκρο): Πρώτα απ 'όλα, πρέπει να καταλάβετε ότι η πρόβλεψη δημιουργείται από το άκρο εισόδου στο άκρο εξόδου Αυτό το αποτέλεσμα πρόβλεψης θα έχει σφάλμα σε σύγκριση με το πραγματικό αποτέλεσμα (πρέπει να το θυμόμαστε ότι το βασικό καθήκον της μηχανικής μάθησης είναι ακόμαπρολέγω ), αυτό το σφάλμα διαδίδεται πίσω σε κάθε επίπεδο στο νευρωνικό δίκτυο και τα βάρη και οι παράμετροι του μοντέλου προσαρμόζονται μέχρι να συγκλίνει το μοντέλο ή να ληφθούν τα αποτελέσματα που αναμένουμε. Αν το δούμε από την άποψη ενός συστήματος ελέγχου, αυτό είναι ένα σύστημα ελέγχου κλειστού βρόχου. (π.χ. νευρωνικό δίκτυο BP)
Sequence-to-sequence (seq2seq): Αυτό είναι γενικόαπό άκρη σε άκρηΜέθοδος πρόβλεψης ακολουθίας, η δομή της είναι ένας κωδικοποιητής και ένας αποκωδικοποιητής Εάν χρησιμοποιείτε το σύνολο δεδομένων ερωτήσεων και απαντήσεων για κωδικοποίηση/αποκωδικοποίηση, μπορείτε να λάβετε ένα ρομπότ ερωτήσεων και απαντήσεων.

Η ερώτηση επιστρέφει στην ίδια τη γραμμή βάσης, τι είναι η γραμμή βάσης;Η γραμμή βάσης αναφέρεται συνήθως σε ένα απλό και εύκολο στην εφαρμογή βασικό μοντέλο.
Στη διαδικασία συντονισμού αλγορίθμου και προσαρμογής παραμέτρων, το καθήκον του Baseline είναι να συγκρίνει τον εαυτό του με τον εαυτό του για να κάνει το μοντέλο όλο και καλύτερο.

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

Μπορείτε να τα βλέπετε συχνά σε ιστότοπους συγκριτικής αξιολόγησης μοντέλων.για παράδειγμαΣι Ναν

4.4 Ορισμός τυχαίας διαμόρφωσης pytorch seed&&CUDNN

Όταν έτρεξα τη γραμμή βάσης, παρουσιάστηκε ένα σφάλμα διαμόρφωσης CUDA. Χρησιμοποιήστε ένα άλλο Accelerator.

Εισαγάγετε την περιγραφή της εικόνας εδώ

import torch
# 设置pytorch的种子
torch.manual_seed(0)
# deterministic当设置为False时,cuDNN将允许一些操作的非确定性优化
torch.backends.cudnn.deterministic = False
# benchmark设置为true允许cuDNN在每个前向传播中自动寻找最适合当前配置的卷积算法,以提高性能。
torch.backends.cudnn.benchmark = True
# 导入必要的库,我们需要用到cv2,glob,os,PIL
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Dataset
import timm
import time

import pandas as pd
import numpy as np
import cv2, glob, os
from PIL import Image
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

4.5 Προεπεξεργασία ήχου και βίντεο

Οι παράμετροι που γίνονται δεκτές από το generate_mel_spectrogram περιλαμβάνουν τη διαδρομή του αρχείου βίντεο, τον αριθμό των φίλτρων για τη διαίρεση της συχνότητας Mel, την υψηλότερη συχνότητα (έλεγχος του υπολογισμένου εύρους φάσματος) και το μέγεθος της εικόνας στόχου.

import moviepy.editor as mp
import librosa
import numpy as np
import cv2

def generate_mel_spectrogram(video_path, n_mels=128, fmax=8000, target_size=(256, 256)):
    # 提取音频
    audio_path = 'extracted_audio.wav'
    # video_path 应该是之前定义的变量,包含了要处理的视频文件的路径。创建了一个 VideoFileClip 对象,存储在 video 变量中。
    video = mp.VideoFileClip(video_path)
    # video.audio 访问视频的音频轨道。write_audiofile() 方法将音频写入文件。verbose=False: 设置为False表示不在控制台输出处理进度。logger=None: 设置为None表示不使用日志记录器。实际上我们做这个预测没有这样的需求,也就不消耗占存。
    # 其默认参数:write_audiofile(self, filename, fps=None, nbytes=2, buffersize=2000, codec=None, bitrate=None, ffmpeg_params=None, write_logfile=False, verbose=True, logger='bar')
    video.audio.write_audiofile(audio_path, verbose=False, logger=None)

    # 加载音频文件,加载采样率
    y, sr = librosa.load(audio_path)

    # 生成MEL频谱图(梅尔频谱图,与之相对应的有mel倒频谱图)
    # 默认参数:librosa.feature.melspectrogram(y=None, sr=22050, S=None, n_fft=2048, hop_length=512, power=2.0, **kwargs)
    # 参数解释:y:音频时间序列,sr:采样率,n_mels 是指在计算梅尔频谱图时,将频谱图划分为多少个梅尔频率滤波器(Mel filters),其决定了最终生成的梅尔频谱图的分辨率,也可以理解为梅尔频谱图的高度。
    S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=n_mels)

    # 将频谱图转换为dB单位,S:输入功率,ref:作为参考,如果是标量,则振幅 abs(S) 相对于 ref: 10 * log10(S / ref) 进行缩放。此处np.max指的是将谱图中的最大值作为参考值,这也是一种常用的参考值取法
    S_dB = librosa.power_to_db(S, ref=np.max)

    # 归一化到0-255之间,NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化。
    S_dB_normalized = cv2.normalize(S_dB, None, 0, 255, cv2.NORM_MINMAX)
    
    # 将浮点数转换为无符号8位整型
    S_dB_normalized = S_dB_normalized.astype(np.uint8)

    # 缩放到目标大小256,256
    img_resized = cv2.resize(S_dB_normalized, target_size, interpolation=cv2.INTER_LINEAR)

    return img_resized

# 使用示例
video_path = '/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/trainset/001b0680999447348bc9f89efce0f183.mp4'  # 替换为您的视频文件路径
mel_spectrogram_image = generate_mel_spectrogram(video_path)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

4.6 Δημιουργία φακέλου δεδομένων εκπαίδευσης

!mkdir ffdv_phase1_sample
!mkdir ffdv_phase1_sample/trainset
!mkdir ffdv_phase1_sample/valset
  • 1
  • 2
  • 3

4.7 Δημιουργία φασματογράμματος Mel

Ο όγκος των δεδομένων είναι πολύ τεράστιος, επομένως δεν θα δημοσιεύσω μια εικόνα εδώ, θα δημοσιεύσω ένα διάγραμμα Mel υπό κανονικές συνθήκες.
Εισαγάγετε την περιγραφή της εικόνας εδώ
Πηγή εικόνας:Πανεπιστήμιο Simon Fraser
Αν το ενεργοποιήσετε και το ακούσετε, είναι ένα κομμάτι ήχου που σταδιακά μειώνεται.

# 使用glob.glob函数查找/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/trainset/目录下前400个.mp4视频文件的路径。
for video_path in glob.glob('/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/trainset/*.mp4')[:400]:
    mel_spectrogram_image = generate_mel_spectrogram(video_path)
    cv2.imwrite('./ffdv_phase1_sample/trainset/' + video_path.split('/')[-1][:-4] + '.jpg', mel_spectrogram_image)
# a. 调用generate_mel_spectrogram(video_path)函数生成梅尔频谱图,并将其存储在mel_spectrogram_image变量中。b. 使用cv2.imwrite函数将梅尔频谱图保存为JPEG图像。图像被保存在./ffdv_phase1_sample/trainset/目录下,并使用与原始视频文件相同的名称(但扩展名改为.jpg)。
for video_path in glob.glob('/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/valset/*.mp4'):
    mel_spectrogram_image = generate_mel_spectrogram(video_path)
    cv2.imwrite('./ffdv_phase1_sample/valset/' + video_path.split('/')[-1][:-4] + '.jpg', mel_spectrogram_image)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.8 Καθορίστε το AverageMeter και το ProgressMeter

Η κλάση AverageMeter χρησιμοποιείται για τον υπολογισμό και την αποθήκευση της μέσης και τρέχουσας τιμής μιας μεταβλητής.

  • name: Το όνομα της μεταβλητής.
  • fmt: συμβολοσειρά μορφοποίησης, που χρησιμοποιείται για μορφοποιημένη έξοδο.
  • reset(): Επαναφέρει όλα τα στατιστικά στοιχεία (val, m., sum, count).
  • update(val, n=1): Ενημέρωση στατιστικών στοιχείων, val είναι η τρέχουσα τιμή και n είναι το βάρος της τιμής (συνήθως ο αριθμός των δειγμάτων).
  • str(): Επιστρέφει μια μορφοποιημένη συμβολοσειρά, συμπεριλαμβανομένης της τρέχουσας τιμής και της μέσης τιμής.
class AverageMeter(object):
    """Computes and stores the average and current value"""
    def __init__(self, name, fmt=':f'):
        self.name = name
        self.fmt = fmt
        self.reset()

    def reset(self):
        self.val = 0
        self.avg = 0
        self.sum = 0
        self.count = 0

    def update(self, val, n=1):
        self.val = val
        self.sum += val * n
        self.count += n
        self.avg = self.sum / self.count

    def __str__(self):
        fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})'
        return fmtstr.format(**self.__dict__)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

Η κλάση ProgressMeter χρησιμοποιείται για την παραγωγή πληροφοριών τρέχουσας παρτίδας και στατιστικών δεικτών κατά τη διάρκεια της εκπαιδευτικής διαδικασίας.

  • num_batches: συνολικός αριθμός παρτίδων.
  • μέτρα: Μια λίστα που περιέχει αντικείμενα AverageMeter που χρησιμοποιούνται για την αποθήκευση διαφορετικών μετρήσεων.
  • πρόθεμα: Το πρόθεμα της γραμμής εξόδου.
  • print(batch): Εκτυπώστε τις πληροφορίες της τρέχουσας παρτίδας, συμπεριλαμβανομένου του τρέχοντος αριθμού παρτίδας και της τρέχουσας τιμής κάθε δείκτη.
  • _get_batch_fmtstr(num_batches): Δημιουργήστε συμβολοσειρές μορφοποίησης παρτίδας για να διασφαλίσετε την ευθυγράμμιση και τη μορφοποίηση της εξόδου.
class ProgressMeter(object):
   def __init__(self, num_batches, *meters):
       self.batch_fmtstr = self._get_batch_fmtstr(num_batches)
       self.meters = meters
       self.prefix = ""


   def pr2int(self, batch):
       entries = [self.prefix + self.batch_fmtstr.format(batch)]
       entries += [str(meter) for meter in self.meters]
       print('t'.join(entries))

   def _get_batch_fmtstr(self, num_batches):
       num_digits = len(str(num_batches // 1))
       fmt = '{:' + str(num_digits) + 'd}'
       return '[' + fmt + '/' + fmt.format(num_batches) + ']'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4.9 Βαθιά μάθηση και διαδικασία αξιολόγησης μοντέλων (κλειδιά)

Η συνάρτηση επικύρωσης αξιολογεί τακτικά την απόδοση του μοντέλου στο σύνολο επικύρωσης κατά τη διάρκεια της εκπαιδευτικής διαδικασίας και υπολογίζει και εκτυπώνει την ακρίβεια Top-1.

def validate(val_loader, model, criterion):
    batch_time = AverageMeter('Time', ':6.3f')# 批处理时间
    losses = AverageMeter('Loss', ':.4e')# 损失
    top1 = AverageMeter('Acc@1', ':6.2f')# Top-1准确率
    progress = ProgressMeter(len(val_loader), batch_time, losses, top1)# 输出ProgressMeter

    # switch to evaluate mode,eval()为评估函数,关闭训练时使用的一些特定层(如 Dropout),并启用 Batch Normalization 层的运行统计。
    model.eval()

    with torch.no_grad():# 定时设置requires_grad为False,防止梯度计算并节省内存。
        end = time.time()
        for i, (input, target) in enumerate(val_loader):
            input = input.cuda()# 将输入数据和目标数据转移到GPU计算
            target = target.cuda()

            # compute output
            output = model(input)
            loss = criterion(output, target)# 计算训练损失

            # measure accuracy and record loss,acc百分比显示
            acc = (output.argmax(1).view(-1) == target.float().view(-1)).float().mean() * 100
            losses.update(loss.item(), input.size(0))
            top1.update(acc, input.size(0))
            # measure elapsed time
            batch_time.update(time.time() - end)
            end = time.time()

        # TODO: this should also be done with the ProgressMeter
        print(' * Acc@1 {top1.avg:.3f}'
              .format(top1=top1))
        return top1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Η συνάρτηση πρόβλεψης χρησιμοποιείται για την εξαγωγή συμπερασμάτων σχετικά με το σύνολο δοκιμών και υποστηρίζει τη χρήση της αύξησης χρόνου δοκιμής (TTA) για τη βελτίωση της σταθερότητας των προβλέψεων μοντέλων κάνοντας πολλαπλές προβλέψεις και υπολογισμό του μέσου όρου.

def predict(test_loader, model, tta=10):
    # switch to evaluate mode
    model.eval()
    # TTA(Test Time Augmentation)
    test_pred_tta = None
    for _ in range(tta):# 执行 TTA 次数的循环,每次循环会生成一个略有不同的输入数据。
        test_pred = []
        with torch.no_grad():
            end = time.time()
            for i, (input, target) in enumerate(test_loader):
                input = input.cuda()
                target = target.cuda()

                # compute output
                output = model(input)
                output = F.softmax(output, dim=1)# 对模型输出进行 softmax 归一化处理,以获得类别概率。
                output = output.data.cpu().numpy()

                test_pred.append(output)
        test_pred = np.vstack(test_pred)
    
        if test_pred_tta is None:
            test_pred_tta = test_pred
        else:
            test_pred_tta += test_pred
    
    return test_pred_tta
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

def train(train_loader, model, criterion, optimizer, epoch):
    batch_time = AverageMeter('Time', ':6.3f')
    losses = AverageMeter('Loss', ':.4e')
    top1 = AverageMeter('Acc@1', ':6.2f')
    progress = ProgressMeter(len(train_loader), batch_time, losses, top1)

    # switch to train mode
    model.train()

    end = time.time()
    for i, (input, target) in enumerate(train_loader):
        input = input.cuda(non_blocking=True)
        target = target.cuda(non_blocking=True)

        # compute output
        output = model(input)
        loss = criterion(output, target)

        # measure accuracy and record loss
        losses.update(loss.item(), input.size(0))

        acc = (output.argmax(1).view(-1) == target.float().view(-1)).float().mean() * 100
        top1.update(acc, input.size(0))# 更新 top1 计量器,记录当前批次的准确率。

        # compute gradient and do SGD step
        optimizer.zero_grad() # 清除之前累积的梯度。
        loss.backward()# 计算损失相对于模型参数的梯度
        optimizer.step()# 根据 backward() 计算的梯度更新模型参数。

        # measure elapsed time
        batch_time.update(time.time() - end)# 更新 batch_time 计量器,记录当前批次的处理时间。
        end = time.time()

        if i % 100 == 0:
            progress.pr2int(i)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

4.10 Τοποθετήστε ετικέτες για σύνολα δεδομένων εκπαίδευσης και επικύρωσης

train_label = pd.read_csv("/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/train_label.txt")
val_label = pd.read_csv("/kaggle/input/ffdv-sample-dataset/ffdv_phase1_sample/val_label.txt")

train_label['path'] = '/kaggle/working/ffdv_phase1_sample/trainset/' + train_label['video_name'].apply(lambda x: x[:-4] + '.jpg')
val_label['path'] = '/kaggle/working/ffdv_phase1_sample/valset/' + val_label['video_name'].apply(lambda x: x[:-4] + '.jpg')

train_label = train_label[train_label['path'].apply(os.path.exists)]
val_label = val_label[val_label['path'].apply(os.path.exists)]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.11 Φόρτωση εικόνων και μετατροπή εικόνων

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

class FFDIDataset(Dataset):
    def __init__(self, img_path, img_label, transform=None):
        self.img_path = img_path
        self.img_label = img_label
        
        if transform is not None:
            self.transform = transform
        else:
            self.transform = None
    
    def __getitem__(self, index):
        img = Image.open(self.img_path[index]).convert('RGB')
        
        if self.transform is not None:
            img = self.transform(img)
        
        return img, torch.from_numpy(np.array(self.img_label[index]))
    
    def __len__(self):
        return len(self.img_path)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

4.12 Ρύθμιση της εκπαιδευτικής διαδικασίας (βασικά σημεία)

Αναφέρεται στην κατηγορία FFDID που ορίστηκε παραπάνω.

train_loader = torch.utils.data.DataLoader(
    FFDIDataset(train_label['path'].values, train_label['target'].values, 
            transforms.Compose([
                        transforms.Resize((256, 256)),
                        transforms.RandomHorizontalFlip(),
                        transforms.RandomVerticalFlip(),
                        transforms.ToTensor(),
                        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])
    ), batch_size=40, shuffle=True, num_workers=12, pin_memory=True
)

val_loader = torch.utils.data.DataLoader(
    FFDIDataset(val_label['path'].values, val_label['target'].values, 
            transforms.Compose([
                        transforms.Resize((256, 256)),
                        transforms.ToTensor(),
                        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])
    ), batch_size=40, shuffle=False, num_workers=10, pin_memory=True
)
# 重点:这里调用timm提供的resnet18模型,因为分类为0/1(真视频/假视频),可以在后续改进,比如换用更深的网络ResNet-34、ResNet-50或是其他变体
model = timm.create_model('resnet18', pretrained=True, num_classes=2)
model = model.cuda()

# 交叉熵损失,针对多类别
criterion = nn.CrossEntropyLoss().cuda()
# Adam优化器,学习率设置为0.003。
optimizer = torch.optim.Adam(model.parameters(), 0.003)
# 每4个epoch将学习率按0.85的因子进行调整。
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma=0.85)
# 初始化最优acc
best_acc = 0.0
for epoch in range(10):
    scheduler.step()
    print('Epoch: ', epoch)
	# 调用train函数
    train(train_loader, model, criterion, optimizer, epoch)
    # 调用validate函数
    val_acc = validate(val_loader, model, criterion)
    
    if val_acc.avg.item() > best_acc:
        best_acc = round(val_acc.avg.item(), 2)
        torch.save(model.state_dict(), f'./model_{best_acc}.pt')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

Παραγωγή:

Epoch:  0
[ 0/10]	Time  6.482 ( 6.482)	Loss 7.1626e-01 (7.1626e-01)	Acc@1  35.00 ( 35.00)
 * Acc@1 64.000
Epoch:  1
[ 0/10]	Time  0.819 ( 0.819)	Loss 4.6079e-01 (4.6079e-01)	Acc@1  80.00 ( 80.00)
 * Acc@1 75.500
Epoch:  2
[ 0/10]	Time  0.914 ( 0.914)	Loss 1.4983e-01 (1.4983e-01)	Acc@1  97.50 ( 97.50)
 * Acc@1 88.500
Epoch:  3
[ 0/10]	Time  0.884 ( 0.884)	Loss 2.4681e-01 (2.4681e-01)	Acc@1  87.50 ( 87.50)
 * Acc@1 84.000
Epoch:  4
[ 0/10]	Time  0.854 ( 0.854)	Loss 5.3736e-02 (5.3736e-02)	Acc@1 100.00 (100.00)
 * Acc@1 90.500
Epoch:  5
[ 0/10]	Time  0.849 ( 0.849)	Loss 5.9881e-02 (5.9881e-02)	Acc@1  97.50 ( 97.50)
 * Acc@1 89.500
Epoch:  6
[ 0/10]	Time  0.715 ( 0.715)	Loss 1.6215e-01 (1.6215e-01)	Acc@1  92.50 ( 92.50)
 * Acc@1 65.000
Epoch:  7
[ 0/10]	Time  0.652 ( 0.652)	Loss 5.3892e-01 (5.3892e-01)	Acc@1  80.00 ( 80.00)
 * Acc@1 78.500
Epoch:  8
[ 0/10]	Time  0.847 ( 0.847)	Loss 6.6098e-02 (6.6098e-02)	Acc@1  97.50 ( 97.50)
 * Acc@1 81.000
Epoch:  9
[ 0/10]	Time  0.844 ( 0.844)	Loss 9.4254e-02 (9.4254e-02)	Acc@1  97.50 ( 97.50)
 * Acc@1 81.500
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

4.12.1 Ιδέες για τη βελτίωση του μοντέλου resnet18

Βαθύτερα δίκτυα: Εάν χρειάζεστε υψηλότερη απόδοση και πιο σύνθετες δυνατότητες εξαγωγής χαρακτηριστικών, μπορείτε να εξετάσετε το ενδεχόμενο να χρησιμοποιήσετε βαθύτερα δίκτυα όπως ResNet-34, ResNet-50 ή ακόμα μεγαλύτερες παραλλαγές ResNet (όπως ResNet-101 ή ResNet-152).

Άλλα προεκπαιδευμένα μοντέλα: Εκτός από τη σειρά ResNet, υπάρχουν πολλά άλλα προεκπαιδευμένα μοντέλα για να διαλέξετε, όπως:

EfficientNet: έχει εξαιρετική απόδοση και απόδοση παραμέτρων.
DenseNet: Η πυκνά συνδεδεμένη δομή δικτύου βοηθά στην καλύτερη χρήση των δυνατοτήτων.
Σειρά VGG: Απλή και κλασική αρχιτεκτονική, κατάλληλη για χρήση υπό περιορισμούς πόρων.
Προσαρμοσμένο μοντέλο: Ανάλογα με τα συγκεκριμένα χαρακτηριστικά του συνόλου δεδομένων και τις απαιτήσεις εργασιών, μπορείτε επίσης να εξετάσετε το ενδεχόμενο να σχεδιάσετε και να εκπαιδεύσετε μια προσαρμοσμένη αρχιτεκτονική μοντέλου, η οποία μπορεί να απαιτεί περισσότερο εντοπισμό σφαλμάτων και πειραματισμό.

Εκμάθηση συνόλου: Εξετάστε το ενδεχόμενο να χρησιμοποιήσετε μεθόδους εκμάθησης συνόλου, όπως το bagging ή το boosting για να συνδυάσετε τις προβλέψεις πολλών μοντέλων για να βελτιώσετε περαιτέρω την απόδοση και τη σταθερότητα.

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

4.12.2 Βελτίωση στην επιλογή της συνάρτησης απώλειας

Εξετάστε το ενδεχόμενο να εφαρμόσετε το Dice Loss για να βελτιώσετε τη λειτουργία απώλειας στο μέλλον Το Dice Loss μετρά την ομοιότητα μεταξύ του αποτελέσματος πρόβλεψης και της μάσκας στόχου και είναι καλύτερο για εργασίες δυαδικής ταξινόμησης με εμφανή όρια. Είναι μια συνάρτηση απώλειας που αποδίδει καλύτερα στην πρόβλεψη σε επίπεδο pixel.

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

4.12.3 Βελτιώσεις επιλογής Optimizer

Το RAdam είναι μια βελτίωση του Adam που βελτιώνει τη σταθερότητα και την απόδοση προσαρμόζοντας δυναμικά τη διόρθωση του ρυθμού εκμάθησης.

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

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

4.13 Μοντέλο αξιολόγησης

# 用模型 (model) 对验证数据集 (val_loader) 进行预测。这部分假设 [:, 1] 给出了类别1的概率。
val_pred = predict(val_loader, model, 1)[:, 1]
# 赋值,预测的概率(或者预测值)赋给了 val_label 数据框中名为 "y_pred" 的列
val_label["y_pred"] = val_pred
  • 1
  • 2
  • 3
  • 4

4.14 Ενσωμάτωση του τελικού συνόλου δεδομένων

submit = pd.read_csv("/kaggle/input/multi-ffdv/prediction.txt.csv")
# 使用 merge 函数将提交文件 (submit) 中的数据与验证数据集标签 (val_label) 中的 video_name 和 y_pred 列合并
merged_df = submit.merge(val_label[['video_name', 'y_pred']], on='video_name', suffixes=('', '_df2'), how='left', )
# 将合并后的数据中 y_pred_df2 列(从验证集中获取的预测结果)的值填充到 y_pred 列中
merged_df['y_pred'] = merged_df['y_pred_df2'].combine_first(merged_df['y_pred'])
merged_df[['video_name', 'y_pred']].to_csv('submit.csv', index=None)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5. Συμπέρασμα

Δεν χρειάζονται 10 λεπτά για να ολοκληρωθεί η εκτέλεση της γραμμής βάσης. Συνήθως θα κολλήσει στο 4,7 για να δημιουργηθεί το φασματόγραμμα Mel. Χρειάζονται όμως 5 ώρες εξερεύνησης από τον ασθενή. Ακολουθεί μια σιωπηρή περίληψη των βασικών διαδικασιών:

  • Υπολογίστε τον αριθμό των δειγμάτων
  • Δημιουργήστε αντικείμενα ήχου και βίντεο
  • Εισαγωγή συνόλου δεδομένων εκπαίδευσης
  • Εισαγωγή δεδομένων ήχου και βίντεο
  • Ορισμός τυχαίου σπόρου/CUDNN
  • Προεπεξεργασία ήχου και βίντεο
  • Δημιουργία φασματογράμματος mel
  • Καθορίστε το σύνολο επικύρωσης, το σύνολο πρόβλεψης και τις μεθόδους συνόλου εκπαίδευσης
  • μετατροπή εικόνας
  • Χρησιμοποιήστε το μοντέλο εκπαίδευσης SOTA, βελτιστοποίησης-αξιολόγησης που παρέχεται από την timm

6. Αναπτύξτε

6.1 Ορισμός καθηκόντων βαθιάς μάθησης

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

Είναι πολύ κατάλληλο να χρησιμοποιείτε τη βαθιά εκμάθηση για να χειρίζεστε τέτοιες εργασίες ήχου και βίντεο, νομίζω ότι η πρώτη είναι η τεράστια ποσότητα δεδομένων ήχου και βίντεο και η ανάγκη για πολύπλοκη ταξινόμηση αυτών των δεδομένων.Ο μηχανισμός της βαθιάς μάθησης καθορίζει ότι απαιτεί τεράστιο όγκο δεδομένων, και στην πραγματικότητα, ένα πολύ σημαντικό σημείο είναι ότι το ίδιο το deepfake απαιτείΤαξινόμησηΗ σκέψη είναι ουσιαστικά μια εργασία ταξινόμησης και η βαθιά εκμάθηση έχει μεγάλα πλεονεκτήματα σε μεγάλους όγκους δεδομένων και εκλεπτυσμένη ταξινόμηση Ένα οικείο παράδειγμα είναι το ανταγωνιστικό δίκτυο GAN.

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

6.2 Η σχέση μεταξύ AIGC και Deepfake

Εισαγάγετε την περιγραφή της εικόνας εδώ

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

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