프로그래밍 공부

전체 글 700

카테고리 설명
프로그래밍 공부하는 블로그
  • 거실 면적과 집 가격 사이의 선형회귀 가격정보의 관계를 측정하자. Living area(feet2) Price(1000$s) 2014 400 1600 330 2400 369 1416 232 3000 540 ... ... 2차 평면상에 마킹이 가능하다. 어떠한 임의의 값에 대한 출력값을 예측하는 기법 = 선형회귀 선형회귀 = 주어진 데이터로 부터 그 데이터를 가장 잘 표현할 수 있는 라인 한개를 찾는 것. 여기서 추정한 라인과 수집된 데이터 간의 오차가 크다 라면 옳은 라인이 아니다. 이런 2차원 방정식에서 직선 말고도 2차함수가 사용 될 수 있는데, 이러한 2차함수를 사용한 그래프를 Training Set : M개의 거실면적, 가격정보 쌍 y = $h_0 (x) $ : 피라미터 로 모델링 된 가설 함수 ..

  • 리눅스 시스템의 부팅 과정 바이오스 단계 PC의 전원 스위치를 켜서 부팅하면 제일 먼저 바이오스(BOIS, basic input/output system) 가 동작 바이오스는 PC에 장착된 기본적인 하드웨어(키보드,디스크 등)의 상태를 확인한 후 부팅 장치를 선택하여 부팅디스크의 첫 섹터에서 512 바이트를 로딩 512 바이트가 마스터 부트 레코드(master boot record, MBR): 2차 부팅 프로그램(부트 로더) 의 위치에 저장 부트 로더 단계 바이오스 단계에서 MBR은 부트로더를 찾아 메모리에 로딩 부트 로더는 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공 부트 로더는 리눅스 커널을 메모리에 로딩 리눅스 커널은 /boot 디렉터리 아래에 vmlinuz-버전명 의 형태..

  • 분류기 구현 ( Classifier ) 구현 특징 추출을 분류하기 위해 선, 평면, 또는 초평면 방정식의 피라미터를 추정하는 과정 대표적인 방법 : Logistic Regression, Neural Networks, SVM 피쳐백터 간의 구분지을 수 있는 라인을 찾는 것. 2차원 공간 상 에서는 하나의 선 을 찾는것. 3차원 공간상 , N차원 공간 상에서는 원하는 하나의 공간 또는 면을 찾게된다. 분류기 구현 단계 구현 과정 데이터를 훈련집합, 테스트 집합으로 분류한다. 일반적으로 5:5 또는 7:3 정도의 비율로 나눈다. 훈련집합 : 분류기를 만들때에 사용, 테스트 집합 : 분류기를 만들고 난 후 성능 평가에 사용. 분류기의 종류 모델 선택 : 어떤 수학적 모델을 사용할 것 인지 결정. ( 선형, 비선..

  • 프로세스를 생성하고 종료하는 시스템 호출/표준 라이브러리 함수 함수 의미 fork 자신과 완전히 동일한 프로세스를 생성한다. exec계열 지정한 실행 파일로부터 프로세스를 생성한다. exit 종료에 따른 상태값을 부모 프로세스에게 전달하며 프로세르를 종료한다. atexit exit로 프로세스를 종료할 때 수행할 함수를 등록한다. _exit atexit로 등록한 함수를 호출하지 않고 프로세스를 종료한다. 프로세스 생성 함수 #include #include #incldue void cleanupaction(void); main() { // 프로세스 식별번호 저장 pid_t pid; int i; for(i=0; i0) { for( ; i

  • MICCAI 에서 2015년도에 만들어진 논문. 이미지 학습 알고리즘의 기본적인 논문임. 의료 영상쪽 이미지 세그먼테이션을 위해 만들어짐 세그먼테이션 배경 내의 이미지 인식법에 대해서는 다양한 유형이 있음. Singl object 하나의 이미지 안에 하나의 객체만 존재 할 때 Classification = 고양이가 있다면 고양이가 있는 이미지 라고. 하나의 이미지로 분류 하는것 Classification + Localization = 고양이가 있는 이미지라고 분류하고, 이미지 내부의 고양이 위치까지 표현하는것 Localization = 지역화 라는 의미가 있음. 무언가 있는 지역 이라고 해석하면 된다. Multible objects 하나의 이미지 안에 여러개의 객체가 존재 할 때 Object Detect..

  • 샤프닝 필터 = 이미지를 선명하게 하고 싶을때 사용하는 필터. Finds edges or ehances details in an image [ 이미지 내부에서 밝기가 급격하게 변화되는 영역을 찾아냄 ]( 태두리 확인 ) 밝기가 동일한 영역 : 평탄한 영역 (Flat areas) 이미지의 평탄한 영역은 밑과 같다. 위 이미지의 중간부분 밝기가 급격하게 변하는 부분, 쉽게 말하면, 밑을 0 위를 1 이라고 하였을 떄, 0과 1 사이를 엣지 [ Edge ] 라고 한다. Model of a ramp digtal edge 모든 이미지가 딱딱 나누어지는 것이 아니다, 이러한 나누어 지지 않는 이미지의 중간부분을 Ramp 라고 한다. 이러한 렘프나 엣지의 밝기의 변화구간을 검출(Detection) 하는 방법 이웃하는..

작성일
2022. 11. 13. 02:00
작성자
WDmil
728x90

거실 면적과 집 가격 사이의 선형회귀 가격정보의 관계를 측정하자.

Living area(feet2) Price(1000$s)
2014 400
1600 330
2400 369
1416 232
3000 540
... ...

2차 평면상에 마킹이 가능하다.

어떠한 임의의 값에 대한 출력값을 예측하는 기법 = 선형회귀

 

선형회귀 = 주어진 데이터로 부터 그 데이터를 가장 잘 표현할 수 있는 라인 한개를 찾는 것.

여기서 추정한 라인과 수집된 데이터 간의 오차가 크다 라면 옳은 라인이 아니다.

 

이런 2차원 방정식에서 직선 말고도 2차함수가 사용 될 수 있는데, 이러한 2차함수를 사용한 그래프를 

 

Training Set : M개의 거실면적, 가격정보 쌍

y = $h_0 (x) $ : 피라미터 로 모델링 된 가설 함수

Learning algorithm : 파라미터를 추정하는 기법

 

선형회귀에서의 각 집의 거실 면적 및 침대 수 에 대한 가격 정보 등

각 차원 벡터와 장소, 위치, 거실면적 등의 N개의 차원벡터가 존재한다.

각 특징 벡터가 4개의 특징벡터가 생성된다.

 

정리하자면, 선형회귀란.

입력 벡터 (연속데이터) 에 대하여 목표값 y를 예측하는것.

목표는 각 훈련 집합에 대한 y 가 h가 되도록하는 y = h(x) 를 찾는것.

 

손실함수 J(0) : 추정치와 측정치의 오차를 표현한 식. 크면 안좋다.

 

선형회귀와 로지스틱 회귀의 차이점.

선형회귀 = Y값을 카운팅 할 수 없다. 정해져있지 않다.

로지스틱 회귀 = Y값이 정해져있는 범위를 카운팅 할 수 있다.

 

선형회귀 에서는 위 방식의 알고리즘을 선형방정식으로 표현한다.

선형방정식 = [ 

직선방정식

평면방정식

초평면 방정식 등

]

728x90
작성일
2022. 11. 11. 21:29
작성자
WDmil
728x90

리눅스 시스템의 부팅 과정

바이오스 단계

  • PC의 전원 스위치를 켜서 부팅하면 제일 먼저 바이오스(BOIS, basic input/output system) 가 동작
  • 바이오스는 PC에 장착된 기본적인 하드웨어(키보드,디스크 등)의 상태를 확인한 후 부팅 장치를 선택하여 부팅디스크의 첫 섹터에서 512 바이트를 로딩
  • 512 바이트가 마스터 부트 레코드(master boot record, MBR): 2차 부팅 프로그램(부트 로더) 의 위치에 저장

부트 로더 단계

바이오스 단계에서 MBR은 부트로더를 찾아 메모리에 로딩

부트 로더는 여러 운영체제 중에서 부팅할 운영체제를 선택할 수 있도록 메뉴를 제공

  • 부트 로더는 리눅스 커널을 메모리에 로딩
  • 리눅스 커널은 /boot 디렉터리 아래에
    • vmlinuz-버전명 의 형태로 제공
  • 리눅스의 대표적인 부트 로더
    • GRUB 와 LILO

커널 초기화 단계

  • 커널은 가장 먼저 시스템에 연결된 메모리, 디스크, 키보드, 마우스 등 장치들을 검사
  • 장치 검사 등 기본적인 초기화 과정이 끝나면 커널은 fork를 사용하지 않고 생성되는 프로세스와 스레드 생성
  • 이 프로세스들은 메모리 관리 같은 커널의 여러가지 동작을 수행
  • 이들 프로세스는 일반적인 프로세스와 구분되도록 대괄호([])로 표시하며 주로 PID 번호가 낮게 배정된다.

init 실행 단계

  • init 실행 단계에 이르면 리눅스가 본격적으로 동작하기 시작
  • 기본적으로 메시지가 보이지 않도록 하고 대신에 부트 스플래시(boot splash)라고 하는 이미지를 출력
  • 부트 스플래시 화면이 진행 중일 때 ctrl + D 키를 누르면
  • 메시지가 출력되는 화면으로 전환

부팅 후 메시지 확인

부팅 시 출력된 메시지는 dmesg 명령이나 more /var/log/boot.log 명령으로 확인 가능.

1번 프로세스

  • 전통적으로 유닉스에서는 init 프로세스가 처음 생성된 프로세스로서 PID가 1번

로그인 프롬프트 출력

  • 마지막으로 그래픽 로그인 시스템인
  • GDM(GNOME display manager)을 동작시키고,
  • 로그인 프롬프트 출력함.(서버링)

init 프로세스

  • init 프로세스는 PID가 1번인 프로세스로 모든 프로세스의 조상 역활
  • 우분투는 자체적으로 개발한 upstart를 init대신 사용하는데, 다만 기존의 유닉스 및 리눅스 환경과의 호환을 위해 실행 파일 이름은 init를 유지
  • init의 동작 방식이 바뀜에 따라 전통적으로 init 프로세스와 관련된 설정 파일이었던 /etc/inittab 파일은 이제 우분투에서 사라졌다.

.init 프로세스와 스크립트 파일

  • 기존의 init와 새로운 upstart는 모두 프로세스를 실행하거나 종료하기 위해 스크립트 파일을 사용
  • /etc/init 디렉터리와 /etc/init.d 디렉터리에 같은 서비스에 대한 파일이 있다면 /etc/init 디렉터리의 스크립트 파일이 우선적으로 적용

upstart가 사용하는 작업 파일

upstart와 관련된 스크립트 파일은 /etc/init 디렉터리에 작업명.cinf 파일로 작성한다.

기존 init 프로세스

init 프로세스가 실행하는 스크립트 파일은 /etc/init.d 디렉터리에 위치한다.

 

upstart 스크립트를 시작하고 정지하기 (systemctl)

  • initctl [start|stop|restart|reload|status] 작업명
  • sudo [start|stop|restart|reload|status]작업명 

start, stop, restart, reload, status 명령은 모두 initctl 명령에 대한 심벌릭 링크 이다.

upstart 스크립트 시작하고 정지하기

sudo ufw status : 작업 상태 보기

systemctl [start|stop|restart|reload|status]

init 스크립트 시작하고 정지하기

sudo service 스크립트명 [start|stop|restart|status]

/etc/init.d/스크립트명 [start|stop|restart|status]

서비스 상태 보기 : service 스크립트 status

init 프로세스와 런레벨

  • init 프로세스에서 사용하던 런레벨(Run Level)의 개념에 대한 이해 필요.
  • init는 시스템의 단계를 일곱 개로 정의하여 구분하고 각 단계에 따라 셸 스크립트를 실행 하는데, 이 단계들을 런 레벨이라고 함
  • 기존 유닉스나 페도라와 달리 우분투의 런레벨은 기본 런레벨이 2번이다
유닉스의 런레벨
런레벨 의미 관련 스크립트의 위치
0 시스템 종료 /etc/rc0.d
1,S,s 단일 사용자 모드 etc/rc1.d
2 다중 사용자 모드(NFS를 실행하지 않음) etc/rc2.d
3 다중 사용자 모드(NFS 포함) etc/rc3.d
4 사용하지 않음(예비 번호) etc/rc4.d
5 시스템 종료(페라는 GUI 모드로 부팅) etc/rc5.d
6 시스템 재시작 etc/rc6.d
우분투의 런레벨
런레벨 의미 관련 스크립트의 위치
0 시스템 종료 /etc/rc0.d
1,S,s 단일 사용자 모드 /etc/rc1.d, /etc/rcS.d
2 그래피컬 다중 사용자 모드 + 네트워킹(기본 값) /etc/rc2.d
3 런레벨 2와 동일 /etc/rc3.d
4 /etc/rc4.d
5 /etc/rc5.d
6 시스템 재시작 /etc/rc6.d

init 프로세스와 런 레벨

런레벨 3, 4, 5번이 2번과 같으므로, rc2.d 디렉터리와 rc3.d, rc4.d, rc5.d 디렉터리의 내용이 모두 같음.

런레벨 별로 실행하는 스크립트 파일은 /etc/init.d 디렉터리에 있는 파일에 대한 심벌릭 링크 이다

런레벨 변경하기

  • init는 1번 프로세스의 이름이기도 하지만 init 프로세스의 런레벨을 바꾸는 명령어로도 사용
  • init을 명령으로 실행하면 실제로는 /sbin/telinit가 실행
  • init로 런레벨을 변경하기 위해서는 바꾸려는 런레벨을 숫자로 지정한다.

기본 런레벨 지정하기

  • 우분투에서 기본 런레벨은 /etc/init/rc-sysinit.conf 파일의 DEFAULT_RUNLEVEL 변수에 지정

현재 런레벨 확인하기 : reunlevel 명령

리눅스를 종료하는 방법

  • sutdown 명령을 사용한다.
  • halt 명령을 사용한다.
  • poweroff 명령을 사용한다.
  • 런레벨을 0이나 6으로 전환한다.
  • revoot 명령을 사용한다.
  • 전원을 끈다 -> 최후의 수단

shutdown 명령 사용하기

리눅스 시스템을 가장 정상적으로 종료하는 방법

shutdown 명령으로 시스템 즉시 종료하기

-h 옵션과 함께 현재 시간으로 지정

shoutdown 한다는 메시지 보내고 종료하기

  • 시스템을 종료할 때 shutdown 명령으로 메시지를 보낼 수 있음
  • 사용자들이 메시지를 받고 정리할 시간이 필요하므로 시간을 now로 지정하면 안 되고 특정 시간을 지정
  • 예 : 2분 후에 종료한다는 메시지 발송

shutdown 명령으로 시스템 재시작하기 : -r 옵션 사용

shutdown 명령 취소하기 : -c 옵션

앞의 3분 후 재시작 명령을 취소할 경우 메시지 출력

shutdown 메시지만 보내기 : -k 옵션

Write [user] message -> CTRL + C

런레벨 변경하기

런레벨을 0으로 바꾸면 시스템이 종료

재시작 하려면 런레벨을 6으로 변경

기타 시스템 종료 명령

  • 시스템을 종료하거나 재시작을 위해 사용할 수 있는 명령 : halt, pweroff, reboot
  • halt 와 poweroff는 reboot명령의 심벌릭 링크
  • halt, reboot, pweroff 명령은 /var/log/wtmp 파일에 시스템 종료 기록을 남기고 시스템을 종료하거나 재시작
  • 사용할 수 있는 옵션
    • -w : 실질적으로 재시작하거나 종료하지는 않지만 wtmp 파일에 기록을 남긴다
    • -f : 강제로 명령을 실행하며 shoutdown을 호출하지 않는다
    • -p : 시스템 전원을 끈다.

데몬 프로세스

데몬(daemon)

  • 리눅스의 백그라운드에서 동작하면서 특정한 서비스를 제공하는 프로세스
  • 리눅스 시스템에서 동작하는 각종 서비스를 제공하는 프로세스들이 바로 데몬

데몬의 동작 방식

  • 독자형(standalone)
    • 시스템의 백그라운드에서 서비스별로 항상 동작
    • 자주 호출되는 데몬이 아니라면 시스템의 자원을 낭비할 우려
  • 수퍼 데몬에 의한 동작 방식
    • 평소에는 수퍼 데몬만 동작하다가 서비스 요청이 오면 수퍼 데몬이 해당 데몬을 동작시킴
    • 독자형보다는 서비스에 응답하는 데 시간이 약간 더 걸릴 수 있지만 자원을 효율적으로 사용한다는 장점이 있다.

수퍼 데몬

  • 유닉스에서 수퍼 데몬의 이름은 inetd
  • 페도라에서는 보안 기능이 포함된 xinetd를 사용

데몬의 조상 : init과 커널 스레드 데몬

init 데몬 (systemd)

  • 대부분의 프로세스의 조상 프로세스 이다.
  • pstree 명령으로 확인

커널 스레드 데몬

  • 커널의 일부분을 프로세스처럼 관리하는 데몬
  • ps 명령으로 확인했을 때 대괄호([ ])로 둘러싸여 있는 프로세스들
  • 예전에는 대부분 k로 시작했으나 요즘은 이를 반드시 준수하지 않음
  • 커널 데몬은 대부분 입출력이나 메모리 관리, 디스크 동기화 등을 수행하며 대체로 PID가 낮은 번호로 할당
  • 커널 데몬을 동작시키는 조상 데몬은 커널 스레드 데몬(kthreadd): PID 2번

주요 데몬

GRUB의 개요

  • GRand Unified Bootloader 의 약자로, 리눅스의 전통적인 부트 로더인 LILO의 단점을 보완하여 GNU 프로젝트의 일환으로 개발
  • GRUB는 LILO에 비해 다음과 같은 장점을 가지고 있음
    • LILO는 리눅스에만 사용이 가능하지만 GRUB는 윈도에서도 사용할 수 있다.
    • LILO에 비해 설정과 사용이 편리하다.
    • 부팅 시에 명령을 사용하여 수정이 가능하다.
    • 멀티 부팅 기능을 지원한다.
  • GRUB의 가장 최신 버전은 GRUB2로 우분투에서 기본 부트 로더로 사용중이다.

GRUB2 관련 디렉터리와 파일

/boot/grub2/brub.cfg 파일: 기존의 menu.lst 파일을 대체하는 기본 설정 파일

/etc/grub.d 디렉터리 : GRUB 스크립트를 가지고 있으며 GRUB의 명령이 실행될 때 순서대로 읽혀 grub,cfg 파일이 생성

/etc/default/grub 파일 : GRUB 메뉴 설정 내용이 저장됨.

 

728x90
작성일
2022. 11. 5. 20:12
작성자
WDmil
728x90

분류기 구현 ( Classifier ) 구현

특징 추출을 분류하기 위해 선, 평면, 또는 초평면 방정식의 피라미터를 추정하는 과정

  • 대표적인 방법 : Logistic Regression, Neural Networks, SVM

 

피쳐백터 간의 구분지을 수 있는 라인을 찾는 것.

 

2차원 공간 상 에서는 하나의 선 을 찾는것.

3차원 공간상 , N차원 공간 상에서는 원하는 하나의 공간 또는 면을 찾게된다.

 

분류기 구현 단계

구현 과정

데이터를 훈련집합, 테스트 집합으로 분류한다.

일반적으로 5:5 또는 7:3 정도의 비율로 나눈다.

훈련집합 : 분류기를 만들때에 사용,

테스트 집합 : 분류기를 만들고 난 후 성능 평가에 사용.

 

분류기의 종류

모델 선택 : 어떤 수학적 모델을 사용할 것 인지 결정. ( 선형, 비선형 ) 

학습 : 수학적 모델의 피라미터를 추정하는 과정

예를 들어 선형모델의 기울기나 절편을 추정

선형 분류기 =  평면, 초평면을 학습하는것

비선형 분류기 = 곡선을 이용하여 학습하는것.

 

성능 평가 방식

오류율 기준

  • 정인식률 = c/N (N : 총 샘플 수, c : 맞춘 샘플 수)
  • 기각률 = r/N (r : 기각한 샘플 수)
  • 오류율 = e/N (e : 틀린 샘플 수)

부류가 두개 인 경우의 혼동행렬

 

728x90
작성일
2022. 11. 5. 13:54
작성자
WDmil
728x90

프로세스를 생성하고 종료하는 시스템 호출/표준 라이브러리 함수

함수 의미
fork 자신과 완전히 동일한 프로세스를 생성한다.
exec계열 지정한 실행 파일로부터 프로세스를 생성한다.
exit 종료에 따른 상태값을 부모 프로세스에게 전달하며 프로세르를 종료한다.
atexit exit로 프로세스를 종료할 때 수행할 함수를 등록한다.
_exit atexit로 등록한 함수를 호출하지 않고 프로세스를 종료한다.

프로세스 생성 함수

#include <unistd.h>
#include <stdlib.h>
#incldue <sys/types.h>

void cleanupaction(void);

main()
{
// 프로세스 식별번호 저장
    pid_t pid;
    int i;
    for(i=0; i<3; i++)
    {
        printf("befor fork [%d]\n",i);
        sleep(1);
    }

// 자식 프로세스 생성
    pid = fork();
    if (pid>0) {
        for( ; i<7; i++) {
            printf("parent [%d]\n",i);
            sleep(1);
        }
// 함수 등록
        atexit(cleanupaction);
    }
    else if(pid ==0) {
        for( ; i<5 ; i++)  {
            printf("chiuld [%d]\n", i);
            sleep(1);
//ls 실행하여 새로운 프로세스 생성
            execl("/bin/ls","ls","-l",(char *)0);
        }
    }
    else("/bin/ls","ls","-l",(char*)0);
    }
}
else {
    printf("fail to fork child process\n");
}
    exit(0);
