반응형

안녕하세요, 이번 포스팅에서는 파이썬을 이용한 데이터 분석에 대해 알아보고, 주식 시장 예측 모델링을 다룰 예정입니다.

새로운 분야에 뛰어들기 위해서는 이 분야에 필요한 전문적인 지식과 기술을 습득하는 것이 중요합니다. 최근 데이터 분석은 비즈니스 분야에서 많이 활용되고 있으며, 데이터 분석으로 얻은 인사이트를 기반으로 더 나은 전략을 수립할 수 있습니다.

데이터 분석을 위한 도구로는 파이썬이 가장 많이 사용되는 언어 중 하나입니다. 파이썬은 데이터를 가공하고 분석하기에 용이한 구조를 지니고 있으며, 더불어 다양한 라이브러리도 제공합니다.

이번 포스팅에서는 주식 시장 예측 모델링을 진행해보겠습니다. 주식 시장은 국내외 관심을 받는 대표적인 분야 중 하나입니다. 파이썬과 다양한 라이브러리를 활용하여 주식 시장의 데이터를 수집, 가공하고 이를 기반으로 시장 예측 모델을 만들어보겠습니다.

데이터 분석의 첫 번째 단계는 데이터 수집입니다. 이번 예시에서는 Yahoo Finance에서 제공하는 주식 데이터를 활용할 예정입니다. 주식 데이터는 다양한 정보를 포함하고 있으며, 향후 시장 동향을 예측하는 데 필요한 데이터를 선택해야 합니다.

다음으로는 데이터 전처리 과정입니다. 이 과정에서는 데이터의 결측값이나 이상치 등을 처리해야합니다. 또한 데이터에 대한 분석을 위해 그래프나 통계량 등을 계산하여 시각화하는 작업도 필요합니다.

마지막으로는 모델링입니다. 이 과정에서는 다양한 머신 러닝 알고리즘을 적용하여 모델을 만들고 성능을 검증합니다. 모델링 결과를 바탕으로 향후 시장 동향을 예측할 수 있습니다.

이번 포스팅에서는 파이썬과 다양한 라이브러리를 활용하여 주식 시장 예측 모델을 만드는 과정을 다루었습니다. 데이터 분석은 시대의 핵심 기술 중 하나이며, 앞으로 더욱 발전해 나갈 것입니다.

반응형

'Python' 카테고리의 다른 글

디자인 패턴  (0) 2022.04.14
OOP 5대 원칙(python 예제 포함)  (0) 2022.04.09
추상클래스(abstract class)  (0) 2022.04.09
덕 타이핑이란?  (0) 2022.04.09
opencv cv2.imshow 에러 해결방법  (0) 2022.03.31
반응형

기존 프로젝트의 모델을 다른 가상환경으로 로드해서 실행하니 다음과 같은 에러가 나온다.

이유: tensorflow 버전이 맞지 않음 즉, 저장한 모델의 버전과 불러올때의 버전이 맞지 않아서 파싱이 되지 않아 생기는 문제

해결 방법: 모델 저장시 사용했던 텐서플로우 버전으로 변경 후 로드

반응형

'인공지능' 카테고리의 다른 글

강화학습이란?  (0) 2022.05.24
[인공지능 서비스의 모든 것] 1. 인공지능이란?  (0) 2022.04.23
[Keras] 자주쓰는 callback 모음  (0) 2021.03.30
Pytorch CNN-LSTM 모델 설계  (0) 2021.03.17
pytorch class weight 주는법  (0) 2021.03.16
반응형

개요: 안드로이드 프로그래밍(자바)을 해서 딥러닝 기술이 적용되는 카메라앱을 만들어봅니다. 그리고 부분별로 소스코드를 분석합니다.

안드로이드 스튜디오를 이용합니다.

먼저, java파일은 해당하는 페이지의 기능을 담당하고 xml파일은 UI를 담당한다고 보시면 되겠습니다.

MainActivity.java를 생성해줍니다. 

MainActivity.java

/*
 원본 코드
 https://github.com/SkyeBeFreeman/SkyeCamera
 https://github.com/googlearchive/android-Camera2Basic/blob/master/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java

 수정
 webnautes
 */

package com.example.cameraapp;


