戰(zhàn):基于ResNet18與遷移學(xué)習(xí)的七分類完整流程)
簡介本資源是面向人工智能導(dǎo)論課程學(xué)習(xí)者的圖像情緒分析大作業(yè)完整實(shí)現(xiàn)方案適用于計(jì)算機(jī)、人工智能及相關(guān)專業(yè)本科生、教師及入門級從業(yè)者解決圖像中人臉情緒識別這一典型CVAI交叉任務(wù)。壓縮包共26個(gè)文件含11個(gè)Python核心腳本涵蓋CNN/VGG/ResNet多模型訓(xùn)練與測試、數(shù)據(jù)預(yù)處理、可視化及對比分析、5份Markdown文檔含README說明、使用指南、實(shí)驗(yàn)報(bào)告框架與參考文獻(xiàn)、4個(gè)輔助ZIP項(xiàng)目包含F(xiàn)er2013數(shù)據(jù)集適配代碼與人臉標(biāo)注工具、1個(gè)Haar級聯(lián)XML檢測器及1個(gè)演示視頻整體8.06MB結(jié)構(gòu)清晰、模塊解耦。已有50人學(xué)習(xí)下載資源經(jīng)實(shí)際運(yùn)行驗(yàn)證答辯平均分96分附帶完整實(shí)驗(yàn)流程、模型性能對比邏輯與GPU加速支持腳本可直接用于課設(shè)、畢設(shè)或二次開發(fā)特別適合從零理解情緒識別全流程的學(xué)習(xí)者快速上手與深度拓展。 圖像情緒分析這種題目在人工智能導(dǎo)論的大作業(yè)里出現(xiàn)頻率相當(dāng)高。它不算最前沿但勝在“麻雀雖小五臟俱全”——從數(shù)據(jù)采集、模型訓(xùn)練、結(jié)果評估到文檔撰寫整條流程覆蓋了計(jì)算機(jī)視覺和深度學(xué)習(xí)的基礎(chǔ)環(huán)節(jié)特別適合用來檢驗(yàn)一學(xué)期課程的掌握程度。我當(dāng)年選這個(gè)題目時(shí)身邊不少同學(xué)在做一個(gè)“能跑通的demo”但我更傾向于把它做成一個(gè)完整、可復(fù)現(xiàn)、能讓老師看出你“真懂”的項(xiàng)目。這篇文章就圍繞我完成這個(gè)項(xiàng)目時(shí)的完整思路展開包括源代碼組織、關(guān)鍵實(shí)現(xiàn)細(xì)節(jié)、實(shí)驗(yàn)設(shè)計(jì)以及那份最容易被忽視、但往往決定最終成績的實(shí)驗(yàn)報(bào)告該怎么寫。先說清楚這個(gè)項(xiàng)目的核心任務(wù)輸入一張圖片程序判斷畫面中人物的情緒屬于哪一類。常見分類包括開心、悲傷、憤怒、驚訝、恐懼、厭惡、中立這七類。聽起來不復(fù)雜但落地難度在細(xì)節(jié)里——比如人臉遮擋、光線變化、不同人種的表情差異、模型過擬合等問題都會直接影響最終準(zhǔn)確率。這份大作業(yè)不僅是讓你訓(xùn)練一個(gè)模型更是讓你體驗(yàn)一遍完整的工程化流程。如果你是正在選題目或者已經(jīng)選了類似題目的學(xué)生這篇內(nèi)容可以幫你少走很多彎路。我會把項(xiàng)目拆成“思路設(shè)計(jì)、代碼實(shí)現(xiàn)、實(shí)驗(yàn)調(diào)優(yōu)、文檔報(bào)告”四個(gè)部分來講結(jié)合我實(shí)際踩過的坑和驗(yàn)證過有效的方法爭取讓你交出一份有技術(shù)含量、邏輯清晰、能經(jīng)得起答辯追問的作業(yè)。1. 項(xiàng)目整體設(shè)計(jì)與思路拆解1.1 從課程要求反推項(xiàng)目定位大部分人工智能導(dǎo)論課的大作業(yè)核心評判標(biāo)準(zhǔn)并不是“模型準(zhǔn)確率有多高”而是“你有沒有完整理解并實(shí)現(xiàn)一個(gè)AI系統(tǒng)”。這句話怎么理解就是說哪怕你只用了最基礎(chǔ)的卷積神經(jīng)網(wǎng)絡(luò)CNN只要你把數(shù)據(jù)處理、訓(xùn)練流程、測試評估、結(jié)果分析講得明明白白分?jǐn)?shù)往往比那些“用了一個(gè)別人封裝好的接口、自己卻說不出原理”的高得多。我的做法是先列了一個(gè)“交付物清單”源代碼、文檔說明、實(shí)驗(yàn)報(bào)告。然后圍繞這三樣?xùn)|西反向設(shè)計(jì)項(xiàng)目邊界。源代碼要跑得起來文檔說明要讓別人10分鐘內(nèi)能看懂并復(fù)現(xiàn)實(shí)驗(yàn)報(bào)告要交代清楚“我做了什么、為什么這么做、結(jié)果如何、還能怎么改進(jìn)”。圍繞這個(gè)目標(biāo)我選擇了深度學(xué)習(xí)方案而不是傳統(tǒng)的HOGSVM這樣的機(jī)器學(xué)習(xí)方案。原因有三點(diǎn)第一深度學(xué)習(xí)方案更貼近當(dāng)前學(xué)術(shù)界和工業(yè)界的主流做法展示的學(xué)習(xí)成果更有說服力。第二預(yù)訓(xùn)練模型和成熟框架如PyTorch大大降低了實(shí)現(xiàn)門檻課程周期內(nèi)完全可完成。第三深度學(xué)習(xí)模型的可解釋工具和可視化手段更豐富有利于實(shí)驗(yàn)報(bào)告的寫作。當(dāng)然選擇深度學(xué)習(xí)也意味著要踩更多的坑比如環(huán)境配置、顯存不足、訓(xùn)練時(shí)間過長等等。但這些問題恰恰是“導(dǎo)論大作業(yè)”該讓你經(jīng)歷的——不然怎么叫“實(shí)踐出真知”1.2 七分類問題建模與數(shù)據(jù)方案選型情緒分析本質(zhì)上是一個(gè)圖像分類問題。我選定的任務(wù)定義是給定一張人臉圖像輸出該人臉對應(yīng)情緒的標(biāo)簽生氣、厭惡、恐懼、開心、悲傷、驚訝、中立。數(shù)據(jù)集方面我優(yōu)先考慮了三個(gè)公開數(shù)據(jù)集FER201335,887張48×48灰度人臉圖7類、CK相對較小但標(biāo)注質(zhì)量高、RAF-DB真實(shí)場景約3萬張。經(jīng)過權(quán)衡我最終選了FER2013作為主數(shù)據(jù)集。為什么因?yàn)樗?guī)模適中、被引用極多、網(wǎng)上教程和相關(guān)代碼也最豐富遇到問題很容易檢索到解決方案。但我必須承認(rèn)FER2013有一個(gè)令人頭疼的特點(diǎn)——噪聲很大很多標(biāo)注本身就有問題訓(xùn)練出來的模型準(zhǔn)確率上限也就在65%左右。而這個(gè)數(shù)字也會成為實(shí)驗(yàn)報(bào)告里“局限性與改進(jìn)方向”的一部分可以說道的地方很多不虧。1.3 技術(shù)路線對比為什么選ResNet作為主干在做方案選型的時(shí)候我比較了三條路線從零訓(xùn)練幾層CNN使用經(jīng)典預(yù)訓(xùn)練網(wǎng)絡(luò)ResNet18/50做遷移學(xué)習(xí)使用現(xiàn)成的API或開源網(wǎng)絡(luò)服務(wù)如果只是圖省事第三條路最輕松但會被老師問得很難受。第一條路雖然代碼最小但分類效果通常不好實(shí)驗(yàn)報(bào)告的曲線圖不好看。我選了第二條路以ResNet18為主干用ImageNet預(yù)訓(xùn)練權(quán)重做初始化然后替換最后的全連接層為7分類。這樣既保留了自己寫代碼的空間又利用了遷移學(xué)習(xí)的優(yōu)勢收斂快、需要的數(shù)據(jù)量小、效果有保障。而且ResNet18結(jié)構(gòu)不復(fù)雜參數(shù)量約1120萬在本人的筆記本GPU4G顯存上完全可以訓(xùn)練對實(shí)驗(yàn)設(shè)備要求低這點(diǎn)對大作業(yè)場景很關(guān)鍵。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 數(shù)據(jù)預(yù)處理別小看這“簡單一步”很多人拿到圖片就直接送進(jìn)模型這是新手最容易犯的錯(cuò)誤。預(yù)處理是決定模型能否收斂的關(guān)鍵環(huán)節(jié)特別要注意以下幾點(diǎn)尺寸統(tǒng)一FER2013原始尺寸是48×48但ResNet18的輸入要求是224×224因此需要先縮放或填充到224×224。數(shù)值歸一化圖像像素是0-255的整數(shù)需要除以255變成0-1浮點(diǎn)數(shù)再按ImageNet的均值和標(biāo)準(zhǔn)差mean[0.485, 0.456, 0.406]std[0.229, 0.224, 0.225]做標(biāo)準(zhǔn)化這樣才能和預(yù)訓(xùn)練權(quán)重對上。數(shù)據(jù)增強(qiáng)訓(xùn)練集可以做隨機(jī)水平翻轉(zhuǎn)概率0.5、隨機(jī)旋轉(zhuǎn)±15度、隨機(jī)裁剪等操作。注意測試集不能做增強(qiáng)只用居中裁剪和歸一化否則推理結(jié)果不準(zhǔn)確。我做了一個(gè)小實(shí)驗(yàn)驗(yàn)證預(yù)處理的有效性不做任何處理直接訓(xùn)練模型在驗(yàn)證集上的準(zhǔn)確率大約只有40%多做了歸一化和數(shù)據(jù)增強(qiáng)后能穩(wěn)定到60%以上。差異非常大這也成了實(shí)驗(yàn)報(bào)告里一個(gè)亮眼的數(shù)據(jù)對比。2.2 從零搭建數(shù)據(jù)管道我用了PyTorch的Dataset和DataLoader來組織數(shù)據(jù)。FER2013數(shù)據(jù)集是CSV格式每行是“l(fā)abel 像素值”需要先解析成圖像。我寫了一個(gè)自定義Dataset類偽代碼如下class FerDataset(Dataset): def __init__(self, csv_path, transformNone): self.data pd.read_csv(csv_path) self.transform transform def __len__(self): return len(self.data) def __getitem__(self, idx): row self.data.iloc[idx] label row[emotion] pixels row[pixels].split() img np.array(pixels, dtypenp.uint8).reshape(48, 48) img cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) pil_img Image.fromarray(img) if self.transform: pil_img self.transform(pil_img) return pil_img, label我特別說明一下使用的transformtransform_train transforms.Compose([ transforms.Resize((224, 224)), transforms.RandomHorizontalFlip(), transforms.RandomRotation(15), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) transform_test transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ])用DataLoader加載時(shí)batch_size設(shè)成64顯存夠的話可以更大shuffleTrue打亂訓(xùn)練集順序。這里有個(gè)容易踩的坑每次訓(xùn)練前一定要重新shuffle否則模型會學(xué)到樣本的次序模式導(dǎo)致驗(yàn)證準(zhǔn)確率忽高忽低。2.3 模型代碼實(shí)現(xiàn)與訓(xùn)練配置模型部分用PyTorch的torchvision庫可以非常簡潔地實(shí)現(xiàn)import torch.nn as nn from torchvision import models class EmotionClassifier(nn.Module): def __init__(self, num_classes7): super(EmotionClassifier, self).__init__() self.backbone models.resnet18(pretrainedTrue) in_features self.backbone.fc.in_features self.backbone.fc nn.Linear(in_features, num_classes) def forward(self, x): return self.backbone(x)訓(xùn)練配置方面我推薦直接用Adam優(yōu)化器初始學(xué)習(xí)率1e-4權(quán)重衰減1e-4損失函數(shù)用交叉熵?fù)p失CrossEntropyLoss訓(xùn)練15-20輪就足夠。如果你顯存緊張可以把batch降到32但學(xué)習(xí)率也要相應(yīng)調(diào)低一些比如5e-5否則訓(xùn)練不穩(wěn)定。需要額外說明的是如果直接用預(yù)訓(xùn)練權(quán)重一開始的學(xué)習(xí)率不要太大因?yàn)轭A(yù)訓(xùn)練特征本身已經(jīng)很好了太大的學(xué)習(xí)率會“沖掉”原有特征。我的經(jīng)驗(yàn)是前5輪用1e-4后5輪降到1e-5最后一輪再降到1e-6這種手動(dòng)或余弦退火的調(diào)度方式能比固定學(xué)習(xí)率高出2-3個(gè)百分點(diǎn)的準(zhǔn)確率。3. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)3.1 項(xiàng)目文件結(jié)構(gòu)與運(yùn)行流程為了后續(xù)寫文檔說明方便我在項(xiàng)目里采用了清晰的文件結(jié)構(gòu)emotion_analysis/ ├── data/ │ ├── fer2013.csv │ └── split.py # 將csv按類別分割為train/val/test ├── src/ │ ├── dataset.py # Dataset類與數(shù)據(jù)增強(qiáng) │ ├── model.py # ResNet模型定義 │ ├── train.py # 訓(xùn)練主腳本 │ ├── test.py # 在測試集上評估 │ └── utils.py # 可視化混淆矩陣等工具 ├── checkpoints/ # 保存模型權(quán)重 ├── images/ # 輸入樣例與結(jié)果輸出 └── requirements.txt運(yùn)行流程很簡單先運(yùn)行split.py劃分?jǐn)?shù)據(jù)集再運(yùn)行train.py訓(xùn)練并保存權(quán)重最后運(yùn)行test.py輸出評估指標(biāo)。整個(gè)流程不超過三行命令這會讓答辯或驗(yàn)收的老師體驗(yàn)很好。3.2 訓(xùn)練腳本的關(guān)鍵細(xì)節(jié)train.py的核心邏輯我很早就寫好了但真正調(diào)通花了不少時(shí)間。我放一個(gè)簡化但可運(yùn)行的核心訓(xùn)練循環(huán)for epoch in range(num_epochs): model.train() train_loss, train_correct 0.0, 0 for images, labels in train_loader: images images.to(device) labels labels.to(device) outputs model(images) loss criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() train_loss loss.item() * images.size(0) _, preds torch.max(outputs, 1) train_correct torch.sum(preds labels.data) # 每個(gè)epoch后跑一次驗(yàn)證集 val_acc evaluate(model, val_loader, device) print(fEpoch {epoch1}/{num_epochs}, Loss: {train_loss/len(train_dataset):.4f}, fTrain Acc: {train_correct/train_size:.4f}, Val Acc: {val_acc:.4f})這里有幾個(gè)小細(xì)節(jié)很關(guān)鍵loss.item()和images.size(0)的乘積是累計(jì)該batch的總loss最后除以樣本總數(shù)得到平均loss比直接平均所有batch的loss更準(zhǔn)確。每個(gè)epoch后跑驗(yàn)證集可以及時(shí)觀察是否過擬合。如果訓(xùn)練準(zhǔn)確率持續(xù)上升、驗(yàn)證準(zhǔn)確率停滯或下降就及時(shí)停止訓(xùn)練早停而不是等訓(xùn)練完再回頭看。保存模型的時(shí)機(jī)也很重要。我只保存驗(yàn)證準(zhǔn)確率最高的那一輪而不是最后一輪的權(quán)重這個(gè)最優(yōu)模型權(quán)重會讓測試集結(jié)果往上提一點(diǎn)。3.3 評估指標(biāo)體系別只看準(zhǔn)確率很多大作業(yè)只報(bào)一個(gè)總體準(zhǔn)確率其實(shí)這不夠。尤其在情緒分類這類類別不均衡的問題上單看一堆平均值很容易掩蓋“某些類準(zhǔn)確率極低”的問題。我做了以下幾項(xiàng)評估Macro-F1每一類的F1單獨(dú)算再取平均對類別均衡懲罰更明顯?;煜仃嚳梢暬恳活惖姆诸惽闆r能一眼看出哪些類別容易被混淆。比如“恐懼”和“驚訝”經(jīng)常混淆“悲傷”和“中立”也容易分不清。分類報(bào)告包括每一類的精確率、召回率、F1-score和樣本數(shù)。在FER2013測試集上我最終模型的總準(zhǔn)確率大約62.8%。單看準(zhǔn)確率確實(shí)不算高但我在實(shí)驗(yàn)報(bào)告里解釋了原因數(shù)據(jù)噪聲大、標(biāo)注模糊等并且用混淆矩陣說明模型已經(jīng)學(xué)到了合理的特征。答辯老師不會因?yàn)闇?zhǔn)確率不夠頂級就扣分反而會因?yàn)槟阏故玖讼到y(tǒng)性的分析思路而加分。3.4 單張圖片推理與可視化結(jié)果為了讓“圖像情緒分析”這個(gè)題目貼近實(shí)際我還額外寫了一個(gè)predict.py支持輸入任意一張含有人臉的圖片先通過OpenCV的人臉檢測器裁剪出人臉區(qū)域再送入模型預(yù)測情緒最后在圖片上標(biāo)注結(jié)果。face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) gray cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) faces face_cascade.detectMultiScale(gray, scaleFactor1.1, minNeighbors5, minSize(48, 48)) for (x, y, w, h) in faces: face_roi img_bgr[y:yh, x:xw] emotion predict_emotion(face_roi) cv2.rectangle(img_bgr, (x, y), (xw, yh), (0, 255, 0), 2) cv2.putText(img_bgr, emotion, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)這段代碼不復(fù)雜但它把“圖像分類模型”變成了“圖像情緒分析應(yīng)用”非常直觀。我記得答辯時(shí)老師看到我可以輸入任意一張生活照并直接輸出情緒標(biāo)簽明顯表現(xiàn)出了興趣然后追問了一句“人臉的檢測框如果偏了會怎樣”這就說明項(xiàng)目已經(jīng)觸到了真實(shí)應(yīng)用層面的問題。4. 常見問題與排查技巧實(shí)錄4.1 模型過擬合train_acc高但val_acc上不去這是我遇到最多的問題幾乎每個(gè)訓(xùn)練過深度學(xué)習(xí)模型的人都會碰上。尤其FER2013噪聲大模型很容易記住訓(xùn)練集里的噪聲樣本。我的排查順序是先檢查數(shù)據(jù)增強(qiáng)有沒有做對再看學(xué)習(xí)率是不是太高接著確認(rèn)模型是否過于復(fù)雜模型越大越容易過擬合最后檢查訓(xùn)練輪數(shù)是否太長。實(shí)際解決辦法有三個(gè)加隨機(jī)翻轉(zhuǎn)和裁剪、增加Dropout在fc層前加0.5的dropout、提前停止訓(xùn)練。做了這三件事后我的驗(yàn)證準(zhǔn)確率從不到50%提升到了穩(wěn)定60%以上。4.2 不同情緒類別的樣本量差異太大在FER2013中“開心”和“中立”的樣本很多“厭惡”和“恐懼”就少很多。直接訓(xùn)練會導(dǎo)致少數(shù)類幾乎沒被學(xué)到召回率極低。解決方法是換用帶權(quán)重的交叉熵?fù)p失函數(shù)也就是給數(shù)量少的類別更高的權(quán)重class_weights compute_class_weight(balanced, classesnp.unique(labels), ylabels) class_weights torch.tensor(class_weights, dtypetorch.float).to(device) criterion nn.CrossEntropyLoss(weightclass_weights)用加權(quán)損失之后“厭惡”這一類在測試集上的召回率大約從20%提升到了35%。雖然依然是準(zhǔn)確率最低的類但確實(shí)是能觀察到顯著變化。4.3 CUDA out of memory課程大作業(yè)用個(gè)人電腦跑的居多顯存不足非常常見。我一開始batch_size設(shè)成128結(jié)果一訓(xùn)練就報(bào)CUDA out of memory。后來分幾步解決先把batch_size降到32或16再把圖像尺寸從224降到160在ResNet上還能接受實(shí)在不行就開CPU訓(xùn)練會慢不少但保證能跑通。我實(shí)際測試過batch_size64和32相比驗(yàn)證準(zhǔn)確率沒有明顯差別所以如果你的顯存只有4G優(yōu)先選32。4.4 預(yù)測單張圖片時(shí)結(jié)果明顯不對如果模型在測試集上準(zhǔn)確率還行但單張圖片效果差多半是預(yù)處理流程不一致。訓(xùn)練時(shí)我們用過數(shù)據(jù)增強(qiáng)和標(biāo)準(zhǔn)化預(yù)測單張時(shí)必須要用和“測試集”相同的處理流程而不是訓(xùn)練集那套尤其不能做隨機(jī)增強(qiáng)否則結(jié)果不可復(fù)現(xiàn)。我在predict.py里寫了一句注釋標(biāo)注了“不能用RandomHorizontalFlip”來提醒自己別踩這個(gè)坑。此外人臉檢測框的裁剪也很關(guān)鍵。檢測框如果偏了能把很多背景或下巴脖子區(qū)域截進(jìn)來模型自然認(rèn)不準(zhǔn)。我自己調(diào)試時(shí)發(fā)現(xiàn)Haar檢測器在某些角度會框偏后來簡單加了框的padding并做了一點(diǎn)位置校正效果好轉(zhuǎn)不少。4.5 環(huán)境依賴與項(xiàng)目復(fù)現(xiàn)問題大作業(yè)答辯時(shí)最尷尬的場景就是“在老師電腦上跑不起來”。為了預(yù)防這種狀況我做了一個(gè)requirements.txt把關(guān)鍵依賴寫清楚Python 3.8、PyTorch 1.12以上、torchvision、opencv-python、pandas、numpy、matplotlib、scikit-learn并測試了CPU環(huán)境下也能正常運(yùn)行推理腳本。雖然訓(xùn)練速度會慢但至少能復(fù)現(xiàn)。5. 實(shí)驗(yàn)報(bào)告與文檔說明撰寫指南5.1 文檔說明要寫什么很多同學(xué)把文檔說明當(dāng)成代碼注釋的大字版這是誤區(qū)。文檔說明的目的是讓一個(gè)小白也能按你的步驟復(fù)現(xiàn)項(xiàng)目。我把文檔說明分成五個(gè)部分項(xiàng)目簡介100字以內(nèi)說清楚項(xiàng)目做了什么。環(huán)境要求列出Python版本、GPU/CPU要求、依賴庫及安裝命令。數(shù)據(jù)集準(zhǔn)備說明數(shù)據(jù)來源、下載方式、目錄結(jié)構(gòu)??焖匍_始分步驟給出運(yùn)行命令包括數(shù)據(jù)劃分、訓(xùn)練、測試、單張推理。代碼結(jié)構(gòu)說明每個(gè)文件負(fù)責(zé)什么函數(shù)與類的輸入輸出是什么。寫這份文檔時(shí)我特意找了一位不搞AI的室友照著文檔跑了一遍。他卡在“pip install -r requirements.txt”這一步——因?yàn)閞equirements里少了opencv-python-headless和pandas這兩個(gè)包。這就是文檔測試的價(jià)值能發(fā)現(xiàn)你自以為“顯而易見”的坑。5.2 實(shí)驗(yàn)報(bào)告的核心章節(jié)與得分點(diǎn)實(shí)驗(yàn)報(bào)告不是流水賬要體現(xiàn)“發(fā)現(xiàn)問題-分析問題-解決問題”的科研邏輯。我的報(bào)告結(jié)構(gòu)如下研究背景與意義為什么圖像情緒分析有價(jià)值可結(jié)合人機(jī)交互、智能駕駛、教育場景等說明。相關(guān)工作與技術(shù)原理介紹表情識別的傳統(tǒng)方法和深度學(xué)習(xí)方法重點(diǎn)解釋CNN、ResNet、遷移學(xué)習(xí)的基本思想。方法設(shè)計(jì)描述數(shù)據(jù)預(yù)處理、模型結(jié)構(gòu)、損失函數(shù)、訓(xùn)練超參數(shù)的選擇依據(jù)。實(shí)驗(yàn)與結(jié)果分析給出準(zhǔn)確率、Macro-F1、混淆矩陣、loss曲線并逐類分析混淆成因。討論與改進(jìn)方向說明目前存在的問題以及未來可以用注意力機(jī)制、多模態(tài)融合等方案優(yōu)化。對于第五章很多人寫得敷衍但恰恰是這里最體現(xiàn)思考深度。我寫了幾點(diǎn)FER2013的標(biāo)注噪聲問題、模型對遮擋和極端光線的魯棒性不足、未來可嘗試使用Vision TransformerViT或基于面部動(dòng)作單元AU的方法等。答辯老師看到這些會認(rèn)為你確實(shí)在“做研究”而非“交作業(yè)”。5.3 答辯常見問題與回答準(zhǔn)備作為一個(gè)過來人我整理了幾個(gè)老師最常問的問題“為什么用ResNet18而不是其他網(wǎng)絡(luò)”回答思路ResNet解決了深層網(wǎng)絡(luò)的梯度消失問題結(jié)構(gòu)適中預(yù)訓(xùn)練權(quán)重好滿足實(shí)驗(yàn)需求VGG更重效果提升有限MobileNet更適合輕量化部署。“你的模型在什么情況下會失效”回答思路人臉遮擋、大角度姿態(tài)、低分辨率圖像都會導(dǎo)致無法準(zhǔn)確識別FER2013數(shù)據(jù)噪聲也限制了模型上限。“準(zhǔn)確率是不是太低了”回答思路承認(rèn)FER2013的難度給出與公開論文的橫向?qū)Ρ却蟛糠终撐脑贔ER2013上也只達(dá)到65%-70%再強(qiáng)調(diào)重點(diǎn)在于整套流程的完整性與分析的系統(tǒng)性?!發(fā)oss為什么越來越低但準(zhǔn)確率沒怎么變”回答思路這是交叉熵?fù)p失中“模型置信度提高但分類結(jié)果沒變”的現(xiàn)象可結(jié)合logits分布來解釋。我建議你在答辯前自己對著這些問題口頭演練一遍。不要背稿而是真正理解背后的邏輯。這樣被追問時(shí)不會慌回答也會更自然。6. 擴(kuò)展思路如何讓大作業(yè)超出預(yù)期一個(gè)思路清晰、能跑通、有報(bào)告的項(xiàng)目已經(jīng)能拿到不錯(cuò)的分?jǐn)?shù)。但如果你想更進(jìn)一步下面幾個(gè)方向很加分而且難度不算太高實(shí)時(shí)攝像頭情緒識別用OpenCV捕捉攝像頭畫面對每一幀做人臉檢測和情緒分類做成一個(gè)簡單的實(shí)時(shí)demo。這個(gè)改動(dòng)不大但演示效果極強(qiáng)。模型可解釋性可視化用Grad-CAM畫出模型對某張圖片分類時(shí)重點(diǎn)關(guān)注的區(qū)域。一張熱力圖往報(bào)告里一放整個(gè)項(xiàng)目的技術(shù)含量立刻上升一個(gè)檔次。不同主干網(wǎng)絡(luò)的對比實(shí)驗(yàn)ResNet18和MobileNetV3各訓(xùn)練一次對比準(zhǔn)確率、參數(shù)量、推理速度形成一張對比表格。這工作量不大但能為實(shí)驗(yàn)報(bào)告提供更多展示內(nèi)容。我在最終版里加入了Grad-CAM可視化效果非常明顯。有一張“開心”樣本的熱力圖里模型重點(diǎn)關(guān)注的是嘴巴和嘴角區(qū)域這完全符合直覺寫進(jìn)報(bào)告也很有說服力。結(jié)語做人工智能導(dǎo)論大作業(yè)的過程某種程度上就是一次“小型科研訓(xùn)練”。我自己的體會是這門課的大作業(yè)不在于你把準(zhǔn)確率刷到多高而在于你能不能把每一個(gè)環(huán)節(jié)講清楚把每一步操作背后“為什么這么做”說明白。源代碼是一份重要的交付物但源代碼背后的思路才是你真正要掌握的東西。圖像情緒分析這個(gè)題目到今天依然有學(xué)術(shù)價(jià)值和應(yīng)用價(jià)值從FER2013上的深度學(xué)習(xí)模型到工業(yè)界視覺情感分析系統(tǒng)這條路其實(shí)一直在延伸。希望這份經(jīng)驗(yàn)分享能幫你少踩幾個(gè)坑真正做出一個(gè)讓自己滿意、也讓老師眼前一亮的大作業(yè)。本文還有配套的精品資源點(diǎn)擊獲取