[cv2] video 데이터

현재 동영상 데이터로 분류하는 작업 경진대회를 진행하고 있습니다.

영상증폭 경험은 있지만 경험이 없어서 영상증폭에 약간의 어려움이 있었습니다.

그러나 비디오는 연속적인 이미지의 연속이기 때문에 결국 이미지 확대와 거의 동일합니다.

def get_frames(path):
    cap = cv2.VideoCapture(path)
    frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    imgs = ()        
    for fidx in range(frames):
        _, img = cap.read()            
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        imgs.append(img)
    
    ret = {f"image{i}":imgs(i) for i in range(1, len(imgs))}
    ret('image') = imgs(0)
    return ret

def aug(transforms, images):
    res = transforms(**images)
    images = torch.zeros((len(images), 3,180, 320))
    images(0, :, :, :) = res("image")
    for i in range(1, len(images)):
        images(i, :, :, :) = res(f"image{i}")
    return images.permute(0,2,3,1), res

def video_save(frame, output_path , file_name , fps = 10):
    frame_array = ()
    size = 0
    for idx , img in enumerate(frame) : 
        height, width, _ = img.shape
        size = (width,height)
        frame_array.append(np.array(img).astype(np.uint8))
    
    out = cv2.VideoWriter(output_path +"/"+ file_name,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)
    for i in range(len(frame_array)):
        # writing to a image array
        out.write(frame_array(i))
    out.release()

==========================실제 run 블럭======================================
from tqdm import tqdm
from albumentations.pytorch.transforms import ToTensorV2
transforms = A.Compose((
    A.Resize(180,320, p = 1),
    A.ISONoise(p = 0.5),
    A.HorizontalFlip(p = 0.5),
    A.ImageCompression(p = 0.7 , quality_lower=80, quality_upper=100),
    A.ColorJitter(brightness = (0.4,0.7) ,p = 0.6),
    A.Affine( 
        scale  = (0.9,1.2),
        rotate = (-10,10),
        p = 0.8),  
    ToTensorV2(transpose_mask=True)
    ), p=1, additional_targets={f"image{i}":"image" for i in range(1, 50)}) # 

frames = get_frames("./train/TRAIN_0001.mp4")
frames,res = aug(transforms, frames)

output_path = "./new_train"

# 저장할 폴더 생성
if os.path.isdir(output_path):
    print("있음")
else:
    print('없음')
    os.mkdir(output_path)

for i in tqdm(list(df.video_path)):
    # 기존 영상 프레임 가져오기
    frames = get_frames(i)
    # 데이터 변화
    frames,res = aug(transforms, frames)

    # 저장
    video_save(frames, output_path ,"new1_"+i.split('/')(2) , fps = 10)

위의 코드는 기존 mp4 동영상을 앨범으로 변환하여 다시 저장하는 코드입니다.

1. cv2로 기존 mp4 비디오를 가져오고 이미지를 수집합니다.

– 위 코드에서 ret가 사전으로 생성된 이유는 균등하게 알부민을 적용하기 위한 기준이 필요하여 위와 같이 작성하였다.

2. 가져온 프레임 목록을 aug 함수에 삽입하고 albummentation에 지정된 변환을 수행합니다.

3. 모델에 삽입하고 여기에서 실행할 것이므로 ToTensorV2()를 사용하여 Tensor로 변경하면 HWC > CHW가 변경된다는 점에 유의해야 합니다.

4. cv2 videowriter를 선언하고 저장합니다.

쉽게 할 수 있습니다.