当前位置: 首页 > news >正文

iphone网站哈尔滨做平台网站平台公司吗

iphone网站,哈尔滨做平台网站平台公司吗,利用国外免费空间做网站,专业网站建设找哪家1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着计算机视觉技术的不断发展#xff0c;图像分割成为了一个重要的研究领域。图像分割可以将图像中的不同对象或区域进行有效的分离#xff0c;对于许多应用领…1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着计算机视觉技术的不断发展图像分割成为了一个重要的研究领域。图像分割可以将图像中的不同对象或区域进行有效的分离对于许多应用领域具有重要的意义如医学图像分析、自动驾驶、智能监控等。其中杂草分割是农业领域中的一个重要应用可以帮助农民准确地识别和分离出农作物和杂草从而实现精确的农药喷洒和杂草控制。 目前深度学习技术在图像分割领域取得了显著的进展。YOLOv8是一种经典的目标检测算法具有高效、准确的特点。然而YOLOv8在杂草分割任务中存在一些问题。首先YOLOv8在感受野的选择上存在局限性导致对于不同尺度的杂草难以进行准确的分割。其次YOLOv8在处理图像中的细节信息时存在一定的困难导致分割结果的精度不高。因此如何改进YOLOv8算法提高杂草分割的准确性和效率成为了当前研究的一个重要课题。 为了解决上述问题本研究提出了一种改进的YOLOv8算法即融合感受野注意力卷积RFCBAMConv的杂草分割系统。该系统通过引入感受野注意力机制能够自适应地调整感受野的大小从而更好地适应不同尺度的杂草分割任务。同时通过引入RFCBAMConv卷积层可以有效地提取图像中的细节信息从而提高分割结果的精度。 本研究的意义主要体现在以下几个方面 提高杂草分割的准确性通过融合感受野注意力卷积RFCBAMConv可以更好地适应不同尺度的杂草分割任务提高分割结果的准确性。这对于农业领域来说具有重要意义可以帮助农民更准确地识别和分离出农作物和杂草从而实现精确的农药喷洒和杂草控制。 提高杂草分割的效率改进的YOLOv8算法在保持准确性的同时还能够提高分割的效率。这对于大规模的农田杂草分割任务来说尤为重要可以减少农民的劳动成本和时间成本提高农业生产的效率。 推动深度学习在农业领域的应用本研究的改进算法可以为农业领域的图像分割任务提供一个有效的解决方案推动深度学习技术在农业领域的应用。这对于提高农业生产的智能化水平实现农业的可持续发展具有重要意义。 综上所述改进YOLOv8算法融合感受野注意力卷积RFCBAMConv的杂草分割系统具有重要的研究背景和意义。通过提高杂草分割的准确性和效率推动深度学习在农业领域的应用可以为农业生产的智能化发展做出重要贡献。 2.图片演示 3.视频演示 【改进YOLOv8】融合感受野注意力卷积RFCBAMConv的杂草分割系统_哔哩哔哩_bilibili 4.数据集的采集标注和整理 图片的收集 首先我们需要收集所需的图片。这可以通过不同的方式来实现例如使用现有的公开数据集ZCDatasets。 eiseg是一个图形化的图像注释工具支持COCO和YOLO格式。以下是使用eiseg将图片标注为COCO格式的步骤 1下载并安装eiseg。 2打开eiseg并选择“Open Dir”来选择你的图片目录。 3为你的目标对象设置标签名称。 4在图片上绘制矩形框选择对应的标签。 5保存标注信息这将在图片目录下生成一个与图片同名的JSON文件。 6重复此过程直到所有的图片都标注完毕。 由于YOLO使用的是txt格式的标注我们需要将VOC格式转换为YOLO格式。可以使用各种转换工具或脚本来实现。 下面是一个简单的方法是使用Python脚本该脚本读取XML文件然后将其转换为YOLO所需的txt格式。 import contextlib import jsonimport cv2 import pandas as pd from PIL import Image from collections import defaultdictfrom utils import *# Convert INFOLKS JSON file into YOLO-format labels ---------------------------- def convert_infolks_json(name, files, img_path):# Create folderspath make_dirs()# Import jsondata []for file in glob.glob(files):with open(file) as f:jdata json.load(f)jdata[json_file] filedata.append(jdata)# Write images and shapesname path os.sep namefile_id, file_name, wh, cat [], [], [], []for x in tqdm(data, descFiles and Shapes):f glob.glob(img_path Path(x[json_file]).stem .*)[0]file_name.append(f)wh.append(exif_size(Image.open(f))) # (width, height)cat.extend(a[classTitle].lower() for a in x[output][objects]) # categories# filenamewith open(name .txt, a) as file:file.write(%s\n % f)# Write *.names filenames sorted(np.unique(cat))# names.pop(names.index(Missing product)) # removewith open(name .names, a) as file:[file.write(%s\n % a) for a in names]# Write labels filefor i, x in enumerate(tqdm(data, descAnnotations)):label_name Path(file_name[i]).stem .txtwith open(path /labels/ label_name, a) as file:for a in x[output][objects]:# if a[classTitle] Missing product:# continue # skipcategory_id names.index(a[classTitle].lower())# The INFOLKS bounding box format is [x-min, y-min, x-max, y-max]box np.array(a[points][exterior], dtypenp.float32).ravel()box[[0, 2]] / wh[i][0] # normalize x by widthbox[[1, 3]] / wh[i][1] # normalize y by heightbox [box[[0, 2]].mean(), box[[1, 3]].mean(), box[2] - box[0], box[3] - box[1]] # xywhif (box[2] 0.) and (box[3] 0.): # if w 0 and h 0file.write(%g %.6f %.6f %.6f %.6f\n % (category_id, *box))# Split data into train, test, and validate filessplit_files(name, file_name)write_data_data(name .data, nclen(names))print(fDone. Output saved to {os.getcwd() os.sep path})# Convert vott JSON file into YOLO-format labels ------------------------------- def convert_vott_json(name, files, img_path):# Create folderspath make_dirs()name path os.sep name# Import jsondata []for file in glob.glob(files):with open(file) as f:jdata json.load(f)jdata[json_file] filedata.append(jdata)# Get all categoriesfile_name, wh, cat [], [], []for i, x in enumerate(tqdm(data, descFiles and Shapes)):with contextlib.suppress(Exception):cat.extend(a[tags][0] for a in x[regions]) # categories# Write *.names filenames sorted(pd.unique(cat))with open(name .names, a) as file:[file.write(%s\n % a) for a in names]# Write labels filen1, n2 0, 0missing_images []for i, x in enumerate(tqdm(data, descAnnotations)):f glob.glob(img_path x[asset][name] .jpg)if len(f):f f[0]file_name.append(f)wh exif_size(Image.open(f)) # (width, height)n1 1if (len(f) 0) and (wh[0] 0) and (wh[1] 0):n2 1# append filename to listwith open(name .txt, a) as file:file.write(%s\n % f)# write labelsfilelabel_name Path(f).stem .txtwith open(path /labels/ label_name, a) as file:for a in x[regions]:category_id names.index(a[tags][0])# The INFOLKS bounding box format is [x-min, y-min, x-max, y-max]box a[boundingBox]box np.array([box[left], box[top], box[width], box[height]]).ravel()box[[0, 2]] / wh[0] # normalize x by widthbox[[1, 3]] / wh[1] # normalize y by heightbox [box[0] box[2] / 2, box[1] box[3] / 2, box[2], box[3]] # xywhif (box[2] 0.) and (box[3] 0.): # if w 0 and h 0file.write(%g %.6f %.6f %.6f %.6f\n % (category_id, *box))else:missing_images.append(x[asset][name])print(Attempted %g json imports, found %g images, imported %g annotations successfully % (i, n1, n2))if len(missing_images):print(WARNING, missing images:, missing_images)# Split data into train, test, and validate filessplit_files(name, file_name)print(fDone. Output saved to {os.getcwd() os.sep path})# Convert ath JSON file into YOLO-format labels -------------------------------- def convert_ath_json(json_dir): # dir contains json annotations and images# Create foldersdir make_dirs() # output directoryjsons []for dirpath, dirnames, filenames in os.walk(json_dir):jsons.extend(os.path.join(dirpath, filename)for filename in [f for f in filenames if f.lower().endswith(.json)])# Import jsonn1, n2, n3 0, 0, 0missing_images, file_name [], []for json_file in sorted(jsons):with open(json_file) as f:data json.load(f)# # Get classes# try:# classes list(data[_via_attributes][region][class][options].values()) # classes# except:# classes list(data[_via_attributes][region][Class][options].values()) # classes# # Write *.names file# names pd.unique(classes) # preserves sort order# with open(dir data.names, w) as f:# [f.write(%s\n % a) for a in names]# Write labels filefor x in tqdm(data[_via_img_metadata].values(), descfProcessing {json_file}):image_file str(Path(json_file).parent / x[filename])f glob.glob(image_file) # image fileif len(f):f f[0]file_name.append(f)wh exif_size(Image.open(f)) # (width, height)n1 1 # all imagesif len(f) 0 and wh[0] 0 and wh[1] 0:label_file dir labels/ Path(f).stem .txtnlabels 0try:with open(label_file, a) as file: # write labelsfile# try:# category_id int(a[region_attributes][class])# except:# category_id int(a[region_attributes][Class])category_id 0 # single-classfor a in x[regions]:# bounding box format is [x-min, y-min, x-max, y-max]box a[shape_attributes]box np.array([box[x], box[y], box[width], box[height]],dtypenp.float32).ravel()box[[0, 2]] / wh[0] # normalize x by widthbox[[1, 3]] / wh[1] # normalize y by heightbox [box[0] box[2] / 2, box[1] box[3] / 2, box[2],box[3]] # xywh (left-top to center x-y)if box[2] 0. and box[3] 0.: # if w 0 and h 0file.write(%g %.6f %.6f %.6f %.6f\n % (category_id, *box))n3 1nlabels 1if nlabels 0: # remove non-labelled images from datasetos.system(frm {label_file})# print(no labels for %s % f)continue # next file# write imageimg_size 4096 # resize to maximumimg cv2.imread(f) # BGRassert img is not None, Image Not Found fr img_size / max(img.shape) # size ratioif r 1: # downsize if necessaryh, w, _ img.shapeimg cv2.resize(img, (int(w * r), int(h * r)), interpolationcv2.INTER_AREA)ifile dir images/ Path(f).nameif cv2.imwrite(ifile, img): # if success append image to listwith open(dir data.txt, a) as file:file.write(%s\n % ifile)n2 1 # correct imagesexcept Exception:os.system(frm {label_file})print(fproblem with {f})else:missing_images.append(image_file)nm len(missing_images) # number missingprint(\nFound %g JSONs with %g labels over %g images. Found %g images, labelled %g images successfully %(len(jsons), n3, n1, n1 - nm, n2))if len(missing_images):print(WARNING, missing images:, missing_images)# Write *.names filenames [knife] # preserves sort orderwith open(dir data.names, w) as f:[f.write(%s\n % a) for a in names]# Split data into train, test, and validate filessplit_rows_simple(dir data.txt)write_data_data(dir data.data, nc1)print(fDone. Output saved to {Path(dir).absolute()})def convert_coco_json(json_dir../coco/annotations/, use_segmentsFalse, cls91to80False):save_dir make_dirs() # output directorycoco80 coco91_to_coco80_class()# Import jsonfor json_file in sorted(Path(json_dir).resolve().glob(*.json)):fn Path(save_dir) / labels / json_file.stem.replace(instances_, ) # folder namefn.mkdir()with open(json_file) as f:data json.load(f)# Create image dictimages {%g % x[id]: x for x in data[images]}# Create image-annotations dictimgToAnns defaultdict(list)for ann in data[annotations]:imgToAnns[ann[image_id]].append(ann)# Write labels filefor img_id, anns in tqdm(imgToAnns.items(), descfAnnotations {json_file}):img images[%g % img_id]h, w, f img[height], img[width], img[file_name]bboxes []segments []for ann in anns:if ann[iscrowd]:continue# The COCO box format is [top left x, top left y, width, height]box np.array(ann[bbox], dtypenp.float64)box[:2] box[2:] / 2 # xy top-left corner to centerbox[[0, 2]] / w # normalize xbox[[1, 3]] / h # normalize yif box[2] 0 or box[3] 0: # if w 0 and h 0continuecls coco80[ann[category_id] - 1] if cls91to80 else ann[category_id] - 1 # classbox [cls] box.tolist()if box not in bboxes:bboxes.append(box)# Segmentsif use_segments:if len(ann[segmentation]) 1:s merge_multi_segment(ann[segmentation])s (np.concatenate(s, axis0) / np.array([w, h])).reshape(-1).tolist()else:s [j for i in ann[segmentation] for j in i] # all segments concatenateds (np.array(s).reshape(-1, 2) / np.array([w, h])).reshape(-1).tolist()s [cls] sif s not in segments:segments.append(s)# Writewith open((fn / f).with_suffix(.txt), a) as file:for i in range(len(bboxes)):line *(segments[i] if use_segments else bboxes[i]), # cls, box or segmentsfile.write((%g * len(line)).rstrip() % line \n)def min_index(arr1, arr2):Find a pair of indexes with the shortest distance. Args:arr1: (N, 2).arr2: (M, 2).Return:a pair of indexes(tuple).dis ((arr1[:, None, :] - arr2[None, :, :]) ** 2).sum(-1)return np.unravel_index(np.argmin(dis, axisNone), dis.shape)def merge_multi_segment(segments):Merge multi segments to one list.Find the coordinates with min distance between each segment,then connect these coordinates with one thin line to merge all segments into one.Args:segments(List(List)): original segmentations in cocos json file.like [segmentation1, segmentation2,...], each segmentation is a list of coordinates.s []segments [np.array(i).reshape(-1, 2) for i in segments]idx_list [[] for _ in range(len(segments))]# record the indexes with min distance between each segmentfor i in range(1, len(segments)):idx1, idx2 min_index(segments[i - 1], segments[i])idx_list[i - 1].append(idx1)idx_list[i].append(idx2)# use two round to connect all the segmentsfor k in range(2):# forward connectionif k 0:for i, idx in enumerate(idx_list):# middle segments have two indexes# reverse the index of middle segmentsif len(idx) 2 and idx[0] idx[1]:idx idx[::-1]segments[i] segments[i][::-1, :]segments[i] np.roll(segments[i], -idx[0], axis0)segments[i] np.concatenate([segments[i], segments[i][:1]])# deal with the first segment and the last oneif i in [0, len(idx_list) - 1]:s.append(segments[i])else:idx [0, idx[1] - idx[0]]s.append(segments[i][idx[0]:idx[1] 1])else:for i in range(len(idx_list) - 1, -1, -1):if i not in [0, len(idx_list) - 1]:idx idx_list[i]nidx abs(idx[1] - idx[0])s.append(segments[i][nidx:])return sdef delete_dsstore(path../datasets):# Delete apple .DS_store filesfrom pathlib import Pathfiles list(Path(path).rglob(.DS_store))print(files)for f in files:f.unlink()if __name__ __main__:source COCOif source COCO:convert_coco_json(./annotations, # directory with *.jsonuse_segmentsTrue,cls91to80True)elif source infolks: # Infolks https://infolks.info/convert_infolks_json(nameout,files../data/sm4/json/*.json,img_path../data/sm4/images/)elif source vott: # VoTT https://github.com/microsoft/VoTTconvert_vott_json(namedata,files../../Downloads/athena_day/20190715/*.json,img_path../../Downloads/athena_day/20190715/) # images folderelif source ath: # ath formatconvert_ath_json(json_dir../../Downloads/athena/) # images folder# zip results# os.system(zip -r ../coco.zip ../coco) 整理数据文件夹结构 我们需要将数据集整理为以下结构 -----datasets-----coco128-seg|-----images| |-----train| |-----valid| |-----test||-----labels| |-----train| |-----valid| |-----test| 模型训练 Epoch gpu_mem box obj cls labels img_size1/200 20.8G 0.01576 0.01955 0.007536 22 1280: 100%|██████████| 849/849 [14:4200:00, 1.04s/it]Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 213/213 [01:1400:00, 2.87it/s]all 3395 17314 0.994 0.957 0.0957 0.0843Epoch gpu_mem box obj cls labels img_size2/200 20.8G 0.01578 0.01923 0.007006 22 1280: 100%|██████████| 849/849 [14:4400:00, 1.04s/it]Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 213/213 [01:1200:00, 2.95it/s]all 3395 17314 0.996 0.956 0.0957 0.0845Epoch gpu_mem box obj cls labels img_size3/200 20.8G 0.01561 0.0191 0.006895 27 1280: 100%|██████████| 849/849 [10:5600:00, 1.29it/s]Class Images Labels P R mAP.5 mAP.5:.95: 100%|███████ | 187/213 [00:5200:00, 4.04it/s]all 3395 17314 0.996 0.957 0.0957 0.08455.核心代码讲解 5.1 export.py class YOLOv8Exporter:def __init__(self):self.FILE Path(__file__).resolve()self.ROOT self.FILE.parents[0] # YOLOv8 root directoryif str(self.ROOT) not in sys.path:sys.path.append(str(self.ROOT)) # add ROOT to PATHif platform.system() ! Windows:self.ROOT Path(os.path.relpath(self.ROOT, Path.cwd())) # relativefrom models.experimental import attempt_loadfrom models.yolo import ClassificationModel, Detect, DetectionModel, SegmentationModelfrom utils.dataloaders import LoadImagesfrom utils.general import (LOGGER, Profile 该程序文件是用于将YOLOv8 PyTorch模型导出为其他格式的工具。它支持导出为PyTorch、TorchScript、ONNX、OpenVINO、TensorRT、CoreML、TensorFlow SavedModel、TensorFlow GraphDef、TensorFlow Lite、TensorFlow Edge TPU、TensorFlow.js和PaddlePaddle等格式。导出的模型可以在不同的深度学习框架中使用。 程序文件首先定义了一些常量和全局变量然后导入了所需的库和模块。接下来定义了一些辅助函数和装饰器用于导出模型和处理异常情况。 然后定义了导出模型的具体函数包括导出TorchScript模型、导出ONNX模型、导出OpenVINO模型、 5.2 predict.py from ultralytics.engine.predictor import BasePredictor from ultralytics.engine.results import Results from ultralytics.utils import opsclass DetectionPredictor(BasePredictor):def postprocess(self, preds, img, orig_imgs):preds ops.non_max_suppression(preds,self.args.conf,self.args.iou,agnosticself.args.agnostic_nms,max_detself.args.max_det,classesself.args.classes)if not isinstance(orig_imgs, list):orig_imgs ops.convert_torch2numpy_batch(orig_imgs)results []for i, pred in enumerate(preds):orig_img orig_imgs[i]pred[:, :4] ops.scale_boxes(img.shape[2:], pred[:, :4], orig_img.shape)img_path self.batch[0][i]results.append(Results(orig_img, pathimg_path, namesself.model.names, boxespred))return results这是一个名为predict.py的程序文件它是一个用于预测基于检测模型的类DetectionPredictor的扩展。该类继承自BasePredictor类并实现了postprocess方法来对预测结果进行后处理并返回Results对象的列表。 在postprocess方法中首先对预测结果进行非最大抑制处理根据设定的置信度阈值和重叠度阈值进行筛选并根据设定的参数进行类别的筛选和最大检测数的限制。 然后对于每个预测结果将其边界框的坐标进行缩放以适应原始图像的尺寸。最后将原始图像、图像路径、类别名称和边界框信息封装成Results对象并添加到结果列表中。 该文件还包含了一个示例用法展示了如何使用DetectionPredictor类进行预测。 5.3 train.py from copy import copy import numpy as np from ultralytics.data import build_dataloader, build_yolo_dataset from ultralytics.engine.trainer import BaseTrainer from ultralytics.models import yolo from ultralytics.nn.tasks import DetectionModel from ultralytics.utils import LOGGER, RANK from ultralytics.utils.torch_utils import de_parallel, torch_distributed_zero_firstclass DetectionTrainer(BaseTrainer):def build_dataset(self, img_path, modetrain, batchNone):gs max(int(de_parallel(self.model).stride.max() if self.model else 0), 32)return build_yolo_dataset(self.args, img_path, batch, self.data, modemode, rectmode val, stridegs)def get_dataloader(self, dataset_path, batch_size16, rank0, modetrain):assert mode in [train, val]with torch_distributed_zero_first(rank):dataset self.build_dataset(dataset_path, mode, batch_size)shuffle mode trainif getattr(dataset, rect, False) and shuffle:LOGGER.warning(WARNING ⚠️ rectTrue is incompatible with DataLoader shuffle, setting shuffleFalse)shuffle Falseworkers 0return build_dataloader(dataset, batch_size, workers, shuffle, rank)def preprocess_batch(self, batch):batch[img] batch[img].to(self.device, non_blockingTrue).float() / 255return batchdef set_model_attributes(self):self.model.nc self.data[nc]self.model.names self.data[names]self.model.args self.argsdef get_model(self, cfgNone, weightsNone, verboseTrue):model DetectionModel(cfg, ncself.data[nc], verboseverbose and RANK -1)if weights:model.load(weights)return modeldef get_validator(self):self.loss_names box_loss, cls_loss, dfl_lossreturn yolo.detect.DetectionValidator(self.test_loader, save_dirself.save_dir, argscopy(self.args))def label_loss_items(self, loss_itemsNone, prefixtrain):keys [f{prefix}/{x} for x in self.loss_names]if loss_items is not None:loss_items [round(float(x), 5) for x in loss_items]return dict(zip(keys, loss_items))else:return keysdef progress_string(self):return (\n %11s *(4 len(self.loss_names))) % (Epoch, GPU_mem, *self.loss_names, Instances, Size)def plot_training_samples(self, batch, ni):plot_images(imagesbatch[img],batch_idxbatch[batch_idx],clsbatch[cls].squeeze(-1),bboxesbatch[bboxes],pathsbatch[im_file],fnameself.save_dir / ftrain_batch{ni}.jpg,on_plotself.on_plot)def plot_metrics(self):plot_results(fileself.csv, on_plotself.on_plot)def plot_training_labels(self):boxes np.concatenate([lb[bboxes] for lb in self.train_loader.dataset.labels], 0)cls np.concatenate([lb[cls] for lb in self.train_loader.dataset.labels], 0)plot_labels(boxes, cls.squeeze(), namesself.data[names], save_dirself.save_dir, on_plotself.on_plot)这是一个用于训练基于检测模型的程序文件train.py。它使用了Ultralytics YOLO库主要包括以下几个部分 导入所需的库和模块。定义了一个名为DetectionTrainer的类该类继承自BaseTrainer类用于训练基于检测模型的任务。在DetectionTrainer类中定义了一些方法包括构建数据集、构建数据加载器、预处理批次、设置模型属性等。在DetectionTrainer类中还定义了一些用于可视化训练过程和结果的方法如绘制训练样本、绘制指标、绘制训练标签等。在文件的最后使用了if name main’语句表示当该文件作为主程序运行时执行以下代码创建一个DetectionTrainer对象传入参数进行初始化并调用train方法开始训练。 总体来说这个程序文件是一个用于训练检测模型的脚本它使用了Ultralytics YOLO库提供的功能和模块实现了数据集的构建、数据加载器的构建、模型的训练等功能并提供了一些可视化方法用于展示训练过程和结果。 5.4 backbone\convnextv2.py import torch import torch.nn as nn import torch.nn.functional as F from timm.models.layers import trunc_normal_, DropPathclass LayerNorm(nn.Module):def __init__(self, normalized_shape, eps1e-6, data_formatchannels_last):super().__init__()self.weight nn.Parameter(torch.ones(normalized_shape))self.bias nn.Parameter(torch.zeros(normalized_shape))self.eps epsself.data_format data_formatif self.data_format not in [channels_last, channels_first]:raise NotImplementedError self.normalized_shape (normalized_shape, )def forward(self, x):if self.data_format channels_last:return F.layer_norm(x, self.normalized_shape, self.weight, self.bias, self.eps)elif self.data_format channels_first:u x.mean(1, keepdimTrue)s (x - u).pow(2).mean(1, keepdimTrue)x (x - u) / torch.sqrt(s self.eps)x self.weight[:, None, None] * x self.bias[:, None, None]return xclass GRN(nn.Module):def __init__(self, dim):super().__init__()self.gamma nn.Parameter(torch.zeros(1, 1, 1, dim))self.beta nn.Parameter(torch.zeros(1, 1, 1, dim))def forward(self, x):Gx torch.norm(x, p2, dim(1,2), keepdimTrue)Nx Gx / (Gx.mean(dim-1, keepdimTrue) 1e-6)return self.gamma * (x * Nx) self.beta xclass Block(nn.Module):def __init__(self, dim, drop_path0.):super().__init__()self.dwconv nn.Conv2d(dim, dim, kernel_size7, padding3, groupsdim)self.norm LayerNorm(dim, eps1e-6)self.pwconv1 nn.Linear(dim, 4 * dim)self.act nn.GELU()self.grn GRN(4 * dim)self.pwconv2 nn.Linear(4 * dim, dim)self.drop_path DropPath(drop_path) if drop_path 0. else nn.Identity()def forward(self, x):input xx self.dwconv(x)x x.permute(0, 2, 3, 1)x self.norm(x)x self.pwconv1(x)x self.act(x)x self.grn(x)x self.pwconv2(x)x x.permute(0, 3, 1, 2)x input self.drop_path(x)return xclass ConvNeXtV2(nn.Module):def __init__(self, in_chans3, num_classes1000, depths[3, 3, 9, 3], dims[96, 192, 384, 768], drop_path_rate0., head_init_scale1.):super().__init__()self.depths depthsself.downsample_layers nn.ModuleList()stem nn.Sequential(nn.Conv2d(in_chans, dims[0], kernel_size4, stride4),LayerNorm(dims[0], eps1e-6, data_formatchannels_first))self.downsample_layers.append(stem)for i in range(3):downsample_layer nn.Sequential(LayerNorm(dims[i], eps1e-6, data_formatchannels_first),nn.Conv2d(dims[i], dims[i1], kernel_size2, stride2),)self.downsample_layers.append(downsample_layer)self.stages nn.ModuleList()dp_rates[x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] cur 0for i in range(4):stage nn.Sequential(*[Block(dimdims[i], drop_pathdp_rates[cur j]) for j in range(depths[i])])self.stages.append(stage)cur depths[i]self.norm nn.LayerNorm(dims[-1], eps1e-6)self.head nn.Linear(dims[-1], num_classes)self.apply(self._init_weights)self.channel [i.size(1) for i in self.forward(torch.randn(1, 3, 640, 640))]def _init_weights(self, m):if isinstance(m, (nn.Conv2d, nn.Linear)):trunc_normal_(m.weight, std.02)nn.init.constant_(m.bias, 0)def forward(self, x):res []for i in range(4):x self.downsample_layers[i](x)x self.stages[i](x)res.append(x)return res该程序文件是一个实现了ConvNeXt V2模型的PyTorch模块。ConvNeXt V2是一个用于图像分类任务的卷积神经网络模型。 该程序文件包含以下几个类和函数 LayerNorm类实现了支持两种数据格式channels_last和channels_first的LayerNorm层。 GRN类实现了全局响应归一化GRN层。 Block类实现了ConvNeXtV2模型的基本块。 ConvNeXtV2类实现了ConvNeXt V2模型。 update_weight函数用于更新模型的权重。 convnextv2_atto函数创建一个ConvNeXtV2模型实例该模型具有较小的尺寸。 convnextv2_femto函数创建一个ConvNeXtV2模型实例该模型具有更小的尺寸。 convnextv2_pico函数创建一个ConvNeXtV2模型实例该模型具有更小的尺寸。 convnextv2_nano函数创建一个ConvNeXtV2模型实例该模型具有更小的尺寸。 convnextv2_tiny函数创建一个ConvNeXtV2模型实例该模型具有较小的尺寸。 convnextv2_base函数创建一个ConvNeXtV2模型实例该模型具有中等尺寸。 convnextv2_large函数创建一个ConvNeXtV2模型实例该模型具有较大的尺寸。 convnextv2_huge函数创建一个ConvNeXtV2模型实例该模型具有非常大的尺寸。 这些函数可以根据指定的参数创建不同尺寸的ConvNeXtV2模型并且可以选择加载预训练的权重。 5.6 backbone\CSwomTramsformer.py class CSWinTransformer(nn.Module):def __init__(self, img_size224, patch_size4, in_chans3, num_classes1000, embed_dim96, depths[2, 2, 6, 2], num_heads[3, 6, 12, 24], mlp_ratio4., qkv_biasTrue, qk_scaleNone, drop_rate0., attn_drop_rate0., drop_path_rate0., norm_layernn.LayerNorm):super().__init__()self.num_classes num_classesself.depths depthsself.num_features self.embed_dim embed_dimself.patch_embed PatchEmbed(img_sizeimg_size, patch_sizepatch_size, in_chansin_chans, embed_dimembed_dim)self.pos_drop nn.Dropout(pdrop_rate)dpr [x.item() for x in torch.linspace(0, drop_path_rate, sum(depths))] # stochastic depth decay ruleself.blocks nn.ModuleList([CSWinBlock(dimembed_dim, resoimg_size // patch_size, num_headsnum_heads[i], mlp_ratiomlp_ratio,qkv_biasqkv_bias, qk_scaleqk_scale, dropdrop_rate, attn_dropattn_drop_rate,drop_pathdpr[sum(depths[:i]):sum(depths[:i 1])], norm_layernorm_layer,last_stage(i len(depths) - 1))for i in range(len(depths))])self.norm norm_layer(embed_dim)self.head nn.Linear(embed_dim, num_classes) if num_classes 0 else nn.Identity()trunc_normal_(self.head.weight, std0.02)zeros_(self.head.bias)def init_weights(self, pretrainedNone):if isinstance(pretrained, str):logger get_root_logger()load_checkpoint(self, pretrained, strictFalse, loggerlogger)elif pretrained is None:for m in self.modules():if isinstance(m, nn.Linear):trunc_normal_(m.weight, std.02)if isinstance(m, nn.Linear) and m.bias is not None:zeros_(m.bias)elif isinstance(m, nn.LayerNorm):ones_(m.weight)zeros_(m.bias)else:raise TypeError(pretrained must be a str or None)def forward(self, x):x self.patch_embed(x)x self.pos_drop(x)for blk in self.blocks:x blk(x)x self.norm(x)[:, 0]if self.num_classes 0:x self.head(x)return x这个程序文件是一个用于图像分类的CSWin Transformer模型。它定义了CSWinBlock类和Mlp类以及一些辅助函数。CSWinBlock类是CSWin Transformer的基本模块它包含了多头注意力机制和多层感知机。Mlp类是多层感知机的实现。这个程序文件还定义了一些辅助函数如img2windows和windows2img用于将图像转换为窗口形式和将窗口形式的图像转换回原始图像形式。 6.系统整体结构 下表总结了每个文件的功能 文件功能export.py导出模型的功能predict.py进行预测的功能train.py模型训练的功能ui.py提供GUI界面的功能backbone\convnextv2.pyConvNeXtV2模型的定义和创建backbone\CSwomTramsformer.pyCSwomTramsformer模型的定义和创建backbone\EfficientFormerV2.pyEfficientFormerV2模型的定义和创建backbone\efficientViT.pyefficientViT模型的定义和创建backbone\fasternet.pyfasternet模型的定义和创建backbone\lsknet.pylsknet模型的定义和创建backbone\repvit.pyrepvit模型的定义和创建backbone\revcol.pyrevcol模型的定义和创建backbone\SwinTransformer.pySwinTransformer模型的定义和创建backbone\VanillaNet.pyVanillaNet模型的定义和创建extra_modules\afpn.pyAFPN模块的定义和创建extra_modules\attention.py注意力模块的定义和创建extra_modules\block.py基础块模块的定义和创建extra_modules\dynamic_snake_conv.py动态蛇卷积模块的定义和创建extra_modules\head.py模型头部模块的定义和创建extra_modules\kernel_warehouse.py卷积核仓库模块的定义和创建extra_modules\orepa.pyOREPA模块的定义和创建extra_modules\rep_block.pyRepBlock模块的定义和创建extra_modules\RFAConv.pyRFAConv模块的定义和创建models\common.py通用模型函数和类的定义models\experimental.py实验性模型的定义models\tf.pyTensorFlow模型的定义models\yolo.pyYOLO模型的定义segment\predict.py分割模型的预测功能segment\train.py分割模型的训练功能segment\val.py分割模型的验证功能ultralytics…Ultralytics库的各个模块和功能utils…通用工具函数和类的定义 这些文件组成了一个完整的杂草分割系统包括模型定义、训练、预测、GUI界面等 7.深度学习基础 卷积神经网络通过使用具有共享参数的卷积运算显著降低了模型的计算开销和复杂性。在LeNet、AlexNet和VGG等经典网络的驱动下卷积神经网络现在已经建立了一个完整的系统并在深度学习领域形成了先进的卷积神经网络模型。 感受野注意力卷积RFCBAMConv的作者在仔细研究了卷积运算之后获得了灵感。对于分类、目标检测和语义分割任务一方面图像中不同位置的对象的形状、大小、颜色和分布是可变的。在卷积操作期间卷积核在每个感受野中使用相同的参数来提取信息而不考虑来自不同位置的差分信息。这限制了网络的性能这已经在最近的许多工作中得到了证实。 另一方面卷积运算没有考虑每个特征的重要性这进一步影响了提取特征的有效性并最终限制了模型的性能。此外注意力机制允许模型专注于重要特征这可以增强特征提取的优势和卷积神经网络捕获详细特征信息的能力。因此注意力机制在深度学习中得到了广泛的应用并成功地应用于各个领域。 通过研究卷积运算的内在缺陷和注意力机制的特点作者认为现有的空间注意力机制从本质上解决了卷积运算的参数共享问题但仍局限于对空间特征的认知。对于较大的卷积核现有的空间注意力机制并没有完全解决共享参数的问题。此外他们无法强调感受野中每个特征的重要性例如现有的卷积块注意力模块CBAM和 Coordinate注意力CA。 因此参考该博客提出了一种新的感受野注意力机制RFA它完全解决了卷积核共享参数的问题并充分考虑了感受野中每个特征的重要性。通过RFA设计的卷积运算RFAConv是一种新的卷积运算可以取代现有神经网络中的标准卷积运算。RFAConv通过添加一些参数和计算开销来提高网络性能。 大量关于Imagnet-1k、MS COCO和VOC的实验已经证明了RFAConv的有效性。作为一种由注意力构建的新型卷积运算它超过了由CAM、CBAM和CA构建的卷积运算CAMConv、CBAMConv、CAConv以及标准卷积运算。 此外为了解决现有方法提取感受野特征速度慢的问题提出了一种轻量级操作。在构建RFAConv的过程中再次设计了CA和CBAM的升级版本并进行了相关实验。作者认为当前的空间注意力机制应该将注意力放在感受野空间特征上以促进当前空间注意力机制的发展并再次增强卷积神经网络架构的优势。 8.卷积神经网络架构 出色的神经网络架构可以提高不同任务的性能。卷积运算作为卷积神经网络的一种基本运算推动了人工智能的发展并为车辆检测、无人机图像、医学等先进的网络模型做出了贡献。He等人认为随着网络深度的增加该模型将变得难以训练并产生退化现象因此他们提出了残差连接来创新卷积神经网络架构的设计。Huang等人通过重用特征来解决网络梯度消失问题增强了特征信息他们再次创新了卷积神经网络架构。 通过对卷积运算的详细研究Dai等人认为具有固定采样位置的卷积运算在一定程度上限制了网络的性能因此提出了Deformable Conv通过学习偏移来改变卷积核的采样位置。在Deformable Conv的基础上再次提出了Deformable Conv V2和Deformable Conv V3以提高卷积网络的性能。 Zhang等人注意到组卷积可以减少模型的参数数量和计算开销。然而少于组内信息的交互将影响最终的网络性能。1×1的卷积可以与信息相互作用。然而这将带来更多的参数和计算开销因此他们提出了无参数的“通道Shuffle”操作来与组之间的信息交互。 Ma等人通过实验得出结论对于参数较少的模型推理速度不一定更快对于计算量较小的模型推理也不一定更快。经过仔细研究提出了Shufflenet V2。 YOLO将输入图像划分为网格以预测对象的位置和类别。经过不断的研究已经提出了8个版本的基于YOLO的目标检测器如YOLOv5、YOLOv7、YOLOv8等。上述卷积神经网络架构已经取得了巨大的成功。然而它们并没有解决提取特征过程中的参数共享问题。本文的工作从注意力机制开始从一个新的角度解决卷积参数共享问题。 9.注意力机制 注意力机制被用作一种提高网络模型性能的技术使其能够专注于关键特性。注意力机制理论已经在深度学习中建立了一个完整而成熟的体系。Hu等人提出了一种Squeeze-and-ExcitationSE块通过压缩特征来聚合全局通道信息从而获得与每个通道对应的权重。Wang等人认为当SE与信息交互时单个通道和权重之间的对应关系是间接的因此设计了高效通道注Efficient Channel Attention力ECA并用自适应kernel大小的一维卷积取代了SE中的全连接FC层。Woo等人提出了卷积块注意力模块CBAM它结合了通道注意力和空间注意力。作为一个即插即用模块它可以嵌入卷积神经网络中以提高网络性能。 尽管SE和CBAM已经提高了网络的性能。Hou等人仍然发现压缩特征在SE和CBAM中丢失了太多信息。因此他们提出了轻量级Coordinate注意力CA来解决SE和CBAM中的问题。Fu等人计了一个空间注意力模块和通道注意力模块用于扩展全卷积网络FCN分别对空间维度和通道维度的语义相关性进行建模。Zhang等人在通道上生成不同尺度的特征图以建立更有效的通道注意力机制。 本文从一个新的角度解决了标准卷积运算的参数共享问题。这就是将注意力机制结合起来构造卷积运算。尽管目前的注意力机制已经获得了良好的性能但它们仍然没有关注感受野的空间特征。因此设计了具有非共享参数的RFA卷积运算以提高网络的性能。 回顾标准卷积 以标准卷积运算为基础构建卷积神经网络通过共享参数的滑动窗口提取特征信息解决了全连接层构建的神经网络的固有问题即参数数量大、计算开销高。 设表示输入特征图其中、和分别表示特征图的通道数、高度和宽度。为了能够清楚地展示卷积核提取特征信息的过程以为例。提取每个感受野slider的特征信息的卷积运算可以表示如下 这里表示在每次卷积slider操作之后获得的值表示在每个slider内的相应位置处的像素值。表示卷积核表示卷积核中的参数数量表示感受野slider的总数。 可以看出每个slider内相同位置的特征共享相同的参数。因此标准的卷积运算无法感知不同位置带来的差异信息这在一定程度上限制了卷积神经网络的性能。 回顾空间注意力 目前空间注意力机制使用通过学习获得的注意力图来突出每个特征的重要性。与上一节类似以为例。突出关键特征的空间注意力机制可以简单地表达如下 这里表示在加权运算之后获得的值。和分别表示输入特征图和学习注意力图在不同位置的值是输入特征图的高度和宽度的乘积表示像素值的总数。一般来说整个过程可以简单地表示在图1中。 空间注意力与标准卷积 众所周知将注意力机制引入卷积神经网络可以提高网络的性能。通过标准的卷积运算和对现有空间注意力机制的仔细分析。作者认为空间注意力机制本质上解决了卷积神经网络的固有缺点即共享参数的问题。 目前该模型最常见的卷积核大小为1×1和3×3。引入空间注意力机制后用于提取特征的卷积操作是1×1或3×3卷积操作。这个过程可以直观地显示出来。空间注意力机制被插入到1×1卷积运算的前面。通过注意力图对输入特征图进行加权运算Re-weight“×”最后通过1×1卷积运算提取感受野的slider特征信息。 整个过程可以简单地表示如下 这里卷积核仅表示一个参数值。如果将的值作为一个新的卷积核参数那么有趣的是通过1×1卷积运算提取特征时的参数共享问题得到了解决。然而空间注意力机制的传说到此结束。当空间注意力机制被插入到3×3卷积运算的前面时。具体情况如下 如上所述如果取的值。作为一种新的卷积核参数上述方程完全解决了大规模卷积核的参数共享问题。然而最重要的一点是卷积核在每个感受野slider中提取将共享部分特征的特征。换句话说在每个感受野slider内都会有重叠。 经过仔细分析发现…空间注意力图的权重在每个slider内共享。因此空间注意机制不能解决大规模卷积核共享参数的问题因为它们不注意感受野的空间特征。在这种情况下空间注意力机制是有限的。 创新空间注意力与标准卷积 RFA是为了解决空间注意力机制问题而提出的创新了空间注意力。使用与RFA相同的思想一系列空间注意力机制可以再次提高性能。RFA设计的卷积运算可以被视为一种轻量级的即插即用模块以取代标准卷积从而提高卷积神经网络的性能。因此作者认为空间注意力机制和标准卷积在未来将有一个新的春天。 感受野的空间特征 现在给出感受野空间特征的定义。它是专门为卷积核设计的并根据kernel大小动态生成如图2所示以3×3卷积核为例。 在图2中“空间特征”表示原始特征图等于空间特征。“感受野空间特征”表示变换后的特征该特征由每个感受野slider滑块组成并且不重叠。也就是说“感受野空间特征”中的每个3×3大小的slider表示提取原始3×3卷积特征时所有感觉野slider的特征。 感受野注意力卷积(RFA): 关于感受野空间特征该博客的作者提出了感受野注意RFA它不仅强调了感受野slider内各种特征的重要性而且还关注感受野空间特性以彻底解决卷积核参数共享的问题。感受野空间特征是根据卷积核的大小动态生成的因此RFA是卷积的固定组合不能脱离卷积运算的帮助卷积运算同时依赖RFA来提高性能。 因此作者提出了感受野注意力卷积RFAConv。具有3×3大小卷积核的RFAConv的总体结构如图3所示。 目前提取感受野特征最常用的方法速度较慢因此经过不断探索提出了一种快速的方法通过分组卷积来取代原来的方法。 具体来说根据感受野大小使用相应的组卷积大小来动态生成展开特征。尽管与原始的无参数方法如Pytorch提供的nn.Unfld()相比该方法添加了一些参数但速度要快得多。 注意正如在上一节中提到的当原始的3×3卷积核提取特征时感受野空间特征中的每个3×3大小的窗口表示所有感受野滑块的特征。但在快速分组卷积提取感受野特征后由于原始方法太慢它们会被映射到新的特征中。 最近的一些工作已经证明信息交互可以提高网络性能。类似地对于RFAConv与感受野特征信息交互以学习注意力图可以提高网络性能但与每个感受野特征交互将带来额外的计算开销。为了确保少量的计算开销和参数数量通过探索使用AvgPool池化每个感受野特征的全局信息然后通过1×1组卷积运算与信息交互。最后softmax用于强调感受野特征中每个特征的重要性。通常RFA的计算可以表示为 表示分组卷积表示卷积核的大小代表规范化表示输入特征图是通过将注意力图与变换的感受野空间特征相乘而获得的。 与CBAM和CA不同RFA可以为每个感受野特征生成注意力图。标准卷积受到卷积神经网络性能的限制因为共享参数的卷积运算对位置带来的差异信息不敏感。RFA完全可以解决这个问题具体细节如下 由于RFA获得的特征图是“调整形状”后不重叠的感受野空间特征因此通过池化每个感受野滑块的特征信息来学习学习的注意力图。换句话说RFA学习的注意力图不再在每个感受野slider内共享并且是有效的。这完全解决了现有的CA和CBAM对大尺寸kernel的注意力机制中的参数共享问题。 同时RFA给标准卷积核带来了相当大的好处但调整形状后特征的高度和宽度是k倍需要进行k×k的stride卷积运算才能提取特征信息。RFAConv创新了标准卷积运算。 此外空间注意力机制将得到升级因为作者认为现有的空间注意力机制应该专注于感受野空间特征以提高网络的性能。众所周知基于自注意力机制的网络模型取得了巨大的成功因为它解决了卷积参数共享的问题并对远程信息进行了建模但基于自注意力机理的方法给模型带来了巨大的计算开销和复杂性。作者认为通过将一些现有空间注意力机制的注意力放在感受野空间特征中它以轻量级的方式解决了自注意力机制的问题。 答案如下 将关注感受野空间特征的空间注意力与卷积相匹配完全解决了卷积参数共享的问题 当前的空间注意力机制本身具有考虑远距离信息的特点它们通过全局平均池化或全局最大池化来获得全局信息这在一定程度上考虑了远距离信息。 为此作者设计了一种新的CBAM和CA称为RFACBAM和RFACA它专注于感受野的空间特征。与RFA类似使用stride为k的k×k的最终卷积运算来提取特征信息具体结构如图4和图5所示将这2种新的卷积方法称为RFCBAMConv和RFCAConv。比较原始的CBAM使用SE注意力来代替RFCBAM中的CAM。因为这样可以减少计算开销。 此外在RFCBAM中通道和空间注意力不是在单独的步骤中执行的因为通道和空间注意力是同时加权的从而允许在每个通道上获得的注意力图是不同的。 10.训练结果可视化分析 评价指标 epoch迭代轮数 train/box_losstrain/seg_losstrain/obj_losstrain/cls_loss训练时的各种损失 metrics/precision(B)metrics/recall(B)metrics/mAP_0.5(B)metrics/mAP_0.5:0.95(B)训练时对于背景类别B的精度、召回率和平均精度 metrics/precision(M)metrics/recall(M)metrics/mAP_0.5(M)metrics/mAP_0.5:0.95(M)训练时对于杂草类别M的精度、召回率和平均精度 val/box_lossval/seg_lossval/obj_lossval/cls_loss验证时的各种损失 x/lr0x/lr1x/lr2学习率 训练结果可视化 为了更好地理解这些数据并进行详细的数据分析我将进行以下步骤 损失分析检查训练和验证损失如何随着迭代轮数的变化。 精度和召回率分析分析模型在不同类别背景和杂草上的精度和召回率。 平均精度分析分析模型的平均精度mAP这是一个重要的性能指标。 学习率分析观察学习率如何变化并分析其对模型性能的影响。 现在我将开始进行这些分析并为每个分析创建相应的图表。 import matplotlib.pyplot as plt import seaborn as sns# 设定绘图风格 sns.set(stylewhitegrid)# 1. 损失分析 plt.figure(figsize(14, 6))# 训练损失 plt.subplot(1, 2, 1) plt.plot(data[epoch], data[train/box_loss], labelBox Loss) plt.plot(data[epoch], data[train/seg_loss], labelSeg Loss) plt.plot(data[epoch], data[train/obj_loss], labelObj Loss) plt.plot(data[epoch], data[train/cls_loss], labelCls Loss) plt.xlabel(Epoch) plt.ylabel(Loss) plt.title(Training Loss) plt.legend()# 验证损失 plt.subplot(1, 2, 2) plt.plot(data[epoch], data[val/box_loss], labelBox Loss) plt.plot(data[epoch], data[val/seg_loss], labelSeg Loss) plt.plot(data[epoch], data[val/obj_loss], labelObj Loss) plt.plot(data[epoch], data[val/cls_loss], labelCls Loss) plt.xlabel(Epoch) plt.ylabel(Loss) plt.title(Validation Loss) plt.legend()plt.tight_layout() plt.show()# 2. 精度和召回率分析 plt.figure(figsize(14, 6))# 背景类别精度和召回率 plt.subplot(1, 2, 1) plt.plot(data[epoch], data[metrics/precision(B)], labelPrecision (B)) plt.plot(data[epoch], data[metrics/recall(B)], labelRecall (B)) plt.xlabel(Epoch) plt.ylabel(Value) plt.title(Background Class Precision Recall) plt.legend()# 杂草类别精度和召回率 plt.subplot(1, 2, 2) plt.plot(data[epoch], data[metrics/precision(M)], labelPrecision (M)) plt.plot(data[epoch], data[metrics/recall(M)], labelRecall (M)) plt.xlabel(Epoch) plt.ylabel(Value) plt.title(Weed Class Precision Recall) plt.legend()plt.tight_layout() plt.show()# 3. 平均精度分析 plt.figure(figsize(14, 6))plt.plot(data[epoch], data[metrics/mAP_0.5(B)], labelmAP_0.5 (B)) plt.plot(data[epoch], data[metrics/mAP_0.5:0.95(B)], labelmAP_0.5:0.95 (B)) plt.plot(data[epoch], data[metrics/mAP_0.5(M)], labelmAP_0.5 (M)) plt.plot(data[epoch], data[metrics/mAP_0.5:0.95(M)], labelmAP_0.5:0.95 (M)) plt.xlabel(Epoch) plt.ylabel(mAP) plt.title(Mean Average Precision (mAP) for Background and Weed Classes) plt.legend()plt.tight_layout() plt.show()# 4. 学习率分析 plt.figure(figsize(7, 4)) plt.plot(data[epoch], data[x/lr0], labelLR0) plt.plot(data[epoch], data[x/lr1], labelLR1) plt.plot(data[epoch], data[x/lr2], labelLR2) plt.xlabel(Epoch) plt.ylabel(Learning Rate) plt.title(Learning Rate Changes Over Epochs) plt.legend()plt.tight_layout() plt.show() 损失分析 训练损失随着迭代次数的增加所有四种损失Box Loss, Seg Loss, Obj Loss, Cls Loss都呈下降趋势。这表明模型在训练过程中逐渐学习并改进其预测。 验证损失验证损失也呈下降趋势这表明模型在未见过的数据上同样表现良好。这是避免过拟合的一个好迹象。 11.系统整合 下图完整源码数据集环境部署视频教程自定义UI界面 参考博客《【改进YOLOv8】融合感受野注意力卷积RFCBAMConv的杂草分割系统》 12.参考文献 [1]郑三婷.浅谈MATLAB仿真在数字图像处理课程中的应用[J].电子制作.2020,(8). [2]张有春.基于卷积神经网络的杂草快速识别研究[J].安徽农业科学.2019,(14).DOI:10.3969/j.issn.0517-6611.2019.14.071 . [3]耿蕊,于晓敏,迟立颖.基于MATLAB图像处理的农业杂草种类识别研究[J].信息通信.2018,(7).DOI:10.3969/j.issn.1673-1131.2018.07.026 . [4]李昌盛,王亚娟,黄启俊,等.基于FPGA的人脸检测系统设计[J].电子技术应用.2011,(10).DOI:10.3969/j.issn.0258-7998.2011.10.007 . [5]颜世利.灰度图像阈值分割的自适应滤波和快速算法研究[J].桂林理工大学.2018. [6]吴国瑞.基于图像处理的杂草种类识别技术研究[D].2009. [7]王树文,张长利,房俊龙.基于计算机视觉的田间杂草识别研究[C].2005.
http://www.pierceye.com/news/707981/

