pip install과 apt-get install의 차이는? pip와 pip3는 뭐가 다르지? sudo란?

안녕하세요. 컴퓨터비전 블로그, 비스카이비전의 심교훈입니다.

 

평생 거의 윈도우만 사용하다 최근에 와서야 리눅스 운영체제(그 중 하나인 우분투)를 사용해보려고 하다보니 이것저것 궁금한 것이 많네요.^^ 궁금증에 대해 답을 찾은 것들에 대해 정리하려고 합니다. 

 

1. pip와 pip3의 차이

우선 pip는 파이썬으로 작성된 패키지 소프트웨어를 다운로드, 설치, 관리하는 패키지 관리 시스템이라고 합니다[1].  저의 경우 pip를 새로운 파이썬 패키지를 설치할 때 많이 사용해왔습니다. 

 

pip말고 pip3를 사용하는 경우도 있는데, pip는 파이썬2를 위한 것이라고 하고, pip3는 파이썬3을 위한 것이라고 합니다[2]. 

2. pip install과 apt-get install의 차이

어떤 패키지를 설치할 때는 pip가 아니라 apt-get을 이용해서 설치할 수도 있습니다. 둘은 무슨 차이가 있을까요? 

우선 apt는 어드밴스트 패키징 툴(advanced packaging tool)의 약자입니다[5].  

 

둘의 가장 큰 차이는 어디서부터 패키지를 가져오는가로 보입니다. pip로 설치하면 파이썬 패키지들의 저장소인 PyPI(Python Package index)에서 패키지를 가져오고, apt-get으로 설치하면 우분투 저장소로부터 패키지를 가져옵니다. PyPI는 파이썬 언어를 만든 Python Software Foundation에서 호스팅한 것이고, 우분투 저장소는 우분투를 만든 Canonical에서 호스팅한 것입니다. 

 

pip는 파이썬 패키지들을 설치할 수 있는 반면, apt-get은 모든 종류의 패키지를 설치할 수 있습니다. 단, 파이썬 패키지들 중에 apt-get을 통해서는 설치할 수 없는 것도 있다고 합니다.  

 

또한 Canonical은 어떤 패키지의 하나의 버전만 호스팅해놨기 때문에, 파이썬 패키지의 특정 버전이 필요한 경우에는 pip를 사용해야한다고 합니다. 

 

virtualenv 가상환경에 패키지를 설치하려면 pip를 사용해야한다고 합니다. virtualenv를 활성화한 다음에 pip를 이용해서 설치하면 알아서 가상환경에 패키지를 설치해준다고 합니다. 

 

pip 설치와 apt-get 설치의 차이에 대해서는 스택오버플로우에 있는 답변들[3]이 굉장히 유용하니, 참고하시기 바랍니다.

 

3. sudo의 의미

sudo는 super user do의 약자로 강력한 관리자의 권한으로 무언가를 하겠다는 의미를 갖습니다[4]. 권한이 센 만큼 잘못 사용했을 때는 책임도 크겠죠?^^  

 

 

항상 질문과 지적은 환영입니다. 빠르게 답변해드리고 있으니, 댓글 남겨주세요.^^ 

 

 

 

<참고자료>

[1] https://ko.wikipedia.org/wiki/Pip_(%ED%8C%A8%ED%82%A4%EC%A7%80_%EA%B4%80%EB%A6%AC%EC%9E%90), 위키백과, pip (패키지 관리자)

[2] https://kaen2891.tistory.com/27, Kaen의 일상생활, "pip와 pip3의 차이"

[3] https://askubuntu.com/questions/431780/apt-get-install-vs-pip-install?newreg=2adf506d10f04229bb92756f31bf6fb0, apt-get install vs pip install

[4] https://linuxacademy.com/blog/linux/linux-commands-for-beginners-sudo/, Linux Commands For Beginners: SUDO

[5] https://ko.wikipedia.org/wiki/%EC%96%B4%EB%93%9C%EB%B0%B4%EC%8A%A4%ED%8A%B8_%ED%8C%A8%ED%82%A4%EC%A7%95_%ED%88%B4, 어드밴스트 패키징 툴

댓글()

[파이썬] 선형 회귀(linear regression)

컴퓨터비전/python|2020. 1. 19. 00:54

선형회귀는 데이터를 가장 잘 설명해낼 수 있는 직선을 찾아내는 것입니다. 직선은 y = ax + b와 같은 일차함수로 나타낼 수 있는데, 결국 가장 적합한 기울기 a와 x절편 b를 찾아내는 것입니다. (특성이 단 하나인 경우.) 선형회귀에 관한 좀 더 자세한 이론 설명은 이전 글을 참고해주세요.^^ 

선형 회귀(linear regression) 그리고 라쏘(Lasso)

 