/* end of main*/

void cleanupaction(void)
{
    print("clean-up-action\n");
}

Fork()함수 : 프로세스를 복제하여 완전히 동일한 프로세스를 생성한다.

#include <sys/type.h>
#include <unistd.h>

pid_t fork(void);

fork 호출이 성공하여 자식 프로세스가 만들어지면, 부모 프로세스에서는 자식 프로세스 ID가 반환되고

자식 프로세스에서는 0을 반환

fork 호출이 실패하여 자식 프로세스가 만들어지지 않으면 부모 프로세스에서는 -1이 반환

 

프로세스는 실행 파일로 존재하는 프로그램으로부터 생성되는 것이 일반적이나, fork를 사용하면 실행 중인 프로세스를 복제하여 새로운 프로세스를 생성할 수 있음.

 

부모 프로세스와 자식 프로세스

  • fork를 호출하여 새로운 프로세스를 생성할 때, fork를 호출하는 쪽을 부모 프로세스라고 하고 새로 생성된 쪽을 자식 프로세스 라고한다.
  • 부모 프로세스와 자식 프로세스는 서로 다른 프로세스 이다.
    • 프로세스 식별번호(PID) 가 서로 다르다.
    • 자식 프로세스의 부모 프로세스 식별번호(PPID)는 자신을 생성한 부모 프로세스가 된다.
  • 자식 프로세스는 부모 프로세스가 fork를 호출하던 시점의 상태를 그대로 물려받는다.
    • 프로그램 코드
    • 프로그램 변수에 저장되어 있는 데이터 값
    • 하드웨어 레지스터의 값
    • 프로그램 스택의 값 등등
  • fork 호출 이후에 부모와 자식 프로세스는 자신들의 나머지 프로그램 코드를 수행한다.

