반응형

20200616_184947000_iOS.MOV. 프로젝트 개발 개요 

1. 프로젝트 개요 

시대와 기술의 발전에 따라 이 시대를 살아가는 현대인의 삶의 질은 점점 더 개선되고 있다. 많은 현대인은 기계나 컴퓨터 장치의 케어를 받으며 하루를 살아가고 있고 관련 기술들은 지속적으로 시장에 출시되고 있다. 이러한 기술들중 수면과 관련된 기술들(슬립테크, 스마트침대)은 지속적으로 출시되고 발전하고있지만 기상한 이후의 시간을 보다 편하게 관리해주는 기술들이 전무하다는 것을 알게 되었고 이 시간을 관리해주는 서비스에 대한 필요성에 대하여 생각해보았다. 하루중에 가장 힘들고 귀찮은 시간이 언제인가, 팀원들과 이야기를 나눠본 결과 팀원들 모두 아침에 일어나 출근, 등교를 준비하는 시간이 가장 힘들고 귀찮다고 생각하고 있었다. 이러한 논의의 결과로 기상부터 출근까지 시간을 관리해주는 서비스를 개발해보자 라는 생각을 하게 되었고 이를 프로젝트 주제로 선정하여 개발을 시작하게 되었다. 

  

2. 국내외 관련 현황  

부족한 모닝케어 관련 서비스 

 최근 수면산업이 급부상하면서 슬립테크가 주목을 받고 있다. 인공지능, 사물인터넷 빅데이터를 활용하여 수면 상태를 체크하고 숙면을 도와주는 제품과 기술들이 등장하고 있다. 대표적인 슬립테크 기술은 침구류에서 찾아볼 수 있다.  

이케아코리아는 편안함, 온도, 빛, 향, 소리 등 ‘굿 슬립(good sleep)’을 위한 다섯 가지 홈퍼니싱 요소를 소개하는 팝업스토어를 지난 8~9월 강남역에서 운영했다. 바디프랜드는 안마의자에 ‘수면 프로그램’을 적용했다. 부교감신경을 자극하는 마사지를 통해 교감신경을 억제하고 긴장된 몸을 이완시켜 숙면을 유도하는 시스템이다. 신세계백화점의 란제리 PB 상품인 ‘언컷’은 인견 파자마, 안대 등 숙면 관련 상품을 대표 상품으로 판매 중이다. LG U+IoT 숙면등은 사용자에게 무드 등으로 편안한 숙면을 제공하고 새소리나 음악으로 상쾌한 아침을 도와준다. 

하지만 사용자들의 수면 건강과 같은 슬립 테크 관련기술은 많지만 정작 수면 후 아침, 모닝 케어 기술은 LG U+ IoT 숙면등의 아침 알람 서비스 외에 찾아보기 힘들다. 

 

 

IoT 인프라의 확대와 성장 

