如何阅读yolo11源码-模型构建过程
发布时间:2026/10/30 2:45:56 锦皓数字建站

给阅读源码没有方向的人的一个抛砖引玉的文下载yolo11源码,打开readme.md找到下面这个在readme.md同层级新建train.py把python代码写入然后就是用ctrl点YOLO最外层的YOLO类目前先看初始化def __init__(self, model: str | Path yolo26n.pt, task: str | None None, verbose: bool False)这里的model:str是限制str,这里的model就是你传入的.pt或者.yaml文件我们主要看else这段落一般都是这里,比如你传yolo11.yaml也是走这里,这里是模型的初始化,super().__init__(modelmodel, tasktask, verboseverbose)调用父类所以我们需要去看YOLO的父类,Model,再次使用ctrl找到Model可以看出,传入的数据格式都是定死的下面的注释也最好看一下,然后就是各种初始化,我们主要看这里if str(model).endswith((.yaml, .yml)): self._new(model, tasktask, verboseverbose) else: self._load(model, tasktask)如果你传入的是.yaml文件就走_new方法,如果是权重文件.pt就走_load一般阅读源码都是想改 yolo11的结构的,所以这里就只看_new方法,ctrl找到_new看这里cfg_dict yaml_model_load(cfg)通过self._new(model, tasktask, verboseverbose)可以知道,这时的cfg是你传的模型文件的路径再找到yaml_load前面几段是做历史兼容的,可以不看,主要看d YAML.load(yaml_file) # model dict d[scale] guess_model_scale(path) d[yaml_file] str(path) return d再找YAML类的load方法我先说这里的整体是把 YAML 文件读成 Python 字典并处理各种脏数据/边界情况我们主要看怎么转为字典try: data instance.yaml.load(s, Loaderinstance.SafeLoader) except Exception as e: # Remove problematic characters and retry s re.sub(r[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\uD7FF\uE000-\uFFFD\U00010000-\U0010ffff], , s) try: data instance.yaml.load(s, Loaderinstance.SafeLoader) except Exception: raise ValueError( fYAML syntax error in {file}: {e}\nVerify YAML with https://ray.run/tools/yaml-formatter ) from None先用SafeLoader正常解析安全不会执行任意 Python 对象失败时用正则删掉非法字符保留 tab/换行/回车、可打印 ASCII、常用 Unicode 范围再试一次还失败就抛出带文件名和格式化工具链接的清晰错误而不是 cryptic 的原始异常最后赋值给 data参考.yaml的话,data大概长这样{ nc: 80, scales: {n: [0.50, 0.25, 1024], s: [0.50, 0.50, 1024]}, backbone: [[-1, 1, Conv, [64, 3, 2]], [-1, 1, Conv, [128, 3, 2]]], head: [[-1, 1, nn.Upsample, [None, 2, nearest]]], }回到yaml_model_load这时候d 拿到了字典也就是datad[scale] guess_model_scale(path)这里是猜scale反正最主要的是给字典加了一个数据,scaledata[yaml_file] str(file)也是加入了一个数据,文件的来源特别注意,yaml_model_load这里的调用load是append_filenameFalse所以不会执行data[yaml_file] str(file)yaml_model_load最后返回了整个字典让我们回到_new方法cfg_dict就是d这个字典主要看这里self.model (model or self._smart_load(model))(cfg_dict, verboseverbose and RANK -1) # build model这里就是构建模型的步骤这行的意思是根据任务动态选模型类 用配置字典实例化网络 按分布式/verbose 控制日志三合一这里仔细讲有点麻烦,总的来说就是如果是detect的task就返回一个DetectionModel所以把上面在翻译一下就长这样DetectionModel(cfg_dict, verboseverbose and RANK -1) # build model创建了一个DetectionModel类,然后使用cfg_dict来创建的所以我们需要找Detection类找Detection类路径是ultralytics-main/ultralytics/nn/tasks.py这里的DetectionModel继承了BaseModel的方法,实际上就是继承了各种方法看这里super().__init__() _initialize_yolo_model(self, cfg, ch, nc, verbose)这里是用了BaseModel的方法找到这个方法这里就是对我们之前的字典进行处理,主要看model.model, model.save parse_model(deepcopy(model.yaml), chch, verboseverbose)这里的parse_model,这里就是把.yaml文件变成nn.Sequential这种pytorch可以执行的东西回到_new方法,此时的self.model就变成了一个可以执行的模型这些就是模型构建的大致过程如果想改模型的话细读parse_model方法
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。