fork를 호출하는 프로그램의 구조

fork를 호출하는 시점을 기준으로, fork를 호출한 이후에 부모 프로세스가 할 일과 자식 프로세스가 할 일을 구분한다.

fork의 반환 값으로 부모 프로세스와 자식 프로세스를 구분한다.

pid = fork(); /* fork  호출이 성공하면 자식 프로세스가 생성된다.*/

if(pid == 0)
/* 자식 프로세스가 수행할 부분*/

else if(pid >0)
/* 부모 프로세스가 수행할 부분 */

else
/* fork 호출이 실패할 경우 수행할 부분 */

 

프로세스 생성 함수 (exec 계열)

경로 이름 또는 파일 이름으로 지정한 실행 파일을 실행하여 프로세스 생성한다.

#include <unistd.h>

extern char **environ;

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
path 실행 파일의 경로로 상대 경로와 절대 경로 모두 사용할 수 있다.
file 경로 이름이 아닌 실행 파일의 이름이다.
반환값 호출이 성공하면 호출하는 프로세스에는 반환 값을 받을 수 없다. 만약 함수 호출 후-1이 반환되면 이는 함수 호출이 실패했음을 의미한다.
arg path나 file로 지정한 실행 파일을 실행할 떄 필요한 명령어 라인의 옵션과 인자이다. 한 개 이상을 지정할 수 있으며 마지막 인자는 반드시 NULL 포인터로 지정해야 한다.
argv arg와 같은 의미를 가지나 문자열 포인터의 배열로 형태가 다르다. 배열의 마지막은 NULL문자열로 끝나야 한다.