import android.annotation.TargetApi;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.ImageFormat;
import android.graphics.Matrix;
import android.hardware.Sensor;
import android.hardware.SensorManager;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureFailure;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.TotalCaptureResult;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.media.ExifInterface;
import android.media.Image;
import android.media.ImageReader;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.appcompat.app.AppCompatActivity;

import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Size;
import android.util.SparseIntArray;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.Toast;


import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.Arrays;


public class MainActivity extends AppCompatActivity{

    private SurfaceView mSurfaceView;
    private SurfaceHolder mSurfaceViewHolder;
    private Handler mHandler;
    private ImageReader mImageReader;
    private CameraDevice mCameraDevice;
    private CaptureRequest.Builder mPreviewBuilder;
    private CameraCaptureSession mSession;
    private int mDeviceRotation;
    private Sensor mAccelerometer;
    private Sensor mMagnetometer;
    private SensorManager mSensorManager;
    private DeviceOrientation deviceOrientation;
    int mDSI_height, mDSI_width;

    private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
    static {
        ORIENTATIONS.append(ExifInterface.ORIENTATION_NORMAL, 0);
        ORIENTATIONS.append(ExifInterface.ORIENTATION_ROTATE_90, 90);
        ORIENTATIONS.append(ExifInterface.ORIENTATION_ROTATE_180, 180);
        ORIENTATIONS.append(ExifInterface.ORIENTATION_ROTATE_270, 270);
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 상태바를 안보이도록 합니다.
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // 화면 켜진 상태를 유지합니다.
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.activity_main);


