MMclassfication 사용자 지정 데이터 세트 교육 및 시각화

mmclassification의 기본적인 소개는 여기에서 자세히 다루지 않겠습니다.초기 단계에서는 그림의 기능을 구현해야 하는 작업이고 mmlab 관련 라이브러리를 사용해 왔기 때문에 mmcls를 선택했습니다. 사실 다른 mmlabs의 사용 과정과 비슷하며, 기본적으로 데이터 셋 구조가 정리된 후에 실행이 가능할 수도 있습니다.

1. 맞춤 데이터 세트

저는 ImageNet의 데이터 형식을 사용합니다. 한편으로는 등록 메커니즘이 없는 것은 원본 코드를 기반으로 직접 수정하는 것이 더 편리합니다. 덜 문제에 직면해야 할 수도 있습니다.

1. mmcls의 imagenet 데이터 형식

전체 트리 구조는 다음과 같습니다.
—data
|----meta
|——|—train.txt
|——|—val.txt
|——|—test.txt
|——train
|——|—class1
|————|—01.jpg
|————|—02.jpg
|———|—…
|——|—class2
|————|—01.jpg
|————| — 02.jpg
|————|—…
|——테스트
|——|—클래스1
|————|—01.jpg
|————|—02.jpg
|————| —
… ——|—클래스2
|————|—01.jpg
|————|—02.jpg
|————|—…
|——발
|——|—클래스1
|—— ———| —01.jpg
|———|—02.jpg
|———|—…
|——|—class2
|————|—01.jpg
|————|—02 .jpg
|——— —|—…
그림과 같이:
여기에 이미지 설명 삽입

그 중 메타에 저장된 3개는 이미지 태그가 포함된 주소 디렉토리입니다:
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
즉: path + space + tag index
train, val, test 모두 이미지 형식 파일로 저장되어 있습니다 이미 해당 train.txt 및 기타 파일이 있는 경우, 즉, 이미 레이블 주소가 있는 경우 모든 이미지를 함께 넣을 수 있으며, 그렇지 않은 경우 각 범주에 대한 폴더를 만든 다음 해당 레이블을 생성합니다. 사용자 지정 데이터 세트를 사용하고 있으므로 다음과 같이 두 번째 방법을 사용합니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입


can과 cant train, val, test 3개의 폴더 총 2개의 레이블이 있고 데이터는 7:2:1로 나뉩니다.
구체적으로 일반폴더를 먼저 설정하고, 라벨 카테고리에 따라 폴더 아래에 폴더를 생성하고,
해당 사진 분할 코드를 저장해두겠습니다.

import os, random, shutil

##############################################################
## 分割数据集,首先将所有数据放在同一个文件夹下###################
def moveFile(fileDir, val_ratio, test_ration2):
    pathDir1 = os.listdir(fileDir)  # 取图片的原始路径
    filenumber = len(pathDir1)
    val_number = int(filenumber * val_ratio)  # 抽取验证集的数量
    test_number = int(filenumber * test_ratio)  # 抽取测试集的数量
    val_sample = random.sample(pathDir1, val_number)  # 随机选取val图片

    # 先抽取验证集图片
    for name1 in val_sample:
        shutil.move(os.path.join(fileDir, name1), os.path.join(valDir, name1))

    # 从剩余的图片中抽取测试集
    pathDir2 = os.listdir(fileDir)  # 取图片的原始路径
    test_sample = random.sample(pathDir2, test_number)  # 随机选取val图片
    for name2 in test_sample:
        shutil.move(os.path.join(fileDir, name2), os.path.join(testDir, name2))

    return


