반응형

1. 패키지와 키 업데이트

 

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update

 

 

 

2. ROS Melodic 설치

 

sudo apt install ros-melodic-desktop-full

 

 

 

3. rosdep 설치 및 초기화

 

sudo apt-get install python-pip
sudo pip install -U rosdep
sudo rosdep init

*** 아래 부분은 sudo가 붙지 않는다. (나중에 권한 문제가 생길 수 있다.)

rosdep update

 

 

 

4. 환경설정

 

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

 

 

 

5.  패키지 작성을 위한 툴 설치

 

sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential

 

 

 

6. 작업공간 세팅 및 초기화

 

mkdir -p catkin_ws/src
cd catkin_ws/
catkin_make

 

 

 

 

이제 roscore을 입력하여 실행시켜보자.

반응형
반응형

우선 QT Designer을 사용하여 Widget을 하나 만들고

pyqtgraph를 통해 그래프를 하나 그릴 수 있는 환경을 만든다.

 

 

과정은 간단하다.

 

ticks 에는 (0, 'A'), (1, 'B'), (2, 'C'), ...   이러한 형식으로 데이터가 들어가게 된다.

 

QT Designer에서 만든 Widget(pyqtgraph)의 'bottom'축을 받아와 xax에 저장해주고

받아온 x축의 이름을 앞에서 만든 ticks로 바꿔준다.

 

그럼 해당 숫자에 해당되는 자리에 문자로 표시되게 된다.

 

이를 좀 더 이쁘게 써보자.

 

결론적으로 x데이터는 숫자여야 한다.

문자로 표시가 되어도 결국엔 숫자가 들어있어야 한다.

 

그래서 x데이터를 문자로 입력하게되면

x데이터를 문자의 갯수로 변경해주고

setTick을 통해 다시 문자로 표시될 수 있도록 변경해준다.

반응형

'이것저것' 카테고리의 다른 글

Ubuntu에서 WiFi연결(hp노트북, rtl8821ce)  (1) 2020.12.29
윈도우 파티션 합치기  (0) 2020.12.29
calibration  (0) 2020.03.20
Visual Studio 에서 scanf 오류날때(C4996)  (0) 2019.09.15
티스토리에서 수식 입력하기  (0) 2019.08.13
반응형

파일을 읽어오는데 계속 문제가 발생한다.

 

csv파일이 저장될때의 encoding방식을 알아야 해당 파일을 정확히 읽어올 수 있을 것 같다.

 

 

위의 방식으로 해당 파일의 인코딩 방식을 알아보면

위와같이 ascii 형식으로 encoding 되었다고 출력되는데

 

이렇게 파일의 encoding 방식을 ascii라고 지정해주면

 

이러한 에러가 출력된다.

 

아무래도 ascii로 인코딩된게 아닌 것 같다.

 

 

해당 파일은 SPR장비의 Punching부분의 센서를 통해 출력되는 데이터고 SPR장비는 독일의 Bollhoff 제품이다.

 

따라서 독일어의 인코딩방식을 적용하니 잘 출력이 된다.

 

ko.wikipedia.org/wiki/%EB%AC%B8%EC%9E%90_%EC%9D%B8%EC%BD%94%EB%94%A9

 

문자 인코딩 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 문자 인코딩영어: character encoding), 줄여서 인코딩은 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것을 말한다. 넓은 의미의 컴퓨

ko.wikipedia.org

위의 링크를 통해 인코딩을 진행하는 문자열 세트의 종류를 확인해볼 수 있다.

 

 

 

그럼 ISO 8859-16 인 독일어 encoding 방식으로 파일을 열어 데이터를 불러오자.

측정데이터는 , 로 구분되어있으므로 이를 기준으로 나누어 출력해보자.

 

 

값들을 잘 저장하다가 중간에 공백이 긴 문자열을 만나면서 '      \x007473.00' 은 float으로 바꿀 수 없다는 에러가 뜬다.

 

그럼 파일의 해당 라인에 무슨 일이 벌어지고 있길래 저리 긴 공백이 포함되어있고 왜 진행이 안되는지 알아보자.