        ImageButton button = findViewById(R.id.take_photo);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                takePicture();
            }
        });

        mSurfaceView = findViewById(R.id.surfaceView);
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        deviceOrientation = new DeviceOrientation();

        initSurfaceView();



    }

    @Override
    protected void onResume() {
        super.onResume();

        mSensorManager.registerListener(deviceOrientation.getEventListener(), mAccelerometer, SensorManager.SENSOR_DELAY_UI);
        mSensorManager.registerListener(deviceOrientation.getEventListener(), mMagnetometer, SensorManager.SENSOR_DELAY_UI);
    }

    @Override
    protected void onPause() {
        super.onPause();

        mSensorManager.unregisterListener(deviceOrientation.getEventListener());
    }

    public void initSurfaceView() {

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        mDSI_height = displayMetrics.heightPixels;
        mDSI_width = displayMetrics.widthPixels;


        mSurfaceViewHolder = mSurfaceView.getHolder();
        mSurfaceViewHolder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                initCameraAndPreview();
            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {

                if (mCameraDevice != null) {
                    mCameraDevice.close();
                    mCameraDevice = null;
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }


        });
    }


    @TargetApi(19)
    public void initCameraAndPreview() {
        HandlerThread handlerThread = new HandlerThread("CAMERA2");
        handlerThread.start();
        mHandler = new Handler(handlerThread.getLooper());
        Handler mainHandler = new Handler(getMainLooper());
        try {
            String mCameraId = "" + CameraCharacteristics.LENS_FACING_FRONT; // 후면 카메라 사용

            CameraManager mCameraManager = (CameraManager) this.getSystemService(Context.CAMERA_SERVICE);
            CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(mCameraId);
            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);

            Size largestPreviewSize = map.getOutputSizes(ImageFormat.JPEG)[0];
            Log.i("LargestSize", largestPreviewSize.getWidth() + " " + largestPreviewSize.getHeight());

            setAspectRatioTextureView(largestPreviewSize.getHeight(),largestPreviewSize.getWidth());

            mImageReader = ImageReader.newInstance(largestPreviewSize.getWidth(), largestPreviewSize.getHeight(), ImageFormat.JPEG,/*maxImages*/7);
            mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mainHandler);
            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            mCameraManager.openCamera(mCameraId, deviceStateCallback, mHandler);
        } catch (CameraAccessException e) {
            Toast.makeText(this, "카메라를 열지 못했습니다.", Toast.LENGTH_SHORT).show();
        }
    }


    private ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader reader) {

            Image image = reader.acquireNextImage();
            ByteBuffer buffer = image.getPlanes()[0].getBuffer();
            byte[] bytes = new byte[buffer.remaining()];
            buffer.get(bytes);
            final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            new SaveImageTask().execute(bitmap);
        }
    };


    private CameraDevice.StateCallback deviceStateCallback = new CameraDevice.StateCallback() {
        @Override
        public void onOpened(CameraDevice camera) {
            mCameraDevice = camera;
            try {
                takePreview();
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {
            if (mCameraDevice != null) {
                mCameraDevice.close();
                mCameraDevice = null;
            }
        }

        @Override
        public void onError(CameraDevice camera, int error) {
            Toast.makeText(MainActivity.this, "카메라를 열지 못했습니다.", Toast.LENGTH_SHORT).show();
        }
    };


    public void takePreview() throws CameraAccessException {
        mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        mPreviewBuilder.addTarget(mSurfaceViewHolder.getSurface());
        mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceViewHolder.getSurface(), mImageReader.getSurface()), mSessionPreviewStateCallback, mHandler);
    }

    private CameraCaptureSession.StateCallback mSessionPreviewStateCallback = new CameraCaptureSession.StateCallback() {
        @Override
        public void onConfigured(@NonNull CameraCaptureSession session) {
            mSession = session;

            try {

                mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
                mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
                mSession.setRepeatingRequest(mPreviewBuilder.build(), null, mHandler);
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
            Toast.makeText(MainActivity.this, "카메라 구성 실패", Toast.LENGTH_SHORT).show();
        }
    };

    private CameraCaptureSession.CaptureCallback mSessionCaptureCallback = new CameraCaptureSession.CaptureCallback() {
        @Override
        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
            mSession = session;
            unlockFocus();
        }

        @Override
        public void onCaptureProgressed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureResult partialResult) {
            mSession = session;
        }

        @Override
        public void onCaptureFailed(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull CaptureFailure failure) {
            super.onCaptureFailed(session, request, failure);
        }
    };



    public void takePicture() {

        try {
            CaptureRequest.Builder captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);//用来设置拍照请求的request
            captureRequestBuilder.addTarget(mImageReader.getSurface());
            captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);


            // 화면 회전 안되게 고정시켜 놓은 상태에서는 아래 로직으로 방향을 얻을 수 없어서
            // 센서를 사용하는 것으로 변경
            //deviceRotation = getResources().getConfiguration().orientation;
            mDeviceRotation = ORIENTATIONS.get(deviceOrientation.getOrientation());
            Log.d("@@@", mDeviceRotation+"");

            captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, mDeviceRotation);
            CaptureRequest mCaptureRequest = captureRequestBuilder.build();
            mSession.capture(mCaptureRequest, mSessionCaptureCallback, mHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }

    public Bitmap getRotatedBitmap(Bitmap bitmap, int degrees) throws Exception {
        if(bitmap == null) return null;
        if (degrees == 0) return bitmap;

        Matrix m = new Matrix();
        m.setRotate(degrees, (float) bitmap.getWidth() / 2, (float) bitmap.getHeight() / 2);

        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
    }



    /**
     * Unlock the focus. This method should be called when still image capture sequence is
     * finished.
     */
    private void unlockFocus() {
        try {
            // Reset the auto-focus trigger
            mPreviewBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                    CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
            mPreviewBuilder.set(CaptureRequest.CONTROL_AE_MODE,
                    CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
            mSession.capture(mPreviewBuilder.build(), mSessionCaptureCallback,
                    mHandler);
            // After this, the camera will go back to the normal state of preview.
            mSession.setRepeatingRequest(mPreviewBuilder.build(), mSessionCaptureCallback,
                    mHandler);
        } catch (CameraAccessException e) {
            e.printStackTrace();
        }
    }


    //출처 - https://codeday.me/ko/qa/20190310/39556.html
    /**
     * A copy of the Android internals  insertImage method, this method populates the
     * meta data with DATE_ADDED and DATE_TAKEN. This fixes a common problem where media
     * that is inserted manually gets saved at the end of the gallery (because date is not populated).
     * @see android.provider.MediaStore.Images.Media#insertImage(ContentResolver, Bitmap, String, String)
     */
    public static final String insertImage(ContentResolver cr,
                                           Bitmap source,
                                           String title,
                                           String description) {

        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.TITLE, title);
        values.put(MediaStore.Images.Media.DISPLAY_NAME, title);
        values.put(MediaStore.Images.Media.DESCRIPTION, description);
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        // Add the date meta data to ensure the image is added at the front of the gallery
        values.put(MediaStore.Images.Media.DATE_ADDED, System.currentTimeMillis());
        values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());

        Uri url = null;
        String stringUrl = null;    /* value to be returned */

        try {
            url = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

            if (source != null) {
                OutputStream imageOut = cr.openOutputStream(url);
                try {
                    source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
                } finally {
                    imageOut.close();
                }

            } else {
                cr.delete(url, null, null);
                url = null;
            }
        } catch (Exception e) {
            if (url != null) {
                cr.delete(url, null, null);
                url = null;
            }
        }

        if (url != null) {
            stringUrl = url.toString();
        }

        return stringUrl;
    }


    private class SaveImageTask extends AsyncTask<Bitmap, Void, Void> {

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            Toast.makeText(MainActivity.this, "사진을 저장하였습니다.", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected Void doInBackground(Bitmap... data) {

            Bitmap bitmap = null;
            try {
                bitmap = getRotatedBitmap(data[0], mDeviceRotation);
            } catch (Exception e) {
                e.printStackTrace();
            }
            insertImage(getContentResolver(), bitmap, ""+System.currentTimeMillis(), "");

            return null;
        }

    }


    // 출처 https://stackoverflow.com/a/43516672
    private void setAspectRatioTextureView(int ResolutionWidth , int ResolutionHeight )
    {
        if(ResolutionWidth > ResolutionHeight){
            int newWidth = mDSI_width;
            int newHeight = ((mDSI_width * ResolutionWidth)/ResolutionHeight);
            updateTextureViewSize(newWidth,newHeight);

        }else {
            int newWidth = mDSI_width;
            int newHeight = ((mDSI_width * ResolutionHeight)/ResolutionWidth);
            updateTextureViewSize(newWidth,newHeight);
        }

    }

    private void updateTextureViewSize(int viewWidth, int viewHeight) {
        Log.d("@@@", "TextureView Width : " + viewWidth + " TextureView Height : " + viewHeight);
        mSurfaceView.setLayoutParams(new FrameLayout.LayoutParams(viewWidth, viewHeight));
    }


}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

    <ImageButton
        android:id="@+id/take_photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|bottom"
        android:src="@android:drawable/ic_menu_camera"
        />

