这个错误还算是比较冷门当是又不是太容易发现,在报错出来的时候容易被最后面的提醒误解,我的报错提示如下:
RuntimeError Traceback (most recent call last)
Input In [11], in <module>
6 model = YOLO('./yolov8.yaml').load('./yolov8n.pt') # build from YAML and transfer weights
8 # Train the model
----> 9 results = model.train(data='tianchi.yaml', epochs=10, device=0)
File /文件地址/ultralytics-main/ultralytics/engine/model.py:655, in Model.train(self, trainer, **kwargs)
652 pass
654 self.trainer.hub_session = self.session # attach optional HUB session
--> 655 self.trainer.train()
656 # Update model and cfg after training
657 if RANK in (-1, 0):
File /文件地址/ultralytics-main/ultralytics/engine/trainer.py:213, in BaseTrainer.train(self)
210 ddp_cleanup(self, str(file))
212 else:
--> 213 self._do_train(world_size)
File /文件地址/ultralytics-main/ultralytics/engine/trainer.py:429, in BaseTrainer._do_train(self, world_size)
427 # Validation
428 if self.args.val or final_epoch or self.stopper.possible_stop or self.stop:
--> 429 self.metrics, self.fitness = self.validate()
430 self.save_metrics(metrics={**self.label_loss_items(self.tloss), **self.metrics, **self.lr})
431 self.stop |= self.stopper(epoch + 1, self.fitness) or final_epoch
File /文件地址/ultralytics-main/ultralytics/engine/trainer.py:551, in BaseTrainer.validate(self)
545 def validate(self):
546 """
547 Runs validation on test set using self.validator.
548
549 The returned dict is expected to contain "fitness" key.
550 """
--> 551 metrics = self.validator(self)
552 fitness = metrics.pop("fitness", -self.loss.detach().cpu().numpy()) # use loss as fitness measure if not found
553 if not self.best_fitness or self.best_fitness < fitness:
File /opt/conda/lib/python3.9/site-packages/torch/utils/_contextlib.py:115, in context_decorator.<locals>.decorate_context(*args, **kwargs)
112 @functools.wraps(func)
113 def decorate_context(*args, **kwargs):
114 with ctx_factory():
--> 115 return func(*args, **kwargs)
File /文件地址/ultralytics-main/ultralytics/engine/validator.py:195, in BaseValidator.__call__(self, trainer, model)
192 self.plot_predictions(batch, preds, batch_i)
194 self.run_callbacks("on_val_batch_end")
--> 195 stats = self.get_stats()
196 self.check_stats(stats)
197 self.speed = dict(zip(self.speed.keys(), (x.t / len(self.dataloader.dataset) * 1e3 for x in dt)))
File /文件地址/ultralytics-main/ultralytics/models/yolo/detect/val.py:168, in DetectionValidator.get_stats(self)
166 def get_stats(self):
167 """Returns metrics statistics and results dictionary."""
--> 168 stats = {k: torch.cat(v, 0).cpu().numpy() for k, v in self.stats.items()} # to numpy
169 if len(stats) and stats["tp"].any():
170 self.metrics.process(**stats)
File /文件地址/ultralytics-main/ultralytics/models/yolo/detect/val.py:168, in <dictcomp>(.0)
166 def get_stats(self):
167 """Returns metrics statistics and results dictionary."""
--> 168 stats = {k: torch.cat(v, 0).cpu().numpy() for k, v in self.stats.items()} # to numpy
169 if len(stats) and stats["tp"].any():
170 self.metrics.process(**stats)
RuntimeError: torch.cat(): expected a non-empty list of Tensors
单看这些代码还是不太容易发现问题的,只可能把你往torch.cat()这个方向引,但如果眼尖会发现在报错之前,有这么两个不起眼的警告(还不是报错,只是警告)
train: Scanning /文件位置/ultralytics-main/datasets/tianchi/image/mchar_train.cache... 0 images, 30000 backgrounds, 0 corrupt: 100%|██████████| 30000/30000 [00:00<?, ?it/s]
WARNING ⚠️ No labels found in /文件位置/ultralytics-main/datasets/tianchi/image/mchar_train.cache, training may not work correctly. See https://docs.ultralytics.com/datasets/detect for dataset formatting guidance.
val: Scanning /文件位置/ultralytics-main/datasets/tianchi/image/mchar_val.cache... 0 images, 10000 backgrounds, 0 corrupt: 100%|██████████| 10000/10000 [00:00<?, ?it/s]
WARNING ⚠️ No labels found in /文件位置/ultralytics-main/datasets/tianchi/image/mchar_val.cache, training may not work correctly. See https://docs.ultralytics.com/datasets/detect for dataset formatting guidance.
意思是有0张图片,30000张背景,下面是对没有标签的警告。
到这个时候就要思考文件位置会不会有什么问题(因为我的yolov8是已经跑通了的),回去一看,果不其然,对于文件的命名出错了。
正常的命名方法是这样的:images放照片;labels放标签,而我两个文件夹都忘打最后的 ‘s’