그럼 간단한 예제를 하나 풀어보겠습니다. 선형 회귀로 해결할 수 있을 것 같은 데이터를 불러와서, 그 중 랜덤하게 75%의 샘플을 선택해서 훈련셋으로 나머지 25%는 테스트셋으로 분리해줍니다. 그 다음에 훈련셋을 이용해서 선형 회귀 모델을 훈련함으로 최적의 a와 b를 구합니다. 그 다음에 y = ax + b(최적의 a와 b를 알게 된 상태)함수에 테스트셋의 각 샘플들의 특성값을 x에 대입시켜줍니다. 그러면 각 샘플의 타겟값에 대한 예측값을 알게 됩니다. 타겟값과 예측값의 상관성을 결정계수를 통해 평가합니다. 결정계수는 1에 가까울수록 예측이 정확하다는 의미를 갖습니다. 

 

이를 실행해주는 코드는 다음과 같습니다. 코드를 실행하기 앞서 scikit-learn, matplotlib, mglearn 라이브러리를 설치해주셔야합니다.^^ 이 부분은 여러분의 검색능력을 믿고 남겨놓겠습니다. "python install 라이브러리명 운영체제명"와 같은 검색어로 찾으시면 쉽게 적당한 것을 찾으실 수 있을 것입니다.

 

import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X, y = mglearn.datasets.make_wave(n_samples=60) # make data points

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # 데이터셋을 훈련셋과 테스트셋으로 분리


plt.plot(X_train, y_train, 'o') # 훈련 데이터 포인트들 그리기
plt.plot(X_test, y_test, '*', color='green') # 테스트 데이터 포인트들 그리기
plt.xlabel("Feature")
plt.ylabel("Target")


lr = LinearRegression().fit(X_train, y_train) # train a linear regressor


print("a: {}".format(lr.coef_)) # 훈련으로 찾아낸 최적의 a
print("b: {}".format(lr.intercept_)) # 훈련으로 찾아낸 최적의 b


y_pred = lr.predict(X_test) # 테스트셋의 데이터들의 타깃값 예측

plt.plot(X_test, y_pred, color='red', linewidth=3) 

plt.savefig('data points.png') # save plot
plt.show() # display plot 

print("training set score: {:.2f}".format(lr.score(X_train, y_train))) # 훈련셋 결정계수
print("test set score: {:.2f}".format(lr.score(X_test, y_test))) # 테스트셋 결정계수

 

 

파란색 o는 훈련 데이터 포인트, 초록색 별은 테스트 데이터 포인트, 빨간 직선은 훈련으로 찾은 최적의 직선

 

 

위 코드를 실행했더니, 선형회귀 모델을 훈련시켜서 얻은 a와 b는 다음과 같았습니다.

 

a = 0.3939, b = -0.0318

 

즉, 선형회귀 모델은 훈련셋을 이용해서 y = 0.3939x - 0.0318이라는 일차함수를 찾아낸 것입니다. (위 그래프에서 빨간선이 바로 그 일차함수입니다.) 이 일차함수에 훈련셋의 특성값과 테스트셋의 특성값을 각각 대입한 다음에, 결정계수를 구했더니 훈련셋의 결정계수는 0.67이었고, 테스트셋의 결정계수는 0.66이었습니다. 테스트셋의 결정계수가 0.66이므로 성능이 엄청 나쁜 것은 아니지만 그렇다고 좋은 것도 아닙니다. 예측 성능이 충분히 좋진 않다는 뜻입니다. 그러나 훈련셋의 결정계수와 큰 차이가 없는 것은 좋은 일입니다. 훈련셋에 과대적합(overfitting)이 되지 않았고, 오히려 과소적합(underfitting)인 상황이기 때문입니다. 가장 좋은 결과는 테스트셋 점수와 훈련셋 점수가 모두 1에 가깝고, 둘의 차이가 적은 경우입니다. 

 

지금의 경우에는 특성이 단 하나였기 때문에 간단한 선형 회귀도 어느 정도 성능을 냈지만 여러 개의 특성을 갖는 데이터의 경우에는 잘 작동하기 힘듭니다. 다음 시간에는 이에 대한 문제를 집어보고 해결책도 함께 살펴보도록 하겠습니다. 오늘 배운 선형회귀를 조금 업그레이드 시켜보겠습니다.^^ '릿지 회귀'와 '라쏘 회귀'로요.  

 

항상 질문과 지적은 환영입니다. 최대한 빠르게 답변해드리도록 노력하고 있으니 바로바로 댓글 남겨주세요.^^

댓글()

티스토리 블로그 및 웹사이트 도메인 제공 사이트 추천

삶/티스토리 관련|2020. 1. 18. 01:55