한국IDC(https://www.idc.com/kr)는 최근 발간한국내 IoT 플랫폼 시장 전망 보고서 통해 2019년 국내 IoT 플랫폼 시장 규모는 전년 대비 19.5% 증가한 7,540억원에 이른다고 밝혔다. 해당 시장은 2023년까지 16.1%의 연평균성장률을 보이며 1조 3,308억원에 이를 것으로 내다봤다. 

보고서에 따르면 기업들이 IoT 플랫폼을 IoT 도입의 출발점으로 인식하면서 해당 시장의 성장에 기여하고 있는 것으로 보인다. 기업들이 적극적으로 디지털 트랜스포메이션을 가속화하고 IoT기술 생태계 내 플랫폼의 역할이 확대되면서 국내 IoT플랫폼 시장은 2023년까지 계속해서 두 자릿수의 성장세를 보일 것이라는 전망이다.  

 

이처럼 IoT 인프라는 연평균 22.6%씩 증가하고 있으며 점점 더 성장해 나갈 것으로 예상이 된다. 

 

 

 

1인 가구 증가 

KB금융경영연구소가 발표한 '2019 한국 1인가구 보고서'에 따르면 우리나라의 1인가구는 2017년 기준 약 562만 가구로, 전체 인구의 10.9%다. 

이는 기존 예상치인 556만 가구를 넘어서는 것으로, 1인가구 증가 추세가 이전보다 빨라졌음을 의미한다. 

한국의 총인구는 2028년 5천194만명을 정점으로 줄어들 것으로 예상되지만, 1인가구의 비율은 계속해서 성장해 2045년 16.3%에 이를 것으로 예상된다. 

보고서는 "미혼·이혼 인구의 증가 등 가구 형태의 변화를 이끄는 요인들이 작용하면서 1인가구는 계속 증가할 것"이라며 "1인가구의 생활 행태가 사회·경제 전반에 미치는 영향도 지속적으로 확대될 것"이라고 내다봤다. 

1인가구 비중의 증가는 전국적인 현상으로, 서울 등 9개 지방자치단체에서는 이미 30%를 넘었다. 

페이지 나누기 

. 프로젝트 개발 목표와 내용 

 

1. 구성 및 주제 선정 

주제선정 회의를 하기위해 팀 미팅을 중 팀원 모두가 아침시간이 힘들고 바쁘다고 공감을 하여 아침 관련 케어 서비스로 주제를 정하였다. 관련 현황과 특허를 조사하였고 구현하려는 아침 관련 서비스를 찾기는 힘들었다. 구현관련 기술을 조사하여 센서와 아두이노, 안드로이드 앱을 이용하여 구체적 구현을 생각하였다. 대략적인 구현 계획을 세운 후 각자 어떠한 업무를 담당할지에 대하여 논의하였고 본인자신있고 최대한의 역량을 이끌어 낼 수 있는 역할선택하여 각자 담당하기로 하였다. 

 

김우현, 정원영 - 어플리케이션 개발, 외부 API연동, 시연품 제작 

이창민, 김찬경 - 아두이노 센서 연동, 시연품과의 연동, 시연품 제작 

 

페이지 나누기 

2. 개발 목표 및 내용 

수면 기상부터 집을 나서기까지 해야 할 모든 일을 총괄해서 관리해주는 서비스를 구축한다. 

 

  1. 사용자가 어플리케이션에서 알람 시간을 설정하면 그 시간에 알람이 울림과 동시에 온수 보일러가 가동된다.  
  1. 침대의 압력센서가 사용자가 침대에 누워있는지를 감지하고 압력이 감지되지 않을 때까지 알람이 울리도록 설계하여 회사나 수업에 지각하는 일을 방지해준다.  
  1. 이런 과정동안 욕조에는 자동으로 데워진 물이 채워지고 일정한 수위가 넘어가면 수도꼭지가 잠겨 더 이상 욕조의 물이 넘치는 일을 방지한다.  
  1. 사용자가 씻는 과정을 마친 후에는 자동으로 화장실의 습도를 측정하여 일정 수준을 넘기면 환풍기가 작동하여 화장실의 습도를 조절해준다.  
  1. 출근 준비가 끝난 사용자는 어플리케이션을 실행하여 메인 화면을 통해 회사 지역의 시간별 날씨를 확인하고 대중교통의 다음 도착시간, 그날 아침의 뉴스 헤드라인을 한번에 확인할 수 있다.  
  1. 또한 오늘 챙겨야 할 물품들을 전날 미리 어플리케이션에 등록하는 과정을 통해 챙겨야 할 물품들을 다시한번 확인하여 준비물을 까먹고 그냥 출근하는 경우를 예방한다.  
  1. 사용자가 집을 나서기 전, 현관에 위치한 초음파 센서를 통해 사용자가 집을 나가는 것을 확인하면 집 안의 환풍기를 제외한 모든 센서와 조명등이 자동으로 꺼진다.  

 

 

이러한 일련의 과정을 통해 아침에 일어나 출근을 준비하는 과정이 매우 쾌적해질 것이다.    

 

페이지 나누기 

. 프로젝트 개발 환경, 추진 전략 및 계획 

1. 프로젝트 개발 환경 

 

               

 

프로젝트에 사용되는 기술로는 크게 애플리케이션, IoT이다. 이러한 기술을 구현하기 위해서 애플리케이션은 안드로이드 스튜디오를, IoT의 구현을 위해서 Arduino를 사용하였다. 

애플리케이션의 경우 사용자가 휴대폰으로 당일의 날씨, 교통정보, 뉴스를 한 화면에 볼 수 있도록 현을 하기로 하였으며 툴의 선택에 있어서 현재 한국에서 IoT분야에 많이 사용되는 안드로이드 운영체제에 맞추어 안드로이드 스튜디오를 선택하게 되었다. 안드로이드 스튜디오에서는 상기 설명된 요소들과 추가적으로 사용자가 시간을 시, 분 단위로 선택하여 알람을 설정할 수 있도록 구현하였으며 설정된 시간이 되면 애플리케이션에서 블루투스 모로 신호를 보내는 기능을 구현하였다. 

IoT의 경우 블루투스 모듈을 통해 신호를 수신 받을 경우 침대에 위치한 진동 센서와 압력센서를 사용하도록 했고 곧바로 보일러의 전원인 led센서와 수위 센서를 작동시키며 이후 초음파 센서를 통해 필요 센서 몇 가지를 제외한 모든 센서를 종료시키도록 하였다. 그리고 온습도 센서와 모터를 이용하여 환기 시스템도 구축하였다. 이렇게 아두이노에서는 블루투스 모듈, 압력 센서, 진동센서, LED, 초음파 센서, 물 수위센서, 온습도 센서, 모터를 이용하였으며 이 모두를 제어하기 위해 Arduino Uno대신 Mega를 택하였다 

페이지 나누기 

다음은 아두이노, 안드로이드 구현 코드이다. 

 

<Arduino>

 

<Arduino Serial Monitor> 

 

 

<안드로이드-activity_main.xml> 

 

 

<안드로이드-mainActivity.java> 

 

 

<안드로이드-XML파싱> 

 

 

 

페이지 나누기2. 프로젝트 개발 추진 전략 및 계획 

(1) 프로젝트 개발 추진 전략 

매주 팀의 진행상황과 진행해야 할 부분들을 파악하기 위해 전략 생성 

미리 milestone을 계획하여 큰 틀을 잡은 후 세부사항을 결정하는 것으로, 그 장점으로는 현재 상황을 객관적으로 판단이 가능하며 계획을 구체화하며 구현하는데에 있어 보다 쉽게 피드백이 가능하다는 점이 있다. 

 

프로젝트 효율을 위한 공동작업 환경 마련 & 개별 작업 

코로나-19의 영향을 받는 현 시국에 원활하고 의욕을 고취하기 위해 FaceTime과 OneDrive, GoogleDocs비대면 회의방식을 마련하였으며, 시연품 제작 전 각자 센서들을 연동, 각 파트를 테스트하였다. 시연품 제작과 테스트의 경우 대면이 불가피 하기 때문에 milestone에 따라 시연품 제작 주에 모여서 3일간 이동하지 않고 한 장소에서 작업을 마쳤다. 

 

 

 

 

 

페이지 나누기 

. 연구개발 추진일정 및 마일스톤 

1. 프로젝트 개발 세부 추진일정 

1주차(3월 3주차) : 팀원 구성, 역할 분담 

2주차(3월 4주차) : 역할 분담의 세분화 및 계획/일정 수립과 아이디어 후보 만들기, 개발 환경 설정 

3주차(4월 1주차) : 재료 신청 준비, 필요 기술 지식 습득 시작 

4주차(4월 2주차) : 아이디어 확정, 재료 신청, 기술/지식 공부 

5주차(4월 3주차) : 계획의 구체화, 필요 기술 습득 확인 및 복습, 재료 수령 

6주차(4월 4주차) : 필요 지식 습득 확인 및 기술 설계 

7주차(51주차) : 안드로이드 스튜디오 애플리케이션 제작 시작, api 사용연습 

8주차(5월 2주차) : api 설정 성공, 애플리케이션 오류 발견 

9주차(5월 3주차) : 시연품 프로토타입 제작 시작 

10주차(5월 4주차) : 애플리케이션 오류 해결, 시연품 제작 시작/완료 

11주차(6월 1주차) : 시연품 테스트, 앱과 시연품간의 연결 성공 

13주차(6월 2주차) : 발표 ppt 시연하여 마무리 

2. 마일스톤  

<short term> 

 

페이지 나누기<long term> 

 

먼저 프로젝트의 구현을 위해 분석단계부터 시작한다. 우리는 분석을 3단계로 나누어 각각 필요사항과 현황, 모듈, 환경 분석으로 지정했다. 

분석 단계에서는 현재 사람들이 어떤 서비스를 원하고 있는지 분석하고 결정하며, 팀에서 최종적으로 결정된 서비스와 유사한 서비스가 있는지 파악하며 유사한 서비스가 있다면 팀만의 차별적인 장점에 대해 구상하여 어떤 전략으로 잠재적 소비자들을 플랫폼으로 끌어당길 수 있는지 분석하고 설계 부분에서 적용시킬 것이다. 이러한 현황, 필요사항 분석과 더불어 개발시에 필요한 모듈과 환경에 대해 정리하고 분석하여 이를 기준으로 어떤 환경에서 웹/앱 플랫폼을 만들 것인지 결정한다. 

설계 단계에서는 계획한 플랫폼의 개발에 필요한 모든 요소들을 설계해 플랫폼의 뼈대를 잡는다. 우선 비즈니스 모델의 간단한 틀을 잡고 설계한 다음, 전체적인 플랫폼의 설계와 구상을 마치고 거시적, 미시적 모두를 만족하는 비즈니스 모델을 설계한다. 비즈니스 모델이 완성되면 사용자들이 거부감을 느끼지 못하고 친근성 있게 접근할 수 있도록 UI/UX 설계를 진행한다. 

개발이 모두 끝나면 최종적으로 테스트 단계에 들어가는데, 이 시점에서 전에 결정한 플랫폼의 유형에 따라 테스트를 하게 됩니다. 개발한 코드와 모듈을 모두 테스트해보고 문제가 발생하는 문제는 없는지, 발견하지 못하여 숨어 있는 오류는 없는지 등을 체크하여 결과를 분석한다. 테스트 결과를 분석하는 단계는 최종 테스트에 있어서 가장 중요한 부분이기 때문에 이 단계에서는 발견되는 오류는 없어야 하며 완벽해야 한다.  

결과 분석이 종료되면 마지막으로 최종테스트를 진행한다. 

테스트까지 끝난 후에는 최종 배포 단계에 접어드는데, 추후에 발견되는 여러가지 문제들을 처리하기 위한 유지/보수도 포함되는 단계이다.페이지 나누기 

. 프로젝트 개발 결과물 활용 계획 

1. 프로젝트 개발 결과물 활용 방안 

(1)  스마트 원룸 시스템 구축 

프로젝트를 구현하면서 만들어지는 작품은 스마트홈 시스템에 기반을 두고 있으며, 1인 가구를 목표로 하여 앞으로는 아파트나 주택 뿐만이 아닌 원룸형식의 주거지에도 스마트 홈이 추가될 것이라 전망하여 원룸 형식의 주거지를 목표로 하였다. 그러므로 시공 업체와 IT관련 아키텍트가 협력하여 작업할 수 있다면 앞으로 모든 스마트 원룸(홈) 시스템에는 해당 프로젝트가 도입될 것으로 예상된다. 각 주거지마다 해당 프로젝트를 추가하면 상기 목표와 같이 오전 준비시간에 있어서 기상부터 세면, 교통정보와 환기, 현관까지의 과정을 관리 받을 수 있다. 

(2)  시스템의 확장으로 종합적 시스템 구축 가능 

본 프로젝트에서는 오전의 준비시간 시스템에 관하여 집중을 했지만 차후 이를 다른 스마트 홈과 연계시키고 원룸 뿐만이 아닌 아파트나 주택 등의 여러 종류의 주거지에 적용 시킬 수 있게 프로젝트를 모듈화 할 수 있다.  

 

 시연영상 - 시연영상.MOV

<시연품> 

페이지 나누기 

. 위험요소 분석 

1. 예상되는 어려운 점 

(1) 집 마다 구조가 다르다!  

집 마다 중인 난방시스템(중앙난방, 개별난방), 구조, 크기가 다르기 때문에 통일된 모듈을 적용하기가 쉽지는 않을 것이라 예상된다. 이를 해결하기 위해 건설업계와 연계를 통해 그들의 노하우로 집의 구조마다 차별화된 모듈 적용방식을 채택하고 필요한 경우 간단한 공사를 통해 모듈을 적용할 수 있도록 한다. 

 

 (2) 지속적인 서비스 제공을 위한 유지보수 

구조, 크기가 다르기 때문에 통일된 모듈을 적용하기가 쉽지는 않을 것이라 예상된다. 이를 해결하기 위해 건설업계와 연계를 통해 그들의 노하우로 집의 구조마다 차별화된 모듈 적용방식을 채택하고 필요한 경우 간단한 공사를 통해 모듈을 적용할 수 있도록 한다. 

아무래도 여러가지 모듈과 기술들이 합쳐진 상태로 제공되는 기술이다 보니 장치 고장에 의한 서비스 제공 장애가 잦을 것이라 예상된다. 이러한 장치 고장을 최대한 빠르게 해결하기 위해 각 지역마다 최소 하나씩의 서비스 센터를 유지해야 할 것이고 시장점유율이 점점 커짐에 따라 서비스 센터의 개수를 늘려 서비스 제공에 지연이 없도록 해야 할 것이다.  

 

 

 

 

 

페이지 나누기 

2. 기술적 위험요소 분석  

(1) 보안 관련  

IoT 시스템은 집이라는 지극히 개인적인 공간이 네트워크와 연결되어 정보가 수집되고 제어되는 것을 뜻한다. 이는 데이터의 파괴와 변형, 정보의 도용이 나타날 수 있으며 개인의 사생활이 침해될 가능성을 내포하고 있시스템의 취약점을 파악하고 보안구축하는 것이 중요하다. 

각각의 IoT 센서들은 블루투스/와이파이 모듈 등을 통해 네트워크로 연결된다. 

센서로부터 정보가 생성되어 유저에게 넘어가 제어가 이루어지기까지 단계별로 암호화를 적용하여 정보를 보호해야 한다. 또한, 접근 권한을 설정하여 본인 인증이 완료된 경우에만 정보에 접근할 수 있도록 할 수 있다. 해당 보안 조치를 위해서 블록체인의 분산원장 기술을 이용함으로써 신뢰성 높은 시스템을 구축하는 것이 가능하다. 

 

다른 방법으로는 분산 처리능력을 갖춘 개방형 IT 아키텍처를 통해 모바일 컴퓨팅 및 IoT 기술을 가능하도록 하는 Edge Computing 기술을 이용할 수 있다. Edge Computing클라우드나 데이터 센터로 정보를 전송하지 않고, 단말기나 로컬 컴퓨터/서버 차원에서 정보를 처리한다. 이는 데이터를 저장하지 않고 직접 처리하므로 민감한 데이터의 보안을 강화한다는 이점을 가진다.  

 

 

페이지 나누기 

VII. 미팅 일지 

 

 

<아이디어 회의> 

 

<서비스 흐름도 제작> 

 

 

 

<센서 선정> 

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형

DSP MATLAB Project Report

Image Processing With GPU

 2020 12 18

 

 

I.    Project 개요

1.1 Project 개발 필요성

요즘 기본적으로 스마트폰을 사용하면서 카메라의 성능 및 스마트폰 자체적인 성능이 발전하여 자체적으로도 아래 사진과 같은 여러가지 필터를 줄 수 있게 되었다.

여러 수식을 이용하여 이미지를 이루고 있는 픽셀 행렬을 다른 값으로 바꾸어 이미지를 변형하는 것. 이것이 이미지 필터링의 정의이다.

이러한 이미지 필터링은 강의 시간에도 연습해 보았지만 주로 cpu를 사용하는것이었고, 이를 gpu를 주체로 사용하여 필터링하고, 다른 방법으로도 사진 파일에 대해 필터링을 하는 프로젝트를 하면 흥미로울 것이라 생각하여 시작하게 되었다.

 

1.2 Project 개발 배경 및 동향

처음 계획을 세우고 공부를 해보니 Mathworks에 위치한 예제들에서 큰 차이를 느끼지 못하였고 단순히 코드를 몇글자 수정하고 필터링 된 결과물들을 나열하는 것에서는 예제의 복사 붙여넣기가 된다고 판단하였다. 이를 해결하기 위해 자체적으로 색에 대해 필터링이 가능한 필터링 함수를 제작하고, UI를 변경하여 단순하게 정해진 사진의 나열이 아니라 사용자가 직접 원하는 사진 파일을 선택하여 필터링하도록 목표를 잡았다.이번학기 딥러닝 수업을 들으면서 이미지 분류 모델을 직접 만들어보았다. 따라서 이미지 품질향상에도 딥러닝을 적용한다면 기존 필터링보다 좋은 결과를 보여줄 것이라 생각하여 딥러닝 모델을 활용하여 이미지 품질 향상을 해보고자 하였다.gpu와 딥러닝을 사용하여 이미지 필터링을 하는 것으로 세부적인 내부 프로세스를 변경하게 되었다.

 

1.3 기본적인 동작 및 기능

필터링을 하고자 하는 이미지를 준비하고, 각각 원하는 필터링 방법에 대한 버튼을 눌러 이미지 파일을 입력받는다. 입력받은 이미지 파일을 MATLAB의 예제에 사용된 sharpenedequalized 필터링 처리하거나 RGB중 원하는 색상만을 표시해주는 필터링을 해주거나 gaussian 필터링 혹은 딥러닝 모듈을 이용한 필터링을 해주도록 만들었다.원본 이미지 파일과의 비교를 위해 원본 파일을 출력하면서 동시에 필터링 된 이미지 파일을 볼 수 있도록 구현하였다.

 

1.4 Project 개발 방법

참고자료로는 MathWorks 페이지의 필터링 기능을 하는 함수와 휘도 색차 구현 함수, 딥러닝 모델을 검색해 사용하였다.

현재 프로젝트는 gpu를 사용한 필터링인데 gpu를 사용하려면 CUDA api 모델이 필요하므로 amd 프로세서를 사용하는 팀원의 컴퓨터에서 호환되지 않는 문제가 발생하므로 호환성 문제를 개선해야 하며, 기여도에 있어서는 기존 함수를 찾아 직접 구현한 것이 대부분이지만, UI 제작과 HSV를 이용한 컬러 필터링 함수를 독자적으로 제작하였으며 딥러닝 모델을 사용하여 휘도값을 바탕으로 해상도를 높이려하였기 때문에 기여도는 50%라고 생각된다. 직접 딥러닝 모델을 개발하고자 하였으나, 데이터셋을 구하기 힘들고 컴퓨팅 성능이 부족하여 좋은 성능을 내기에 어려웠다. 따라서 미리 학습된 VDSR 신경망을 가져와 사용하였다.

II.   Project 수행 내용

2.1 알고리즘

만들고자 하는 프로젝트의 단순한 알고리즘은 다음과 같다.

기능을 크게 3가지로 나누고 각 버튼을 통해 해당 기능에 적용할 이미지를 선택하도록 한뒤,

이미지를 로드하여 gpuArray를 통해 이미지를 처리(Color 관련 filtering, Gaussian/adjust, 딥러닝)하게 된다.

딥러닝을 이용한 이미지 품질향상은 직접 모델을 개발하기엔 컴퓨팅자원과 시간이 부족하여 기존에 학습된 VDSR모델을 사용하였다. VDSR모델은 Accurate Image Super Resolution Using Very Deep Convolutional의 약자로 저해상도의 이미지와 고해상도의 이미지 사이의 매핑을 학습하여 저해상도의 이미지를 고해상도로 upscale시켜준다.

먼저 RGB의 이미지에서 휘도와 색차로 이미지를 나누고 그 중 휘도 이미지를 사용하여 학습을 한다.

여기서 rgb2ycbcr을 하여 RGB이미지를 휘도, 색차로 구분한 뒤 바로 휘도를 사용하지 않고 좀더 부드럽게 하기위해 쌈삼차보간법을 적용한 휘도를 모델의 입력값으로 사용한다.

쌍삼차보간법이 적용된 휘도이미지는 VDSR 네트워크를 통과한 뒤 쌍삼차보간법이 적용된 휘도이미지와 더해져 Super Resoluion 이미지를 생성한다. 생성된 이미지는 High Resolution 이미지와 Mean Squad Error 손실함수를 사용하여 loss를 비교하고 loss를 줄여나가도록 학습된다.

20개의 layer(image input layer +Convolution2D(padding ), ReLU +regression layer)로 구성이 된다. 그리고 각 Convolution2D layer3x3x64 필터를 64개 포함한다.

이미지 향상 딥러닝 모델을 구현하기엔 데이터 셋과 컴퓨팅 자원, 시간이 부족하였으므로 위와 같은 구조로 학습된 batchsize=64, epoch 100 “trainedVDSR-Epoch-100-ScaleFactors-234.mat” 모델을 가져와 사용하였다. (위 모델의 경우 학습시간이 Nvidia사의 Titan X로도 6시간이 걸린다.)

원하는 이미지를 불러와 imread로 읽은 후, rgb2ycbcr을 거쳐 bicubic시킨 y 이미지를 가져와 학습하고 ycbcr2rgb를 하여 향상된 이미지를 얻는다.

 

 

 

참고)

