天天看點

mmcv常用API介紹

文章目錄

  • ​​前言​​
  • ​​1、前置基礎知識​​
  • ​​1.1. 讀取圖像​​
  • ​​1.2. cv2和pil互相轉化​​
  • ​​1.3. 轉成pil進行可視化​​
  • ​​1.4. cv2和pil儲存圖像​​
  • ​​2、mmcv​​
  • ​​2.1. 變換圖像尺寸Resize​​
  • ​​2.2. 填充圖像​​
  • ​​2.3. 圖像左右翻轉變化​​
  • ​​總結​​

前言

 本篇主要對mmdet中經常使用mmcv某些API做介紹。

1、前置基礎知識

  mmcv中包含了大量圖像處理的函數,最常用到的兩個庫就是cv2和pillow。是以,對這兩個庫常用的API做下簡要介紹。

1.1. 讀取圖像

import cv2
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt

# h>w的圖像: (1133, 800, 3)
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000001.jpg'

img = cv2.imread(img_path)
h,w = img.shape[:2]
print('h:', h, 'w:',w)

img = Image.open(img_path)
w,h = img.size
print('w:', w, 'h:',h)      

 注意cv2傳回的是圖像的h和w,而pil傳回的是圖像的w和h!!

1.2. cv2和pil互相轉化

import cv2
import numpy as np
from PIL import Image
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# pil --> cv2
image = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)      

1.3. 轉成pil進行可視化

 一般在IDE中進行編碼,是以轉成PIL更加友善可視化,貼下可視化pil圖像代碼:

from PIL import Image
import matplotlib.pyplot as plt

img = open(img_path)
plt.imshow(img)
plt.show()      

1.4. cv2和pil儲存圖像

  隻需注意儲存的是絕對路徑即可。

cv2.imwrite('abs_path', img) # img是經cv2.imread讀取的
img.save('abs_path')      # img 是經 Image.open()讀取的      

2、mmcv

 這裡貼下mmdet中常使用的資料集處理字段:

train_pipeline = [
    dict(type='LoadImageFromFile'),
    dict(type='LoadAnnotations', with_bbox=True),
    dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
    dict(type='RandomFlip', flip_ratio=0.5),
    dict(type='Normalize', **img_norm_cfg),
    dict(type='Pad', size_divisor=32),
    dict(type='DefaultFormatBundle'),
    dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]      

2.1. 變換圖像尺寸Resize

  分别選取了兩張h>w和w>h的圖像進行Resize變換,mmdet中變換操作就是讓比例較小的一邊變成指定的一邊,然後另一邊進行scale縮放。當然,變換完成後和原始圖像的h和w的大小順序不發生改變。

from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
from mmcv.image import imrescale

# h>w的圖像: (1133, 800, 3),可視化第一張圖像
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000001.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]

img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow(img)
plt.show()

# w>h的圖像 :(800, 1067, 3), 可視化第二張圖像
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000003.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]

img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

plt.imshow(img)
plt.show()      
mmcv常用API介紹
mmcv常用API介紹

2.2. 填充圖像

 在Resize基礎上, Pad操作就是填充寬和高讓其兩邊成為32的倍數。貼下總的代碼:

import cv2
from PIL import Image, ImageDraw
import matplotlib.pyplot as plt
from mmcv.image import imrescale

# h>w的圖像: (1133, 800, 3)
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000001.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]

img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow(img)
plt.show()

#pad
from mmcv.image import impad_to_multiple
import numpy as np
# pil --> cv2
image = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
pad_img = impad_to_multiple(image, divisor=32, pad_val= 0)
print(pad_img.shape)
pad_img = Image.fromarray(cv2.cvtColor(pad_img, cv2.COLOR_BGR2RGB))
plt.imshow(pad_img)
plt.show()


# w>h的圖像 :(800, 1067, 3)
img_path = '/home/wujian/mmdet-lap/data/coco/val2017/000003.jpg'
img = cv2.imread(img_path)
h,w = img.shape[:2]

img, new_scale = imrescale(img, scale=(1333,800), return_scale= True)
print(img.shape)
# cv2 --> pil
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

plt.imshow(img)
plt.show()

#pad
from mmcv.image import impad_to_multiple
import numpy as np
# pil --> cv2
image = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
pad_img = impad_to_multiple(image, divisor=32, pad_val= 0)
print(pad_img.shape)
pad_img = Image.fromarray(cv2.cvtColor(pad_img, cv2.COLOR_BGR2RGB))
plt.imshow(pad_img)
plt.show()      

2.3. 圖像左右翻轉變化

總結

繼續閱讀