if __name__ == '__main__':
    ori_path = './data/space_all/train'  # 最开始train的文件夹路径
    test_Dir = './data/space_all/test'  # 移动到新的文件夹路径
    val_Dir = './data/space_all/val'  # 移动到新的文件夹路径
    val_ratio, test_ratio = 0.1, 0.2  # 抽取比例  ******自己改*******
    for firstPath in os.listdir(ori_path):
        fileDir = os.path.join(ori_path, firstPath)  # 原图片文件夹路径
        valDir = os.path.join(val_Dir, firstPath)  # val下子文件夹名字
        testDir = os.path.join(test_Dir, firstPath)  # test下子文件夹名字
        if not os.path.exists(valDir):  # 如果val下没有子文件夹,就创建
            os.makedirs(valDir)
        if not os.path.exists(testDir):  # 如果test下没有子文件夹,就创建
            os.makedirs(testDir)
        moveFile(fileDir, val_ratio, test_ratio)  # 从每个子类别开始逐个划分
    print("Successfully splited!")

다음 단계는 해당 txt 파일을 생성하는 것입니다.

## 制作标签,在此之前需要用上半部分代码划分好数据集

path='./data/space_all/train'


data_path = pathlib.Path(path)
all_images_path = list(data_path.glob('*/*'))
all_images_path = [str(path) for path in all_images_path]  # 所有图片路径名存入列表
random.shuffle(all_images_path)  # 打散

print(len(all_images_path))
# print(all_images_path)  # 打印前五个

# 开始制作标签
label_names = sorted(item.name for item in data_path.glob('*/') if item.is_dir())
print(label_names)  # 打印类别名  注:下一步是制作与类别名对应的标签
label_to_index = dict((name, index) for index, name in enumerate(label_names))

all_image_labels = [label_to_index[pathlib.Path(path).parent.name] for path in all_images_path]


for image, label in zip(all_images_path[:5], all_image_labels[:5]):
   print(image, '-----', label)

filename='./data/space_all/train.txt'     # ***这里也要记得改***

print(image + " " + str(label) + "\n")
with open(filename,'w') as f:
   for image,label in zip(all_images_path,all_image_labels):
       f.write(image+" "+str(label)+"\n")
print("\nAll images and labels have been written in  .txt!\n")

완료 후 데이터 준비가 완료됩니다.

둘, 훈련

mmcls를 사용하는 과정도 비교적 간단하며, 다른 mmlab 코드베이스를 사용하는 과정, 즉 config에서 해당 파일을 수정하는 과정과 동일합니다. 여기서는 resnet18_8xb32_in1k.py를 사용하고 있는데, 이 네이밍의 의미는 resnet18, 8 카드, batchsize32를 사용하고 데이터 세트는 imagenet1k입니다. 먼저 이 파일을 열 수 있습니다. configs/resnet/resnet18_8xb32_in1k.py 에
여기에 이미지 설명 삽입
꽤 많이 있습니다 . 사실 /base/datasets/imagenet_bs32.py 의 일부만 수정하면 파일의 이 부분을 볼 수 있습니다 . 여기에 이미지 설명 삽입
데이터에 해당하는 경로를 제외하고 다른 미세 조정을 하지 않으면 다른 것은 변경할 필요가 없습니다.
그런 다음 ImageNet 데이터 세트 레이블에 자신의 데이터 레이블을 추가해야 합니다. 물론 여기에서 새 데이터 레이블을 만들 수도 있습니다. 게으른 나머지 하지 않았습니다.
구체적인 작업은 다음과 같습니다.
mmcls/imagenet.py에서 자신의 레이블을 CLASS에 추가합니다. 여기에 이미지 설명 삽입
다른 레이블은 수정하지 마십시오.
그러면 훈련할 수 있습니다. 두 가지 방법이 있습니다. 하나는 직접 실행하는 것이지만 실행 중인 구성을 수정하는 것을 기억하고, 다른 하나는 터미널에 명령을 입력하는 것입니다. 저는 게을러서 첫 번째 것을 선택하기 때문에 매번 그렇게 많은 명령을 입력할 필요가 없습니다.
여기에 이미지 설명 삽입
여기에 이미지 설명 삽입
첫 번째 부분은 구성 파일을 지정하는 것이고 두 번째 부분은 작업 아카이브 폴더를 지정하는 것입니다. 그런 다음 실행할 수 있습니다. 지정된 폴더에 로그 파일, 체크포인트 파일 및 구성 파일이 생성되며 이 구성 파일에서 모델 학습 프로세스를 미세 조정할 수 있습니다.
특정 매개변수는 다른 기사에서 소개되었으므로 여기서는 자세히 설명하지 않겠습니다.여기에 이미지 설명 삽입
사실 이 파일은 이전 config 아래에 있는 4개의 파일을 자동으로 통합하는 시스템인데 다음에 실행할 때 다른 training configuration에 영향을 주지 않고 여기서 직접 수정할 수 있어 더 합리적일 것입니다. 경로 및 기타 기본 설정을 포함합니다. 그런 다음 실행 중인 구성을 설정할 때 이것을 구성으로 사용하십시오.

