전체 글
소리 처리 - 들어가기 앞서
올해들어 또 BirdClef 대회를 진행했고, 해당 도메인에서 또 소리를 다루게 되었다.소리를 다뤄보면서 작년에는 바쁘기도 해서 모델만 돌려보고 도메인 지식을 제대로 습득하려고 하지 않았는데 올해 진행하면서 소리의 전처리 부터 시작하여 여러가지 시도를 해 보다보니 생각보다 모델 방면에서의 구조가 CV와 크게 다르지 않고, 전처리 과정에서 생각할 부분이 많았어서 좋은 경험을 했다고 생각이 들어 조금 더 공부해 보고 싶어서 진행하려 한다.소리 처리 기본소리를 처리할때 Raw Data를 쓰려면 여러가지 문제로 인하여 Mel Spectrogram으로 바꿔서 처리를 한다.Raw 데이터를 바로 다루기에는 사이즈가 너무 크다난잡하게 데이터가 이루어져 있어 파악하기 힘들다python에서 많이 사용하는 소리처리 라이브..
Benetech 대회 회고
대회 링크 : https://www.kaggle.com/competitions/benetech-making-graphs-accessible Benetech - Making Graphs Accessible | Kaggle www.kaggle.com 대회 개요 Chart에서 Raw Data를 추출하는 대회 위와 같은 이미지가 존재 할 때 각 데이터에 해당하는 x와 y값을 아래 같이 예측하는 모델을 개발한다. x,Alberta;Ontario;Quebec;P.E.I.,vertical_bar y,62023;50355;56288;38621,vertical_bar 특이사항 5가지 종류의 Chart가 존재한다 Vertical Bar, Horizontal Bar, Line, Scatter, Dot 데이터의 개수는 약 6..
Rust를 이용한 고성능 Python 회고
네이버 DEVIEW에서 고성능 Python을 위한 C API를 듣고 한번 직접 도전 해 보았다. 최근 캐글 대회에서 사용한 Polars가 Pandas 보다 월등한 속도를 보여주어, Rust에 관심을 가지게 되었다. Rust로 구현하고 싶은 부분이 이미지 처리 부분이었는데, 이를 위해서는 PyArray 와 cv::Mat간의 직접 메모리 참조를 이용한 Type 변환이 필요했다. 위 과정에서 메모리 관련한 문제가 발생할 위험이 크기 때문에 메모리 안정적으로 설계 된 Rust로 고성능 Python 모듈을 시도해 보았다. 왜 하려고 했는가? 지금까지 Python을 쓰면서 느낀것이 아래와 같은 이유로 다른 언어에 비해 Python은 느리다는 것이다. 인터프리터 언어 Global Interpreter Lock 특히나..
구조체 (Struct)
이번 글에서는 구조체에 대해서 다루려고 한다. Rust에서 구조체(struct)는 여러 Type의 데이터를 묶어서 의미있는 단위로 사용할 수 있도록 한다. 객체 지향적 프로그래밍 언어인 Python, Java의 Class와 유사하다고 생각 될 수 있으나 rust의 구조체는 언어 디자인 철학에 의하여 상속 대신에 trait을 이용한다. 이는 추후에 자세히 다룰 예정이다. 구조체 정의 rust에서는 struct 키워드를 이용하여 구조체를 정의할 수 있다. 아래와 같이 구조체의 이름을 명시하고 중괄호안에 원하는 필드명과 그 타입을 명시해 주면 구조체가 정의된다. struct User { username: String, email: String, sign_in_count: u64, active: bool, } ..
Asymmetric Loss For Multi-Label Classification
이번 시간에는 Imbalance Dataset에 좋은 성능을 보여주는 Asymmetric Loss(이하 ASL)에 대해서 공부한 내용을 정리해보고자 한다. 논문 개요 Asymmetric Loss를 이용하여 Multi-Label에 필연적으로 따라오는 Positive Label과 Negative Label의 Imbalance문제와 mislabeling 문제를 해결 가능하다. 기존 아키텍쳐를 변형하는게 아닌 Loss만을 이용하기 때문에 도입하기 쉽고, 추가적인 학습시간 등의 부하 없이 성능을 상승시킬수 있다. Binary Cross-Entropy and Focal Loss 우선 ASL에 들어가기 앞서 Multi Label Loss의 기본이 되는 Binary Cross Entropy(이하 BCE)와 Imbala..
Rust 기초 - 소유권(2)
이번 글에서는 소유권의 참조자에 대해서 알아보자 앞선 글에서 우선 앞서 이야기 한것처럼 기본적으로 Rust에서는 함수에 인자로 변수를 넣어주게 되는경우 소유권이 넘어가게 되고, 호출한 함수가 끝나면서 자동적으로 메모리에서 해제되게된다. 하지만 우리는 이 변수를 계속해서 쓰고싶을 경우도 존재하기에 소유권을 돌려주기위해 일일히 반환하기위해 명시하는것은 너무 귀찮은 일이다. fn main() { let s1 = String::from("hello"); let (s2, len) = calculate_length(s1); println!("The length of '{}' is {}.", s2, len); } fn calculate_length(s: String) -> (String, usize) { let le..
Rust 기초 - 소유권(1)
원래는 함수와 같이 진행하려고 했으나 Rust에서 소유권이 중요한 개념이라 따로 분리해서 진행합니다. 소유권(Ownership)이란? 소유권은 Rust에서 메모리 관리를 하는 매우 중요한 핵심기능이다. 다른 프로그래밍 언어에서는 garbage collector가 백그라운드에서 끊임없이 작동하거나, 자동적인 메모리 관리 기능이 없어서 프로그래머가 명시적으로 관리해주어야 한다. Rust에서는 메모리 관리의 몇가지 규칙으로 이루어진 소유권 시스템을 통하여 메모리를 관리한다. 이 소유권을 통하여 동작하는 기능들은 런타임 비용이 발생하지 않는다. 스택(Stack)과 힙(Heap) 소유권에 대해 이야기 하기전에 우선 메모리에 관하여 이야기 해보자. 컴퓨터의 운영체제(OS)에서는 프로그램의 실행을 위하여 다양한 메모..
Rust 기초 - 함수
Functions Rust에서 함수는 fn 을 사용하여 정의 할 수 있다. rust 작성 규칙에 따라 모든 함수는 snake case 형식으로 작성한다. fn main() { println!("Hello, world!"); another_function(); } fn another_function() { println!("Another function."); } 다른 언어와 같이 함수에 parameter를 가지는 형식으로 선언하는것 또한 가능하다. 모든 parameter는 반드시 type이 정의되어 있어야 한다. fn main() { another_function(5, 6); } fn another_function(x: i32, y: i32) { println!("The value of x is: {}"..