网站整体结构商丘网站建设设计
2026/2/17 13:45:42 网站建设 项目流程
网站整体结构,商丘网站建设设计,旅游网站建设方案之目标,最好的做网站0 简介 今天学长向大家介绍一个机器视觉的毕设项目#xff0c;基于深度学习的人脸识别系统 项目运行效果#xff1a; 毕业设计 糖尿病视网膜预测#x1f9ff; 项目分享:见文末! 1 任务目标 这次任务的数据集是1000的糖网的4个等级的眼底图像#xff0c;我们需要利用深度…0 简介今天学长向大家介绍一个机器视觉的毕设项目基于深度学习的人脸识别系统项目运行效果毕业设计 糖尿病视网膜预测 项目分享:见文末!1 任务目标这次任务的数据集是1000的糖网的4个等级的眼底图像我们需要利用深度学习框架pytorch 来根据眼底图像预测其分类。2 数据处理1.数据分析通过对数据统计可以得到已经划分的训练集图片种类的分布是有一点不均匀的同时图片数量也有一点少所以我们先简单的对图片数据进行一下扩充这里我们使用最简单的图片反转作为数据增强的方式。我们对一类的图片进行的左右翻转和上下翻转扩充为原来的三倍。对二类和三类的图片我们做了上下翻转扩充到原来的二倍。对零类图片不做任何处理。这是处理后的训练集分布。我是73分割的训练集和验证集2.模型训练2.1模型准备使用的模型是torchvision.model里的经典模型和预训练好的参数。​from torchvision import models as models# inception_v3,ResNet50model models.resnet50(pretrainedTrue)#将pretrained置为true意思是使用已经预训练好的参数。​​model.fc#打印模型全连接层的输入和输出参数#Linear(in_features2048, out_features1000, biasTrue)因为我们是四分类所以调整模型输出为​model.fc torch.nn.Linear(in_features2048, out_features4, biasTrue)model.aux_logits False #这个设置是InceptionV3这个模型需要设置的#不知道什么意思但不设置会报错。2.2参数设置​device torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)model model.to(devicedevice)learning_rate 1e-4num_epochs 10batch_size 32optimizer torch.optim.Adam(model.parameters(), lr learning_rate)loss_criterion torch.nn.CrossEntropyLoss()2.3读取数据并转换为tensor类型这一部分我是定义了一个类mydataset继承父类Dataset来获取可迭代的数据对象同时对图片的处理和transform转换也在这里面实现。这里就不多说对dataset不懂得可以看我之前写的dataset类。直接贴代码。​my_transform transforms.Compose([transforms.Resize((299,299)),transforms.ToTensor(),# transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]),])#这里进行transform是因为inception_v3模型的输入是(299299)#resnet就不需要是299299了class retinaDataset(Dataset):definit(self, imagepathrD:\course\junior_2\deep_learning\third\train, csv_path ,transformmy_transform):self.df pd.read_csv(csv_path)# if (total is not None): # self.df self.df[:total] self.transform transform self.imagepath imagepath def __len__(self): return len(self.df) def __getitem__(self, index): img_path os.path.join(self.imagepath, self.df.iloc[index].image .png) img Image.open(img_path) if(self.transform): img self.transform(img) return img, torch.tensor(self.df.iloc[index].Retinopathy_grade)​​train_dataset retinaDataset(csv_pathrD:\course\junior_2\deep_learning\mythird\train.csv)train_dataloader DataLoader(datasettrain_dataset, batch_sizebatch_size, shuffleTrue) #这里调用Dataloder函数对数据进行分组并打乱顺序。2.4开始训练​for epoch in range(num_epochs):for data, target in tqdm(train_dataloader):data data.to(devicedevice)target target.to(devicedevice)score model(data) optimizer.zero_grad()​loss loss_criterion(score, target)loss.backward()optimizer.step() print(ffor epoch {epoch}, loss : {loss})2.5测试模型准确率​def f_check_accuracy(model_i,model_r, loader):model_i.eval() #模型inception_v3model_r.eval() #模型resnet50num00num10num20num30total00total10total20total30correct_output 0total_output 0with torch.no_grad(): #反向传播时不再自动求导节省显存。 for x, y in tqdm(loader): x x.to(devicedevice) y y.to(devicedevice) score_i model_i(x) score_r model_r(x) _,predictions_i score_i.max(1) _,predictions_r score_r.max(1) for i in range (len(y)): if(y[i]0): total0total01 if(predictions_i[i]0): num0num01 elif(y[i]1): total1total11 if(predictions_r[i]1): num1num11 elif(y[i]2): total2total21 if(predictions_r[i]2): num2num21 elif(y[i]3): total3total31 if(predictions_i[i]3): num3num31 correct_output num0num1num2num3 total_output total0total1total2total3 # model.train() print(0类准确率,num0/total0,correct:,num0,total:,total0) print(1类准确率,num1/total1,correct:,num1,total:,total1) print(2类准确率,num2/total2,correct:,num2,total:,total2) print(3类准确率,num3/total3,correct:,num3,total:,total3) print(fout of {total_output} , total correct: {correct_output} with an accuracy of {float(correct_output/total_output)*100})​解释一下我为什么要把inception_v3和resnet50结合到一起。我们可以看到v3和resnet50再不同种类的准确率不同。所以可以把这两个模型结合在一起来提高准确率。可以看到准确率提升的效果很好大约20个点左右。我们还可以从kaggle中下载一些数据来补充训练集因为1000图片在划分之后对于四分类的任务来说是不够的。3 数据分析数据集描述1.下载地址messidor_features.arff2.数据集开头有一些描述信息训练是用不到的我选择删掉方便用pd.read_csv()函数读取。当然不删也是可以的有专门的函数读取.arff文件​from scipy.io import arff import pandas as pd df arff.loadarff(messidor_features.arff) #读取出来是一个元组 dataframe pd.DataFrame(df[0])3.数据集messidor_features.arff包含从 Messidor图像集中提取的特征用于预测图像是否包含糖尿病视网膜病变的迹象。所有特征都代表检测到的病变、解剖部位的描述特征或图像级描述符。该数据集有20条属性类标签是最后一条如图。4. 对数据集有大概了解后来简单探索性分析一下它。首先查看data.info(),看看有没有缺失值及数据类型。​import pandas as pd pathE:/Python_file/zuoye/messidor_features.arff Cnames [x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, y] #删掉与数据集无关的内容 datapd.read_csv(path,headerNone,namesCnames) print(数据集基础信息) print(data.info())可以看到数据里没有缺失值。再统计一下类标签为‘1’的数据有611条占比为53.1%标签为‘0’的数据有540条占比为46.9%。说明正例数据与负例数据的数量分布是均衡的。5.这里推荐使用pandas-profiling库可以一键生成对数据集的分析报告非常好用。没有安装的话用pip installpandas_profiling 命令安装一下。​import pandas_profiling report pandas_profiling.ProfileReport(data) report.to_file(output_file.html)运行后生成一个可交互的.html文件通常包含对数据的类型检测计算唯一值、缺失值分位数统计如最小最大值、四分位数、中位数等描述统计如平均数、众数、峰度偏度等变量间相关系数的热力图等等。我们来看看该数据集下各属性间用Spearman秩相关系数ρ描述的单调相关的度量热力图ρ的值介于-1和1之间-1表示完全负单调相关0表示没有单调相关1表示完全正单调相关。三. 方法介绍逻辑回归的原理有很多博主写的很好我就不班门弄斧了主要说说代码。利用sklearn库提供的LogisticRegression()可以很方便的完成训练和预测。​from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split Xdata[data.columns[0:19]] #提取特征不要标签 ydata[y] #train_size0.880%的训练集占比 x_train,x_test,y_train,y_testtrain_test_split(X,y,train_size0.8,random_state90) lrLogisticRegression(max_iter3000) clmlr.fit(x_train,y_train) print(对测试集的预测结果) #输出预测结果、预测结果的结构类型及尺寸 resultclm.predict(x_test)LogisticRegression()的参数很多但需要设置的不多。我们的数据集是分布均衡的参数类别权重class_weight不需要设置关于参数优化算法solver用默认的‘liblinear’就好因为这是二分类问题只看有没有病变而且我们是小数据集也用不到面向大数据集的‘sag’和‘saga’而max_iter是设置迭代次数如果小了可能模型没收敛就运行结束了这里我设置为3000次。四. 结果和模型评价及可视化1.测试集的检测结果如图1代表有病变0代表没有。要注意的是划分训练集和测试集时random_state等于不同的值会得到不同的测试集我这里是random_state90改成其他数预测结果就和我不同但对模型评价没有影响。2.模型评价的指标有很多比如召回率、精度、准确率、F统计量、决定系数R²、ROC曲线的包络面积AUC等。可以用classification_report()一键生成评估报告。​from sklearn.metrics import classification_report print(性能报告;) print(classification_report(y_test,result)) confusion metrics.confusion_matrix(y_test, result)3.以FPR为横轴TPR为纵轴绘制ROC曲线并由曲线计算得AUC0.77。​from sklearn.metrics import roc_curve,auc from matplotlib import pyplot as plt fpr, tpr, thr roc_curve(y_test, result, drop_intermediateFalse) fpr, tpr [0] list(fpr), [0] list(tpr) plt.plot(fpr, tpr) plt.title(ROC curve for diabetes classifier) plt.xlabel(False Positive Rate (1 - Specificity)) plt.ylabel(True Positive Rate (Sensitivity)) plt.grid(True) plt.show() print(AUC: str(auc(fpr,tpr)))该模型的检测能力还是可以的。4.从逻辑回归模型中导出各个变量的回归系数由此作出重要程度的条形图。​print(逻辑回归各变量系数) print(clm.coef_) coef_lr pd.DataFrame({var : x_test.columns, coef : clm.coef_.flatten() }) index_sort np.abs(coef_lr[coef]).sort_values().index coef_lr_sort coef_lr.loc[index_sort,:] # 水平柱形图绘图 fig,axplt.subplots() x, y coef_lr_sort[var], coef_lr_sort[coef] rects plt.barh(x, y, colordodgerblue) plt.grid(linestyle-., axisy, alpha0.4) plt.tight_layout() #添加数据标签 for rect in rects: w rect.get_width() ax.text(w, rect.get_y()rect.get_height()/2,%.2f %w,haleft,vacenter)逻辑回归就是把线性回归的结果输入到了sigmoid函数所以各变量的系数还是有的。可以看到对视网膜病变检测结果影响最大的五个变量分别是x14,x1,x2,x0,x15它们的含义参照上文。可以确定这五个变量是导致糖尿病视网膜病变的主要因素。项目运行效果毕业设计 糖尿病视网膜预测 项目分享:见文末!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询