요번에 제가 공부한거는 영상 화질 개선 쪽 관심을 갖게되어

한번 공부 하고 다른곳에 접목 시켜봐야겟다라는 취지로 공부하게 되엇고

이 공부를 하면서 처음으로 난관이엇던게 다른 딥러닝 과정과 다르게 이미지 처리 과정인 전처리 과정에서 꽤 애먹엇습니다

왜냐면 patch 사이즈가 잇는데 그것에 조건이 맞아야 되고 그 patch가 과연 어떤 저화질인가 원본이가 등등 생각을 하면서

알게된게 원본사진을  저화질 사진을 만들고 그리고 이미지를 patch 사이즈만큼 크롭 합니다 그리고 그 크롭된 이미지 바탕으로 학습시키는 것엿습니다

전 optimizer를 SGD 모멘트를 사용하엿고 단순한 SRCNN모델 구조 9-1-5 과정을 하엿습니다

                    변환 >>>          





코드를 보시면


필요한 패키지들 import










학습데이터셋 정리



patch  정보




 이미지 정보 사진으로 출력해보기



데이터 전처리 과정






























torch 데이터셋을 만들기위한 과정





















# 모델 정의

























SRCNN(
  (layer1): Sequential(
    (0): Conv2d(3, 64, kernel_size=(9, 9), stride=(1, 1))
    (1): ReLU()
  )
  (layer2): Sequential(
    (0): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1))
    (1): ReLU()
  )
  (layer3): Sequential(
    (0): Conv2d(32, 3, kernel_size=(5, 5), stride=(1, 1))
  )
)


손실함수 optimizer 등 정리




Train 부분 학습하기













91 tensor(0.0007, grad_fn=<MeanBackward1>)
92 tensor(0.0007, grad_fn=<MeanBackward1>)
93 tensor(0.0007, grad_fn=<MeanBackward1>)
94 tensor(0.0007, grad_fn=<MeanBackward1>)
95 tensor(0.0007, grad_fn=<MeanBackward1>)
96 tensor(0.0007, grad_fn=<MeanBackward1>)
97 tensor(0.0007, grad_fn=<MeanBackward1>)
98 tensor(0.0007, grad_fn=<MeanBackward1>)
99 tensor(0.0007, grad_fn=<MeanBackward1>)


아무 사진이나 test 해보기
















원본 사진


원본사진을 저화질로 강제 변환


강제로 저화질로 된 사진을 고화질로 변환





만든 계기:

공부할 목적도잇고 이러한 비슷한 유형의 오픈소스도 많지만 저는 참고를 안하고 이 것을 생각하게 된 계기가 미션 임파셔블 영화를 보고 거기서 주인공 톰크루즈가 범인을 찾을때 범인 사진을 주고 그 길거리에서 범인 찾는것을 보고 아 만들어 보자 재미겟다 하고 프로젝트를 시행햇고 그결과 나름 괜찮은 모델이 만들어 졋으며, 길거리에서 나를 찾아주는것을 하고 싶지만 다른사람의 개인 정보 노출인것 같아서 해보지 못햇습니다 그렇지만 나중에 기회가 되면 한번 해보고 싶은 테스트 입니다

첫번째로는 제 얼굴 데이터를 가져오는게 첫번쨰 엿고

그리고 두번쨰로는 제 이미지와 다른 이미지 얼굴을 비교할 이미지엿습니다

이때 제가 이미지를 가져올때 사용한 모듈은 openCV이고 이것을 활용해서  제 이미지와 유투브에 볼수잇는 사람 얼굴 이미지를 가져왓습니다

이미지를 가져왓다는 기준에서 이미지를 전처리하고 학습하는 과정입니다

















이미지 파일을 저장한 파일 이름

이미지 파일을 가져 코드 입니다





















이미지를 가져오고 그 이미지를 ToTensor 화를 시켜 데이터셋으로 만듭니다






[[1, 'train', 'image//train\\train_img98.jpg'], [1, 'train', 'image//train\\train_img99.jpg']]
5636

이 데이터 셋을 DataLoader를 통해 데이터 로드화를 시킵니다



<torch.utils.data.dataloader.DataLoader object at 0x0000022480D08EB8>

