728x90
반응형

 

Chat GPT

 Chat GPT는 OpenAI 재단에서 GPT-3.5 모델로 만든 인공지능 챗봇이다. 

기존 3.0 버전도 성능이 좋았지만 ChatGPT는 직접 사용 해보고 꽤 충격을 받았다. 공식적으로는 해당 모델이 인터넷에 연결되어있지 않고, 2021년까지의 데이터를 기반으로 학습되었기 때문에 아래처럼 정확하지 않은 정보를 진실처럼 전달해주기도 한다.

하지만 공식 또는 지식과 같은 내용을 질문한다면 문맥 파악 능력과 정확하고 방대한 지식에 큰 충격을 받을 것이다.

개인적으로 웹 서비스를 만들면서 생겼던 문제를 Chat GPT에게 물어보면서 해결하는 과정을 글로 작성해보았다.

 

해당 모델에 대한 좀 더 자세한 내용은 아래 기사를 참고하자.

 

오픈AI, 'GPT-3.5' 모델 공개 - AI타임스

오픈AI가 대형 언어모델인 \'GPT-3\'의 뒤를 잇는 \'GPT-3.5\' 시리즈 모델을 선보였다. 자연어처리 모델 ‘다빈치-003’과 대화형 모델인 ‘챗GPT’다.다빈치-003은 인간의 피드백을 통한 강화학습을 이

www.aitimes.com

 


Chat GPT로 문제 상황 해결하기

 먼저 내가 겪은 문제 상황은 Flask 백엔드에서 ['A', 'B', 'C']와 같은 문자열 리스트 형태의 데이터를 render_template로 프론트에게 전달하면서 발생했다. 프론트에서 전달받은 데이터는 리스트가 아닌 문자열로 인식되었고 중간의 ' 기호를 코드로 나타내면서 아래처럼 ' 로 변환되어 표시되었다.

 

구글에서 검색해봤지만 명확한 이유가 설명된 글이 거의 없었고, 위와 비슷한 상황을 찾기 위한 검색어를 만드는 것 자체가 어려웠다. 그래서 AI에게 물어보기로 했다.

 

 