相关文章:

  • 签名能留链接的网站数据库网站建设公司
  • 网站权重不够高 导致创建网站销售产品
  • 中国建设报网站做网站如何文字链接文字
  • 网站建设网站多少钱网站上做值机的app
  • 百度手机网站提交做网站优化的教程
  • wordpress建站教程贴吧网站建设的论文的参考文献
  • 公司网站设计建议php7 wordpress
  • 商城网站建设策划书扬中会建网站
  • 铜陵市网站建设如何建立小程序商城
  • 大型网站运营步骤做网站f12的用处
  • 静态网站什么意思微信开发者工具打不开
  • 建站到网站收录到优化通化北京网站建设
  • 网站开发作用wordpress mysuc cms
  • 网站开发人员的职责是什么石家庄外贸建站公司
  • 内外外贸购物网站建设网站顶部下拉广告
  • 深圳企业网站建设服务平台销售推广语
  • 做网站要什么资料百度网盘登录
  • 聚牛网站建设公司北京seo优化推广
  • 成都网站公司网站建设东莞大岭山电子厂
  • python建立简易网站网站界面设计的分类有哪几种
  • 网络规划师考哪些内容优化设计卷子答案
  • 邢台网站关键词优化wordpress弹窗下载
  • 晋城市企业网站腾讯qq官网登录入口
  • 怎么给网站在百度地图上做爬虫一家专门做灯的网站
  • 河南焦作有做网站开发的公司吗xampp安装wordpress
  • python购物网站开发流程图win淘宝客wordpress主题模板
  • 江苏省建设执业网站个人做淘宝客网站有哪些
  • 浙江省建设厅门户网站咨询公司是干什么的
  • 哪个网站上可以做初中数学题wordpress 网校插件
  • html写手机网站制作网页用什么语言