*휘도 = R, G ,B 픽셀 값의 일차 결합을 통해 각 픽셀의 밝기를 나타냄
*색차 = R, G, B 픽셀 값의 다른 일차 결합을 통해 색차 정보를 나타냄
*삼차보간법
삼차보간법은 3차함수를 이용하여 미지의 값을 추정하는 것이다. 삼차함수를 사용하기 때문에 더 부드러워진다. 미지의 값을 찾기 위해 위와 같은 식을 통하여 미지의 값을 추정한다.
쌍삼차보간법은 삼차보간법을 2차원으로 확장한 것인데, 삼차보간법에선 y-1 ,y0, , y1 , y2  이웃한 4개의 점을 참조하지만 쌍삼차보간법은 이웃한 16개의 점을 참조한다.

2.2 MATLAB 구현

우선적으로 app designer를 사용하여 색상 추출을 위한 컬러 필터 함수를 추가하였다.

이미지를 인수로 받아 HSV로 변환하고 계산(mask create)를 통해 분리한 뒤 다시 RGB로 변환시켜

원하는 색조를 추출하는 필터함수이다.

function I = colorfilter(app, image, range)
   % RGB to HSV conversion
   I = rgb2hsv(image);        
   % Normalization range between 0 and 1
   range = range./360;  
   % Mask creation
   if(size(range,1) > 1), error('Error. Range matriz has too many rows.'); end
   if(size(range,2) > 2), error('Error. Range matriz has too many columns.'); end
   if(range(1) > range(2))
   % Red hue case
   mask = (I(:,:,1)>range(1) & (I(:,:,1)<=1)) + (I(:,:,1)<range(2) & (I(:,:,1)>=0));
   else
   % Regular case
   mask = (I(:,:,1)>range(1)) & (I(:,:,1)<range(2));
   end
