"지속 가능한 지구환경을 만들기 위해 환경 설비의 연구개발부터 엔지니어링, 시공 및 운영 그리고 사후관리까지 전 과정을 책임지는 Total solution Provider"라고 하는데, 사업분야는 Air Quality Control System, Retrofit & Maintenance, New & Renewable Energy, Manufacturing Services로 총 4가지가 있다.
매출의 대부분이 환경플랜트 사업부문에서 나온다고 하는데 그게 홈페이지에서의 Air Quality Control System 분야로 추측된다. 전기집진기, 배연탈황설비, 배연탈질설비 등이 시장점유율 각각 70%, 30%, 25%를 차지하고 있는데 이러한 설비들이 모두 대기오염 방지 설비들이다.
앞서, librosa, pyaudio 라이브러리를 활용하여 마이크로부터 audio를 실시간으로 추출, time/frequency domain에서 audio를 분석하는 방법에 대해 살펴보았다. 사물놀이 악기들의 소리를 주파수 Spectrum, Mel Spectrum 등에서 분석해보았으나 각각의 악기들이 가지고 있는 고유한 주파수의 영역이 넓어 분류하기가 어려웠다. 대안으로 사물놀이 공연 전체의 beat/tempo 또는 pitch에 매칭하는 방법을 생각해보았다.
이러한 관점에서 Google의 tensorflow model hub를 살펴보던 중 SPICE(Self-Supervised Pitch Estimation)이라는 모델을 찾았다. SPICE는 monophonic audio의 fundamental frequency를 추정하는 모델, pitch 추정 모델,이다. SPICE는 annotated data가 없을 때 pitch 추정 모델을 훈련하는 방식을 제안하였으며, 사람이 일반적으로 absolute pitch보다 relative pitch를 훨씬 쉽게 추정할 수 있다는 observation에서 영감을 받았다고 한다. (그래서 모델 구조 또한 그 영감을 반영하고 있다.) Deep learning 기반의 Pitch Estimation(예. CREPE) 알고리즘과 다른 점은 Annotated data가 없을 때, 즉 unlabeled data를 다루기 위하여 self-supervised learning 기법을 사용한 점이다.
* Self-supervised learning 기법에 대한 설명은 아래 참조를 확인
SPICE의 간략한 모델 architecture는 아래 그림과 같다. 모델의 Input은 Constant Q Transform으로 변환한 CQT 프레임이다. SPICE의 저자는 Constant Q Transform(CQT)이 다음과 같은 장점이 있다고 하였다.
Indeed, the CQT filter bank computes a wavelet transform [16], and wavelets can be effectively used to represent the class of locally periodic signals.
앞서 말한 바와 같이 저자가 받은 영감을 모델에 그대로 반영하고 있다.
먼저, 2개의 CQT 프레임(pitch가 shifted된 frame과 아닌 frame)이 shared weighted를 갖는 2개의 Encoder에 input으로 넣어진다. Loss는 Encoder의 출력 간 차이가 상대적인 pitch 차이에 비례하도록 설계됐다. 즉, self-supervised learning에서 Pretext task(논문에서는 auxiliary task로 표현)에 해당하는게 바로 이 pitch difference를 추정하는 것이다.
Downstream task는 input 프레임에서 절대 pitch 값을 추정하는 pitch estimation이라고 할 수 있다. 더 상세한 내용은 저자의 논문을 읽어보기를..
Gfeller, Beat, et al. "SPICE: Self-supervised pitch estimation."IEEE/ACM Transactions on Audio, Speech, and Language Processing28 (2020): 1118-1128.
self-supervised learning이란 Labeling 작업에 들어가는 노력 및 비용을 해결할 수 있는 방법 중 하나.
Unlabeled dataset을 input으로 받아 사용자가 정의한 문제(pretext task)를 network가 학습하게 하여 데이터 자체에 대한 이해도를 높이고, pretext task에서 나온 pre-training된 network를 궁극적으로 사용자가 풀고자 하는 문제인 downstream task에 transfer learning 하는 방법
Intel Realsense 시리즈는 로보틱스, 드론, AR/VR 등과 같은 연구분야에서 상당히 널리 사용되고 있는 컴퓨터 비젼 솔루션으로서, Stereo depth, Lidar, 3D Tracking 카메라 제품군과 Vision 소프트웨어 등을 포함하고 있다.
오픈소스로 제공되고 있는 SDK(Software Development Kit)의 성능은 뛰어난 편이며, ROS(Robot Operation System)와 같은 플랫폼과의 손쉬운 연동도 지원한다. 인텔의 기술이란..
여기서, 카메라 제품군의 모듈들을 인텔과 함께 개발한 회사가 바로 나무가이다.
내가 드론 개발/연구에 사용하던 카메라의 핵심 부품을 국내 중소기업이 개발했다니.. 정말 깜짝 놀랐었다.
앞으로 로봇, 드론, AR/VR 산업이 미래 먹거리가 될 것으로 예상되는 바, 그 근간이 되는 핵심이라 할 수 있는 비젼 기술과 카메라는(특히 3D sensing 카메라) 지속적으로 그 시장 규모를 확대할 것이다.
아마도 현재는 삼성전자 갤럭시 시리즈에 납품하는 모바일 카메라가 회사 매출과 영업이익에 큰 비중을 차지하겠으나, 미래에는 3D Sensing 카메라의 비중이 더 커지지 않을까? 생각한다. (물론, 인텔의 마케팅 전략에 달렸고 연구를 넘어 실제 상용화까지 나무가의 제품군 판매가 이어져야겠지만...)
지금은 회사에서 영업 이익보다 매출 중심으로 capa를 늘리는 추세인 듯 하다.
21년 1분기에 매출과 영업이익이 모두 잘 나온 것을 보면, 뭔가 시가총액도 같이 올라가주지 않을까? 생각한다.
삼성전기에서 spin-off(분사)한 회사로 Power 부문, ICT 부문 및 ESL 부문에서 관련 기술들을 보유, 사업을 진행 중에 있다.
아래의 이베스트투자증권의 리포트에 따르면 2020년 사업 부문별 매출액이 3in1 보드, 파워모듈, ESL이 각각 47%, 37%, 11% 정도로 Power 부문의 매출이 대부분이다. 홈페이지를 들어가서 확인해보더라도 삼성전자의 노트북, 스마트폰 용 파워모듈 등과 TV용 3in1 보드가 주요 매출처이고, IoT 모듈들(블루투스, Wi-Fi, ZigBee 등)을 활용한 제품들 다수를 판매하고 있으나 매출이 크지 않은 것 같았다. (Keyco라는 자체 브랜드를 통해 IoT 솔루션들을 제공하고 있는 것 같으나 사업이 잘 되고 있는 것 같지는 않다)
사실 매출이 1조를 육박하고 있어서 ICT 관련 사업들도 잘 되고 있으나 총 매출액 대비 그렇게 크지 않아 눈에 뛰지 않는 것일 수도?
현재 영업이익이 꽤나 괜찮은 편이지만 사실 상장한지 얼마 안된 회사라서 이걸 투자해야하는가? 라는 고민을 계속 가지고 있었다. 그러다 아래 youtube를 보다가 투자 하겠다 라는 마음을 먹었다. (본 포스팅을 쓰는 이유이기도 하다)
youtube 알고리즘에 이끌려 삼일회계법인 감사본부 3년차 회계사의 하루에 대한 영상을 보게 됐다.
최근 중견/대기업들이 직원들의 일할 좌석을 앱을 통해 배정하는 자율좌석제도 등을 한다는 뉴스를 봤었는데 삼일회계법인 또한 자율좌석제도를 시행하고 있었다. 영상에서 나의 주목을 끈 것은 1분 6초 정도에 좌석 이름표가 자동으로 변경되는 것을 볼 수 있었다. 해당 제품이 솔루엠의 제품인지는 확인되지 않았지만, 이게 바로 ESL 기술이구나 라는 것을 알 수 있었다.
ESL은 Electronic Shelf Label 즉, 전자가격표시기로 전자종이 디스플레이를 이용하여 원하는 정보를 표시해주는 장치이다. 이마트, 홈플러스 같은 곳에서 종이로 제품의 가격을 표시하는 문제로, 가격 변동에 따라 직원들이 직접 하나하나 바꾸던 기존의 방법들을 전자종이로 대체, 실시간으로 원하는 정보를 표시함으로서 불편함을 해소할 수 있다고 한다. ESL에 대해 처음 들었을 때에는 그 활용도가 마트 외에 있을까? 라는 의문이 들어 시장규모가 크지 않을 것 같다 라는 판단을 했지만, 위 영상을 보고 참 다양한 분야에 쓰일 수 있겠구나 라는 판단이 됐다.
더 나아가 최근에는 아래 뉴스처럼 솔루엠이 시스코와 협력하여 기존에 시스코가 구축한 네트워크를 기반으로 ESL 솔루션을 적용할 수 있도록 MOU를 맺었다고 한다.
나는 이 MOU가 솔루엠의 ESL 사업 확장에 꽤나 중요한 결정이였고 아주 좋은 판단이라고 생각한다.
통신 쪽 연구를 하는 연구자로서 생각해본다면, ESL 장치를 납품하는 것보다 납품된 장치를 운용할 수 있는 네트워크 인프라를 구축 비용이 상당히 클 것이라 본다. 이를 기존 시스코의 인프라를 그대로 활용할 수 있으면 추가 비용 없이 손쉽게 ESL 장치를 배포할 수 있어 두 회사 간 스마트 오피스 시장 공략에 엄청난 시너지가 될 것이다.
x = Bool("x")
x = Const("x" , BoolSort())
p, q, r = Bools("p q r") # convenience function for multiple definitions
x = Real("x")
x, y = Reals("x y") # need space
y = Int("x")
v = BitVec("n", 32) # 32 bit bitvector
f = FP("f", Float64()) #Floating point values
a = Array("a", IntSort(), BoolSort()) # arrays
Constraints / Operations
# Common numerical operations
print(x + x) # addition
print(x * x) # multiplication
print(x ** 4) # fourth power of x
# Common boolean operations
print(And(p,q))
print(And(p,q,r)) # some can accept more than one argument for convenience.
print(Or(p,q))
print(Implies(p,q))
print(Xor(p,q))
print(Not(p))
# Constraints
print(x == x) #equal
print(x != x) # not equal
print(x <= RealVal(3)) # inequality
print(Or( x < 3, x == 3, x > 3 )) # Constraints are operations into booleans
# And many more! Look in the API docs for others https://z3prover.github.io/api/html/namespacez3py.html
Exercise
Get a root of the polynomialx**3 + 3*x**2 + 4*x + 2 == 0using z3.
x = Real("x")
solve(x**3 + 3*x**2 + 4*x + 2)
증명 방법
x = Real("x")
solve(x**3 + 3*x**2+ 4*x + 2 ==0, x != -1)
# 또는
prove( Implies( x**3 + 3*x**2+ 4*x + 2 ==0, x == -1))
Exercise : Send More Money
Send
+ More
----------
Money
를 찾는 문제
from z3 import *
digits = Ints('s e n d m o r y')
s,e,n,d,m,o,r,y = digits
send = Sum([10**(3-i) * d for i,d in enumerate([s,e,n,d])]) # convert digits of number to number
more = Sum([10**(3-i) * d for i,d in enumerate([m,o,r,e])])
money = Sum([10**(4-i) * d for i,d in enumerate([m,o,n,e,y])])
print(type(digits))
solver = Solver()
solver.add([s > 0, m > 0]) # first digits are nonzero
# Constrain all digits constrained to be 0 through 9
# FILL IN
solver.add([ And(0 <= d, d <=9) for d in digits])
# Constrain all digits to be unique (Hint: Look at the 8-Queens constraints. Anything useful?)
# FILL IN
solver.add(Distinct(digits))
# Constrain send + more == money
# FILL IN
solver.add(send + more == money)
solver.check()
print(solver.check())
solver.model()
# see the value of send
print(solver.model().eval(send))
Proof = Exhaustively Not Finding Counterexamples
solver.check()may return
sat - "I have found a solution. You may ask for it withsolver.model()"
unknown - This means "I give up". There may be a solution out there somewhere, there may not.
unsat - "I KNOW there is no solution. I've tried EVERYTHING".
Z3 solver가 주어진 problem을 solve하기 위해 모든 것을 try해보기 때문에 실행 시간이 크다는 단점 존재