[태그:] python

  • opencv 시작하기

    유명한 opencv를 시작했다. docker python 이미지를 찾아 쉽게 시작했다. python 3.7, opencv4를 설치한 이미지다.

    docker pull jjanzic/docker-python3-opencv

    몇 번 시행착오를 거쳤으나 여러 사이트를 참조하여 결과만 남긴다. 먼저 docker 내용을 host에 넘기기 위해 xhost +를 실행했다. 그 뒤 sudo 명령어로 docker를 실행했다. 여기에 좋은 내용이 있다. docker run 옵션은 다음과 같다.

    sudo docker run --device=/dev/video0:/dev/video0 -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -p 5000:5000 -p 8888:8888 -it -v /home/now0930/codeForPython3/opencv:/home/code  --env QT_X11_NO_MITSHM=1 jjanzic/docker-python3-opencv_modified /bin/bash

    중간에 –env QT_X11_NO_MITSHM=1 를 넣어 시작하지 않으면 다음 에러가 난다.

    cv2.error: OpenCV(4.1.1) /opencv-4.1.1/modules/highgui/src/window.cpp:627: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'

    시작 후 docker 내부에서 pip로 opencv-python 모듈을 설치한다. opencv-python를 설치하지 않으면 video를 사용하여 이미지를 저장할 수 없다.

    python -m pip install opencv-python

    root 권한으로 libget2.0-dev, pkg-config를 설치했는데 영향을 모르겠다. 일단 되니 고.

    apt reinstall libgtk2.0-dev pkg-config

    여기 코드를 그대로 사용하여 실행 됨을 확인한다.

    sudo로 docker를 실행하면 보안 문제가 있다고 한다. video를 사용할 수 있도록 host에 권한을 할당했다.

    sudo usermod -a -G video now0930

    다음을 실행하면, 윈도우가 무한대로 뜬다. cv2.imshow를 하나만 사용해야 된다. 여러 개를 사용하면 무엇이 문제인지 모르겠으나, 안된다. matplot으로 창을 띄워도 되나 너무 느리다. 찾아보면 해결 방법을 찾겠지만, 그냥 cv2.imshow로 가기로 했다.

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt  
    cap = cv2.VideoCapture(0)
    
    #while(1):
    #videocapture로 들어오는 이미지를 matplot으로 실시간 표시
    #plt.ion()
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    
    while cap.isOpened():
    
        # Take each frame
        _, frame = cap.read()
        # Our operations on the frame come here
        #gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    
        # Convert BGR to HSV
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        #hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
        # define range of blue color in HSV
        lower_blue = np.array([110,50,50])
        upper_blue = np.array([130,255,255])
    
        # Threshold the HSV image to get only blue colors
        mask = cv2.inRange(hsv, lower_blue, upper_blue)
    
        # Bitwise-AND mask and original image
        res = cv2.bitwise_and(frame,frame, mask= mask)
    
        #cv2.imshow("frame",frame)
        #cv2.imshow("mask",mask)
        cv2.imshow("res",res)
    
    
        #plt.subplot(2,2,1),plt.imshow(frame)
        #plt.subplot(2,2,2),plt.imshow(mask)
        #plt.subplot(2,2,3),plt.imshow(res)
        #plt.pause(0.001)
        #plt.show()
    
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
    

  • 파이썬으로 풀어보는 회귀분석

    파이썬으로 풀어보는 회귀분석

    isbn: 9791161752501

    통계를 이해하고 이를 python으로 풀어본 책이다. 기초 개념을 모르면 책을 이해할 수 없다. 나에겐 코드 따라해 보기가 전부였다. 좌절. keras+tensorflow 나오기 전에 참 힘들게 적용 했겠다.

  • tag 형식 제한기 작성 후기

    최근 몇 일간 태그를 제한하는 스크립트, 코드를 작성했다. 프로세스는 좀 복잡하다. 시운전자마다 태그를 지멋대로 작성한다. 태그를 잘 분석하면 좋은데, 지 멋대로라 의미있는 정보를 쉽게 얻어내기 어렵다. 오타도 많고 단어도 지 멋대로 순서로 작성한다. 그나마 잘못한 부분을 보아야 하는데 잘 보이지도 않는다. 없던 작업이라 대부분 고민해서 직접 만들었다. 시간이 정말 많은 사람이라면 취미로 프로그램 작성을 가져봄을 추천한다. 이건 뭐 정확한 법칙도 없어 모두 케바케다. stack overflow가 셧다운 되었을 때 사람들이 그 난리를 쳤는지 이해된다.

    위치,원래 태그,수정한 태그
    ***,****_UM_PRS_***_***,***_UM_PRS_***_***
    ***,****_UM_PRS_***_***,****_UM_PRS_***_***
    ***,***_PRS_UM_***_***_***,***_UM_PRS_***_***_***
    ***,***_PRS_UM_***_***_***,***_UM_PRS_***_***_***

    위 결과를 보면 원래 태그가 UM_PRS, PRS_UM 두 방식으로 표현된다. 두 방식을 모두 UM_PRS로 수정했다. 틀려도 같이 틀린다. 대충 잘 동작한다고 믿고 싶다. 몇 만개 중에서 30%만 수정한 태그에 답을 달았다. %를 올릴려면 한참 입력해야 한다. 현실은 시궁창이니…

  • linear approxmation

    python으로 데이터를 근사 함수로 바꾸는 명령이 있다. polyfit. 대박이다!

    Python 3.5.2 (default, Jul 10 2019, 11:58:48) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import numpy as np
    >>> x=np.arange(0,4)
    >>> y=np.array([0,1,1.9,3.1])
    >>> np.polyfit(x,y,1)
    array([ 1.02, -0.03])
    >>> np.polyfit(x,y,2)
    array([0.05, 0.87, 0.02])

    인터넷에서 구한 sine 데이터로 근사 함수를 구해봐야 겠다.

    #_*_ coding: utf-8 _*_
    import matplotlib
    matplotlib.use('Agg')
    
    import numpy as np
    from sklearn.preprocessing import PolynomialFeatures
    
    import csv 
    import tensorflow as tf
    import matplotlib.pyplot as plt 
    import pandas as pd
    
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import Dropout
    from keras.callbacks import ModelCheckpoint
    
    print ("Package Loaded")
    print ("데이터로 함수 근사하기")
    
    ipd = pd.read_csv("./sine.csv")
    print (ipd.head())
    print (ipd.shape)
    
    #column 선택.
    time=ipd.iloc[:,0].array
    sineValue=ipd.iloc[:,1].array
    #print(type(time))
    #print(time)
    #print(time)
    #print(sineValue)
    approxFunc = np.polyfit(time,sineValue,6, full=False)
    print(approxFunc)
    

    처음에 5,000개를 모두 시키니 애가 이상한 짓을 한다. 사인 웨이브 크기가 1이고 0.001 단위로 쪼갰다. 파랑색 선이 내가 예상한 그림인데 애가 작고 너무 티 안나게 그렸다. 오차를 줄이려 노력하다 보니 아무것도 아닌 그래프를 그렸다.

    이번에는 앞에 몇 개 잘랐다.

    tf-docker /home/tensorflow/tutorial/ItnSensor > cat sine.csv
    0,0.841470985
    0.001,0.873736397
    0.002,0.90255357
    0.003,0.927808777
    0.004,0.949402346
    0.005,0.967249058
    0.006,0.98127848
    0.007,0.991435244
    0.008,0.997679266
    0.009,0.999985904
    0.01,0.998346054
    0.011,0.992766189
    0.012,0.983268329
    0.013,0.969889958
    0.014,0.952683874
    0.015,0.931717983
    0.016,0.907075026
    0.017,0.878852258
    0.018,0.847161063
    0.019,0.812126509
    0.02,0.773886863
    0.021,0.73259304
    0.022,0.688408006
    0.023,0.64150614
    0.024,0.592072543
    0.025,0.540302306
    0.026,0.486399742
    0.027,0.430577581
    0.028,0.373056127
    0.029,0.314062391
    0.03,0.253829194
    0.031,0.192594249
    0.032,0.130599223

    이렇게 하면 좀 비슷하게 그린다. 입력으로 준 수치가 (0.032, 0.1305..)에서 끊어져 애는 끝까지 아래로 간다고 생각하나 보다.

    특정 부분을 보고 특징을 뽑아내야 하는데, 그냥 인공지능 하나 만들어서 하는게 낫다. 에러, 정확도가 얼마인지도 모르겠다.

  • 웹 크롤러+워드클라우드

    웹 크롤러+워드클라우드

    python으로 보기싫은 좃선, 중앙 제안 키워드를 빼고 뉴스를 검색해 보자. 계획은 아래와 같다.

    • 웹 크롤러를 만들어 조선, 중앙 인터넷 페이지를 접속한다.
    • 헤드라인을 긁어 파일로 저장한다.
    • 파일을 읽어 워드클라우드로 주요 키워드를 확인한다.
    • 구글뉴스로 키워드를 검색어 제외한다.

    웹 크롤러는 인터넷에 많이 공개되어 있어 쉽게 만들었다. 코드 몇 줄로 원하는 기능을 구현했다. 어려웠던 점은 복사한 코드를 수정한 점이다. 인터넷 코드가 json 형식으로 파일을 저장했다. 이를 텍스트로 변경하는 과정에 문제가 있었다. csv의 writerow를 dictionary 인자로 넣으면 한 글자마다 컴마를 찍는다. dictionary를 [] 괄호로 감싸야 된다.

    워드클라우드 역시 쉽다. 한글폰트를 명시하여 generate하면 바로 된다. 나머지 부족한 부분(plot을 파일로 저장 등)을 과거 코드에서 복사해서 해결했다.

    구글뉴스가 – 기호로 검색어를 제외하는 기능을 제공한다. +키워드없이 모두 -로 넣으면 범위를 너무 크게 잡는다. 한국어, 최근 1주일 등 범위를 좁혔다. 검색어 제외와 보통 검색을 비교해 보면 좀 효과가 있는 듯 하다.

    # -*- coding: utf-8 -*-
    import requests
    from bs4 import BeautifulSoup
    import os
    import csv
    
    from wordcloud import WordCloud
    
    import matplotlib
    matplotlib.use('Agg')
    import matplotlib.pyplot as plt
    
    
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    
    req = requests.get('http://www.chosun.com/')
    req.encoding=None
    html = req.text
    
    
    soup = BeautifulSoup(html, 'html.parser')
    
    
    #조선일보는 dl형식으로 헤드라인을 작성한다.
    my_contents = soup.find_all('dl', {'class':'news_item'}, 'dt')
    
    
    data = {}
    
    
    #임의의 키를 만들어서 저장.
    index = 0
    
    for content in my_contents:
        data[index] = content.text
        index = index + 1
    
    
    ###중앙일보
    req = requests.get('https://joongang.joins.com/')
    req.encoding=None
    html = req.text
    soup = BeautifulSoup(html, 'html.parser')
    
    #중알일보는 li형식으로 헤드라인을 만든다.
    my_contents = soup.find_all('li')
    
    
    for content in my_contents:
        data[index] = content.text
        index = index + 1
    
    print(data.values())
    
    with open(os.path.join(BASE_DIR, 'result.csv'), 'w', encoding='utf8') as csv_file:
        writer = csv.writer(csv_file)
        for key in data.keys():
        #writer = csv.DictWriter(csv_file, data.keys())
        #writer = csv.writer(csv_file, delimiter=',')
            #print(data[key])
            writer.writerow([data[key]])
    
    csv_file.close()
    
    ##word cloud
    
    
    text = open(os.path.join(BASE_DIR, 'result.csv'), 'r', encoding='utf8').read()
    
    #한글 폰트를 사용하기 위해, 명시
    wordcloud = WordCloud(font_path='/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf', background_color='white').generate(text)
    
    plt.figure()
    plt.imshow(wordcloud, interpolation="bilinear")
    plt.axis("off")
    plt.show()
    plt.savefig('./wordcloud.jpg',format='jpg', dpi=300)
    

    고해상도 이미지를 원하면 아래와 같이 작업한다.

    wordcloud = WordCloud(width=800, height=400).generate(text)
    plt.figure( figsize=(20,10) )
    plt.imshow(wordcloud)

    참조 사이트

    https://datamod.tistory.com/104

    json으로 저장할 경우, utf8 방식으로 저장.

    https://beomi.github.io/2017/01/20/HowToMakeWebCrawler/

    웹 크롤러 기본.

    http://pythonstudy.xyz/python/article/403-%ED%8C%8C%EC%9D%B4%EC%8D%AC-Web-Scraping

    requests 한글 사용.

    https://twpower.github.io/84-how-to-use-beautiful-soup

    beautifulsoup 기본.

    https://medium.com/@gis10kwo/converting-nested-json-data-to-csv-using-python-pandas-dc6eddc69175

    json to csv, pandas

    https://www.programiz.com/python-programming/working-csv-files

    write to csv

    https://stackoverflow.com/questions/1816880/why-does-csvwriter-writerow-put-a-comma-after-each-character

    writerow 할 때, 각 글자뒤에 comma 삽입될 때.

    https://myjamong.tistory.com/48

    wordcloud 사용에 한글 폰트 설정

    https://stackoverflow.com/questions/28786534/increase-resolution-with-word-cloud-and-remove-empty-border/28795577

    고해상도 wordcloud