% Saturation is modified according to the mask
   I(:,:,2) = mask .* I(:,:,2);
   
   % HSV to RGB conversion
   I = hsv2rgb(I);
        end
    end

인자로 받는 범위의 경우 직접 색조를 찾아보면서 정확한 값을 찾아낼 수 있었고, 우리가 판단한 결과 빨간색의 범위는 320~50, 파란색 170~305, 초록색 50~170으로 대부분의 사진에서 색조를 구별하는데 성공하였다.

 이미지의 회색조 영상처리를 한 후 Gaussian 필터링과 medifilter를 사용하여 원본과 adjust, gaussian을 출력하도록 구현하였다.

 

%image enhancement Model Load%
            load('trainedVDSR-Epoch-100-ScaleFactors-234.mat');
dimage = original;
            dimage = im2double(dimage);
            [rows,cols,np] = size(dimage);
            %RGB이미지 색체, 휘도 분리
            ycbcr_image = rgb2ycbcr(dimage);
            y = ycbcr_image(:,:,1);% 휘도
            cb = ycbcr_image(:,:,2);% 색채
            cr = ycbcr_image(:,:,3);% 색채
            %삼차보간법을 거친 휘도,색채
            bicubiced_y = imresize(y,[rows cols],'bicubic'); % bicubiced 휘도
            bicubiced_cb = imresize(cb,[rows cols],'bicubic'); % bicubiced 색채
            bicubiced_cr = imresize(cr,[rows cols],'bicubic'); % bicubiced 색채
%휘도 이미지로 학습된 딥러닝 알고리즘
            dimage = activations(net,bicubiced_y,41);
            dimage = double(dimage);
%이미지를 다시 RGB이미지로
            Super_Resolution = bicubiced_y + dimage;
            vdsr_image = ycbcr2rgb(cat(3,Super_Resolution,bicubiced_cb,bicubiced_cr));

미리 학습된 100 epoch을 거친 VDSR모델을 사용하여 이미지 해상도를 높였다. 원하는 이미지를 불러와 imread로 읽은 후, rgb2ycbcr을 거쳐 bicubic시킨 y 이미지를 가져와 모델에 넣고 ycbcr2rgb를 하여 향상된 이미지를 얻는다.

2.3 입력 및 출력

입력 / 출력




 

 

III.  참여 인원별 역할 및 수행 소감

[정원영] -보고서 작성, GUI 구현, 컬러필터링 함수 구현

 강의시간에 배운 바를 바탕으로 필터링하는데는 문제가 없었지만 정작 하고나니 양도 없고 배워가는 것도 없는것 같아 직접 HSV를 이용한 필터링 함수를 만들어 보았고, 색채같은 부분에 있어어서 많은 애를 먹었다. 하지만 원뿔형 구조에 대한 이해와 많은 시행착오를 겪은 후 약간이나마 이해를 할 수 있었고 사용자가 원하는 색채만을 추출한 이미지 필터링을 구현하는데 성공하였다.

또한 다른 팀원의 버튼을 구성할 수 있다는 제시를 통해 당시까지 구현한 필터링을 버튼 이벤트와 연동할 수 있었으며 결과적으로는 상당히 깔끔한 바탕의 GUI를 갖춘 프로젝트를 만들 수 있었다.

비대면이기에 많은 난항도 겪었지만 이번 프로젝트를 통해 진행에 대한 노하우를 얻었기 때문에 만족스러웠다.

 

[이창민] -보고서 작성, GUI구현, VDSR모델을 이용한 이미지 품질 향상 코드 수정

매트랩 수업과 딥러닝 수업에서 배운 내용을 결합하여 과제를 해보게 되어 매트랩이 여러 분야와 융합되어 다양하게 사용할 수 있음을 깨달았다. 수업시간에 배운 여러 노이즈제거 방법들도 딥러닝 분야와 합쳐 적용된다면 기존 dsp에서 쉽게 향상될 것이라고 느꼈다. 하지만 직접 모델을 개발할 환경이 되지 않아 epoch batchsize등을 늘리는 등 직접 모델을 개발, 수정해보지 못해 아쉬웟다. 완성도를 위해 GUI를 처음 만들어보니 시행착오도 많고 어려움도 많이 겪었지만 이때까지 GUI관련 프로그래밍은 거의 해보질 않아 좋은 경험이었다.

 

 

