基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)
前端界面:flask+python, UI界面:pyqt5+python
这是一个完整项目,包括代码,数据集,模型训练记录,前端界面,ui界面,各种指标图:包括准确率,精确率,召回率,F1值,损失曲线,准确率曲线等
卷积模型采用vgg16模型或efficientnet,也可以用其他的卷积模型
PyQt5 UI 应用入口
好的,我们将构建一个完整的天气识别系统,使用VGG16和EfficientNet作为卷积神经网络,并结合Flask和PyQt5分别实现前端界面和UI界面。项目将包括数据集准备、模型训练、评估、前端和服务端代码。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog, QMessageBox
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
import requests
import json
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Weather Recognition System")
self.setGeometry(100, 100, 800, 600)
self.image_label = QLabel(self)
self.image_label.setAlignment(Qt.AlignCenter)
self.upload_button = QPushButton("Upload Image", self)
self.upload_button.clicked.connect(self.upload_image)
self.result_label = QLabel("", self)
self.result_label.setAlignment(Qt.AlignCenter)
self.result_label.setStyleSheet("font-size: 16px; font-weight: bold;")
layout = QVBoxLayout()
layout.addWidget(self.image_label)
layout.addWidget(self.upload_button)
layout.addWidget(self.result_label)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def upload_image(self):
options = QFileDialog.Options()
file_path, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "", "Images (*.png *.xpm *.jpg);;All Files (*)", options=options)
if file_path:
pixmap = QPixmap(file_path)
self.image_label.setPixmap(pixmap.scaled(400, 400, Qt.KeepAspectRatio))
files = {'file': open(file_path, 'rb')}
response = requests.post('http://127.0.0.1:5000/predict', files=files)
result = response.json()
vgg16_prediction = result['vgg16_prediction']
efficientnet_prediction = result['efficientnet_prediction']
self.result_label.setText(f"VGG16 Prediction: {vgg16_prediction}\nEfficientNet Prediction: {efficientnet_prediction}")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
项目结构
weather_recognition_system/
├── data/
│ ├── train/
│ │ ├── sunny/
│ │ ├── cloudy/
│ │ ├── rainy/
│ │ └── snowy/
│ └── val/
│ ├── sunny/
│ ├── cloudy/
│ ├── rainy/
│ └── snowy/
├── models/
│ ├── vgg16.pth
│ └── efficientnet.pth
├── app.py # Flask应用入口
├── ui_app.py # PyQt5 UI应用入口
├── train_vgg16.py # VGG16模型训练脚本
├── train_efficientnet.py # EfficientNet模型训练脚本
├── utils.py # 工具函数
├── requirements.txt # 依赖项
└── README.md # 项目说明文档
安装依赖项
首先,安装所需的Python库:
pip install torch torchvision flask pyqt5 matplotlib scikit-learn pandas seaborn
数据集准备
假设你已经有一个天气图像数据集,目录结构如上所示。如果没有,可以从公开的数据集中下载或自行收集。
训练模型
VGG16 模型训练
EfficientNet 模型训练
前端界面 (Flask)
app.py
文件
templates/index.html
文件
创建一个简单的HTML模板用于上传图片并显示预测结果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Weather Recognition</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background-color: #f4f4f4;
}
.container {
text-align: center;
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
input[type="file"] {
margin-bottom: 20px;
}
button {
padding: 10px 20px;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
.result {
margin-top: 20px;
font-size: 1.2em;
}
</style>
</head>
<body>
<div class="container">
<h1>Upload Weather Image</h1>
<form id="upload-form" enctype="multipart/form-data">
<input type="file" id="file-input" name="file" accept="image/*" required>
<br><br>
<button type="submit">Predict</button>
</form>
<div class="result" id="result"></div>
</div>
<script>
document.getElementById('upload-form').addEventListener('submit', function(event) {
event.preventDefault();
const formData = new FormData(this);
fetch('/predict', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
document.getElementById('result').innerHTML = `
<p>VGG16 Prediction: ${data.vgg16_prediction}</p>
<p>EfficientNet Prediction: ${data.efficientnet_prediction}</p>
`;
})
.catch(error => console.error('Error:', error));
});
</script>
</body>
</html>
UI界面 (PyQt5)
ui_app.py
文件
运行项目
-
启动Flask服务器:
python app.py
-
启动PyQt5 UI应用:
python ui_app.py
解释
- 数据预处理: 使用
transforms.Compose
对图像进行预处理。 - 模型训练: 使用VGG16和EfficientNet进行训练,并绘制损失曲线和准确率曲线。
- Flask应用: 提供一个简单的Web界面用于上传图像并获取预测结果。
- PyQt5 UI应用: 提供一个图形化的用户界面用于上传图像并显示预测结果。
通过这些步骤,你可以构建一个完整的天气识别系统,包括训练、评估、前端和服务端代码