해당 라인의 데이터를 ,로 구분하여 모두 출력해봤다.

 

데이터들을 잘 불러오다가 중간중간 위의 에러에서 말한듯이 긴 공백과 함께 \x00 이 붙은 값이 보인다.

 

이를 해결하기 위해 골머리를 좀 썩혔다.

 

 

우선 해당 라인을 , 로 구분하는 것이 아닌 \x00 으로 구분하자.

긴 공백과 함께 \x00 은 데이터라인에 5~6번 등장하므로 이를 기준으로 구분하여 새로운 데이터라인을 만든다.

 

아까 보였던 \x00 이라는 보기싫은 문자가 보이지 않게 되었다.

이를 기준으로 나누었으므로 이는 기준이 되어 보이지 않고 이를 앞, 뒤로

'DataDataData   ', 'DataDataData   ','....'  형태로 나뉘게 된다.

 

그럼 line_data[0] 에는 처음 \x00이 나오기 전까지의 데이터들이 하나의 데이터로 저장되어있고 우리는 원하는 값을 얻기위해 이를 ',' 를 기준으로 나누어줄 필요가 있다.

 

우선 지금 총 몇개의 데이터로 나누어져있는지 파악하기 위해

위의 코드에서

 

print(len(data)) 를 사용하여 출력해봤다.   13이라는 출력값을 확인했다.

 

그럼 반복문을 13번 진행하여 해당 데이터라인을 다시 ' , '로 나누어주자.

 

그럼 이렇게 \x00 으로 한번 나뉘고 ' , ' 를 기준으로 다시 한번 나눠진 2차원 배열형태가 된다.

 

그럼 이제 다시 새로운 리스트를 만들어 해당 값들을 모두 한번에 넣어주자.

 

이 과정도 생각보다 골머리를 썩혔다.

 

이 방법이 좋은방법은 아닐거같고 더 좋은 방법이 있을 것으로 생각되지만

일단 지금은 생각이 나지 않으므로 지금 생각 난 방법으로 작성하고 향후 더 좋은 방법이 생각나면

개선하도록 하겠다.

 

우선 배열의 [0][0] 에는 빈칸이 들어있다.

그리고 [1][0] 에는 Value...... 라는 문자열이 들어있고

[1][n], [2][n] 즉 각 배열의 가장 끝 요소에는 공백이 들어가있다.

 

위의 3가지 경우를 고려하여 유의미한 데이터의 개수를 파악할 수 있다.

그리고 유의미한 데이터들의 위치를 알고있으므로 해당 값들을 가져올수도 있다.

 

우선 유의미한 데이터들의 개수부터 알아보자.

 

 

j와 k 변수를 통해 반복문을 실행하면서 위의 3가지 경우에서는 count를 진행하지않고 넘어가도록 하여

최종적으로 유의미한 데이터의 개수를 count변수에 저장하였다.

 

그리고 이를 통해 유의미한 데이터들을 담아줄 배열의 크기를 지정해준다.

 

 

데이터가 담길 크기를 지정해줬으므로 이제 유의미한 데이터들을 넣어주자.

 

다시 count를 0으로 셋팅해주고 위와 과정을 반복하여 유의미한 데이터를 넣어주자.

 

잠깐.

앞에서 유의미한 데이터가 담길 배열 크기를 지정해주기 위해 count를 세는 반복문을 진행하였다.

그냥 리스트가 꽉 차면 동적으로 늘려줄 수 는 없는걸까?

 

좋은 방법을 찾았다.

list에 append함수를 사용하여 값을 추가하여 주는 것이다.

 

 

위와 같이 작성하여 last_array를 출력해보면 값은 잘 들어가있는데

그래프로 나타내는 과정에서 문제가 발생한다.

(그래프 그리는 부분을 지우고 해보면 잘 된다.)

 

원인을 찾아보니 last_array 라는 list에 숫자로 값이 들어간 것이 아닌 문자열로 들어가 이러한 문제가 발생한 듯 싶다.

 

 

 

