当前位置: 首页 > 后端技术 > Python

Python教你如何对图像进行分类

时间:2023-03-25 22:26:45 Python

在日常生活中,总会有图像分类的场景,比如垃圾分类、不同场景的图像分类等;今天的文章主要是基于图像识别场景进行建模。图像识别使用Python深度学习进行模型训练,然后使用模型对上传的电子表格进行自动审核比较,然后反馈相应的结果。它主要使用PythonTorchvision构建模型。Torchvision服务于Pytorch深度学习框架,主要用于生成图片、视频数据集和训练模型。模型搭建为了直观的搭建模型,需要使用Jupyternotebook搭建模型,导入需要的包。图像识别需要用到深度学习相关模块,所以需要导入相应的包。具体导入包如下:%reload_extautoreload%autoreload2importtorchfromtorch.utils.dataimportDataLoaderfromtorchvision.datasetsimportImageFolderfromtorchvisionimporttransformsastfsfromtorchvisionimportmodelsfromtorchimportnnimportmatplotlib.pyplotasplt%matplotlibinlineimportosos.environ["KMP_DUPLICATE_LIBUE_OK"]="KMP_DUPLICATE_LIBUE_OK"]="KMP_DUPLICATE_LIBUE_OK"]="KMP_DUPLICATE_LIBUE_OK"]该方法基于GPU或CPU训练。训练在没有GPU的CPU下进行。模型的训练需要一定的时间。训练时间取决于训练集的数据和硬件的性能。训练结果的准确性取决于数据。howmuchandaccuracy而且,深度学习需要大量的素材来判断准确的结果,所以需要声明使用CPU进行训练:#是否使用GPUuse_gpu=Falsedataenhancement对训练集得到的数据进行预处理和设置训练的层数,然后水平翻转得到的图片再裁剪图片。裁剪后随机翻转图片增强随机对比度和图片颜色变化#数据增强train_transform=tfs.Compose([#训练集数据预置处理tfs.Resize([224,224]),tfs.RandomHorizo??ntalFlip(),tfs.RandomCrop(128),tfs.ToTensor(),tfs.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])])test_transform=tfs.Compose([tfs.Resize([224,224]),#tfs.随机crop(128),tfs.ToTensor(),tfs.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])])#每个batch的数据集个数batch_size=10数据集和验证集准备模型训练需要准备数据集和验证集,只有足够的照片才能得到更准确的答案训练集和验证集部分代码如下:#构建训练集和验证集#train_set=ImageFolder('./dataset1/train',train_transform)train_data=DataLoader(train_set,batch_size,shuffle=True,num_workers=0)valid_set=ImageFolder('./dataset1/valid',test_transform)valid_data=DataLoader(valid_set,2*batch_size,shuffle=False,num_workers=0)train_set.class_to_idxlen(valid_data)#数据集准备尝试:ifiter(train_data).next()[0].shape[0]==batch_sizeand\iter(valid_data).next()[0].shape[0]==2*batch_size:print('Datasetisready!')else:print('不成功,可能batchsize不对')except:print('不成功,imagetransformiswrong!')modelbuildandpreparemodel#buildmodeldefget_model():model=models.resnet50(pretrained=真)模型。fc=nn.Linear(2048,3)返回模型:model=get_model()withtorch.no_grad():scorce=model(iter(train_data).next()[0])print(scorce.shape[0],scorce.shape[1])如果scorce.shape[0]==batch_size和scorce.shape[1]==3:print('Modelisready!')else:print('Modelisfailed!')except:print('modeliswrong')ifuse_gpu:model=model.cuda()buildmodeloptimizer#构建损失函数和优化准则=nn.CrossEntropyLoss()optimizer=torch.optim.Adam(model.parameters(),lr=1e-4)#训练epoch数max_epoch=20模型训练和训练结果可视化数据集和训练集准备好进行模型训练以及训练结果的可视化,部分代码如下:deftrain(model,train_data,valid_data,max_epoch,criterion,optimizer):freq_print=int(len(train_data)/3)metric_log=dict()metric_log['train_loss']=list()metric_log['train_acc']=list()如果valid_data不是None:metric_log['valid_loss']=list()模型。train()running_loss=0running_acc=0fori,datainenumerate(train_data,1):img,label=dataifuse_gpu:img=img.cuda()label=label.cuda()#前向传播out=model(img)#计算误差loss=criterion(out,label.long())#反向传播,更新参数optimizer.zero_grad()loss.backward()optimizer.step()#计算准确率_,pred=out.max(1)num_correct=(pred==label.long()).sum().item()acc=num_correct/img.shape[0]running_loss+=loss.item()running_acc+=acc如果i%freq_print==0:print('[{}]/[{}],trainloss:{:.3f},trainacc:{:.3f}'\.format(i,len(train_data),running_loss/i,running_acc/i))metric_log['train_loss'].append(running_loss/len(train_data))metric_log['train_acc'].append(running_acc/len(train_data))如果valid_data不是None:model.eval()running_loss=0running_acc=0fordatainvalid_data:img,label=dataifuse_gpu:img=img.cuda()label=label.cuda()#转发前向传播out=model(img)#计算错误loss=criterion(out,label.long())#计算准确度_,pred=out.最大(1)num_correct=(pred==label.long()).sum().item()acc=num_correct/img.shape[0]running_loss+=loss.item()running_acc+=accmetric_log['valid_loss'].append(running_loss/len(valid_data))metric_log['valid_acc'].append(running_acc/len(valid_data))print_str='epoch:{},trainloss:{:.3f},trainacc:{:.3f},\有效损失:{:.3f},有效精度:{:.3f}'.format(e+1,metric_log['train_loss'][-1],metric_log['train_acc'][-1],metric_log['valid_loss'][-1],metric_log['valid_acc'][-1])else:print_str='epoch:{},trainloss:{:.3f},trainacc:{:.3f}'.format(e+1,metric_log['train_loss'][-1],metric_log['train_acc'][-1])print(print_str)#可视化nrows=1ncols=2figsize=(10,5)_,figs=plt.subplots(nrows,ncols,figsize=figsize)ifvalid_dataisnotNone:figs[0].plot(metric_log['train_loss'],label='trainloss')figs[0].plot(metric_log['valid_loss'],label='validloss')figs[0].axes.set_xlabel('loss')无花果[0].legend(loc='best')图[1].plot(metric_log['train_acc'],label='trainacc')figs[1].plot(metric_log['valid_acc'],label='有效acc')figs[1].axes.set_xlabel('acc')figs[1].legend(loc='best')else:figs[0].plot(metric_log['train_loss'],label='train损失')figs[0].axes.set_xlabel('loss')figs[0].legend(loc='best')figs[1].plot(metric_log['train_acc'],label='trainacc')figs[1].axes.set_xlabel('acc')figs[1].legend(loc='best')为模型训练调整参数#用作参数train(model,train_data,valid_data,max_epoch,criterion,optimizer)保存model#保存模型torch.save(model.state_dict(),'./model/save_model2.pth')总结今天这篇文章主要讲的是如何建立一个图像识别模型。希望对大家有所帮助。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享