</FrameLayout>

 

반응형
반응형
$ CUDA_VISIBLE_DEVICES=[GPU_NUMBER] python [PY_FILE]

ex)
$ CUDA_VISIBLE_DEVICES=0 python main.py

위 명령은 터미널 상에서 GPU 선정 방법이다.

import os

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"   
os.environ["CUDA_VISIBLE_DEVICES"]="[GPU_NUMBER]"

ex)
import os

os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"   
os.environ["CUDA_VISIBLE_DEVICES"]="0" 
os.environ["CUDA_VISIBLE_DEVICES"]="1"
os.environ["CUDA_VISIBLE_DEVICES"]="0,1"
반응형
반응형

pytorch에서 모델을 학습할 때 특정 클래스에 가중치를 주어 더 잘 학습하게 하는 방법이 있습니다.

weights = torch.FloatTensor([1/20, 1/20, 1/20, 7/20, 1/20, 7/20, 1/20, 1/20, 1/100]).cuda()
criterion = torch.nn.CrossEntropyLoss(weight=weights)

위의 상황은 클래스가 9개일 때 인덱스 3과 5번은 더 잘 탐지하고 싶고, 마지막 인덱스는 불필요한 상황입니다.

이후 아래와 같이 설정해주면 됩니다.

logits = model(inputs)
labels = labels.view(bs*seq_length)

loss = criterion(logits, labels)
반응형

'인공지능' 카테고리의 다른 글

[Keras] 자주쓰는 callback 모음  (0) 2021.03.30
Pytorch CNN-LSTM 모델 설계  (0) 2021.03.17
pytorch model summary  (0) 2021.03.16
GRU VS LSTM  (0) 2021.03.15
YOLO V5 사용하기  (0) 2021.03.15
반응형

GRU는 각 셀에서 cell state를 전달하지 않아 LSTM보다 연산량이 적어 속도가 빠른 장점이 있습니다.

