|
|
1. 8비트 훈련데이터 삽입시 오류 해결 ?
오류해결 ==> 훈련데이터를 24비트로 설정할 것.
2. 코드에 데이터 증식 옵션 추가
(1) 모든 증식 옵션 추가
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 | if augmentation == False: print("No Augmentation") else: if augmentation == True:#데이터 증식 augmentation = imgaug.augmenters.Sometimes(0.5, [ #Sometimes 0.5는 모든 경우의 50%에서 주어진 argmenters를 적용합니다. #imgaug.augmenters.Fliplr(0.5), #이미지의 50%를 가로로 뒤집기 #iaa.Flipud(0.5), # 이미지의 50%를 세로로 뒤집기 imgaug.augmenters.GaussianBlur(sigma=(0.0, 5.0)), ## 0에서 5.0의 시그마로 이미지를 흐리게 합니다. iaa.CropAndPad( #높이/너비의 -5%에서 10%까지 이미지 자르기 percent=(-0.05, 0.1), pad_mode=ia.ALL, pad_cval=(0, 255) ), iaa.Affine( scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, # 이미지를 축별로 개별적으로 크기의 80-120%로 조정 translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}, # -20에서 +20%까지 이동(축당) rotate=(-45, 45), # -45도에서 +45도까지 회전 shear=(-16, 16), # -16도에서 +16도까지 전단.... order=[0, 1], # use nearest neighbour or bilinear interpolation (fast) # 가장 가까운 이웃 또는 쌍선형 보간법 사용(빠름) cval=(0, 255), # if mode is constant, use a cval between 0 and 255 모드가 상수인 경우 0에서 255 사이의 cval을 사용 mode=ia.ALL #scikit-image의 워핑 모드 중 하나를 사용합니다(위에서 두 번째 이미지의 예 참조). ), iaa.Invert(0.05, per_channel=True), # 색상 채널 반전 iaa.Add((-10, 10), per_channel=0.5), #이미지 밝기 변경(원래 값의 -10에서 10까지) iaa.AddToHueAndSaturation((-20, 20)), #색조 및 채도 변경 iaa.SomeOf((0, 5),## 이미지당 다음(덜 중요한) 오그멘터를 0~5개 실행 ,그것들을 모두 실행하지 마십시오. 종종 너무 강력하기 때문 [ iaa.OneOf([ iaa.GaussianBlur((0, 3.0)), ## 0과 3.0 사이의 시그마로 이미지를 흐리게 합니다. iaa.AverageBlur(k=(2, 7)), # 커널 크기가 2에서 7 사이인 로컬 수단을 사용하여 이미지를 흐리게 합니다. iaa.MedianBlur(k=(3, 11)), # 커널 크기가 2에서 7 사이인 로컬 중앙값을 사용하여 이미지를 흐리게 합니다. ]), iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)), # sharpen images #iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)), # emboss images # search either for all edges or for directed edges모든 에지 또는 유향 에지 중 하나를 검색 # blend the result with the original image using a blobby mask 블러비 마스크를 사용하여 결과를 원본 이미지와 혼합 #iaa.SimplexNoiseAlpha(iaa.OneOf([ # iaa.EdgeDetect(alpha=(0.5, 1.0)), # iaa.DirectedEdgeDetect(alpha=(0.5, 1.0), direction=(0.0, 1.0)), #])), iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5), # add gaussian noise to images iaa.OneOf([ iaa.Dropout((0.01, 0.1), per_channel=0.5), # 임의로 최대 10%의 픽셀을 제거합니다. iaa.CoarseDropout((0.03, 0.15), size_percent=(0.02, 0.05), per_channel=0.2), ]), # # 전체 이미지의 밝기를 변경하거나(때로는 채널당) 또는 하위 영역의 밝기 변경 # either change the brightness of the whole image (sometimes # per channel) or change the brightness of subareas iaa.OneOf([ iaa.Multiply((0.5, 1.5), per_channel=0.5), iaa.FrequencyNoiseAlpha( exponent=(-4, 0), first=iaa.Multiply((0.5, 1.5), per_channel=True), second=iaa.ContrastNormalization((0.5, 2.0)) ) ]), iaa.ContrastNormalization((0.5, 2.0), per_channel=0.5), # # 대비를 개선 또는 악화 iaa.Grayscale(alpha=(0.0, 1.0)) ], random_order=True )]) print("Applying Default Augmentation on Dataset") else: augmentation = augmentation print("Applying Custom Augmentation on Dataset") | cs |
결과 ==> loss값이 높다가 nan이 나옴
loss값이 말도 안되게 높거나 nan이 나오는 이유 검색
제시된 원인
1. learningrate가 너무 높다
2. input data에 nan이 껴있다.
3. output size와 데이터가 불일치한다.
4. log(0)이 어디선가 수행되고 있다.
==>1,3,4의 원인은 아니고 증식코드 추가 후 증식된 input data에 nan값이 있는 것 같아서 증식 코드 수정함.
(2) 수정한 증식 코드
==> 이미지당 augment를 0~5개 실행에서==> 0~1개 실행하도록 수정함.
이 augment를 모두 실행하면 너무 강력하게 작동한다고 증식 augment 추가 할때 설명에 있었기 떄문에 줄여봄.
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 | if augmentation == False: print("No Augmentation") else: if augmentation == True:#데이터 증식 augmentation = imgaug.augmenters.Sometimes(0.5, [ #Sometimes 0.5는 모든 경우의 50%에서 주어진 argmenters를 적용합니다. #imgaug.augmenters.Fliplr(0.5), #이미지의 50%를 가로로 뒤집기 #iaa.Flipud(0.5), # 이미지의 50%를 세로로 뒤집기 imgaug.augmenters.GaussianBlur(sigma=(0.0, 5.0)), ## 0에서 5.0의 시그마로 이미지를 흐리게 합니다. iaa.CropAndPad( #높이/너비의 -5%에서 10%까지 이미지 자르기 percent=(-0.05, 0.1), pad_mode=ia.ALL, pad_cval=(0, 255) ), iaa.Affine( scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, # 이미지를 축별로 개별적으로 크기의 80-120%로 조정 translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}, # -20에서 +20%까지 이동(축당) rotate=(-45, 45), # -45도에서 +45도까지 회전 shear=(-16, 16), # -16도에서 +16도까지 전단.... order=[0, 1], # use nearest neighbour or bilinear interpolation (fast) # 가장 가까운 이웃 또는 쌍선형 보간법 사용(빠름) cval=(0, 255), # if mode is constant, use a cval between 0 and 255 모드가 상수인 경우 0에서 255 사이의 cval을 사용 mode=ia.ALL #scikit-image의 워핑 모드 중 하나를 사용합니다(위에서 두 번째 이미지의 예 참조). ), iaa.Invert(0.05, per_channel=True), # 색상 채널 반전 iaa.Add((-10, 10), per_channel=0.5), #이미지 밝기 변경(원래 값의 -10에서 10까지) iaa.AddToHueAndSaturation((-20, 20)), #색조 및 채도 변경 iaa.SomeOf((0, 1),## 이미지당 다음(덜 중요한) 오그멘터를 0~5개 실행 ,그것들을 모두 실행하지 마십시오. 종종 너무 강력하기 때문 [ iaa.OneOf([ iaa.GaussianBlur((0, 3.0)), ## 0과 3.0 사이의 시그마로 이미지를 흐리게 합니다. iaa.AverageBlur(k=(2, 7)), # 커널 크기가 2에서 7 사이인 로컬 수단을 사용하여 이미지를 흐리게 합니다. iaa.MedianBlur(k=(3, 11)), # 커널 크기가 2에서 7 사이인 로컬 중앙값을 사용하여 이미지를 흐리게 합니다. ]), iaa.Sharpen(alpha=(0, 1.0), lightness=(0.75, 1.5)), # sharpen images #iaa.Emboss(alpha=(0, 1.0), strength=(0, 2.0)), # emboss images # search either for all edges or for directed edges모든 에지 또는 유향 에지 중 하나를 검색 # blend the result with the original image using a blobby mask 블러비 마스크를 사용하여 결과를 원본 이미지와 혼합 #iaa.SimplexNoiseAlpha(iaa.OneOf([ # iaa.EdgeDetect(alpha=(0.5, 1.0)), # iaa.DirectedEdgeDetect(alpha=(0.5, 1.0), direction=(0.0, 1.0)), #])), iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5), # add gaussian noise to images iaa.OneOf([ iaa.Dropout((0.01, 0.1), per_channel=0.5), # 임의로 최대 10%의 픽셀을 제거합니다. iaa.CoarseDropout((0.03, 0.15), size_percent=(0.02, 0.05), per_channel=0.2), ]), # # 전체 이미지의 밝기를 변경하거나(때로는 채널당) 또는 하위 영역의 밝기 변경 # either change the brightness of the whole image (sometimes # per channel) or change the brightness of subareas iaa.OneOf([ iaa.Multiply((0.5, 1.5), per_channel=0.5), iaa.FrequencyNoiseAlpha( exponent=(-4, 0), first=iaa.Multiply((0.5, 1.5), per_channel=True), second=iaa.ContrastNormalization((0.5, 2.0)) ) ]), iaa.ContrastNormalization((0.5, 2.0), per_channel=0.5), # # 대비를 개선 또는 악화 iaa.Grayscale(alpha=(0.0, 1.0)) ], random_order=True )]) print("Applying Default Augmentation on Dataset") else: augmentation = augmentation print("Applying Custom Augmentation on Dataset") | cs |
iaa.SomeOf((0, 1),## 이미지당 다음(덜 중요한) 오그멘터를 0~1개 실행 ,그것들을 모두 실행하면 종종 너무 강력함.
결과
==> nan값은 나타나지 않음. 하지만 증가 옵션을 추가하기 전보다 높은 loss값이고 과적합되어 loss값이 2.8에서 더이상 떨어지지 않음을 확인
==>https://imgaug.readthedocs.io/en/latest/source/examples_basics.html
augment에 대해 더 조사해본 결과 내가 추가한 코드가 아직도 너무 강력하게 변형되어 증식되고 있음을 예측함
==>간단하고 일반적인 증식 옵션만을 사용하도록 코드를 수정함.
(3)간단하고 일반적인 증식 옵션만을 사용하여 증식 코드 수정
- 이미지에 크롭 및 어파인 변환을 적용하고 일부 이미지를 약간의 노이즈와 블러를 추가하고 대비와 밝기만을 변경함.
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 | if augmentation == False: print("No Augmentation") else: if augmentation == True:#데이터 증식 augmentation = iaa.Sequential([ #iaa.Fliplr(0.5), # horizontal flips iaa.Crop(percent=(0, 0.1)),# 무작위 자르기 # Small gaussian blur with random sigma between 0 and 0.5. # But we only blur about 50% of all images. # 0과 0.5 사이의 랜덤 시그마를 가진 작은 가우시안 블러. # 하지만 전체 이미지의 약 50%만 흐리게 처리합니다. iaa.Sometimes( 0.5, iaa.GaussianBlur(sigma=(0, 0.5)) ), # 각 이미지의 대비를 강화하거나 약화시킵니다. iaa.LinearContrast((0.75, 1.5)), # Add gaussian noise. # For 50% of all images, we sample the noise once per pixel. # For the other 50% of all images, we sample the noise per pixel AND # channel. This can change the color (not only brightness) of the # pixels. # 가우시안 노이즈를 추가합니다. # 모든 이미지의 50%에 대해 픽셀당 한 번 노이즈를 샘플링합니다. # 모든 이미지의 나머지 50%에 대해 픽셀당 노이즈를 샘플링하고 # 채널. 이것은 색상(밝기뿐만 아니라)을 변경할 수 있습니다. # 픽셀. iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5), # Make some images brighter and some darker. # In 20% of all cases, we sample the multiplier once per channel, # which can end up changing the color of the images. # 일부 이미지는 더 밝게, 일부는 더 어둡게 만듭니다. # 모든 경우의 20%에서 승수를 채널당 한 번 샘플링합니다. # 이미지의 색상을 변경할 수 있습니다. iaa.Multiply((0.8, 1.2), per_channel=0.2), # 각 이미지에 어파인 변환을 적용합니다. # 크기 조정/확대/축소, 변환/이동, 회전 및 깎기. iaa.Affine( scale={"x": (0.8, 1.2), "y": (0.8, 1.2)}, translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)}, rotate=(-25, 25), shear=(-8, 8) ) ], random_order=True) print("Applying Default Augmentation on Dataset") else: augmentation = augmentation print("Applying Custom Augmentation on Dataset") | cs |
==> 결과.
■증식 코드 (2)번과 (3)번 비교 결과
- 검증데이터는 val_rpn_class_loss값만 훈련데이터를 일반적으로 증식(3)했을때 loss값이 더 낮은 값을 가짐. 나머진 비슷 .
==>코드 (2)보다 일반적으로 증식한(3)이 Region Proposal Network가 백그라운드와 오브젝트를 잘 분리함.
나머지는 비슷.
■이미지 증식 옵션 추가하기 전(기본 코드)과 증식 옵션(2)와 비교
==> 기본 코드의 val_loss: 2.1(epoch=833) , 증식 옵션 추가 코드(2) val_loss: 2.8 (epoch=191)
,일반적인 증식 코드(3) val_loss: 2.9 (epoch=622)
==>증식 옵션을 더 추가했을 때(2)가 비슷한 epoch에서 val_loss값은 더 높지만 val_mrcnn_class_loss값만 조금 더 낮은 손실값을 가짐.
==>증식 옵션 추가 했을때(2)는 추가 안 했을 때(이전 게시물) 보다 검증데이터에서 마스크 RCNN이 객체의 각 클래스를 더 잘 인식함.
==>나머지는 더 못함 .
------------------------------------------------------------------------------
아직은 이미지 증식 코드를 추가하기전의 val_loss값의 성능이 더 좋은 결과를 보였음.
해볼 것
1.augment에 대한 추가적인 공부와 실습을 통해 최적의 augment를 찾아야함.
2.train데이터 수를 늘릴 예정
|
|

첫댓글 진짜 연구를 하고있네 포기하지말고 꼭 해결하길