yolov8 で Ultralytics/datasets/coco.yaml を使用してトレーニングすると、「train2017.cache にラベルが見つかりません」というエラーが発生しました。
model.train(
data="ultralytics/datasets/coco.yaml",
epochs=100,
imgsz=640,
batch=16,
save_period=10,
)
この問題の理由を以下で見つけてください。
ここでは coco データセットは事前にダウンロードされず、トレーニング中に自動的にダウンロードされるため、ダウンロード速度は比較的遅くなります。
すると、データセットの下に coco フォルダーが表示されます (ここにフォルダーが表示されない場合は、~/.config/Ultralytics/settings.yaml
パスの設定を確認してください)。
train.cache はラベルフォルダーにあります。ダウンロードではなく、画像内の電車やヴァルの写真をもとにラベルから対応するファイルを見つけて生成します。
したがって、この生成プロセス中に何が問題になったのかを確認する必要があります。
まず、画像とラベルへのパスが正しいかどうかを確認します。
label_files をチェックインして、ultralytics/yolo/data/dataset.py
ファイルが存在するかどうかを確認します。
(インターネット上の多くの記事では、この手順で問題が解決されています)
def get_labels(self):
"""Returns dictionary of labels for YOLO training."""
self.label_files = img2label_paths(self.im_files)
#print(self.label_files)
cache_path = Path(self.label_files[0]).parent.with_suffix('.cache')
このステップでは、ブロガーはこれらのファイルがフォルダー内に存在することを確認します。引き続き原因の究明が必要です。
エラーはここで報告されます。
# Display cache
nf, nm, ne, nc, n = cache.pop('results') # found, missing, empty, corrupt, total
if exists and LOCAL_RANK in (-1, 0):
d = f'Scanning {
cache_path}... {
nf} images, {
nm + ne} backgrounds, {
nc} corrupt'
tqdm(None, desc=self.prefix + d, total=n, initial=n, bar_format=TQDM_BAR_FORMAT) # display cache results
if cache['msgs']:
LOGGER.info('\n'.join(cache['msgs'])) # display warnings
if nf == 0: # number of labels found
raise FileNotFoundError(f'{
self.prefix}No labels found in {
cache_path}, can not start training. {
HELP_URL}')
明らかに nf=0 と表示されていますが、なぜ nf 0 なのでしょうか?生成プロセス中にキャッシュに問題がある可能性が非常に高いため、次に、キャッシュによって生成されたコードを見つける必要があります。
ここでは nf で +1 操作がまだdataset.py
行われています。明らかに、何か問題が発生し、+1 操作が実行されませんでした。
def cache_labels(self, path=Path('./labels.cache')):
"""Cache dataset labels, check images and read shapes.
Args:
path (Path): path where to save the cache file (default: Path('./labels.cache')).
Returns:
(dict): labels.
"""
x = {
'labels': []}
nm, nf, ne, nc, msgs = 0, 0, 0, 0, [] # number missing, found, empty, corrupt, messages
desc = f'{
self.prefix}Scanning {
path.parent / path.stem}...'
total = len(self.im_files)
nkpt, ndim = self.data.get('kpt_shape', (0, 0))
if self.use_keypoints and (nkpt <= 0 or ndim not in (2, 3)):
raise ValueError("'kpt_shape' in data.yaml missing or incorrect. Should be a list with [number of "
"keypoints, number of dims (2 for x,y or 3 for x,y,visible)], i.e. 'kpt_shape: [17, 3]'")
with ThreadPool(NUM_THREADS) as pool:
results = pool.imap(func=verify_image_label,
iterable=zip(self.im_files, self.label_files, repeat(self.prefix),
repeat(self.use_keypoints), repeat(len(self.data['names'])), repeat(nkpt),
repeat(ndim)))
pbar = tqdm(results, desc=desc, total=total, bar_format=TQDM_BAR_FORMAT)
for im_file, lb, shape, segments, keypoint, nm_f, nf_f, ne_f, nc_f, msg in pbar:
nm += nm_f
nf += nf_f
ne += ne_f
nc += nc_f
if im_file:
x['labels'].append(
dict(
im_file=im_file,
shape=shape,
cls=lb[:, 0:1], # n, 1
bboxes=lb[:, 1:], # n, 4
segments=segments,
keypoints=keypoint,
normalized=True,
bbox_format='xywh'))
if msg:
msgs.append(msg)
pbar.desc = f'{
desc} {
nf} images, {
nm + ne} backgrounds, {
nc} corrupt'
pbar.close()
ここで、電車のフォルダー内の写真が見つからないことがわかり、フォルダーを
確認したultralytics/datasets/coco/images/train2017
ところ、フォルダーは空でした。
2 番目の外観のサイズtrain2017.zip
はわずか 2.2kB です! ダウンロードは失敗しました。
問題は、ダウンロードしたファイルが破損しているかどうかの確認ができないことであることが判明しました。