IV.  Project 후기

 

매트랩을 처음하면서 완성도를 위해 GUI를 구현하는데 있어 시행착오가 많았다. 버튼 이벤트 처리 과정에서 에러가 많이 났으며, 이미지 불러오기 처리 과정에서 CUDA를 지원하지 않는 그래픽카드여서 gpuArray를 사용하는데 에러가 많았다.  CUDA만을 지원하여 다른 intel, AMD 계열의 openCL을 지원하는 함수가 있었다면 범용적으로 사용 할 수 있어 좋았을 것이다.하지만 이번학기 딥러닝 과목을 들으면서 배운 내용을 토대로 다른 과제를 수행해 볼 수 있어서 좋았다. 아쉬운 점은 충분한 데이터 셋을 구할 수 있었다면 기존 모델에서 epoch을 늘리던가 batchsize를 늘려 좀더 좋은 결과 가진 모델을 사용할 수 있었을 것이며, 보고서의 제한 페이지가 존재하여 알고리즘에 대한 설명과 코드에 대한 팀의 이해도를 제대로 서술되지 못한 것 같아 아쉬움이 남는다.

 

이번 프로젝트를 통해 MATLAB이 강력한 언어임을 느꼈고, 이를 제대로 사용하기 위해서는 실 사용자인 우리가 익숙해져야한다는 점을을 느꼈다. 다른 프로젝트를 수행한다면 이번의 경험을 발판삼아 잘 진행할 수 있을 것으로 예상된다.

 

 

V.    Appendix

