版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目9基于MaskR-CNN实现目标检测一、简答题1.简述目标检测的主要任务和应用场景。2.简述基于候选区域的目标检测算法的基本思想。gionPopoal修息,(类别更好的识别效果。3.简述基于回归的目标检测算法的基本思想。二、实操题1.9.1~9.4MaskR-CNN模型实现小麦麦穗检测模型的搭建和训练。9.1~9.4实施,核心代码如下:importosimportnumpyasnpimporttorchfromPILimportImageimportmatplotlib.pyplotaspltimportcv2importtorchvisionimportutilsimporttransformsasTfromtorchvision.transformsimportfunctionalasFfromtorch.utils.dataimportDataLoader,Subsetimportwarningswarnings.filterwarnings('ignore')#导入torch.optimimporttorch.optimasoptim#导入MaskRcnn_Resnet50_FPNfromtorchvision.models.detectionimportmaskrcnn_resnet50_fpn#导入FastRCNNPredictorfromtorchvision.models.detection.Mask_rcnnimportFastRCNNPredictor#导入MaskRCNNPredictorfromtorchvision.models.detection.mask_rcnnimportMaskRCNNPredictorfromengineimporttrain_one_epoch,evaluate#自定义数据集类PennFudanDataset的代码如下。classPennFudanDataset(Dataset):"""用于加载Penn-Fudan数据集并提供访问图像、标签和掩码的类。"""definit(self,root,transforms=None):self.root=root#定义数据增广操作self.transforms=transforms#语句1获取指定目录下所有文件名,排序后存入集合list中self.imgs=list(sorted(os.listdir(os.path.join(root,'PNGImages'))))self.masks=list(sorted(os.listdir(os.path.join(root,'PedMasks'))))defgetitem(self,idx):#获取图像及其二进制掩码图像的路径img_path=os.path.join(self.root,'PNGImages',self.imgs[idx])mask_path=os.path.join(self.root,'PedMasks',self.masks[idx])#加载图像和二进制掩码图像img=Image.open(img_path).convert('RGB')mask=Image.open(mask_path)#将二进制掩码图像转换为NumPy数组mask=np.array(mask)obj_ids=np.unique(mask)#剔除背景(索引0)的对象IDobj_ids=obj_ids[1:]#语句2将掩码数组转为二元掩码集合masks=mask==obj_ids[:,None,None]num_objs=len(obj_ids)#计算每个目标的边界框boxes=[]foriinrange(num_objs):pos=np.where(masks[i])xmin=np.min(pos[1])xmax=np.max(pos[1])ymin=np.min(pos[0])ymax=np.max(pos[0])boxes.append([xmin,ymin,xmax,ymax])#将边界框和标签转换为PyTorch张量boxes=torch.as_tensor(boxes,dtype=torch.float32)labels=torch.ones((num_objs,),dtype=64)#将二元掩码集合转换为PyTorch张量masks=torch.as_tensor(masks,dtype=torch.uint8)#为当前图像创建目标字典image_id=torch.tensor([idx])area=(boxes[:,3]-boxes[:,1])*(boxes[:,2]-boxes[:,0])iscrowd=torch.zeros((num_objs,),dtype=64)target={'boxes':boxes,'labels':labels,'masks':masks,'image_id':image_id,'area':area,'iscrowd':iscrowd}#图像数据增广操作ifself.transformsisnotNone:img=self.transforms(img)returnimg,targetdeflen(self):#返回数据集中图像的总数returnlen(self.imgs)#创建行人检测数据集dataset=PennFudanDataset('../data/PennFudanPed')#获取第一张图像img=np.array(dataset[0][0])#显示图像plt.figure(figsize=(16,8))plt.axis('off')plt.imshow(img)plt.show()#提取第一张图像的边界框信息boxes=dataset[0][1]['boxes'].cpu().numpy().astype(32)plt.figure(figsize=(16,8))#为每个目标绘制绿色矩形,以表示实际边界框forbinboxes:cv2.rectangle(img,(b[0],b[1]),(b[2],b[3]),(0,220,0),3)plt.axis('off')plt.imshow(img)plt.show()#提取第一张图像中各目标的掩码,转成像素为0-255的图像image_0_mask_0=Image.fromarray(dataset[0][1]['masks'][0].mul(255).byte().numpy())image_0_mask_1=Image.fromarray(dataset[0][1]['masks'][1].mul(255).byte().numpy())#图像叠加处理fin=Image.blend(image_0_mask_0,image_0_mask_1,0.3)fin.show()#图像增广处理函数defget_transform(train):transforms=[]transforms.append(torchvision.transforms.ToTensor())iftrain:transforms.append(torchvision.transforms.RandomHorizontalFlip(0.5))returntorchvision.transforms.Compose(transforms)#创建训练数据集对象dataset=PennFudanDataset('../data/PennFudanPed',get_transform(train=True))#创建测试数据集对象dataset_test=PennFudanDataset('../data/PennFudanPed',get_transform(train=False))#设置随机种子torch.manual_seed(1)#打乱原有样本下标顺序indices=torch.randperm(len(dataset)).tolist()#选取dataset中前120个样本为训练集dataset=Subset(dataset,indices[:-50])#选取dataset_test中后50个样本为测试集dataset_test=Subset(dataset_test,indices[-50:])#创建数据加载器,加载训练集data_loader=DataLoader(dataset,batch_size=1,shuffle=True,num_workers=0,collate_fn=utils.collate_fn)#创建数据加载器,加载测试集data_loader_test=DataLoader(dataset_test,batch_size=1,shuffle=False,num_workers=0,collate_fn=utils.collate_fn)#定义构建模型的函数defget_instance_segmentation_model(num_classes):#利用COCO数据集上的预训模型创建模型实例model=maskrcnn_resnet50_fpn(pretrained=True)#FastR-CNN预测器的输出特征维度,以匹配给定的类别数in_features=model.roi_heads.box_predictor.cls_score.in_featuresmodel.roi_heads.box_predictorFastRCNNPredictor(in_featuresnum_classes)#获取MaskR-CNN预测器的输入特征维度in_features_mask=model.roi_heads.mask_predictor.conv5_mask.in_channels#设置中间隐藏层的神经元数hidden_layer=256#更新MaskR-CNN的Mask预测器的隐藏层数和输出特征维度,#以匹配给定的类别数model.roi_heads.mask_predictor=MaskRCNNPredictor(in_features_mask,hidden_layer,num_classes)#返回已更新的MaskR-CNN模型returnmodel#调用函数以获取包含两个类别的MaskR-CNN模型get_instance_segmentation_model(num_classes=2)#指定模型或数据所使用的设备配置(CPU或GPU)device=torch.device('cuda')iftorch.cuda.is_available()elsetorch.device('cpu')#获取模型参数params=[pforpinmodel.parameters()ifp.requires_grad]#配置优化器optimizer=optim.SGD(params,lr=0.005,momentum=0.9,weight_decay=0.0005)#配置学习率调度器lr_scheduler=torch.optim.lr_scheduler.StepLR(optimizer,step_size=3,gamma=0.1)#训练次数num_epochs=5#目标类别数num_classes=2#创建模型实例model=get_instance_segmentation_model(num_classes=num_classes)#将模型移动到指定设备上进行计算model.to(device)#定义训练函数deftrain_one_epoch(model,optimizer,data_loader,device,epoch,print_freq):#设置为训练模式model.train()#语句1定义度量记录器对象metric_logger=utils.MetricLogger(delimiter=" ")metric_logger.add_meter('lr',utils.SmoothedValue(window_size=1,fmt='{value:.6f}'))header='Epoch:[{}]'.format(epoch)lr_scheduler=None#设置学习率调度器ifepoch==0:warmup_factor=1./1000warmup_iters=min(1000,len(data_loader)-1)lr_scheduler=utils.warmup_lr_scheduler(optimizer,warmup_iters,warmup_factor)#通过迭代器遍历数据集中的样本forimages,targetsinmetric_logger.log_every(data_loader,print_freq,header):#读取图像信息的img和targetimages=list(image.to(device)forimageinimages)targets=[{k:v.to(device)fork,vint.items()}fortintargets]#调用模型进行预测loss_dict=model(images,targets)#计算总的损失函数losses=sum(lossforlossinloss_dict.values())#去除因记录目的在每个GPU上所产生的损失loss_dict_reduced=utils.reduce_dict(loss_dict)losses_reduced=sum(lossforlossinloss_dict_reduced.values())loss_value=losses_reduced.item()#当loss_value为有限值时,输出损失值并退出当前批次训练ifnotmath.isfinite(loss_value):print("Lossis{},stoppingtraining".format(loss_value))print(loss_dict_reduced)sys.exit(1)#参数梯度清零optimizer.zero_grad()#反向传播,计算梯度losses.backward()#更新参数optimizer.step()#当lr_scheduler存在时,调节学习率iflr_schedulerisnotNone:lr_scheduler.step()#更新记录器中的数据metric_logger.update(loss=losses_reduced,**loss_dict_reduced)metric_logger.update(lr=optimizer.param_groups[0]["lr"])returnmetric_logger#定义验证函数@torch.no_grad()defevaluate(model,data_loader,device):#获取并行化CPU操作的线程数n_threads=torch.get_num_threads()#设置CPU并行计算时所占用的线程数torch.set_num_threads(1)cpu_device=torch.device("cpu")#设置为评估模式model.eval()metric_logger=utils.MetricLogger(delimiter=" ")header=#读取数据集coco=get_coco_api_from_dataset(data_loader.dataset)iou_types=_get_iou_types(model)#在coco上评测目标检测、实例分割、关键点检测的APcoco_evaluator=CocoEvaluator(coco,iou_types)#语句1对数据集上每个样本进行预测forimages,targetsinmetric_logger.log_every(data_loader,100,header):images=list(img.to(device)forimginimages)torch.cuda.synchronize()model_time=time.time()#使用模型对图像进行预测outputs=model(images)outputs=[{k:v.to(cpu_device)fork,vint.items()}fortinoutputs]m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电焊焊接施工方案(3篇)
- 雨季降水施工方案(3篇)
- 事故应急预案技术(3篇)
- 中档木门施工方案(3篇)
- 医院收入分析制度
- 2026年陇南师范高等专科学校单招职业倾向性考试题库含答案详解(能力提升)
- 2026年黑龙江三江美术职业学院单招职业倾向性考试题库带答案详解(满分必刷)
- 2026年青岛远洋船员职业学院单招职业倾向性考试题库含答案详解(能力提升)
- 关于花苞开花的研究报告
- 2026年鹰潭职业技术学院单招职业倾向性考试题库带答案详解(培优a卷)
- 消防思想政治教育
- 灭火系统运行管理规定细则
- 加油站防雷安全生产责任制度
- DB4201∕T 533.1-2017 清洁服务规范 第1部分:分类与一般要求
- 春秋三传经典常谈课件
- 学校后勤管理处行政部副主任2025年个人工作总结
- 《中国人寿保险新基本法》课件
- 费率招标优缺点及风险提示报告
- 2024年江西省公务员考试行测真题附答案详解(完整版)
- 统编版高中政治选择性必修2《法律与生活》期末复习必背知识点考点提纲
- WST856-2025安全注射标准解读
评论
0/150
提交评论