exec 계열 함수의 구분

  • 함수 이름에 p가 있고 없고의 차이
    • p가 없으면
      • 경로(path)로 실행 파일을 지정한다.
    • p가 있으면
      • 실행 파일의 이름만 지정한다.
  • 경로를 지정하는 경우 (p가 없을 경우)
    • 지정한 (상대/절대) 경로에서 해당 파일을 찾는다.
  • 파일의 이름만 지정하는 경우 (p가 있는 경우)
    • 쉘 환경변수 PATH에서 지정한 디렉터리를 차례대로 검색하여 찾는다.
      • 예)$ printenv PATH <- 환경변수 PATH의 값을 출력한다.

exec 계열의 함수는 지정한 실행 파일로부터 프로세스를 생성한다.

  • fork 는 실행 중인 프로세스로부터 새로운 프로세스를 생성한다.

exec 계열의 함수의 사용 예

호출 프로세스와 피 호출 프로세스

  • 호출 프로세스( caller process )
    • exec 를 실행하는 프로세스
  • 피호출 프로세스 ( calle process )
    • exec에 의해 생성되는 프로세스

exec를 성공적으로 호출한 결과

  • 호출 프로세스는 종료된다.
  • 호출 프로세스가 메모리 영역을 피호출 프로세스가 차지한다.
  • 호출 프로세스 PID를 피호출 프로세스가 물려받는다.

