调试mmcls主要是让自己记住要改的几步,不然总是容易忘。
1.数据输入有两种,一种可以带ann_file形式,一种是不带,通常不带的,就直接取train文件下的几类做训练的,如果是带,形式上是一行图片名称,后面跟类别,
135efbeaeb592d3b51edca5dff099de6 1
这种形式是不可取的,要完整的文件名,否则要去修改一下,要记住mm系列中数据集和数据前处理是分离的,数据集是用来__getitem__和测评数据的,前处理是处理成模型想要的输入格式。格式不对,属于读取数据在loadImageFromFile(pipeline)中,我把图片后缀加上了.jpg。
def __call__(self, results):
if self.file_client is None:
self.file_client = mmcv.FileClient(**self.file_client_args)
if results['img_prefix'] is not None:
filename = osp.join(results['img_prefix'],
results['img_info']['filename']+".jpg")
else:
filename = results['img_info']['filename'] +".jpg"
img_bytes = self.file_client.get(filename)
img = mmcv.imfrombytes(img_bytes, flag=self.color_type)
if self.to_float32:
img = img.astype(np.float32)
results['filename'] = filename
results['ori_filename'] = results['img_info']['filename']
results['img'] = img
results['img_shape'] = img.shape
results['ori_shape'] = img.shape
num_channels = 1 if len(img.shape) < 3 else img.shape[2]
results['img_norm_cfg'] = dict(
mean=np.zeros(num_channels, dtype=np.float32),
std=np.ones(num_channels, dtype=np.float32),
to_rgb=False)
return results
这样有可能图片有问题,在dataset中__getitem__做这个修改,mmclassification-master/mmcls/datasets/base_dataset.py:
def __getitem__(self, idx):
try:
return self.prepare_data(idx)
except:
return self.__getitem__(np.random.randint(self.__len__()))
2.在imagenet中修改classes。
3.在config的model中修改classes。
4.在config中的dataset中修改数据的路径名称,samples_pre_gpu这些数据,通常1080ti上224的图片的bs大概在56-96之间,此外works指的是cpu的进程,通常取2.另外就是间隔保存,evluation的评估间隔等这些。
5.如果你是二分类,记得在model中更改topk=(1,),然后在mmclassification-master/mmcls/datasets/base_dataset.py中有两个固定的(1,5)要更改一下,这两个是写死的,如果类别不够5,会在评估时报错。