model 만들기



























































모델을 불러오고 이게 이진 분류이기떄문에 cross Entropy를 사용하엿습니다 

옵티마이저는 SGD 를 사용하엿고요





























tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) tensor([1, 0, 1, 1, 0, 0, 1, 1, 0, 0]) 0 tensor([ 0.0280, -0.0438], grad_fn=<SelectBackward>) tensor(0.6926, grad_fn=<NllLossBackward>) tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) tensor([1, 0, 1, 1, 0, 1, 1, 0, 1, 1]) 3 tensor([ 0.0192, -0.0182], grad_fn=<SelectBackward>) tensor(0.6747, grad_fn=<NllLossBackward>) tensor([0, 0, 1, 0, 1, 1, 0, 0, 0, 0]) tensor([0, 0, 1, 0, 1, 1, 0, 0, 0, 0]) 6 tensor([ 0.1548, -0.1646], grad_fn=<SelectBackward>) tensor(0.6105, grad_fn=<NllLossBackward>) tensor([1, 1, 1, 0, 1, 0, 1, 1, 0, 1]) tensor([1, 1, 1, 0, 1, 0, 1, 1, 0, 1]) 9 tensor([-0.0842, 0.0758], grad_fn=<SelectBackward>) tensor(0.5047, grad_fn=<NllLossBackward>) tensor([0, 1, 0, 0, 1, 0, 1, 1, 0, 1]) tensor([0, 1, 0, 0, 1, 0, 1, 1, 0, 1]) 12 tensor([ 0.0621, -0.0692], grad_fn=<SelectBackward>) tensor(0.3295, grad_fn=<NllLossBackward>) tensor([0, 1, 0, 0, 0, 0, 1, 0, 1, 0]) tensor([0, 1, 0, 0, 0, 0, 1, 0, 1, 0]) 15 tensor([ 1.2586, -1.2573], grad_fn=<SelectBackward>) tensor(0.0666, grad_fn=<NllLossBackward>) tensor([0, 0, 0, 0, 1, 1, 0, 0, 0, 1]) tensor([0, 0, 0, 0, 1, 1, 0, 0, 0, 1]) 18 tensor([ 3.9662, -3.9760], grad_fn=<SelectBackward>) tensor(0.0190, grad_fn=<NllLossBackward>) tensor([1, 1, 1, 0, 0, 1, 1, 1, 1, 1]) tensor([1, 1, 1, 0, 0, 1, 1, 1, 0, 1]) 21 tensor([-4.7700, 4.5682], grad_fn=<SelectBackward>) tensor(0.1105, grad_fn=<NllLossBackward>) tensor([1, 0, 1, 0, 0, 0, 0, 1, 1, 1]) tensor([1, 0, 1, 0, 0, 0, 0, 1, 0, 1]) 24 tensor([-4.1996, 4.0406], grad_fn=<SelectBackward>) tensor(0.3424, grad_fn=<NllLossBackward>) tensor([0, 1, 0, 0, 1, 1, 1, 0, 0, 0]) tensor([0, 1, 0, 0, 1, 1, 0, 0, 0, 0]) 27 tensor([ 5.5803, -5.6217], grad_fn=<SelectBackward>) tensor(0.2072, grad_fn=<NllLossBackward>) tensor([0, 0, 1, 1, 1, 1, 0, 1, 0, 0]) tensor([0, 0, 1, 1, 1, 1, 0, 1, 0, 0]) 30 tensor([ 8.9125, -8.9570], grad_fn=<SelectBackward>) tensor(0.0434, grad_fn=<NllLossBackward>) tensor([1, 0, 0, 0, 0, 1, 0, 1, 1, 0]) tensor([1, 0, 0, 0, 0, 1, 0, 1, 1, 0]) 33 tensor([-2.5862, 2.4938], grad_fn=<SelectBackward>) tensor(0.0365, grad_fn=<NllLossBackward>) tensor([0, 1, 0, 1, 1, 1, 0, 1, 1, 1]) tensor([0, 1, 0, 1, 1, 1, 0, 1, 1, 1]) 36 tensor([ 5.4982, -5.4998], grad_fn=<SelectBackward>) tensor(0.0100, grad_fn=<NllLossBackward>) tensor([0, 0, 0, 0, 0, 0, 0, 1, 0, 0]) tensor([0, 0, 0, 0, 0, 0, 0, 1, 0, 0]) 39 tensor([ 6.5110, -6.5401], grad_fn=<SelectBackward>) tensor(0.0181, grad_fn=<NllLossBackward>) tensor([1, 1, 0, 1, 0, 1, 1, 0, 0, 0]) tensor([1, 1, 0, 1, 0, 1, 1, 0, 0, 0]) 42 tensor([-1.8054, 1.7288], grad_fn=<SelectBackward>) tensor(0.0623, grad_fn=<NllLossBackward>) tensor([0, 0, 1, 0, 1, 0, 0, 1, 1, 0]) tensor([0, 0, 1, 0, 1, 0, 0, 1, 1, 0]) 45 tensor([ 9.7148, -9.7983], grad_fn=<SelectBackward>) tensor(0.1400, grad_fn=<NllLossBackward>) tensor([0, 1, 0, 1, 0, 0, 0, 0, 1, 1]) tensor([0, 1, 0, 1, 0, 0, 0, 0, 1, 1]) 48 tensor([ 5.6560, -5.6685], grad_fn=<SelectBackward>) tensor(0.1142, grad_fn=<NllLossBackward>) tensor([1, 0, 1, 0, 1, 1, 0, 0, 0, 1]) tensor([1, 0, 1, 0, 1, 1, 0, 0, 0, 1]) 51 tensor([-3.2274, 3.1140], grad_fn=<SelectBackward>) tensor(0.0149, grad_fn=<NllLossBackward>) tensor([1, 1, 1, 1, 1, 1, 1, 0, 0, 0]) tensor([1, 1, 1, 1, 1, 1, 1, 0, 0, 0]) 54 tensor([-2.9067, 2.7908], grad_fn=<SelectBackward>) tensor(0.0314, grad_fn=<NllLossBackward>

C:\anaconda\envs\py36\lib\site-packages\torch\serialization.py:250: UserWarning: Couldn't retrieve source code for container of type Detect. It won't be checked for correctness upon loading.
  "type " + obj.__name__ + ". It won't be checked "

************************************************************************************************************** 0 tensor(0.9402) ************************************************************************************************************** tensor([1, 0, 1, 0, 1, 1, 0, 1, 0, 0]) tensor([1, 0, 1, 0, 1, 1, 0, 1, 0, 0]) 0 tensor([-4.0769, 3.9162], grad_fn=<SelectBackward>) tensor(0.0169, grad_fn=<NllLossBackward>) tensor([1, 0, 1, 0, 1, 0, 1, 1, 0, 0]) tensor([1, 0, 1, 0, 1, 0, 1, 1, 0, 0]) 3 tensor([-3.1147, 3.0043], grad_fn=<SelectBackward>) tensor(0.0201, grad_fn=<NllLossBackward>) tensor([0, 1, 1, 0, 1, 1, 0, 1, 0, 0]) tensor([0, 1, 1, 0, 1, 1, 0, 1, 0, 0]) 6 tensor([ 11.2800, -11.4009], grad_fn=<SelectBackward>) tensor(0.0050, grad_fn=<NllLossBackward>) tensor([1, 1, 1, 1, 1, 1, 0, 0, 0, 0]) tensor([1, 1, 1, 1, 1, 1, 0, 0, 0, 0]) 9 tensor([-3.1894, 3.0685], grad_fn=<SelectBackward>) tensor(0.0048, grad_fn=<NllLossBackward>) tensor([1, 1, 1, 1, 0, 0, 1, 0, 0, 0]) tensor([1, 1, 1, 1, 0, 0, 1, 0, 0, 0]) 12 tensor([-3.6513, 3.5146], grad_fn=<SelectBackward>) tensor(0.0027, grad_fn=<NllLossBackward>) tensor([0, 1, 1, 1, 0, 1, 1, 0, 1, 1]) tensor([0, 1, 1, 1, 0, 1, 1, 0, 1, 1]) 15 tensor([ 5.8190, -5.8288], grad_fn=<SelectBackward>) tensor(0.0011, grad_fn=<NllLossBackward>) tensor([0, 1, 0, 1, 0, 0, 1, 0, 0, 0]) tensor([0, 1, 0, 1, 0, 0, 1, 0, 0, 0]) 18 tensor([ 4.0300, -4.0859], grad_fn=<SelectBackward>) tensor(0.0059, grad_fn=<NllLossBackward>) tensor([0, 0, 1, 1, 0, 0, 0, 0, 1, 0]) tensor([0, 0, 1, 1, 0, 0, 0, 0, 1, 0]) 21 tensor([ 15.3868, -15.5231], grad_fn=<SelectBackward>) tensor(0.0003, grad_fn=<NllLossBackward>) tensor([0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) tensor([0, 0, 0, 0, 1, 1, 1, 1, 1, 1]) 24 tensor([ 3.4316, -3.4660], grad_fn=<SelectBackward>) tensor(0.0004, grad_fn=<NllLossBackward>) tensor([1, 0, 0, 1, 0, 1, 0, 0, 0, 0]) tensor([1, 0, 0, 1, 0, 1, 0, 0, 0, 0]) 27 tensor([-4.5901, 4.4397], grad_fn=<SelectBackward>) tensor(0.0002, grad_fn=<NllLossBackward>) tensor([0, 0, 1, 1, 0, 1, 1, 0, 0, 0]) tensor([0, 0, 1, 1, 0, 1, 1, 0, 0, 0]) 30 tensor([ 8.0189, -8.0658], grad_fn=<SelectBackward>) tensor(0.0011, grad_fn=<NllLossBackward>) tensor([1, 0, 0, 0, 0, 0, 1, 1, 1, 1]) tensor([1, 0, 0, 0, 0, 0, 1, 1, 1, 1]) 33 tensor([-4.3459, 4.2037], grad_fn=<SelectBackward>) tensor(0.0026, grad_fn=<NllLossBackward>) tensor([0, 0, 1, 1, 1, 0, 1, 1, 0, 1]) tensor([0, 0, 1, 1, 1, 0, 1, 1, 0, 1]) 36 tensor([ 9.0171, -9.0800], grad_fn=<SelectBackward>) tensor(0.0010, grad_fn=<NllLossBackward>) tensor([0, 0, 1, 0, 0, 0, 0, 1, 0, 0]) tensor([0, 0, 1, 0, 0, 0, 0, 1, 0, 0]) 39 tensor([ 10.2416, -10.3436], grad_fn=<SelectBackward>) tensor(0.0002, grad_fn=<NllLossBackward>) tensor([1, 1, 0, 0, 0, 0, 0, 1, 0, 0]) tensor([1, 1, 0, 0, 0, 0, 0, 1, 0, 0]) 42 tensor([-5.2891, 5.1190], grad_fn=<SelectBackward>) tensor(0.0709, grad_fn=<NllLossBackward>) tensor([1, 1, 0, 1, 0, 1, 1, 1, 1, 0]) tensor([1, 1, 0, 1, 0, 1, 1, 1, 1, 0]) 45 tensor([-5.0690, 4.9150], grad_fn=<SelectBackward>) tensor(0.0007, grad_fn=<NllLossBackward>) tensor([1, 1, 1, 1, 0, 0, 0, 1, 1, 0]) tensor([1, 1, 1, 1, 0, 0, 0, 1, 1, 0]) 48 tensor([-5.1015, 4.9344], grad_fn=<SelectBackward>) tensor(0.0023, grad_fn=<NllLossBackward>) tensor([1, 1, 1, 0, 1, 0, 0, 0, 0, 0]) tensor([1, 1, 1, 0, 1, 0, 0, 0, 0, 0]) 51 tensor([-4.4345, 4.2825], grad_fn=<SelectBackward>) tensor(0.0002, grad_fn=<NllLossBackward>) tensor([0, 1, 0, 0, 0, 0, 0, 0, 1, 0]) tensor([0, 1, 0, 0, 0, 0, 0, 0, 1, 0]) 54 tensor([ 6.1383, -6.2095], grad_fn=<SelectBackward>) tensor(0.0002, grad_fn=<NllLossBackward>) ************************************************************************************************************** 1 tensor(0.9989)




















































https://www.kaggle.com/thedownhill/art-images-drawings-painting-sculpture-engraving


이미지 데이터 :  https://www.kaggle.com/thedownhill/art-images-drawings-painting-sculpture-engraving

이미지 데이터를 가지고 Drawing/Painting/Sculptures/Engravings/Iconography 구별하기


첫번째. 필요한 모듈 가져오기



두번째, 파라미터 설정


셋번째, 폴더에 잇는 이미지 파일 torch화 하기





















# 이미지크기를 (120,120)으로 바꾸고 이미지값을 Normalize를 시키고 trainDataset으로 바꾼다









C:\anaconda\envs\py36\lib\site-packages\torchvision\transforms\transforms.py:188: UserWarning: The use of the transforms.Scale transform is deprecated, please use transforms.Resize instead.
  "please use transforms.Resize instead.")

7671

# 데이터 셋을 데이터 로더 형태로 변환해서 batch_size 만큰 데이터를 읽어들인다


<torch.utils.data.dataloader.DataLoader object at 0x000001B1FE41E9E8>

넷번째, 모델 생성


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





layer1.0.weight
layer1.0.bias
layer1.1.weight
layer1.1.bias
layer1.2.weight
layer1.2.bias
layer1.2.running_mean
layer1.2.running_var
layer1.2.num_batches_tracked
layer2.0.weight
layer2.0.bias
layer2.1.weight
layer2.1.bias
layer2.2.weight
layer2.2.bias
layer2.2.running_mean
layer2.2.running_var
layer2.2.num_batches_tracked
layer3.0.weight
layer3.0.bias
layer3.1.weight
layer3.1.bias
layer3.2.weight
layer3.2.bias
layer3.2.running_mean
layer3.2.running_var
layer3.2.num_batches_tracked
layer4.0.weight
layer4.0.bias
layer4.1.weight
layer4.1.bias
layer4.2.weight
layer4.2.bias
layer4.3.weight
layer4.3.bias
layer4.3.running_mean
layer4.3.running_var
layer4.3.num_batches_tracked
fc.0.weight
fc.0.bias
fc.2.weight
fc.2.bias
fc.4.weight
fc.4.bias
fc.6.weight
fc.6.bias

# 손실함수 optimizer 생성


다섯번째, 학습하기


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

0 Accursy : 46.74748992919922
1 Accursy : 67.48794555664062
2 Accursy : 75.1531753540039
3 Accursy : 79.03793334960938
4 Accursy : 81.81462860107422
5 Accursy : 83.47021484375
6 Accursy : 83.90040588378906
7 Accursy : 85.73849487304688
8 Accursy : 86.53369903564453
9 Accursy : 87.34193420410156
10 Accursy : 88.82804870605469
11 Accursy : 88.68465423583984
12 Accursy : 90.4706039428711
C:\anaconda\envs\py36\lib\site-packages\torch\serialization.py:250: UserWarning: Couldn't retrieve source code for container of type NNNNN1. It won't be checked for correctness upon loading.
  "type " + obj.__name__ + ". It won't be checked "

13 Accursy : 91.81332397460938 14 Accursy : 92.20440673828125 15 Accursy : 93.87303161621094 16 Accursy : 94.02946472167969 17 Accursy : 95.09842681884766 18 Accursy : 94.98109436035156 19 Accursy : 97.19723510742188 20 Accursy : 98.52691650390625 21 Accursy : 99.13961791992188 22 Accursy : 99.66105651855469 23 Accursy : 99.83053588867188 24 Accursy : 99.93482208251953 25 Accursy : 99.92178344726562 26 Accursy : 99.9869613647461 27 Accursy : 100.0 28 Accursy : 100.0

여섯번째, test 데이터 평가하기







850



<torch.utils.data.dataloader.DataLoader object at 0x000001B1FE41E9E8>


#이미지 데이터가 torch화 하면서 채널이 3이 아닌 애들이 발생하면 그 데이터를 제거 해줘야되기때문에 어느 데이터가 잘못되엇는지 확인하는 과정

2
3
4
5

# 평가하기


2
3
4
5
6
7
8
9
10
11
12

Accursy : 62.0







+ Recent posts