exec계열을 사용한 프로세스 생성

 

  fork exec계열
프로세스의 원본 부모 프로세스를 복제하여 새로운 프로세스를 생성한다. 지정한 프로그램(파일)을 실행하여 프로세스를 생성한다.
셸 명령줄의 프로그램인자 새롭게 지정할 수 없고 부모 프로세스의 것을 그대로 사용한다. 필요할 경우 적용할 수 있다.
부모( 또는 호출 ) 프로세스의 상태 자식 프로세스를 생성한 후에도 자신의 나머지 코드를 실행한다. 호출이 성공할 경우 호출(Caller)프로세스는 종료된다.
자식( 또는 피호출) 프로세스의 메모리 상의 위치 부모 프로세스와 다른곳에 위치한다. 호출 프로세스가 있던 자리를 피호출 프로스세스가 물려받는다.
프로세스 생성 후 자식( 또는 피호출) 프로세스의 프로그램 코드의 시작지점 fork 호출 이후 부터 수행된다. 프로그램의 처음부터 수행된다.
프로세스 식별 번호 (PID) 자식 프로세스는 새로운 식별 번호를 할당받는다. 호풀 프로세스의 식별 번호를 피호출 프로세스가 물려받는다.
프로세스의 원본인 파일에 대한 권한 부모 프로세스를 복제하므로 상관없다. 실행 파일에 대한 실행 권한이 필요하다.