3. 검증

훈련 지표는 주로 acc-top1과 acc-top5이며, top-1은 가장 좋은 분류를 가진 것이고, top-5는 처음 5개의 무승부의 가장 좋은 분류입니다(그렇게 해야 하기 때문입니다). 학습 결과는 log.json 파일에 저장됩니다. 마지막으로 생성된 체크포인트 파일인 latest.pth를 사용하여 테스트 세트를 확인할 수 있습니다. 주로 사용하는 곳은 tools/test.py로 train과 동일하며 2가지 동작 모드가 있는데 여기서는 명령어를 직접 사용합니다.

python tools/test.py work_dir/resnet18_8xb32_in1k.py work_dir/latest.pth --metrics accuracy --metric-option topk=1

여기서 첫 번째 부분은 config 파일의 주소, 두 번째 부분은 사용된 체크포인트의 주소, 메트릭은 설정된 평가 기준, 정확도가 선택된 상태, topk=1은 acc-top1의 값입니다.

여기에 이미지 설명 삽입
결과를 json 파일로 출력할 수도 있습니다. 코드는 다음과 같습니다.

python tools/test.py work_dir/resnet18_8xb32_in1k.py work_dir/latest.pth --out result.json --out-items all

출력을 위해 선택할 수 있는 키워드는 동일하며 모두 출력합니다.

4. 시각화

기본 제공 분석 도구를 직접 사용하여 교육 로그를 시각화할 수 있습니다. 예를 들어 로그에서 top1 변경 사항을 시각화하기 위한 코드는 다음과 같습니다.

python tools/analysis_tools/analyze_logs.py plot_curve work_dir/20230214_153510.log.json --keys accuracy_top-1 --legend accuracy --out result.jpg

그 중 plot_curve는 곡선을 그리기 위한 것이고, key는 곡선을 그리기 위해 선택한 키로 다중일 수 있으며, legend는 범례, out은 저장된 파일의 이름이다.
여기에 이미지 설명 삽입

5. 예보

훈련된 모델을 사용하여 새로운 그림을 예측하려면 api를 직접 호출하면 됩니다.코드는 비교적 간단합니다.jupyter lab으로 직접 작성했습니다. 소스 코드를 직접 클릭하십시오. 사진을 게시하겠습니다.
여기에 이미지 설명 삽입

요약하다

사실 이것들은 docs 문서에 아주 명료하게 쓰여 있는데 많은 사람들이 너무 게을러서 읽지 못할 수도 있고 저도 마찬가지지만 인터넷에서 찾은 많은 튜토리얼이 불완전하다는 것을 알았기 때문에 천천히 읽을 수 밖에 없습니다 , 불완전한 곳이 있을지도 모릅니다 , 모두가 함께 교류하고 배울 수 있다고 말할 수 있습니다. mmlab에 대한 전반적인 느낌은 시작하면 정말 편리하고 사용하기 쉽다는 것입니다.

Supongo que te gusta

Origin blog.csdn.net/onepunch_k/article/details/129041676
Recomendado
Clasificación