classdef app3_exported < matlab.apps.AppBase
 
    % Properties that correspond to app components
    properties (Access = public)
        UIFigure                      matlab.ui.Figure
        UploadimageforColorfilterButton  matlab.ui.control.Button
        UploadimageforGaussianButton  matlab.ui.control.Button
        UploadimageforEnhancementButton  matlab.ui.control.Button
        Label                         matlab.ui.control.Label
        UIAxes1_1                     matlab.ui.control.UIAxes
        UIAxes1_2                     matlab.ui.control.UIAxes
        UIAxes1_3                     matlab.ui.control.UIAxes
        UIAxes1_4                     matlab.ui.control.UIAxes
        UIAxes1_5                     matlab.ui.control.UIAxes
        UIAxes1_6                     matlab.ui.control.UIAxes
        UIAxes1_7                     matlab.ui.control.UIAxes
        UIAxes1_8                     matlab.ui.control.UIAxes
        UIAxes1_9                     matlab.ui.control.UIAxes
        UIAxes2_1                     matlab.ui.control.UIAxes
        UIAxes2_2                     matlab.ui.control.UIAxes
        UIAxes2_3                     matlab.ui.control.UIAxes
        UIAxes3_1                     matlab.ui.control.UIAxes
        UIAxes3_2                     matlab.ui.control.UIAxes
    end
 
   
    methods (Access = private)
       
        % ----------------------------------------------------------------------- %
        %                        C O L O R    F I L T E R                         %
        % -------------------------------------------------------------%
         % 빨강 범위: 320~50(hsv )%
         % 파랑 범위: 170~305        %
         % 초록 범위: 050~170        %
 
 
        function I = colorfilter(app, image, range)
 
            % RGB to HSV conversion
            I = rgb2hsv(image);        
   
            % Normalization range between 0 and 1
            range = range./360;
   
            % Mask creation
            if(size(range,1) > 1), error('Error. Range matriz has too many rows.'); end
            if(size(range,2) > 2), error('Error. Range matriz has too many columns.'); end
 
            if(range(1) > range(2))
                % Red hue case
                mask = (I(:,:,1)>range(1) & (I(:,:,1)<=1)) + (I(:,:,1)<range(2) & (I(:,:,1)>=0));
            else
                % Regular case
                mask = (I(:,:,1)>range(1)) & (I(:,:,1)<range(2));
            end
   
            % Saturation is modified according to the mask
            I(:,:,2) = mask .* I(:,:,2);
   
            % HSV to RGB conversion
            I = hsv2rgb(I);
   
        end
    end
   
 
    % Callbacks that handle component events
    methods (Access = private)
 
        % Button pushed function: UploadimageforColorfilterButton
        function UploadimageforColorfilterButtonPushed(app, event)
            global filename;
            global filepath;
           
            [filename, filepath] = uigetfile({'*.png; *.bmp; *.jpg','supported imgaes';...
                                   '*.png', 'Portable Network Graphics(*.png)';...
                                   '*.bmp', 'Bitmap (*.bmp)';...
                                   '*.jpg', 'JPEG(*.jpg)';...
                                   '*.*','All files(*.*)'}, filepath);
 
           
            % Diverse Gpu image filtering by ÀÌâ¹Î, Á¤¿ø¿µ for matlab project%
 
            % Use gpu %
            image = gpuArray(imread([filepath, filename]));
            dimage = im2double(image);
           
            % Sharpened + Equalize %
            gradient = convn(dimage,ones(3)./9,'same') - convn(dimage,ones(5)./25,'same');
            amount = 5;
            sharpened = dimage + amount.*gradient;
            equalized = histeq(dimage);
 
            % no (R/G/B) series %
            redChannel = dimage(:, :, 1);
            greenChannel = dimage(:, :, 2);
            blueChannel = dimage(:, :, 3);
            nored = cat(3, greenChannel, greenChannel, blueChannel);    % cover from here
            nogreen = cat(3, redChannel, redChannel, blueChannel);
            noblue = cat(3, redChannel, greenChannel, redChannel);      % to here
            
 
            orf = colorfilter(app,dimage,[320 50]);     % red
            ogf = colorfilter(app, dimage,[50 170]);     % green
            obf = colorfilter(app, dimage,[170 305]);    % blue
 
            % Output %
            imshow(dimage, 'parent', app.UIAxes1_1);
            imshow(sharpened, 'parent', app.UIAxes1_2);
            imshow(equalized, 'parent', app.UIAxes1_3);
            imshow(nored, 'parent', app.UIAxes1_4);
            imshow(nogreen, 'parent', app.UIAxes1_5);
            imshow(noblue, 'parent', app.UIAxes1_6);
            imshow(orf, [], 'parent', app.UIAxes1_7);
            imshow(ogf, [], 'parent', app.UIAxes1_8);
            imshow(obf, [], 'parent', app.UIAxes1_9);
          
        end
 
        % Button pushed function: UploadimageforGaussianButton
        function UploadimageforGaussianButtonPushed(app, event)
            global filename;
            global filepath;
           
            [filename, filepath] = uigetfile({'*.png; *.bmp; *.jpg','supported imgaes';...
                                   '*.png', 'Portable Network Graphics(*.png)';...
                                   '*.bmp', 'Bitmap (*.bmp)';...
                                   '*.jpg', 'JPEG(*.jpg)';...
                                   '*.*','All files(*.*)'}, filepath);
 
           
            % Diverse Gpu image filtering by ÀÌâ¹Î, Á¤¿ø¿µ for matlab project%
 
            % Use gpu %
            image = gpuarray(imread([filepath, filename]));
            dimage = im2double(image);
           
            % Gaussian + filtering %
            grayed = mat2gray(image3);
            gau = imnoise(grayed, 'gaussian', 0,0.025);
            filtered = medfilt2(gau);
 
            adjim = imadjust(dimage);     %Adjust non colored photo%
 
           
 
            % Output %
            imshow(imresize(dimage3,1),'parent', app.UIAxes2_1);
            imshow(imresize(adjim,1),'parent', app.UIAxes2_2);
            imshow(imresize(filtered,1),'parent', app.UIAxes2_3);
         
        end
 
        % Button pushed function: UploadimageforEnhancementButton
        function UploadimageforEnhancementButtonPushed(app, event)
            global filename;
            global filepath;
           
            [filename, filepath] = uigetfile({'*.png; *.bmp; *.jpg','supported imgaes';...
                                   '*.png', 'Portable Network Graphics(*.png)';...
                                   '*.bmp', 'Bitmap (*.bmp)';...
                                   '*.jpg', 'JPEG(*.jpg)';...
                                   '*.*','All files(*.*)'}, filepath);
 
            original = imread(fullfile(filepath,filename));
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
            %image enhancement Model Load%
            load('trainedVDSR-Epoch-100-ScaleFactors-234.mat');
           
            dimage = original;
            dimage = im2double(dimage);
           
            [rows,cols,np] = size(dimage);
           
            %RGB이미지 색체, 휘도 분리
            ycbcr_image = rgb2ycbcr(dimage);
            y = ycbcr_image(:,:,1);% 휘도
            cb = ycbcr_image(:,:,2);% 색채
            cr = ycbcr_image(:,:,3);% 색채
           
            %삼차보간법을 거친 휘도,색채
            bicubiced_y = imresize(y,[rows cols],'bicubic'); % bicubiced 휘도
            bicubiced_cb = imresize(cb,[rows cols],'bicubic'); % bicubiced 색채
            bicubiced_cr = imresize(cr,[rows cols],'bicubic'); % bicubiced 색채
           
 
           
            %휘도 이미지로 학습된 딥러닝 알고리즘
            dimage = activations(net,bicubiced_y,41);
            dimage = double(dimage);
           
            %이미지를 다시 RGB이미지로
            Super_Resolution = bicubiced_y + dimage;
            vdsr_image = ycbcr2rgb(cat(3,Super_Resolution,bicubiced_cb,bicubiced_cr));
 
           
            imshow(original,'parent', app.UIAxes3_1)
            imshow(vdsr_image,'parent', app.UIAxes3_2)
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          
        end
    end
 
    % Component initialization
    methods (Access = private)
 
        % Create UIFigure and components
        function createComponents(app)
 
            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 506 674];
            app.UIFigure.Name = 'MATLAB App';
 
            % Create UploadimageforColorfilterButton
            app.UploadimageforColorfilterButton = uibutton(app.UIFigure, 'push');
            app.UploadimageforColorfilterButton.ButtonPushedFcn = createCallbackFcn(app, @UploadimageforColorfilterButtonPushed, true);
            app.UploadimageforColorfilterButton.Position = [14 641 163 25];
            app.UploadimageforColorfilterButton.Text = 'Upload image for Color filter';
 
            % Create UploadimageforGaussianButton
            app.UploadimageforGaussianButton = uibutton(app.UIFigure, 'push');
            app.UploadimageforGaussianButton.ButtonPushedFcn = createCallbackFcn(app, @UploadimageforGaussianButtonPushed, true);
            app.UploadimageforGaussianButton.Position = [14 284 164 22];
            app.UploadimageforGaussianButton.Text = 'Upload image for Gaussian ';
 
            % Create UploadimageforEnhancementButton
            app.UploadimageforEnhancementButton = uibutton(app.UIFigure, 'push');
            app.UploadimageforEnhancementButton.ButtonPushedFcn = createCallbackFcn(app, @UploadimageforEnhancementButtonPushed, true);
            app.UploadimageforEnhancementButton.Position = [16 135 182 22];
            app.UploadimageforEnhancementButton.Text = 'Upload image for Enhancement';
 
            % Create Label
            app.Label = uilabel(app.UIFigure);
            app.Label.Position = [-68 273 1 5];
 
            % Create UIAxes1_1
            app.UIAxes1_1 = uiaxes(app.UIFigure);
            title(app.UIAxes1_1, '¿øº»')
            app.UIAxes1_1.Position = [12 529 133 113];
 
            % Create UIAxes1_2
            app.UIAxes1_2 = uiaxes(app.UIFigure);
            title(app.UIAxes1_2, 'sharpened ')
            app.UIAxes1_2.Position = [176 529 133 113];
 
            % Create UIAxes1_3
            app.UIAxes1_3 = uiaxes(app.UIFigure);
            title(app.UIAxes1_3, 'Equalized')
            app.UIAxes1_3.Position = [353 529 133 113];
 
            % Create UIAxes1_4
            app.UIAxes1_4 = uiaxes(app.UIFigure);
            title(app.UIAxes1_4, 'red to green')
            app.UIAxes1_4.Position = [12 417 133 113];
 
            % Create UIAxes1_5
            app.UIAxes1_5 = uiaxes(app.UIFigure);
            title(app.UIAxes1_5, 'green to red')
            app.UIAxes1_5.Position = [176 417 133 113];
 
            % Create UIAxes1_6
            app.UIAxes1_6 = uiaxes(app.UIFigure);
            title(app.UIAxes1_6, 'blue to red')
            app.UIAxes1_6.Position = [353 417 133 113];
 
            % Create UIAxes1_7
            app.UIAxes1_7 = uiaxes(app.UIFigure);
            title(app.UIAxes1_7, '(filter)only red')
            app.UIAxes1_7.Position = [16 305 133 113];
 
            % Create UIAxes1_8
            app.UIAxes1_8 = uiaxes(app.UIFigure);
            title(app.UIAxes1_8, '(filter)only green')
            app.UIAxes1_8.Position = [176 305 133 113];
 
            % Create UIAxes1_9
            app.UIAxes1_9 = uiaxes(app.UIFigure);
            title(app.UIAxes1_9, '(filter)only blue')
            app.UIAxes1_9.Position = [353 305 133 113];
 
            % Create UIAxes2_1
            app.UIAxes2_1 = uiaxes(app.UIFigure);
            title(app.UIAxes2_1, '¿øº»')
            app.UIAxes2_1.Position = [12 156 133 113];
 
            % Create UIAxes2_2
            app.UIAxes2_2 = uiaxes(app.UIFigure);
            title(app.UIAxes2_2, 'Adjusted')
            app.UIAxes2_2.Position = [177 156 133 113];
 
            % Create UIAxes2_3
            app.UIAxes2_3 = uiaxes(app.UIFigure);
            title(app.UIAxes2_3, 'Gaussian + filtering')
            app.UIAxes2_3.Position = [353 156 133 113];
 
            % Create UIAxes3_1
            app.UIAxes3_1 = uiaxes(app.UIFigure);
            title(app.UIAxes3_1, '¿øº»')
            app.UIAxes3_1.Position = [29 11 133 113];
 
            % Create UIAxes3_2
            app.UIAxes3_2 = uiaxes(app.UIFigure);
            title(app.UIAxes3_2, 'Deep learning Enhancement')
            app.UIAxes3_2.Position = [197 11 133 113];
 
            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end
 
    % App creation and deletion
    methods (Access = public)
 
        % Construct app
        function app = app3_exported
 
            % Create UIFigure and components
            createComponents(app)
 
            % Register the app with App Designer
            registerApp(app, app.UIFigure)
 
            if nargout == 0
                clear app
            end
        end
 
        % Code that executes before app deletion
        function delete(app)
 
            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
end
 
 

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형

HTTP


웹은 HTTP를 이용해서 통신하는 클라이언트와 서버로 구성

 

HTTP 메시지 구조

 

요청 메시지 : 요청라인 - 헤더 - 공백 - 바디

Request line => 요청방식(method) - 요청페이지 - 프로토콜/버전 으로 구성

ex) GET /dir/page.html HTTP/1.1

(공백으로 정보 구분)

  • GET(메소드)
  • /dir/page.html (URL)
  • HTTP/1.1 (프로토콜:HTTP 버전:1.1)

헤더 : General Headers, Response Headers, Entity Headers

바디 : 응답 메시지(HTML)

 

 

 