따라서 위와 같이 실행하니 그래프가 잘 출력된다.

 

이제 값들을 하나의 리스트에 저장하였으니 이들을 이용하여 Feature Data만 추출하면 되겠다.

csv.zip
0.01MB

반응형

'Project > CFRP' 카테고리의 다른 글

_csv.Error: line contains NULL byte  (0) 2020.10.28
반응형

파이썬으로 csv파일을 읽어와 작업을 하려고하는데 아래와 같은 에러가 발생한다.

 

 

해당 파일에 말 그대로 NULL byte가 존재해 발생하는 에러로 파일을 읽어오는 방식을 변경하여서 이를 해결했다.

 

처음에는 pd.read_csv 함수를 사용하여 파일을 읽어오려 했으나

다음과 같이 open함수를 사용하고 encoding 방식을 설정해줌으로서 이를 해결하였다.

 

 

 

encoding 방식에는 "uft-8" , "uft-16" 등 다양한 방법이 있었으나 이러한 방식들은 똑같은 에러를 출력하며

제대로 작동하지 않았고 나의 경우 "latin-1" 방식을 적용함으로서 해당 파일을 잘 불러올 수 있었다.

 

아래 내용은 해당 파일의 모든 데이터를 full_data에 저장하고

full_data에 저장된 문자들 중 23번째 라인을 불러와 line_data에 저장,

최종적으로 line_data에 저장된 값들을 "," 로 구분하여 받아올 수 있도록 작성한 것이다.

반응형

'Project > CFRP' 카테고리의 다른 글

.csv파일 읽어오기  (0) 2020.10.28
반응형

* Server Code

 

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#define BUFSIZE 1024
#define PORT_NUM 7000


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

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

void ErrorHandling(const char* message);