fork와 exec의 비교(2)

  • Fokr
    • 자신과 동일한 자식 프로세스만 생성할 수 있다.
    • 다른 종류의 프로세스를 생성할 수 없다.
    • 자식 프로세스를 생성하더라도 자신은 종료되지 않는다.
  • exec
    • 자신과 다른 종류의 프로세스를 생성할 수 있다.
    • 새로운 프로세스를 생성하면 자신은 종료된다.

 

fork와 exec를 함께 사용하기

  • fork를 호출하여 자식 프로세스를 생성 한 후에 자식 프로세스가 exec를 호출하여 새로운 프로세스를 생성한다.
  • 결과적으로 부모 프로세스는 종류가 다른 자식 프로세스를 생성하고 자신 역시 나머지 작업을 계속 할 수 있다.

프로세스 생성 함수 (exec)

#include <unistd.h>
#include <stdio.h>
main()
{
    printf("befor executing ls - l\n")
    execl("/bin/ls","ls","-l",(char *)0);
    printf("after executing ls -l\n");
}

for와 exec를 같이 사용

 #include <unistd.h>
#incldue <sys/types.h>

main()
{
    pid_t pid();

    printf("hello!\n")

    pid = fork();

    if(pid > 0) { /* parent process */
        printf("parent\n");
        sleep(1);
    }
    else if(pid == 0)
{ /* child process */
        printf("child\n");
        execl("/bin/ls", "ls", "-l", (char *)0);
        printf("fail to execute ls \n");
    }
    else
    printf("parent: fail to fork\n");
    printf("bye!\n");
}

부모프로세스는 자식 프로세스의 생존 여부와 상관 없이 나머지 일을 수행, 자식 프로세스가 exec를 호출하여 새로운 프로세스 생성 후, 자식 프로세스는 종료 됨.

 

프로세스 생성 함수 exit

