티스토리 뷰
728x90
현재 video data를 가지고 분류하는 테스크 대회를 진행하고 있다.
이미지 증량은 경험이 있지만, video의 증량은 경험이 전무하기에 조금 애 먹었다.
하지만, 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 영상을 albumentation으로 변환하여 다시금 저장하는 코드이다.
1. cv2로 기존 mp4영상을 가져와 이미지를 모은다.
-위 코드에서 딕셔너리로 ret를 만드는 이유는 밑에서 albumentation을 동일하게 적용하기 위한 기준이 필요하여 위와같이 작성하였다.
2. 가져온 프레임 list를 aug함수에 넣어 albumentation에서 지정해준 변환을 수행한다.
3.여기서, 모델에 넣고 돌릴예정이라, ToTensorV2()를 사용해 tensor로 바꿔줄때, HWC > CHW 로 바뀌는걸 인지하고 있어야 한다.
4. cv2 videowriter를 선언해주고, 저장해주면 끝.
간단하게 할 수 있다.
반응형
'적어놓으면 쓸모있는 코드' 카테고리의 다른 글
[Selenium] 0. Selenium 설치 (0) | 2023.11.29 |
---|---|
[python] 비동기 방식 asyncio 정리 - jupyter notebook (0) | 2023.10.09 |
github token 자동 로그인 (0) | 2022.09.09 |
파이캐럿에서 피쳐수가 자동으로 줄어들때 (0) | 2022.08.10 |
colab에서 xgboost가 안될 때 (0) | 2022.08.03 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 초보자
- 티스토리챌린지
- 디텍션
- 자바
- DeepLearning
- 깃
- 알고리즘
- 오블완
- 어탠션
- GNN
- YOLO
- YOLOv8
- 오류
- 뜯어보기
- github
- CNN
- 도커
- c3k2
- GIT
- python
- V11
- 욜로
- yolov11
- java
- 이미지
- docker
- 백준
- Tree
- 정리
- 딥러닝
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함