??更多目標檢測、圖像分類識別、目標追蹤等項目可看我主頁其他文章
功能演示:
甲狀腺結節識別系統,卷積神經網絡,resnet50,mobilenet【pytorch框架,python源碼】_嗶哩嗶哩_bilibili
(一)簡介
基于卷積神經網絡的甲狀腺結節識別系統是在pytorch框架下實現的,這是一個完整的項目,包括代碼,數據集,訓練好的模型權重,模型訓練記錄,ui界面和各種模型指標圖表等。
該項目有兩個可選模型:resnet50和mobilenet,兩個模型都在項目中;GUI界面由pyqt5設計和實現,界面中給出模型預測病害的結果、概率和對應的防治措施。此項目的兩個模型可做對比分析,增加工作量。
該項目是在pycharm和anaconda搭建的虛擬環境執行,pycharm和anaconda安裝和配置可觀看教程:
超詳細的pycharm+anaconda搭建python虛擬環境_pycharm虛擬環境搭建-CSDN博客
(二)項目介紹
1. 項目結構
?????
該項目可以使用已經訓練好的模型權重,也可以自己重新訓練,自己訓練也比較簡單
以訓練resnet50模型為例:
第一步:修改model_resnet50.py的數據集路徑,模型名稱、模型訓練的輪數
???
第二步:模型訓練和驗證,即直接運行model_resnet50.py文件
第三步:使用模型,即運行gui_chinese.py文件即可通過GUI界面來展示模型效果
2. 數據結構
??????
部分數據展示:?
?????
3.GUI界面(技術棧:pyqt5+python+opencv)?
1)gui初始界面?
?
2)gui分類、識別界面?
?
?
????
4.模型訓練和驗證的一些指標及效果
?????1)模型訓練和驗證的準確率曲線,損失曲線
?
?????2)熱力圖
?
??3)準確率、精確率、召回率、F1值
?
4)模型訓練和驗證記錄
?
??
(三)代碼
由于篇幅有限,只展示核心代碼
def main(self, epochs):# 記錄訓練過程log_file_name = './results/resnet50訓練和驗證過程.txt'# 記錄正常的 print 信息sys.stdout = Logger(log_file_name)print("using {} device.".format(self.device))# 開始訓練,記錄開始時間begin_time = time()# 加載數據train_loader, validate_loader, class_names, train_num, val_num = self.data_load()print("class_names: ", class_names)train_steps = len(train_loader)val_steps = len(validate_loader)# 加載模型model = self.model_load() # 創建模型# 修改全連接層的輸出維度in_channel = model.fc.in_featuresmodel.fc = nn.Linear(in_channel, len(class_names))# 模型結構可視化x = torch.randn(16, 3, 224, 224) # 隨機生成一個輸入# 模型結構保存路徑model_visual_path = 'results/resnet50_visual.onnx'# 將 pytorch 模型以 onnx 格式導出并保存torch.onnx.export(model, x, model_visual_path) # netron.start(model_visual_path) # 瀏覽器會自動打開網絡結構# 將模型放入GPU中model.to(self.device)# 定義損失函數loss_function = nn.CrossEntropyLoss()# 定義優化器params = [p for p in model.parameters() if p.requires_grad]optimizer = optim.Adam(params=params, lr=0.0001)train_loss_history, train_acc_history = [], []test_loss_history, test_acc_history = [], []best_acc = 0.0for epoch in range(0, epochs):# 下面是模型訓練model.train()running_loss = 0.0train_acc = 0.0train_bar = tqdm(train_loader, file=sys.stdout)# 進來一個batch的數據,計算一次梯度,更新一次網絡for step, data in enumerate(train_bar):# 獲取圖像及對應的真實標簽images, labels = data# 清空過往梯度optimizer.zero_grad()# 得到預測的標簽outputs = model(images.to(self.device))# 計算損失train_loss = loss_function(outputs, labels.to(self.device))# 反向傳播,計算當前梯度train_loss.backward()# 根據梯度更新網絡參數optimizer.step() # 累加損失running_loss += train_loss.item()# 每行最大值的索引predict_y = torch.max(outputs, dim=1)[1] # torch.eq()進行逐元素的比較,若相同位置的兩個元素相同,則返回True;若不同,返回Falsetrain_acc += torch.eq(predict_y, labels.to(self.device)).sum().item()# 更新進度條train_bar.desc = "train epoch[{}/{}] loss:{:.3f}".format(epoch + 1,epochs,train_loss)# 下面是模型驗證# 不啟用 BatchNormalization 和 Dropout,保證BN和dropout不發生變化model.eval()# accumulate accurate number / epochval_acc = 0.0 testing_loss = 0.0# 張量的計算過程中無需計算梯度with torch.no_grad(): val_bar = tqdm(validate_loader, file=sys.stdout)for val_data in val_bar:# 獲取圖像及對應的真實標簽val_images, val_labels = val_data# 得到預測的標簽outputs = model(val_images.to(self.device))# 計算損失val_loss = loss_function(outputs, val_labels.to(self.device)) testing_loss += val_loss.item()# 每行最大值的索引predict_y = torch.max(outputs, dim=1)[1] # torch.eq()進行逐元素的比較,若相同位置的兩個元素相同,則返回True;若不同,返回Falseval_acc += torch.eq(predict_y, val_labels.to(self.device)).sum().item()train_loss = running_loss / train_stepstrain_accurate = train_acc / train_numtest_loss = testing_loss / val_stepsval_accurate = val_acc / val_numtrain_loss_history.append(train_loss)train_acc_history.append(train_accurate)test_loss_history.append(test_loss)test_acc_history.append(val_accurate)print('[epoch %d] train_loss: %.3f val_accuracy: %.3f' %(epoch + 1, train_loss, val_accurate))# 保存最佳模型if val_accurate > best_acc:best_acc = val_accuratetorch.save(model.state_dict(), self.model_name)# 記錄結束時間end_time = time()run_time = end_time - begin_timeprint('該循環程序運行時間:', run_time, "s")# 繪制模型訓練過程圖self.show_loss_acc(train_loss_history, train_acc_history,test_loss_history, test_acc_history)# 畫熱力圖test_real_labels, test_pre_labels = self.heatmaps(model, validate_loader, class_names)# 計算混淆矩陣self.calculate_confusion_matrix(test_real_labels, test_pre_labels, class_names)
?????(四)總結
以上即為整個項目的介紹,整個項目主要包括以下內容:完整的程序代碼文件、訓練好的模型、數據集、UI界面和各種模型指標圖表等。
整套項目資料齊全,一步到位,省心省力。
項目運行過程如出現問題,請及時交流!