먼저 내 상황을 그대로 물어보았다. str.replace(/'/g, "\'"); 를 사용하여 해결할 수 있지만 복잡하고 번거로운 방법이라 추천하지 않는다고 한다. 아직 답변이 조금 부족하다고 생각해서 다시 질문해보았다.

 

처음보다 괜찮은 방법인 것 같지만 여전히 추천하지 않는다고 한다. AI가 추천하는 방법이 궁금해졌다.

 

여기까지만 봐도 충분히 해결할 수 있겠지만 내 코드에 이 내용을 어떻게 적용하면 좋을 지 물어보기로 했다.

작성한 코드의 일부를 그대로 복사해서 물어봐도 정확하게 알려주었다..!

 

AI가 알려준대로 코드를 수정해보자.

<script>
        var ticker_index = JSON.parse('{{ ticker_index | safe }}');
        var ticker_value = JSON.parse('{{ ticker_value | safe }}');
        var aver_step = "{{ aver_step }}"

        var chart = new Chart(document.getElementById(ticker).getContext('2d'), {
        type: 'line',
        data: {
            labels: ticker_index,
            datasets: [{
            label: 'Close Price',
            backgroundColor: 'transparent',
            borderColor: 'blue',
            data: ticker_value,
            }]
        },
        options: {
            scales: {
	    		yAxes: [{
	    			ticks: {
	    				stepSize : aver_step,
	    				fontSize : 12,
		    		}
		    	}]
		    }
        }
        });

    </script>
@app.route('/graph', methods=['GET', 'POST'])
def graph():
    if 'id' not in session:
        return render_template('signin.html')

    if request.method == 'POST':
        try:
            ticker = request.form.get("ticker")
            startdate = request.form.get("startdate")
            #enddate = request.form.get("enddate")
            enddate = datetime.now()
            interval = request.form.get("interval")
            kind = request.form.get("kind")
            
            yf_Ticker = yf.Ticker(ticker)
            
            ticker_data = yf_Ticker.history(start=startdate, end=enddate, interval=interval)[kind]
            ticker_index = (lambda origin: [str(tmp.strftime("%Y-%m-%d")) for tmp in list(origin.index)])(ticker_data)
            ticker_value = (lambda origin: [round(tmp, 2) for tmp in list(origin.values)])(ticker_data)
            aver_step = (max(ticker_value) - min(ticker_value)) / len(ticker_value)
            
            ticker_index_str = json.dumps(ticker_index)
            ticker_value_str = json.dumps(ticker_value)
        except Exception as e:
            return render_template('error_500.html', ticker=ticker, exception_msg=e)   
        
    elif request.method == 'GET':
        ticker = ""
        ticker_index = []
        ticker_value = []
        aver_step = 0
        
    return render_template('graph.html', ticker=ticker, ticker_index=ticker_index_str, ticker_value=ticker_value_str, aver_step=aver_step)

 

코드를 수정하고 다시 실행하여 정상적으로 제거된 걸 볼 수 있다.


후기

내가 위에서 물어본 질문은 사람이해도 크게 어렵지 않은 부분이었지만 하나의 예시일 뿐이고, Chat GPT는 학습한 거의 모든 데이터를 인간 전문가 정도의 수준으로 알고 있는 것 같다. 수학과 물리학 등의 이론을 물어보거나 이야기를 물어봐도 답해줄 수 있다. 잘못된 데이터로 학습하지만 않았다면 분야를 가리지 않는 방대한 분야의 지식을 왠만한 사람들보다 정확하게 (그리고 원한다면 영어, 러시아어, 중국어로도) 설명해준다.

드론 PID 튜닝

 

심지어 이런 위에서 말한 내용을 기억하고 새로운 내용을 추가한 답변을 하거나, 코드와 관련된 github 링크를 추천해주기도 한다.

 

이 글에서 모든 활용방법을 설명할 순 없고, 모든 답변이 다 정확한 건 아니지만 이 정도 수준만 되어도 현실의 다양한 문제를 질문하여 해결할 수 있었다.

만약 인터넷에 연결되어 전세계의 모든 데이터를 실시간으로 학습한다면 더 정교하고 방대한 신경망 모델이 될거라고 생각한다.

728x90
반응형
728x90
반응형

H.264, MPEG, FFmpeg 관련 설명

https://beankhan.tistory.com/212



FFmpeg Visual Studio 빌드

https://sinsisao.tistory.com/2



avframe 자료형 관련 매뉴얼

https://ffmpeg.org/doxygen/2.7/structAVFrame.html



디코딩/ 인코딩 관련 예제

http://wiki.gurubee.net/pages/viewpage.action?pageId=30966295



멀티미디어 관련 글 외 다양한 글들이 잘 정리되어 있음 (구루비)

http://wiki.gurubee.net/display/SWDEV/Home



vp9 관련

https://namu.wiki/w/VP9(%EB%B9%84%EB%94%94%EC%98%A4%20%EC%BD%94%EB%8D%B1)


https://blog.naver.com/elimnet1/220687657398


https://stackoverrun.com/ko/q/4768371



gstreamer 관련

https://yujuwon.tistory.com/entry/GStreamer%EB%9E%80

728x90
반응형
728x90
반응형

1. 목적 

- [프로젝트> 그룹> 커뮤니케이션] 중 화상 회의/영상 채팅 기술을 구현하기 위한 연습코드

- TCP/IP 연결이 성립된 상태에서 1:1로 실시간 단방향 영상 전송을 구현

 

2. 구성

- 노트북 카메라 연결 -> 영상 캡쳐 후 파일 저장 -> 저장된 이미지 파일을 TCP/IP 소켓으로 전송해줌 -> 클라이언트에서는 파일로 받은 후 이미지를 보여줌

- 언어는 C/C++, 네트워크는 윈도우 소켓, 형식은 윈도우 실행파일(exe), 라이브러리는 동적로딩으로 활용(DLL 파일 따로 필요)

- 베이스 코드 : https://hwan001.tistory.com/54?category=747955

 

3. 코드

// windows socket
#include <winsock2.h>

// windows
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// opencv 
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;

#pragma comment(lib, "ws2_32.lib")

// Socket
#define IP "127.0.0.1"
#define PORT 6667
#define BUFSIZE 44000

void server();
void client(char *server_ip);
void client_send(SOCKET *sock);
void server_recv(SOCKET *client_sock);

int main() {
    int sel;
    char server_ip[21];
    printf("1: server\n2:client\n3.tmp file clear >");
    scanf_s("%d", &sel);
    switch (sel)
    {
    case 1: // 서버로 수신
        server();
        break;
    case 2: // 클라이언트로 전송
        printf("Server IP : ");
        scanf_s("%s", server_ip, 21);
        if (!strcmp(server_ip, "test")) {
            strcpy(server_ip, IP);
        }
        printf("%s\n", server_ip);
        client(server_ip);
        break;
    case 3: // 임시 파일 삭제
        remove("recv.jpg");
        remove("tmp.jpg");
        break;
    default:
        break;
    }
    return 0;
}

void client(char *server_ip) {
    // WSA  초기화
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    // 소켓 만들기
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN addr;
    // 소켓 설정
    ZeroMemory(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(server_ip);
    addr.sin_port = htons(PORT);
    
    // TCP 연결 시도
    connect(sock, (SOCKADDR *)&addr, sizeof(addr));
    // 영상 전송
    client_send(&sock);
    // 마무리
    closesocket(sock);
    WSACleanup();
    remove("tmp.jpg");
}

void server() {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    // 소켓 만들기
    SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN addr;
    // 소켓 설정
    ZeroMemory(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(PORT);
    
    bind(sock, (SOCKADDR *)&addr, sizeof(addr));
    listen(sock, 2);
    printf("listen ok\n");
    // 클라이언트 연결 요청 수락
    SOCKADDR_IN client_addr;
    ZeroMemory(&client_addr, sizeof(client_addr));
    int nlen = sizeof(client_addr);
    SOCKET client_sock = accept(sock, (SOCKADDR *)&client_addr, &nlen);
    // TCP 연결 수립
    printf("clinet IP : %s\n", inet_ntoa(client_addr.sin_addr));
    // 영상 수신
    server_recv(&client_sock);
    // 마무리
    closesocket(sock);
    WSACleanup();
    remove("recv.jpg");
}

// server function
void server_recv(SOCKET *client_sock) {
    FILE *fp = NULL;
    char buf[BUFSIZE];
    char buf2[BUFSIZE];
    Mat image;
    while (1) {
        // 이미지 파일 수신
        ZeroMemory(buf, NULL);
        fopen_s(&fp, "recv.jpg", "wb");
        // 버퍼 채우기
        recv(*client_sock, buf, sizeof(buf), 0);
        fwrite(buf, BUFSIZE, 1, fp);
        // 버퍼를 두번 받으면 딜레이가 사라진다??
        recv(*client_sock, buf2, sizeof(buf2), 0);
        fwrite(buf2, BUFSIZE, 1, fp);
        fclose(fp);
        // 이미지 보여주기
        image = imread("recv.jpg");
        if (image.empty()) { continue; }
        else imshow("recv", image);
        // esc 누르면 종료
        if (waitKey(33) > 0) break;
    }
}

// client fuction
void client_send(SOCKET *sock) {
    FILE *fp = NULL;
    Mat image;
    VideoCapture cap(0);
    char buf[BUFSIZE];
    while (1) {
        // 카메라 접근 후 파일로 작성
        cap.read(image);
        resize(image, image, Size(300, 400));
        imwrite("tmp.jpg", image);
        // 파일 열어서 읽고 전송
        ZeroMemory(buf, NULL);
        fopen_s(&fp, "tmp.jpg", "rb");
        fread(buf, BUFSIZE, 1, fp);
        send(*sock, buf, sizeof(buf), 0);
        fclose(fp);
    }
}
 

4. 결과

 

 

5. 추가 기능

- 양방향 영상 송수신, IOCP, P2P, 코덱

728x90
반응형
728x90
반응형

http://shephexd.github.io/2018/06/21/Tensorflow_install.html


https://stackoverflow.com/questions/6622454/cuda-incompatible-with-my-gcc-version


http://noota.tistory.com/entry/우분투에서-gcc-손쉽게-설치하기



# 작성 중 - 20181215

728x90
반응형
728x90
반응형

 

 

 

1. OpenCV 다운로드 받기 [https://opencv.org/releases/]

- C드라이브에 설치해주면 'c:\\opencv' 가 기본 위치가 됨 

 

 

2. 프로젝트에 연결해주기 (프로젝트 클릭 후 Alt+Enter)

 

- VC++ 라이브러리> 포함 디렉터리 (include 폴더 선택), 

- VC++ 라이브러리> 라이브러리 디렉터리 (lib 폴더 선택) 

 

 

- 디버깅 > 환경   :   PATH=C:\opencv\build\x64\vc15\bin;%PATH%

 

 

-링커 > 입력> 추가 종속성   :    C:\opencv\build\x64\vc15\lib\opencv_world430d.lib   

 

 

** 추가 종속성 파일 입력 시 주의사항 : opencv_world430d.lib 파일은 디버그 모드로 컴파일 시 사용, 릴리즈에서 사용을 원하면 opencv_world430.lib 파일 경로 입력, 뒤에 숫자는 라이브러리 버전 별로 다름.

*** 위에 구성과 플랫폼을 변경해서 '디버그/ x86', '디버그/ x64', '릴리즈/x86', '릴리즈/ x64' 다 설정해주면 빌드 시 편함

 

 

 

3. 코드 내 라이브러리 호출

#include <stdio.h>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;

#pragma comment(lib, "ws2_32.lib")

int main() {
	return 0;
}
728x90
반응형
728x90
반응형

[Anaconda3] 


1. 아나콘다 리눅스 인스톨러(최신버전) 다운로드 (.sh 파일)

 링크 : https://www.anaconda.com/download/#linux


 


2. 설치된 폴더로 이동하여 설치 진행

 

 - 설치 : sudo bash Anaconda3-5.0.0.1-Linux-x86_64.sh

 - 설치시 설명은 ctrl-c, 대답은 전부 yes, 디렉토리는 본인 계정의 홈디렉토리로 해주면됨. ( ex) /home/hwan ) 

 - 홈 디렉토리로 설정 시 본인의 계정에서만 사용가능


3. 설치 확인 (python 실행)

 

 - 빨간색 줄처럼 뜨면 설치 완료

 - 뜨지 않는다면..

   export PYTHON_BIN_PATH = /home/'User Name'/ anaconda3/bin/python '

   명령어를 쳐주면됨. (아니면 개인 프로필 파일에(~/.profile) 직접 주가해줘도 됨)


4. Tensorflow 설치

 - cd ~/anaconda3/bin/ 

   :  설치된 아나콘다 디렉토리의 bin 디렉토리로 이동 (아나콘다 안에 tensorflow 라이브러리를 추가하기 위함)

 - sudo ./pip install tensorflow 

   : 아나콘다가 설치된 디렉토리 내에있는 pip를 사용하여 cpu 버전 텐서플로우를 설치


5. 설치 확인

 - python 실행후 import tensorflow

728x90
반응형
728x90
반응형

1. 파이썬 프로젝트를 만든다


2. python 환경 추가


3. Anaconda 4.2.0 체크 


4. import 하고 실행 -> 에러 안나면 성공



728x90
반응형
728x90
반응형


--------------------------------------------------------------------------------

 OS : Windows 10 64bits

  툴 : Visual Studio 2017 Community + Python, Anaconda3-4.2.0(64bits), TensorFlow (CPU)

--------------------------------------------------------------------------------


[ Visual Studio 2017 Community + Python ]


1. https://www.visualstudio.com/ko/vs/python




2. Community




3.  3개 체크, python 네이티브 개발 도구 선택


 



[ Anaconda3-4.2.0-Windows ]


1. Older version 설치 : https://www.continuum.io/downloads




2.  Anaconda3-4.2.0-Windows-x86_64 설치



3. 아나콘다 설치 : 둘 다 체크


[ Tensor Flow ]


 cmd -> pip install tensorflow





728x90
반응형

+ Recent posts