프로세스를 종료하면서 부모 프로세스에게 종료와 관련된 상태 값을 넘김

#include <stdlib.h>

void exit(int status);
status 부모 프로세스에게 전달되는 상태 값으로 0~255(1바이트)의 값이 사용된다.
반환값 없음
  • exit는 프로세스를 의도적으로 종료시킨다.
  • 이외에 프로세스가 종료하는 경우는
    • 더이상 수행할 문장이 없거나
    • main 함수 내에서 return 문을 수행할 떄 이다.
  • status의 값은 0~255 사이의 값으로 각각에 대한 정해진 의미가 없다.
  • 프로그램 작성자가 임의로 정해서 사용한다.

프로세스 생성 함수 atexit

프로세스가 exit를 호출하여 종료할 때 수행되는 함수들을 등록한다.

#incldue <stdlib.h>

int atexit(void (*function)(void));
function atexit로 등록할 함수의 이름이다.
반환값 호출이 성공하면 0을 반환하고, 실패하면 0이 아닌 값을 반환한다.
  • function
    • 함수의 이름으로 함수는 void function(void); 형으로 정의되어야 한다.
  • 종료 시 마무리 작업 (clean-up-action)
    • 프로세스가 종료할 때 깔끔한 마무리를 위해 수행해야 하는 작업들
    • 최대 32개까지 등록할 수 있다. (실제 실행 순서는 등록 순서의 역순)
#include <unistd.h>
#include <stdlib.h>

void func1(void);
void func2(void);

main()
{
    printf("hello!\n");
    atexit(func1);
    atecit(func2);

    printf("bye!\n");
    exit(0);
}
void func1(void) { printf("func1\n"); }
void func2(void) { printf("func2\n"); }

프로세스 생성 함수 _exit

exit 함수와 같지만 clean-up-action 을 수행하지 않는다.

#include <unistd.h>

void _exit(int status);
status 부모 프로세스에게 전달되는 상태 값으로 0~255의 값이 사용된다.
반환값 없음

_exit 는 atexit로 claen-up-action에 해당하는 함수들을 등록해 놓았떠라도 종료 할 때 이를 수행하지 않는다.

 

#include <unistd.h>
#include <stdlib.h>

void func1(void);
void func2(void);

main()
{
    printf("hello\n");
    atexit(func1);
    atexit(func2);

    printf("bye!\n");
    _exit(0);
}
void func1(void) { printf("func1\n"); }
void func2(void) { printf("func2\n"); }

 

728x90
카테고리
작성일
2022. 11. 2. 17:18
작성자
WDmil
728x90

MICCAI 에서 2015년도에 만들어진 논문. 이미지 학습 알고리즘의 기본적인 논문임.

 

의료 영상쪽 이미지 세그먼테이션을 위해 만들어짐

 

세그먼테이션

배경 내의 이미지 인식법에 대해서는 다양한 유형이 있음.

Singl object

하나의 이미지 안에 하나의 객체만 존재 할 때

 

Classification = 고양이가 있다면 고양이가 있는 이미지 라고. 하나의 이미지로 분류 하는것

Classification + Localization = 고양이가 있는 이미지라고 분류하고, 이미지 내부의 고양이 위치까지 표현하는것

  • Localization = 지역화 라는 의미가 있음. 무언가 있는 지역 이라고 해석하면 된다.

Multible objects

하나의 이미지 안에 여러개의 객체가 존재 할 때

 

Object Detection = 하나의 이미지 안에 여러개의 객체가 존재하는 것에서 객체의 위치에 Localization을 수행하고, 각각의 객체마다 어떤 클레스에 해당하는지 의 분류를 동시에 수행하는 것.

 

Instance Segmentation = 그냥 세그먼테이션 이라고 하기도 함, 하나의 이미지 안에 여러 오브젝트가 존재하는 상황에서 각 객체를 사각형으로 표시하는것 외에도 객체의 픽셀마다 어떤 클래스인지 예측하는 방향으로 모델이 동작하게 된다.

 

 

즉, Segmentation 은 각 픽셀마다 클레스를 할당하는 작업을 의미합니다.

일반적인 분류(Classification)은 단일이미지를 하나의 클래스로 분류하나,

분할(segmentation)에서는 각 픽셀마다 하나의 클래스로 분류한다.

 

각 이미지의 픽셀마다 클레스 레이블을 예측하는게 Semantic Segmentation의 목표

이미지가 주어졌을 때 (높이, 너비, 1) 크기를 가지는 한장의 분할 맵을 생성한다.

각 픽셀마다 N개의 클래스에 대한 확률(probability)를 뱉어야 함으로, 정답값은 (높이X너비XN)형태를 갖는다.

각 픽셀마다 원-핫 인코딩 (one-hot encoding)방식을 따른다.

 

그러나, 분할 작업을 위한 데이터 세트 생성 비용은 매우 비싸다.

각 픽셀마다 어떤 클래스로 분류되는지 일일이 지정해야 하기 때문,

하지만, 일반적인 CNN분류 모델의 형식을 크게 바꾸지 않고 학습 가능,

일반적인 딥러닝 네트워크의 구조가 크게 어렵지 않은 편이라는 장점이 있다.

 