도메인(domain)이라는 단어가 낯선 분들을 위해서 바로 간단한 예를 들어드리겠습니다. 

 

티스토리에서 블로그를 만들면 다음과 같은 방식의 주소를 갖게 됩니다. 

blueskyvision.tistory.com 

하하. 제 주소입니다. 

 

그런데 이런 이름은 뒤에 .tistory가 붙기 때문에 주소가 너무 길고 이쁘지가 않죠. 또 결정적으로 blueskyvision.tistory.com과 같은 주소로는 애드센스 광고를 달 수 없습니다! 이때 도메인 서비스가 필요합니다. 

 

제가 지금까지 이용해본 도메인 서비스는 가비아freenom.com입니다. 가비아는 유료고, freenom은 이름에서 알 수 있듯이 몇몇 도메인은 무료로 제공합니다. 그런데 사실상 .com, .net과 같은 유명한 도메인은 유료이고, .cf, .ml과 같이 특이한 도메인만 무료입니다. ㅎㅎ .cf와 같은 도메인으로 만들어놓으면 사람들이 "이거 이상한 사이트 아냐?"하고 의심하기 쉽겠죠. 그래서 그런지 몰라도 제가 코딩 공부겸 재미로 간단한 웹게임을 만든 후 웹사이트의 도메인을 무료 도메인인 .cf로 해놨더니 선뜻 잘 방문을 안하시네요..ㅋㅋ (관심있으시면 방문해서 게임 한번 해보세요. injoywebgame.cf)

 

그래서 저는 지금 가비아를 사용해서 blueskyvision.tistory.com을 bskyvision.com으로 접속할 수 있게 했습니다. .com의 경우 1년에 2만원 정도니 비싸긴 하지만 또 그렇다고 엄청 비싼 금액은 아니죠. 저는 처음에 .com의 도메인을 구입하면서 일년에 애드센스로 적어도 2만원은 벌겠지 했는데, 그게 생각처럼 그렇게 쉽진 않더라구요.ㅋㅋ 암튼 지금은 한달에 2만원은 넘게 버니 더이상 돈이 아깝진 않습니다. 제 블로그 2019년 수익 관련해서는 다음 글을 참고하세요.^^

 

하루 평균 방문자 1300명인 티스토리 블로그는 얼마나 벌까?(bskyvision 2019년 결산)

 

참고로 얼마 못법니다. ㅋㅋ

댓글()

[파이썬] kNN(k-Nearest Neighbors)으로 붓꽃 품종 예측

컴퓨터비전/python|2020. 1. 18. 01:11

이번 시간에는 kNN을 이용해서 붓꽃의 품종을 예측하는 코드를 소개해드리도록 하겠습니다. kNN은 한국어로 k-최근접이웃으로 번역되기도 합니다. kNN의 작동원리는 매우 간단합니다. 새로운 데이터가 있는데 그 데이터의 클래스를 모른다면, 훈련 데이터셋에서 그 새로운 데이터와 가장 비슷하게 생긴 놈을 찾아서 걔랑 같은 유형이라고 라벨링해버리는 것입니다. kNN에 대한 이론적인 내용은 이전 포스팅을 참고해주세요.^^

 

유유상종의 진리를 이용한 분류 모델, kNN(k-Nearest Neighbors)  

 

오늘 예제 코드를 실행하기 위해서는 scikit-learn(사이킷런) 라이브러리와 NumPy 라이브러리가 필요합니다. 마찬가지로 각자 운영체제에 맞게 설치해주시면 됩니다.^^ 사이킷런은 안드레아스 뮐러라는 분이 주도해서 만든 머신러닝 라이브러리입니다. 꽤 쓸만하다고 합니다. 그리고 항상 느끼는 바이지만 역시 다운로드 및 설치는 리눅스가 윈도우에 비해 훨씬 편합니다.

 

 

붓꽃 품종에는 setosa, versicolor, virginica와 같은 세 개의 종이 있다고 합니다. 붓꽃의 꽃잎의 폭과 길이, 꽃받침의 폭과 길이를 측정한 것을 가지고 어느 붓꽃 품종에 속하는지를 예측하는 예제입니다. 간단히 말해서 4개의 특성(feature)과 3개의 클래스(class)가 있는 문제입니다.

 

150개의 샘플을 포함하고 있는 붓꽃 데이터셋에서 랜덤하게 선택한 75%를 훈련셋으로 나머지 25%를 테스트셋으로 해서 예측 정확도를 평가해보도록 하겠습니다. 

 

이것을 수행해주는 코드는 다음과 같습니다. 중요한 부분에는 한글로 주석을 달아놓았으니 참고하시기 바랍니다. 

import numpy as np