응답 메시지 : 상태라인 - 헤더 - 공백 - 바디

Status line => 프로토콜/버전 - 응답상태코드 - 응답상태메시지 로 구성

ex) HTTP/1.1 200 OK

  • HTTP버전 1.1
  • 200(상태코드)
  • OK(응답이유)

헤더 : General Headers, Response Headers, Entity Headers

바디 : 응답 메시지(HTML)

 

 

** 요청방식(method)

  • GET : 자원요청(기본값), 요청 파라미터를 URL에 붙여서 전송 , 서버로부터 데이터 획득
GET /HTTP/1.1
Host: foo.com
  • POST : 자원 요청, 요청 파라미터를 Body에 붙여서 전송, 서버에 데이터 추가
POST / HTTP/1.1
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

say=Hi&to=Mom
  • HEAD : HTTP Header 정보만 요청
HEAD /index.html
  • PUT : URL 자원을 생성하도록 요청 (파일 업로드 가능), 서버에 데이터 갱신
PUT /new.html HTTP/1.1
Host: example.com
Content-type: text/html
Content-length: 16

<p>New File</p>
  • DELETE : URL 자원을 삭제하도록 요청 (파일 삭제 가능), 서버에 데이터 삭제
DELETE /file.html HTTP/1.1
  • TRACE : 진단 목적, 서버는 응답바디에 요청받은 자료와 동일한 내용 보냄
TRACE /index.html
  • OPTION : 응답 가능한 HTTP 메소드 요청

 

 

 

** RESTful API

http에는 여러 매소드가 있다.

하지만 REST는 CRUD(Create, Read, Update, Delete) 4가지 메소드만 사용한다.

create = post, read = get, update = put, delete =delete

 

 

 

HTTP 응답 상태 코드

1xx : 정보 제공

2xx : 요청 성공적

3xx : 요청한 자원이 다른곳에 있음

4xx : 요청에 문제있음

5xx : 서버에 에러있음


 

 

 

 

세션과 쿠키


HTTP 비연결지향 : 클라이언트-서버 연결 후 하나의 요청과 응답을 처리하고 연결 종료(응답이 끝나면 연결 종료)=> 클라이언트 정보가 서버에서 관리 되지 않음, 연결유지를 위한 리소스를 줄여 더 많은 연결을 가능하게 함, 연결/연결종료에 대한 오버헤드 발생

HTTP 무상태 프로토콜 : 연결을 종료하는 순간 클라이언트-서버 통신 끝, 클라이언트 상태 정보 유지안함(이전 통신 정보 모름)

따라서 쿠키와 세션이 필요

 

 

쿠키

- http 통신시 사용자 정보 유지하기 위해 사용

- 서버에서 생성하여 응답 헤더에 붙이고 클라이언트에 전송

- 쿠키는 요청을 전달할 때 이름=값 형식으로 요청 헤더에 포함되어 서버에 전달

  • 쿠키 제약사항 : 브라우저당 최대 300개, 호스트마다 20개 가능, 크기 4kb\

예시) 인터넷 쇼핑몰 장바구니, 로그인 페이지 ID/PW 자동저장

 

세션 쿠키 : 브라우저가 열려 있는 동안 유효한 쿠키, 서버 이용하는 동안 사용자 정보를 유지하기 위해

 

영속 쿠키 : 디스크에 유효기간 동안 저장되는 쿠키, 재방문시 정보를 기억하기 위해

 

 

쿠키 발행시 옵션 속성 지정 가능

  • Domain : 브라우저가 쿠키 값을 전송할 서버의 도메인 지정

cookie.setDomain("test.com");

  • Path : 브라우저가 쿠키 값을 전송할 URL 지정

cookie.setPath("/경로");

  • Expires : 쿠키 유효기간 설정

cookie.setMaxAge(값);

  • Secure : SSL 통신 채널 연결시에만 쿠키 전송하게 설정

cookie.setSecure(true);

  • HttpOnly : 자바 스크립트에서 쿠키값 읽지 못하게 설정

cookie.setHttpOnly(true);

 

 

세션

  • 클라이언트와 서버의 논리적인 연결
  • 일정 시간동안 같은 클라이언트로부터 송신되는 request를 하나의 상태로 인식하고 상태를 유지함.
  • 브라우저로 웹 서버 접속 후 브라우저 종료될때까지 연결이 유지되는 상태
  • 서버는 사용자 정보를 유지하기 위해(http를 사용하는 경우) 서버의 메모리에 브라우저별 세션 영역 할당
  • 각 영역은 세션 ID로 구분 => 세션 ID = 세션 토큰
  • 각 클라이언트마다 고유 ID 가짐, 서버에 저장하므로 쿠키보다 안전
  • 서버에 저장하므로 서버 저장공간 필요, 서버가 처리하므로 부하 발생

 

세션 ID를 클라이언트에 전달하는 방법

1. HTML 히든 필드 이용

  • 세션 ID를 HTML의 히든 필드로 클라이언트에 전달
  • 히든 필드이므로 웹페이지에서 안보임
  • 소스 보기를 통해 세션 ID값 추출 가능

 

 

2. URL rewriting을 이용

  • 클라이언트 브라우저가 쿠키 사용을 제한한 경우에 사용
  • 웹 서버에 서비스되는 페이지의 모든 URL에 세션 ID를 request parameter로 붙여 사용

https://dololak.tistory.com/579
https://dololak.tistory.com/579

 

3. 쿠키 이용

  • 클라이언트 브라우저가 쿠키 사용을 허용하는 경우

서버가 세션 ID를 생성 -> 쿠키에 저장 -> 헤더에 세션ID 저장하여 전달 -> 클라이언트 식별

 

 

 

세션을 이용한 클라이언트-서버 응답/요청

  • 클라이언트별 유일한 세션 ID 부여 => 클라이언트 식별
  • 클라이언트 첫 요청시 세션ID 생성, 전달
  • 두번째 요청부턴 세션 ID 사용

https://tansfil.tistory.com/58

  쿠키 서버
저장위치 클라이언트 서버
만료시점 쿠키저장시 설정 정확한 시점 모르
리소스 클라이언트 리소스 서버 리소스
용량제한 O X

 

 

 

 

 

정규식


  • 특정한 규칙을 가진 문자열 집합을 표현하는데 사용하는 형식 언어

ex)

String str = "abcdefghijk";

System.out.println(str.replaceAll("[abchij]", "굿"));

=> 정규표현식 "[abchij]"는 a,b,c,h,i,j를 개별적으로 의미함


 

 

 

 

인코딩 스키마


  • 문자 인코딩

문자들의 집합을 컴퓨터에서 저장 or 통신에 사용할 목적으로 부호화하는 방법 = 인코딩

웹 애플리케이션에서 사용되는 데이터들 => 네트워크 통해 여러 종류 시스템으로 전달됨

따라서 인코딩 스키마를 적용하여 안전하게 데이터 사용

 

  1. URL 인코딩

URL에 포함된 문자들이 안전하게 웹 서버에 전달 될 수 있도록 특수한 기능을 가진 메타 문자들을 브라우저가 인코딩해 전달 => 브라우저 특성에 따라 특수문자 표현 변형 오류 막기 위해

 

  1. HTML 인코딩

HTML문서에서 특별한 기능을 수행하는 문자들의 의미를 제거하고 일반적인 문자로 표시하기 위해 사용되는 인코딩 방식

 

  1. Base64 인코딩

모든 바이너리 데이터들을 출력 가능한 ASCII 문자들을 이용해 안전하게 나타내도록 하는 방식 => 이메일 첨부 파일을 인코딩해서 SMTP를 통해 안전하게 전송 or HTTP 승인을 사용하는 경우 사용자 인증서를 인코딩할때 사용

 

  1. 멀티바이트 인코딩

EUC-KR, MS949, 유니코드, UTF-8 등의 인코딩 방식