그렇다면 속도를 CPU와 GPU환경에서 비교해보겠습니다.

실행한 테스크는 포즈 디텍션이며 pytorch 프레임 워크를 이용했습니다. 러닝 타임의 평균값을 내기 위해 for문을 이용하여 2번 실행했습니다. 모델은 bidirectional LSTM과 GRU입니다.

CPU환경

LSTM - 0.2s

GRU - 0.06s

GPU 환경

LSTM - 0.005s

GRU - 0.006s

결론적으로 CPU환경에서 GRU를 사용하는 편이 LSTM 보다 3배정도 빠르며 GPU환경에선 다소 차이가 안나는 것으로 보입니다.

반응형

'인공지능' 카테고리의 다른 글

pytorch class weight 주는법  (0) 2021.03.16
pytorch model summary  (0) 2021.03.16
YOLO V5 사용하기  (0) 2021.03.15
YOLO v3 커스텀 데이터 셋 학습  (0) 2021.01.05
YOLO V3 원하는 객체만 바운더리 박스 칠하기  (0) 2021.01.05
반응형

YOLO는 속도측면에서 이점이 있는 객체 인식 모델로 알려져 있습니다.

 

3버전까지 동일 저자였으나 5버전은 중국인이 제작하였습니다.

 

github.com/ultralytics/yolov5

 

ultralytics/yolov5

YOLOv5 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.

github.com

 

3버전에 비해 성능도 높아지고 자동화가 잘 되어 있어서 사용하기 좋습니다. 또한 파이토치로 구성되어 모바일에 잘 이식된다고 합니다.

 

사용법을 알아보겠습니다.

 

git clone https://github.com/ultralytics/yolov5.git

 

yolo v5는 4가지 선행학습 모델을 제공합니다.

 

s, m, l, x 순으로 모델 크기가 커집니다. l 모델이 가장 합리적 모델이라고 말합니다.

 

합리적이란 모델 크기와 성능 향상 폭을 고려할 때 합리적이라는 뜻입니다.

 

커스텀 데이터 셋으로 학습을 하고자 할 경우 레이블링을 위하여 다음 툴을 사용해줍니다.

 

github.com/tzutalin/labelImg

 

tzutalin/labelImg

🖍️ LabelImg is a graphical image annotation tool and label object bounding boxes in images - tzutalin/labelImg

github.com

 

해당 툴의 yolo 버전 어노테이션은 v5를 지원합니다. 

 

이후 yaml 파일을 생성해주어야 합니다.

 

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: dataset/images/  # 118287 images
val: dataset/images/  # 5000 images

# number of classes
nc: 5

# class names
names: ['1','1','1','clubhead', 'clubshaft']

train, val의 경로와 nc 클래스 수, names 클래스 명을 각자의 커스텀 데이터 셋에 맞게 수정해줍니다.

 

이후 아래 명령어로 학습을 실행해줍니다.

 

python train.py --img 512 --batch 16 --epochs 200 --data clubhead.yaml --weights yolov5l.pt

img는 인풋 이미지 크기dlqslek. yaml 파일에 데이터 셋 경로가 있기 때문에 따로 필요는 없죠 --weights에서 선행학습 모델을 설정해줍니다.

 

아래와 같이 학습이 진행되는 것을 볼 수 있습니다.

 

학습 시 앵커 사이즈도 자동으로 탐색해주므로 어떠한 버전보다 편리하군요

 

테스트를 원할 경우 다음과 같은 명령어로 실행이 가능합니다.

python detect.py --source ./data/custom/images/val --weights ./runs/train/exp20/weights/best.pt 

 

반응형

'인공지능' 카테고리의 다른 글

pytorch model summary  (0) 2021.03.16
GRU VS LSTM  (0) 2021.03.15
YOLO v3 커스텀 데이터 셋 학습  (0) 2021.01.05
YOLO V3 원하는 객체만 바운더리 박스 칠하기  (0) 2021.01.05
인공지능 관련 용어집  (0) 2021.01.05
반응형

터미널 창에

 

export TF_CPP_MIN_LOG_LEVEL=2

입력

 

반응형

'인공지능 > 환경 세팅' 카테고리의 다른 글

Conda 가상환경 설정  (0) 2021.01.06

+ Recent posts