from sklearn.datasets import load_iris
iris_dataset = load_iris() # 붓꽃 데이터셋을 적재합니다. 

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)
# 데이터셋을 랜덤하게 75%의 훈련셋과 25%의 테스트셋으로 분리합니다.  

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1) 

knn.fit(X_train, y_train) # kNN 분류기를 훈련셋으로 훈련시킵니다. 

y_pred = knn.predict(X_test) # 테스트셋의 라벨값을 예측합니다. 

print("prediction accuracy: {:.2f}".format(np.mean(y_pred == y_test)))

 

이 코드를 실행하면, 다음과 같은 결과가 출력됩니다. 

 

 

예측 정확도가 0.97이라고 하니 꽤 높죠? 150개 중에 25%가 테스트셋이니까, 38개의 테스트셋의 클래스중 97%의 클래스를 맞췄다는 것입니다. 거의 한, 두 개 빼고는 다 제대로 예측해낸 것입니다. 

 

오늘은 kNN을 이용해서 붓꽃의 품종을 예측하는 문제에 대해 다뤄봤습니다. 사실 이 문제는 머신러닝 분야에서 아주 유명하고도 오래된 예제입니다. ㅎㅎ 

 

항상 질문과 지적은 환영합니다.^^ 담에 또 찾아뵙겠습니다! 

댓글()

[파이썬] 웹캠 영상 실시간 물체 검출

컴퓨터비전/python|2020. 1. 17. 17:24

[파이썬] 얼굴 검출 https://bskyvision.com/675 

[파이썬] 얼굴 검출 후 성별 인식 https://bskyvision.com/677

[파이썬] 물체 검출 https://bskyvision.com/678

 

지난 번에 말씀드린대로 오늘은 웹캠으로 촬영되는 영상에서 실시간으로 물체 검출하는 방법에 대해 소개해드리도록 하겠습니다.

 

이것을 좀더 편하게 하기 위해 우분투를 윈도우10에 듀얼부팅 방식으로 설치했습니다. 기존에는 클라우드 통합개발환경을 이용해서 우분투 운영체제를 이용했었습니다. 

 

바로 실시간 물체 검출을 테스트한 영상을 보여드리도록 하겠습니다. (유튜브에 동영상은 처음 올려보네요.ㅋㅋ)

 

https://youtu.be/FqDaMtR3Smk

 

이 물체 검출 모델은 80개의 물체를 검출할 수 있도록 훈련되었습니다. 영상에서 볼 수 있듯이, 검출 성능이 그다지 나쁘지 않죠? ㅎㅎ 

 

(영상을 보시다보면 집 안에 웬 오토바이가 있지 하고 놀라실 수도 있는데, 제가 지금 거주하고 있는 중국에서는 전동 오토바이를 충전하기 위해 집에 들여다놓는 경우가 많답니다. ㅋㅋ)

 

이번에도 마찬가지로 opencv-python 라이브러리와 cvlib 라이브러리를 미리 설치해주셔야 합니다. cvlib 라이브러리에 있는 detect_common_objects 함수가 실질적으로 물체 검출을 해줍니다. 파이썬 코드는 다음과 같습니다. 

 

# import necessary packages
import cvlib as cv
from cvlib.object_detection import draw_bbox
import cv2

# open webcam (웹캠 열기)
webcam = cv2.VideoCapture(0)

if not webcam.isOpened():
    print("Could not open webcam")
    exit()
    

# loop through frames
while webcam.isOpened():

    # read frame from webcam 
    status, frame = webcam.read()

    if not status:
        break

    # apply object detection (물체 검출)
    bbox, label, conf = cv.detect_common_objects(frame)

    print(bbox, label, conf)

    # draw bounding box over detected objects (검출된 물체 가장자리에 바운딩 박스 그리기)
    out = draw_bbox(frame, bbox, label, conf, write_conf=True)

    # display output
    cv2.imshow("Real-time object detection", out)

    # press "Q" to stop
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
# release resources
webcam.release()
cv2.destroyAllWindows()   

 

항상 말씀드리는 것이지만, 코딩에 익숙치 않으신 분들은 코드에 겁먹지 마세요. 그냥 흐름만 아시면 됩니다. 너무 디테일에 처음부터 매달리다보면 큰 그림을 놓치기 쉽기 때문입니다.^^ 

 

오늘은 실시간 물체 검출에 대해 다뤄봤습니다. 이러한 물체 검출 기술이 존재하기 때문에, 자율 주행 자동차도 생겨날 수 있었던 것이겠죠? 즐거운 하루보내세요! 

 

아, 혹시 이미지 분류와 물체 검출의 개념이 헷갈리시는 분이 계시다면 아래 글을 참고하세요.^^ 

이미지 분류(image classification)와 물체 검출(object detection)의 차이는? 

댓글()