CNN의 동작과정

CNN에서는 필터, 혹은 커널이라 불리는것을 사용한다.

각 필터는 입력에서 특정한 특징을 잡아내어 특징 맵을 생성한다.

하나의 필터는 슬라이딩 하면서, 컨볼루션 연상르 통해 특징 맵을 연산.

인풋 이미지가 필터(커널)을 통과하면서 해당되는 픽셀에 1을 곱해주고, 나온 값을 다 더해주면 오른쪽 Feature map이 생성된다.

 

728x90

'알고리즘' 카테고리의 다른 글

머신러닝 프로세스 ( 선형회귀 )  (0) 2024.06.13
Q & Optimal Policy  (1) 2024.06.09
MDP ( Markov Decision Process )  (1) 2024.06.09
Greedy Action으로 알아보는 Q-Learning  (0) 2024.06.07
Quick Sort 알고리즘  (0) 2024.05.15
작성일
2022. 10. 28. 17:45
작성자
WDmil
728x90

샤프닝 필터 = 이미지를 선명하게 하고 싶을때 사용하는 필터.

Finds edges or ehances details in an image [ 이미지 내부에서 밝기가 급격하게 변화되는 영역을 찾아냄 ]( 태두리 확인 )

밝기가 동일한 영역 : 평탄한 영역 (Flat areas) 

이미지의 평탄한 영역은 밑과 같다.

이미지의 왼쪽 과 오른쪽 의 평탄한 부분을 Flat areas라고 한다.

위 이미지의 중간부분 밝기가 급격하게 변하는 부분, 쉽게 말하면, 밑을 0 위를 1 이라고 하였을 떄, 0과 1 사이를 

엣지 [ Edge ] 라고 한다.

 

Model of a ramp digtal edge 

모든 이미지가 딱딱 나누어지는 것이 아니다, 이러한 나누어 지지 않는 이미지의 중간부분을 Ramp 라고 한다.

오른쪽과 왼쪽 사이의 중간부분을 Ramp 라고 한다.

이러한 렘프나 엣지의 밝기의 변화구간을 검출(Detection) 하는 방법

이웃하는 화소와의 밝기 차이를 계산하면 된다.

평탄한 영역에서 이웃 화소와의 값과의 차 = 거의 0에 가깝거나 0이다.

우리는 이러한 방법으로 밝기의 변화량에 따른 변화구간을 검출 할 수 있다.

 

Sharpening Filter 설계

이웃하는 픽셀값의 차이를 구하면 엣지의 밝기구간을 찾을 수 있다.

밝기의 변화량 = 1차미분, 2차 미분을 하여 유도 할 수 있다.

1차 미분에서의 미분데이터는 위와같이 계산할 수 있다.

2차 미분에서의 미분 데이터는 위와 같이 계산할 수 있다.

 

ramp = 완만한 밝기 변화구간

Isolated point ( 고립점 ) = 급격히 증가, 감소한 부분

Thin line = 얇은 라인 밝기변환구간

Step = 밝기가 급격히 튀는 구간.

 

여기서 알 수 있는 부분

1차 미분 : ramp에서 두꺼운 엣지로 산출 하고,

2차 미분 : detail의 부분에 대해 더 강한 반응을 가지게 된다. step 부분에 대해 2중 응답을 산출한다.

 

Laplacian 필터

디테일 에지 검출, 에지 강화가 가능하다.

영상은 2차원 신호로 이루어져 있다.

x축에 대한 2차 미분과 y축에 대한 2차 미분을 더한 것.

위와 같은 수식을 이용해 필터를 설계 할 수 있다.

0 1 0
1 -4 1
0 1 0

가 필터가 된다.

이미지 데이터에 대한 필터값을 씌우는 방법은. 이미지 픽셀의 구하려는 픽셀을 정 중앙에 놓고 주변 값을 각 픽셀에 곱한 다음, 전부 더해서 구하려는 픽셀에 넣어주면 된다. ( 바꾼다 )

 

위 수식에서는 위 아래 좌 우 만 고려하지만, 대각선방향에 대한 축을 하나 추가하여 계산에 이용해도 된다.

 

라플라시안 필터를 이용하여 필터 결과를 뽑았을 때 나온 결과로 엣지를 강화하는법

Laplacian 필터를 이용하여 데이터를 필터링 하였을 때, 필터결과값이

결과가 -면, 원본에 -해준다.

결과가 +면, 원본에 + 해준다.

{ 절대값을 씌운다? }

 

( 밝기 변화량에 따른 변화를 넣어주어서, 밝기차를 더 크게 주는 것)

위 필터 결과를 넣어주었을 때 원본보다 더 엣지를 크게 만들어주는 것을 볼 수 있다.

디테일이 선명하게 되는 영상을 흭득 가능하다.

수식은 $g(x.y) = 5f(x,y)-[f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)]$ 이다.

0 -1 0
-1 5 -1
0 -1 0

 

-1 -1 -1
-1 9 -1
-1 -1 -1

마스크로 표현하면 위와 같이 표현된다.

 

728x90