1~4바이트를 사용하여 다양한 문자를 표시

 

  1. MS 스크립트 인코딩

MS에서 제공하는 인코딩 기법으로 IE에서만 사용가능

 

예시들)

https://ande226.tistory.com/121


728x90
반응형
블로그 이미지

아상관없어

,
반응형

 

728x90
반응형

'공부 > 기타' 카테고리의 다른 글

DSP MATLAB Project - Image Processing With GPU  (0) 2022.04.26
웹 애플리케이션 기본지식  (0) 2021.05.20
대칭키로 평문 암,복호화 (대칭키 외부 저장)  (0) 2021.05.09
네이밍 컨벤션  (0) 2021.05.02
Github SourceTree  (0) 2020.09.03
블로그 이미지

아상관없어

,
반응형

암,복호화.pdf
0.73MB

대칭키k 평문 DES암호화 -> RSA공개키로 대칭키k 암호화 후 외부파일 저장 -> 대칭키k로 암호화된 평문 복구

 

<암호화된 대칭키 파일>

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형

카멜케이스

- CamelCase

 

lower 카멜케이스

- camelCase

 

스네이크케이스

- snake_case

 

파스칼케이스

- PascalCase

728x90
반응형
블로그 이미지

아상관없어

,

Github SourceTree

공부/기타 2020. 9. 3. 15:27
반응형

Commit = 스테이지에 올린 파일들을 묶고 스냅샷

Pull = 원격 저장소에 있는 모든 커밋 다운로드

Push = 로컬에서 원격으로 업로드 ( Commit시 로컬에 저장되므로 Push함)

Patch = 새로고침

Branch = 새로운 기능 추가할 때 사용, Branch 생성

Merge = 두 Branch를 합침

Stash = 작업 도중 브랜치 바꿈, 임시 저장공간 ( 신규 파일은 되지 않는다 = 변경사항이 없기 때문), 이전 commit 덮어씀

Git Flow

- master : 기준 브랜치

- develop : 개발 브랜치, 이 브랜치 기분으로 작업한 기능 merge함

- feature : 단위기능 개발 브랜치, 완료후 develop과 merge

- release : QA 품질검사

- hotfix : 배포후 버그가 생겼을때 긴급수정

 

 

ex)

1. master 브랜치에서 시작

2. 동일 브랜치 develop에 생성

3. develop에서 개발

4. 기능 구현 필요시 feature 브랜치로 각자 기능 구현후 develop과 merge

5. 모든 기능 완료시 develop 브랜치를 release 브랜치로 만들어버림

6. 모든 것이 완료되면 release 브랜치를 master와 develop브랜츠로 보냄

7. 버그 발생시 hotfix 브랜치를 만들어 수정

 

fork 하여 프로젝트 복사후, 각자 개발하여 fork한 원격 저장소에 push하고 메인 원격 저장소에 pull request함

 

1. github을 clone

2. add하여 스테이지에 올림

3. 커밋하여 변경사항 저장

4. 원격저장소에 push

 

728x90
반응형
블로그 이미지

아상관없어

,
반응형

글머리1(# _)

글머리2(## _)

글머리3(### _)

글머리4(#### _)

글머리5(##### _)

글머리6(###### _)

강조

italic = * a *, _ a _

*italic*

_italic_

굵은 글씨 = ** a **, __ a __

**굵은 글씨**

__굵은 글씨__

줄 긋기 = ~~ _ ~~

~~줄긋기~~

굵은글씨 italic = **_

**_굵은글씨 italic_**

인용구

앞에 > 붙임

인용구 테스트

숫자

숫자와 점을 이용

  1. 첫번째
    1. 세부1
    2. 세부2
  2. 두번째
  3. 세번째

목록

*, +, -

각각 순서대로

  • star
    • plus
      • minus

외부 링크

[] = 타이틀 () = 링크

[naver](https://naver.com)

수평선 줄



<hr/>

-연속

*연속

< hr/ >

이미지

[![Picture]()

]

코드 강조

`` 코드 묶기(역따옴표 씀)

글을 쓰다가 코드 강조시 `printf("hello world")`로 하면 된다.

코드 전체 삽입

` 3번 입력 후 사용언어 입력

b = 1; c = 1;

문법 연습.md
0.00MB

728x90
반응형
블로그 이미지

아상관없어

,
반응형

ECB_BMPFileEncryption.java ▼

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;

public class EcbMode {

     
    public static void main(String[] args) throws Exception{

    KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(new SecureRandom());
    SecretKey secretKey = kg.generateKey();

    FileInputStream inFile = new FileInputStream("c:/simpsons.bmp");

	
    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    FileOutputStream outFile = new FileOutputStream("ECB_simpsons.bmp");

    byte[] input = new byte[64];
    int bytesRead;
    while((bytesRead = inFile.read(input)) != -1){
        byte[] output = cipher.update(input,0,bytesRead);
        if(output != null)
            outFile.write(output);
    }

    byte[] output = cipher.doFinal();
    if(output != null)
        outFile.write(output);

    inFile.close();
    outFile.flush();
    outFile.close();
    }
}

KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); //DES알고리즘으로 키 생성 Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); //DES알고리즘, ECB(Electronic Code Block) Mode 암호화 방식, Padding

 

CBC_BMPFileEncryption.java▼

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;

public class CbcMode {

    
     // @param args the command line arguments
     
    public static void main(String[] args) throws Exception{
         //TODO code application logic here

	//키 발생기 kg 선언 DES형태
    KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(new SecureRandom());//랜덤값으로 키 초기화
    SecretKey secretKey = kg.generateKey();//비밀키 생성

    FileInputStream inFile = new FileInputStream("simpsons.bmp");
	//현재폴더에서 simpsons.bmp 불러옴
	
    Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");//DES알고리즘/ECB모드/패딩함
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    FileOutputStream outFile = new FileOutputStream("CBC_simpsons.bmp");

    byte[] input = new byte[64];
    int bytesRead;
    while((bytesRead = inFile.read(input)) != -1){
        byte[] output = cipher.update(input,0,bytesRead);
        if(output != null)
            outFile.write(output);
    }

    byte[] output = cipher.doFinal();
    if(output != null)
        outFile.write(output);

    inFile.close();
    outFile.flush();
    outFile.close();
    }
}

KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");

//DES알고리즘으로 키 생성

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

//DES알고리즘, CBC(Cipher Block Chaining) Mode 암호화 방식, Padding

 

CTR_BMPFileEncryption.java▼

import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;

public class CtrMode {

    
     // @param args the command line arguments
     
    public static void main(String[] args) throws Exception{
         //TODO code application logic here

	//키 발생기 kg 선언 DES형태
    KeyGenerator kg = KeyGenerator.getInstance("DES");
    kg.init(new SecureRandom());//랜덤값으로 키 초기화
    SecretKey secretKey = kg.generateKey();//비밀키 생성

    FileInputStream inFile = new FileInputStream("simpsons.bmp");
	//현재폴더에서 simpsons.bmp 불러옴
	
    Cipher cipher = Cipher.getInstance("DES/CTR/PKCS5Padding");//DES알고리즘/ECB모드/패딩함
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);

    FileOutputStream outFile = new FileOutputStream("CTR_simpsons.bmp");

    byte[] input = new byte[64];
    int bytesRead;
    while((bytesRead = inFile.read(input)) != -1){
        byte[] output = cipher.update(input,0,bytesRead);
        if(output != null)
            outFile.write(output);
    }

    byte[] output = cipher.doFinal();
    if(output != null)
        outFile.write(output);

    inFile.close();
    outFile.flush();
    outFile.close();
    }
}

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

//AES알고리즘으로 키 생성

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");

//AES알고리즘, CTR(Counter) mode 암호화 방식, Padding

여기서 같이 암호화된 헤더파일 부분을 수정해주면 볼 수 있게 된다

 

728x90
반응형
블로그 이미지

아상관없어

,