OpenMMLab 是香港中文大学-商汤科技联合实验室 MMLab 自 2018 年 10 月开源的一个计算机视觉领域的 AI 算法框架。其包含了众多计算机视觉多个方向的算法框架,本篇介绍 MMClassification 库,运行服务器 Ubuntu 18.04。
安装 MMClassification 的安装需要在一些基础库之上进行,如 pytorch,mmcv 等。假设显卡驱动、cuda、cudnn 等均已安装配置好,接下来就是安装 python 和一些包。我们这里采用 miniconda 来进行 python 安装和环境配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh chmod  +x miniconda.shbash ./miniconda.sh -b -p /opt/miniconda echo  "export MINICONDA_HOME=/opt/miniconda"  >> ~/.bashrcecho  "export PATH=$MINICONDA_HOME /bin:$PATH "  >> ~/.bashrcsource  ~/.bashrcconda create -n mm python=3.8 conda activate mm pip install torch==1.10.0+cu111 torchvision==0.11.0+cu111 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html pip install mmcv -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.10.0/index.html git clone  https://github.com/open-mmlab/mmclassification.git cd  mmclassificationpip install -e . 
打开 Python 命令提示符,输入如下内容,如果正常显示,说明 mmclassification 安装成功:
1 2 import  mmclsprint (mmcls.__version__)
使用 mmclassification 进行图片分类 安装成功后,在克隆的仓库里有源代码,里面包含了很多算法的配置信息。我们这里以 mobilenet-v2 为例,进行图片分类应用。
首先需要下载预训练好的模型,访问网址:mmclassification-model_zoo 
1 2 3 cd  mmclassificationmkdir  checkpointswget https://download.openmmlab.com/mmclassification/v0/mobilenet_v2/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth -P checkpoints 
其次,下载测试图片:
1 wget https://media-cldnry.s-nbcnews.com/image/upload/t_fit-760w,f_auto,q_auto:best/rockcms/2022-10/bananas-mc-221004-02-3ddd88.jpg -O demo/banana.jpg 
最后,进行图片类别预测(假设下面代码运行目录是 mmclassification):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 from  mmcls.apis import  inference_model, init_model, show_result_pyplotconfig_file = "configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py"  checkpoint_file = "checkpoints/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth"  device = "cuda:0"  model = init_model(config_file, checkpoint_file, device=device) img = "demo/banana.jpg"  result = inference_model(model, img) show_result_pyplot(model, img, result) 
使用 mmclassification 模型微调 现在我们模型框架、预训练模型都有了,只需要使用自己的数据集进行再次训练,使得模型能够更加准确的在我们自己数据上进行预测。microsoft-cats_dogs_dataset 
其次,将下载的数据保存并解压到 mmclassification/data 目录下:
1 unzip -q kagglecatsanddogs_5340.zip -d ./data/ 
然后,把数据按照 imagenet 的格式进行存放:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 path = "data/PetImages"  catPath = "data/PetImages/Cat"  dogPath = "data/PetImages/Dog"  for  x in  os.listdir(catPath):    if  x.split("." )[-1] != "jpg" :         print (x)         os.remove(os.path.join(catPath, x)) for  x in  os.listdir(dogPath):    if  x.split("." )[-1] != "jpg" :         print (x)         os.remove(os.path.join(dogPath, x)) for  root, dirs , files in  os.walk(path):    for  f in  files:         if  os.path.splitext(f)[1] == ".jpg" :             img_path = os.path.join(root, f)             try:                 img = cv2.imread(img_path)                 if  img is None:                                          print (img_path)                     os.remove(img_path)                 else :                                          cv2.imwrite(img_path, img)             except Exception as e:                 print ("Bad file:" , img_path) total = len(os.listdir(catPath)) train_num = int(total * 0.8) val_num = int(total * 0.1) test_num = total - train_num - val_num cats = sorted(os.listdir(catPath)) dogs = sorted(os.listdir(dogPath)) training_cat = "data/cats_dogs_dataset/training_set/training_set/cats"  training_dog = "data/cats_dogs_dataset/training_set/training_set/dogs"  val_cat = "data/cats_dogs_dataset/val_set/val_set/cats"  val_dog = "data/cats_dogs_dataset/val_set/val_set/dogs"  test_cat = "data/cats_dogs_dataset/test_set/test_set/cats"  test_dog = "data/cats_dogs_dataset/test_set/test_set/dogs"  for  p in  [training_cat, training_dog, val_cat, val_dog, test_cat, test_dog]:    os.makedirs(p) with open("data/cats_dogs_dataset/classes.txt" , "w" ) as f:     f.write("cats" )     f.write("\n" )     f.write("dogs" ) fval = open("data/cats_dogs_dataset/val.txt" , "w" ) ftest = open("data/cats_dogs_dataset/test.txt" , "w" ) for  i, (c, d) in  enumerate(zip(cats, dogs)):    c_path = os.path.join(catPath, c)     d_path = os.path.join(dogPath, d)     c_new = "cat."  + c     d_new = "dog."  + d     if  i < train_num:         shutil.copy(c_path, os.path.join(training_cat, c_new))         shutil.copy(d_path, os.path.join(training_dog, d_new))     elif  i < train_num + val_num:         shutil.copy(c_path, os.path.join(val_cat, c_new))         shutil.copy(d_path, os.path.join(val_dog, d_new))         fval.write(f"cats/{c_new} 0\n" )         fval.write(f"dogs/{d_new} 1\n" )     else :         shutil.copy(c_path, os.path.join(test_cat, c_new))         shutil.copy(d_path, os.path.join(test_dog, d_new))         ftest.write(f"cats/{c_new} 0\n" )         ftest.write(f"dogs/{d_new} 1\n" ) fval.close() ftest.close() 
再然后,生成配置文件:configs/mobilenet_v2/mobilenet-v2_cats_dogs.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 _base_ = [     '../_base_/models/mobilenet_v2_1x.py' ,     '../_base_/datasets/imagenet_bs32_pil_resize.py' ,     '../_base_/schedules/imagenet_bs256.py' ,     '../_base_/default_runtime.py'  ] model = dict (     head=dict (         num_classes=2 ,           topk=(1 ,),     ) ) dataset_type = 'ImageNet'  data = dict (     samples_per_gpu=32 ,     workers_per_gpu=1 ,     train=dict (         type =dataset_type,         data_prefix='/workspace/mmclassification/data/cats_dogs_dataset/training_set/training_set' ,           classes='/workspace/mmclassification/data/cats_dogs_dataset/classes.txt'      ),     val=dict (         data_prefix='/workspace/mmclassification/data/cats_dogs_dataset/val_set/val_set' ,         ann_file='/workspace/mmclassification/data/cats_dogs_dataset/val.txt' ,         classes='/workspace/mmclassification/data/cats_dogs_dataset/classes.txt'      ),     test=dict (                  data_prefix='/workspace/mmclassification/data/cats_dogs_dataset/test_set/test_set' ,         ann_file='/workspace/mmclassification/data/cats_dogs_dataset/test.txt' ,         classes='/workspace/mmclassification/data/cats_dogs_dataset/classes.txt'      ) ) evaluation = dict (metric_options={"topk" : (1 , )}) optimizer = dict (type ='SGD' , lr=0.01 , momentum=0.9 , weight_decay=0.0001 ) optimizer_config = dict (grad_clip=None ) lr_config = dict (policy='step' , step=[3 , 6 , 9 ]) runner = dict (type ='EpochBasedRunner' , max_epochs=12 ) load_from = "/workspace/mmclassification/checkpoints/mobilenet_v2_batch256_imagenet_20200708-3b2dc3af.pth"  
最后进行训练:
1 2 3 cd  mmclassificationpython tools/train.py configs/mobilenet_v2/mobilenet-v2_cats_dogs.py --work-dir work_dirs/mobilenet-v2 
训练后,新模型在猫狗数据上达到了更高的准确率。
参考文献 
open-mmlab/OpenMMLabCourse 图像分类与 MMClassification Yolov3模型框架darknet研究(九)解决Corrupt JPEG data问题