int main(int argc, char** argv) {

    WSADATA wsaData;
    SOCKET servSock, clntSock;   //SOCKET은 사실 UINT_PTR 형이다.
    SOCKADDR_IN servAddr, clntAddr;


    char message[BUFSIZE]; //Message Buffer
    int strLen;
    int fromLen, nRcv;

    int len = 0;

    
    printf("Port Num: 7000");


    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        ErrorHandling("Load WinSock 2.2 DLL Error");

    servSock = socket(PF_INET, SOCK_STREAM, 0);
    if (servSock == INVALID_SOCKET)
        ErrorHandling("Socket Error");

    memset(&servAddr, 0, sizeof(SOCKADDR_IN));
    servAddr.sin_family = AF_INET;
    servAddr.sin_port = PORT_NUM;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    if (bind(servSock, (struct sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
        ErrorHandling("Bind Error");

    if (listen(servSock, 2) == SOCKET_ERROR)
        ErrorHandling("Listen Error");

    fromLen = sizeof(clntAddr);


    clntSock = accept(servSock, (struct sockaddr*)&clntAddr, &fromLen);    //// 클라이언트의 접속 요청을 수락
    if (clntSock == INVALID_SOCKET) {
        ErrorHandling("Accept Error");
    }
    else {
        printf("%s Connection Complete!\n", inet_ntoa(clntAddr.sin_addr));
        printf("Start ...\n");
    }
    closesocket(servSock);



    FILE* image;
    image = fopen("C:/Users/94hsk/Desktop/recv.jpg", "wb");
   
    while ((len = recv(clntSock, message, sizeof(message) - 1, 0)) != 0)
    {
        fwrite(message, sizeof(char), sizeof(message) - 1, image);
        if (feof(image))break;
    }

    fclose(image);
    closesocket(clntSock);
    WSACleanup();

    printf("Close Connection..\n");

    return 0;
}

void ErrorHandling(const char* message) {
    WSACleanup();
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

 

 

 

*Client Code

 

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS

#include <winsock2.h>
#include <stdio.h>

#include <stdlib.h>
#include <conio.h>


#include <WS2tcpip.h>


#pragma comment(lib, "ws2_32.lib")
//#include<arpa/inet.h>



#define BUFSIZE 1024

void ErrorHandling(const char* message);

int main(int argc, char** argv) {

    SOCKET clntSock;    // 소켓 생성
    WSADATA wsaData;
    SOCKADDR_IN servAddr;

    char sAddr[15];
    int sPort;
    int nRcv;
    unsigned int Addr;
    char message[BUFSIZE];
    char message2[BUFSIZE];

    struct hostent* host;

    FILE* fp;
    size_t len;

    fp = NULL;
    fp = fopen("C:/Users/94hsk/Desktop/lena.jpg", "rb");


    if (fp  == NULL)
        ErrorHandling("Image Read Fail");

    printf("Server Address : ");       gets_s(sAddr, sizeof(sAddr));   /// gets_s함수는 입력을 받는 함수로
    printf("Port Number : ");       gets_s(message, sizeof(message));   // 해당 크기만큼의 문자열을 받아 저장한다.
    sPort = atoi(message);  // 문자열을 정수 타입으로 변경해주는 함수이다.
                            // 왜 변경하지?
                            // message에 문자가 들어가면 바로 0을 반환
                            // 문자가 숫자로 시작할 시 숫자 반환
                            // 숫자+문자의 경우 문자 나오기 전까지 숫자 반환
                            // 문자+숫자의 경우 0 반환
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)  // 소캣 사용 전 초기화를 진행하고 초기화 정보를 wasData에 저장
        ErrorHandling("Load WinSock 2.2 DLL Error");    // 초기화 성공하면 0 반환

    clntSock = socket(AF_INET, SOCK_STREAM, 0); // socket(int domain, int Type, int protocol);
                                                // 소캣을 생성한다.
                                                // AF_INET 체계는 주소체계를 사용하며 IPv4인터넷 프로토콜 사용

    if (clntSock == INVALID_SOCKET)
        ErrorHandling("Socket Error");

    memset(&servAddr, 0, sizeof(servAddr)); // memset 함수는 어떤 메모리의 시작점부터 연속된 범위를 어떤 값으로
                                            // 모두 지정하고 싶을때 사용하는 함수
                                // 채우고자 하는 메모리의 시작 주소 : servAddr
                                // 메모리에 채우고자 하는 값 : 0
                                // 채우고자 하는 메모리의 크기 : sizeof(servAddr)
    
    //// SOCKADDR_IN 구조체의 객체 servAddr
    //// 위의 구조체는 IPv4 주소를 저장하는 구조체이다.
    //// 주소 체계, 포트 정보, IPv4 주소 등을 저장한다.
    
    
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr(sAddr);
    
    //// SOCKADDR_IN 구조체의 구조체변수 servAddr에 대해 설정을 진행한다.
    //// sin_addr 값에는 IP주소를 나타내는 32비트 정수 탑이의 구조체가 들어간다.
    //// 즉 입력받은 iP주소를 통해 통신을 설정해주는 부분이다.
    void* dst;
    int check;


    //servAddr.sin_port = htons(sPort);
    servAddr.sin_port = (sPort);


    if (connect(clntSock, (struct sockaddr*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) {
        ErrorHandling("Connection Error");
    }
    else {
        printf("Connect OK!\nStart...\n");
    }


    while (1)
    {
        printf("sending\n");
        len = fread(message2, sizeof(char), BUFSIZE-1, fp);
        send(clntSock, message2, len, 0);
        if (feof(fp))break;
    }
    printf("Sending Done! \n");
    shutdown(clntSock, SD_SEND);

    len = recv(clntSock, message2, BUFSIZE - 1, 0);
    message2[len] = 0;
    puts(message2);

    fclose(fp);

    closesocket(clntSock);
    WSACleanup();           /// 소캣 종료
    printf("Close Connection..\n");

    return 0;
}


void ErrorHandling(const char* message) {
    WSACleanup();
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

 

반응형

'C++' 카테고리의 다른 글

C++ 내부정의, 외부정의, 헤더파일  (0) 2020.01.09
객체지향언어  (0) 2020.01.08
반응형

pcl 1.8 install.txt
0.00MB

위 파일 그대로 진행

반응형
반응형

opencv 3.2 install.txt
0.00MB

과정 중 cmake 이후 make -j 를 진행하는 단계에서 아래와 같은 에러가 출력될 수 있다.

 

`/usr/lib/x86_64-linux-gnu/libGL.so'를 만들 규칙이 없습니다.  멈춤.

 

이는 NVIDIA의 그래픽 드라이버를 설치하는 과정에서 뭔가 문제가 opencv설치과정에서 접근하는 내용에 대해

수정이 되어 발생되는 문제같아 보인다.

 

이 경우 아래 코드를 진행한 후 다시 make 단계를 진행해보자.

 

$ sudo rm /usr/lib/x86_64-linux-gnu/libGL.so 

 

$ sudo ln -s /usr/lib/libGL.so.1 /usr/lib/x86_64-linux-gnu/libGL.so 

 

 

 

 

 

techtidings.blogspot.com/2012/01/problem-with-libglso-on-64-bit-ubuntu.html

 

Problem with libGL.so on 64-bit Ubuntu

I have an Nvidia card and as expected I installed Nvidia drivers for my ubuntu. But, whenever I compiled programs that used OpenGL ( libGL...

techtidings.blogspot.com

위의 링크를 참고하여 작성하였다.

반응형
반응형

모든 내용은  blog.naver.com/hyunmonn/222085247469 님의 자료를 토대로 실행한 과정입니다.

 

 

 

사전 준비로

* VisualStudio 2019

* https://github.com/AlexeyAB/darknet 여기의 링크에서 zip파일을 다운로드받고

* cmake.org/download/ 여기의 링크에서 최신버전의 .msi 파일을 다운받는다.

그리고 물체인식을 위한 이미지파일들이 필요하다.

(나는 비행기 사진들과 새 사진들을 사용하였다.)

 

CMake 프로그램을 실행시킨 후 상단의

"Where is the source code" 부분에 zip파일로 다운받은 내용인 폴더의 경로를 넣어주고

"Where to build the binaries" 부분에 해당 파일안의 build 폴더 경로를 지정해준다.

 

그리고 프로그램 하단의 configure을 눌러 진행하게 되면 아래와 같은 창이 뜨게되는데

본인의 PC환경에 맞추어 작성해준다.  나는 VS2019 버전과 64bit 환경에서 작업하므로

아래와 같이 입력해주었다.

그 결과 아래와 같이 출력됨을 확인할 수 있다.

 

openCV_DIR에 경로가 NOTFOUND로 되어있으면 opencv경로의 build/x64xvc15/lib 폴더로 지정해주어

아래와 같이 설정한다.

 

아래와 같이 설치 경로를 변경해준다.

 

CUDA가 인식되었는지 확인한다.

CMAKE_CUDA_COMPILER가 NOTFOUND로 되어있으면

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\bin\nvcc.exe    로 지정해주자.

(CMAKE_CUDA_COMPILER가 안보이면 search부분 우측의 "Advanced"가 체크되어있는지 확인해보자.)

이제 아래와 같이 설정하여 하단의 configure 버튼을 클릭한다.

 

 

그런데 하단과 같은 에러가 출력되게 된다.

CUDA toolset을 제대로 찾지 못한 것으로 보인다.

 

 

 

많이 찾아봤는데 버전 문제로 보인다.

게시물 상단에 링크한 블로거님의 게시물에는 Cuda Toolkit을 10.2로 진행할때 오류가 발생할 수 있어

10.1 의 설치를 권장하셨지만 나의 경우 10.1에서 오류가 발생하고 혹시나하는 마음에 10.2를 설치하여 진행한 결과

아래와 같이 정상적으로 configure 되는 것을 확인할 수 있다.

 

 

Configuring done 이 출력됨을 확인하였으면 generate를 눌러 실행한다.

 

 

Generating done 이 출력되지만 상당히 많은 Warning가 뜨는 것을 확인할 수 있다.

(무시하고 아래 Build과정을 진행해보자.  나의 경우 Warning이 뜨긴 하였지만 Build 는 이상없이 잘 되었다.)

 

 

다시 git에서 다운받은 darknet-master 폴더로 들어가 build폴더 안에있는 솔루션 파일을 열어

Build를 진행해준다.

 

과정은 아래와 같다.

 

프로젝트 파일을 열면 위와 같이 프로젝트들의 목록을 확인할 수 있다.

이 부분을 우클릭하여 빌드해준다.(아래 사진처럼)

 

그럼 이제 이미지들을 yolo에서 인식할 수 있게 이미지에서 물체의 범위를 추출해보자.

 

https://github.com/AlexeyAB/Yolo_mark

 

위의 링크에서 zip파일을 다운받은 후 압축을 풀어준다.

 

Yolo_mark-master 폴더에 솔루션파일이 있다.

 

위의 이미지와 같이 나타날텐데 상단에서 모드를 Release모드로 설정해준 후 프로그램을 컴파일 및 실행시켜보자.

 

그럼  x64 폴더의 Release폴더에 yolo_mark 라는 이름의 실행파일이 생성된다.

 

yolo_mark.exe 의 실행파일은 이미지들의 경로와 txt파일을 저장할 이름, 그리고 label 될 이름을 파라미터로 필요로한다.

 

 

Release 폴더에서 상단의 주소 부분에 cmd를 입력하여 실행시켜보자.

주소 부분에 cmd 입력

그럼 위와 같은 cmd창이 나타나게 된다.

 

경로\Yolo_mark-master\x64\Release>yolo_mark.exe

 

yolo_mark.exe를 입력하면 필요한 파라미터들이 출력된다.

 

그럼 Release 폴더의 data, img 폴더에 이미지들을 모두 넣어주자.

 

여기까지 진행되었다면 앞의 img폴더로 다시 돌아와 obj이름의 텍스트파일을 생성해주자.

 

그리고 텍스트파일에 사진들을 구분할 label을 입력하여준다.

나는 비행기와 새를 구분할 것이므로 plane과 bird를 라벨링할것이다.

 

각각의 물체에 대해 각각 다른 줄로 작성해준다.

 

그 후 아래처럼 해당 텍스트파일을 다른이름으로 저장하면서

파일형식은 '모든 파일' 로 선택하고 파일 이름 뒤에 .names 를 붙여 names형식의 파일을 만들어준다.

 

 

그리고 기존의 obj.txt 파일은 삭제해준다.

 

 

그럼 아까와 같이 Release 경로에서 주소창에 cmd를 입력하여 아래 명령어를 입력해준다.

 

경로>yolo_mark.exe data\img data\train.txt data\obj.names

 

그럼 위와같이 각각의 사진에 대해 물체의 영역을 지정해줄 수 있는 프로그램이 실행된다.

 

마우스로 해당 물체를 선택해주자.

하나의 이미지에 대해 물체가 선택되었다면 아래와 같이 보이게 된다.

 

그럼 키보드의 -> 화살표를 이용하여 다음 이미지로 넘어가고 다시 물체영역을 지정해주자.

 

한장에 여러개의 물체가 있는 경우 위와 같이 따로따로 선택해주자.

 

비행기가 끝나고 새 사진이 나오게 되면 object를 변경해주어야 한다.

 

상단의 스크롤을 옮겨 Object id가 변경됨을 확인하고 다시 객체의 영역을 지정해주자.

 

완료되었으면 ESC를 눌러 종료

 

 

data폴더의 image폴더에서 각각의 이미지에 대한 데이터가 담긴 txt파일이 생성되었음을 확인할 수 있다.

 

또한 data폴더의 train.txt 파일에 데이터가 입력되었음을 확인할 수 있다.

 

여기서 train 이미지들에 대한 정보들이 train.txt 폴더에 저장되었는데 test이미지들 역시 이와 같은

방식으로 진행하여 test.txt 파일을 저장해주자.

 

 

 

이렇게 데이터셋  준비가 끝났다.

반응형

+ Recent posts