레이블이 python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 python인 게시물을 표시합니다. 모든 게시물 표시

2026년 3월 2일 월요일

인공지능 학습에 필수인 데이터 분할(data splitting)

 보통은 입력(X)와 출력(y)의 쌍을 y값을 기준으로 랜덤하게 7:3 혹은 8:2로 학습용과 테스트용으로 분류한다.

통상적으로 sklearn 패키지에 있는 train_test_split() 함수를 사용하여 전체 데이터에서 학습용과 테스용 데이터의 인덱스를 얻어온다.

물론 위와 같은 방식으로 간편하게 사용하기 좋지만, 데이터의 분포가 정규분포인 경우 특정 영역에서 샘플링이 몰리는 현상은 여전하다.

그래서 계층적 샘플링(stratified sampling)을 사용하여 각 계층내에서 램덤하게 샘플링하여

위와 같이 분포가 많거나 적거나 상관없이 골고루 영역에서 램덤하게 샘플링 할 수 있다.

우선 pandas의 cut() 함수를 이용하여 데이터를 구간에 따라 라벨을 부여하고 bar 그래프를 그려본다.


import pandas as pd

import numpy as np

from matplotlib.pyplot import plt


...

data_dict['y_labels'] = pd.cut(data_dict['y'], bins=[0.0, 1.5, 3.0, 4.5, 6.0, np.inf], labels=[1, 2, 3, 4, 5])

data_dict['y_labels'].value_counts().sort_index().plot.bar(rot=0, grid=True)

plt.xlabel('categories')

plt.ylabel('counts')

plt.show()

...


그리고 train_test_split() 함수의 stratify 매개변수를 사용하여 계층적 샘플링을 수행할 수 있다.


strat_train_set, strat_test_set = train_test_split(

data_dict, test_size=0.2, stratify=data_dict['y_labels'], random_state=42

)


앞으로 계층적 샘플링을 사용하자.

2026년 1월 4일 일요일

[책] Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow

 3판까지 나온 상태인 것 같다. 가격이 제법 나가서 사서 살펴보진 못했다. (원서는 10만원 선이고, 번역서는 5만원 선으로 검색된다.) 둘다 사서보기 부담 스럽다. 강의에 써보고 싶은데 접근하기가 쉽지 않다.

이론적으로 매몰되지 않고 그렇다고 따라 하기 식으로 매뉴얼 처럼되어 있는 책도 아닌 그 사이 어딘가에 있는 책같다. 들여다 봐야 할 것 도 많고 할일도 많은데 선 듯 움직여 지지 않는다. 그래서 되세김하기 위해 여기에 기록으로 남겨 볼때 마다 기억나게 남겨둔다. 

2025년 12월 7일 일요일

Python 코드의 성능을 높일 수 있는 10가지 영리한 방법

[출처: https://blog.jetbrains.com/pycharm/2025/11/10-smart-performance-hacks-for-faster-python-code/ ]

1. 내부항목 검사(Membership Test)에 효과적인 Set(집합) 활용하기

배열형 자료형의 내부항목을 검사는 다음과 같은 "내부항목 in 배열형" 연산자와 if문을 조합하여 처리한다.



하지만, 가장 손쉽게 사용하는 list를 검색하는 것은 특히 비효율적이다. list의 크기가 커질수록 내부항목검사(x in some_list)는 각 내부항목을 하나씩 스캔해서 비교해야 하므로 S/W time complexity는 선형 시간 복잡도 (O(n))를 가집니다(여기서, n은 내부항목의 개수).


위와 같이 최악의 경우를 상정한 것이기는 하지만, 총 1M 개를 내부항목으로 갖는 list와 set의 내부항목 검사에 소요되는 시간은 다음과 같다. 

True

List lookup: 0.005432s

True

Set lookup: 0.000081s


파이썬의 set은 내부항목 관리를 해시 테이블로 구현되어 평균적으로 상수 시간(O(1)) 조회 성능을 제공하여 특히 대규모 데이터셋을 다룰 때 set 내 값 존재 여부 확인할때 훨씬 빠르다.

통상적으로 set보다 list를 고민없이 사용하는 경우들이 많은데  set가 list보다 훨씬 효율적이다; set는 내부항목 검사 속도를 높일 뿐만 아니라 합집합, 교집합, 차집합과 같은 연산을 훨씬 빠르고 간결하게 수행합니다.

내부항목 검사에 list 대신 set를 사용하면(특히 성능이 중요한 코드에서) 로직을 최소한으로 변경하면서도 상당한 속도 향상을 달성할 수 있다.


2. 불필요한 복사 행위를 피하라.

list, dict 또는 array 같은 큰 객체를 복사하는 것은 시간과 메모리 측면에서 비용이 많이 들 수 있다. 복사 작업은 메모리에 새로운 객체를 생성하며, 이는 특히 대규모 데이터셋을 다루거나 많은 반복 작업을 수행해야하는 반복문 내에서 작업할 때 상당히 부담스러운 오버헤드가 된다. 

가능한 경우 객체를 복제하지 말고 그 자리에서 수정하여 새 구조체를 할당하고 채우는 오버헤드를 피하자.(메모리 사용량을 줄이고 성능을 향상시킵니다.) 파이썬의 많은 내장 데이터 구조들은 복사 작업이 필요 없는 인플레이스 메서드(예: sort, append, update)를 제공하고 이를 적극 활용하자.


당연하게도 in-place(복사행위 없는) 작업이 훨씬 속도가 빠르다.

In-place: 0.0000s
Copy: 0.0049s

성능이 중요한 코드에서는 객체가 언제, 어떻게 복제되는지 주의 깊게 살펴보고 reference(new_list = list)와 in-place 연산을 활용하면 크거나 복잡한 데이터 구조를 다룰 때 더 효율적이고 메모리 친화적인 코드를 작성할 수 있다.


3. 메모리 효율성을 위해서 객체의 구성요소관리에 __slots__ 를 사용하자.

기본적으로 Python 클래스는 인스턴스 속성을 동적 사전(__dict__)에 저장한다. 이는 유연성을 제공하지만 메모리 오버헤드가 발생하고 속성 접근 속도가 약간 느려진다.

__slots__를 사용하면 클래스에 대해 고정된 속성 집합을 명시적으로 선언할 수 있습니다. 이는 __dict__의 필요성을 없애 메모리 사용량을 줄여주며, 특히 클래스의 인스턴스를 많이 생성할 때 유용합니다. 또한 간소화된 내부 구조 덕분에 속성 접근 속도가 약간 빨라집니다.

__slots__는 동적 속성 할당을 제한하지만, 메모리 제약 환경이나 성능에 민감한 애플리케이션에서는 효율적이다. 경량 클래스나 데이터 컨테이너의 경우 __slots__를 적용하는 것이 코드를 더 효율적으로 만드는 간단한 방법이다.


하지만, 결과는 들쑥 날쑥이다. 우선 이론상 동적 메모리 관리가 정적 메모리 관리보다 훨씬 시간이 더 든다는 것은 당연한 사실이니 나름 합리적인 내용이다. 하지만 결과는 들쑥날쑥.... 

Without slots: 0.6076s
With slots: 0.5399s
...
Without slots: 0.4644s
With slots: 0.6735s

마무튼 이 내용은 보류.


4. 기본 연산자 대신 math 패키지를 사용하자.

수치 계산의 경우, Python의 math 모듈은 C로 구현된 함수를 제공하여 순수 Python으로 작성된 동일한 연산보다 더 나은 성능과 정밀도를 제공한다. 

예를 들어, math.sqrt()를 사용하는 것이 지수 연산자(**)를 사용하여 숫자를 0.5제곱하는 것보다 일반적으로 더 빠르고 정확합니다. 마찬가지로, math.sin(), math.exp(), math.log()와 같은 함수들은 속도와 신뢰성을 위해 고도로 최적화되어 있습니다.

이러한 성능 향상 효과는 특히 반복 작업을 수행하는 반복문이나 대규모 계산에서 두드러지게 나타난다. 수치 연산이 많은 작업에 수학 모듈을 활용하면 더 빠른 실행 속도와 더 일관된 결과를 동시에 달성할 수 있어, 과학적 계산, 시뮬레이션 또는 수학 연산이 많은 코드에 최적의 선택이다.


결과를 보면 명확해 진다.

Math sqrt: 0.4781s
Operator: 0.6468s


5. 공간의 크기가 명확히 정해져 있다면 메모리를 사전에 할당해서 사용하자.

동적으로 list나 array을 생성할 때 파이썬은 내부적으로 크기가 커짐에 따라 자동으로 크기를 조정한다. 편리하지만, 이러한 크기 조정은 새로운 크기의 메모리 할당과 데이터 복사 그리고 기존의 메모리 반납을 수반하여 오버헤드를 발생시킨다. 특히 대규모 루프나 성능이 중요한 루프에서 더욱 그렇다.

데이터 구조의 최종 크기를 미리 알고 있다면 매번 필요시에 동적할당을 수행하는 방식이 아닌 사전에 메모리를 미리 할당해서 사용하여 성능 향상시킬 수 있다. list나 array를 고정된 크기로 초기화하면 반복적으로 발생할 수 있는 (동적할당->복사->메모리반환) 크기 조정을 피할 수 있으며, 파이썬(또는 NumPy 같은 라이브러리)이 메모리를 더 효율적으로 관리할 수 있다.

이 기법은 수치 계산, 시뮬레이션, 대규모 데이터 처리에서 특히 유용하며 이런 작은 최적화조차도 연쇄적인 누적 효과를 낼 수 있다. 메모리를 사전 할당해서 사용하면 메모리 파편화(Memory Fragmentation)를 줄이고 캐시 지역성을 개선하며 더 예측 가능한 성능을 보장한다.


Pre-allocated: ~0.0300s
Dynamic: ~0.0400s


6. 집중 연산 구간에서 예외처리를 사용하지 말자.

파이썬의 예외 처리는 예상치 못한 동작을 관리하는 데 강력하고 깔끔하지만, 성능이 중요한 루프 내에서 적합하도록 설계된 것은 아니다. 예외 발생 및 포착에는 스택 추적(unwinding)과 컨텍스트 전환이 수반되며, 이는 상대적으로 비용이 많이 드는 작업이다.

hot loop(반복적으로 실행되거나 대량의 데이터를 처리하는 코드 구간)에서 제어 흐름을 위해 예외를 사용하면 성능이 크게 저하된다. 대신 오류가 발생하기 전에 이를 방지하기 위해 조건부 검사(if, in, is 등)를 사용하면, 훨씬 빠를 뿐만 아니라 더 예측 가능한 실행을 수행한다.

예상되는 제어 흐름보다는 진정으로 예외적인 경우에만 예외를 허용하면, 특히 성능이 중요한 타이트한 루프나 실시간 애플리케이션에서 더 깔끔하고 빠른 코드를 얻을 수 있다.


Conditional: 0.8241s
Exception: 1.3350s


7. 반복 수행과정에서 local 함수를 사용하자.

함수 내에서 특정 논리 블록이 반복적으로 수행해야 할 경우, 이를 지역(중첩) 함수(closure라고도 함)로 정의하면 성능과 가독성을 향상시킬 수 있다. 지역 함수는 이름 탐색 속도가 더 빠릅니다. 당연하게도 파이썬이 전역 범위보다 지역 범위에서 변수 혹은 함수를 조회하는 것이 더 빠르기 때문이다.

이 기법은 루프, 데이터 변환 또는 재귀적 프로세스와 같이 동일한 작업을 여러 번 적용하는 함수에서 특히 유용하고, 자주 사용되는 로직을 로컬로 유지함으로써 런타임 오버헤드와 인지 부하를 모두 줄일 수 있다.



Local function: 0.3879s
Global function: 0.6965s


8. 조합 연산에는 itertools를 사용하자.

개인적인 경험상 이를 통해 잃을 수 있는 손해가 더 많다고 생각하고 실행 속도의 실요성도 없어 보여서 제외함.


9. 정렬된 list 다룰 때 bisect를 사용하자.

정렬된 목록을 다룰 때 선형 검색이나 수동 삽입 로직을 사용하면 비효율적이다. 특히 목록이 커질수록 더욱 심해진다. Python의 bisect 모듈은 이진 검색을 사용하여 정렬된 순서를 유지하는 빠르고 효율적인 도구를 제공한다.

bisect_left(), bisect_right(), insort() 같은 함수를 사용하면 단순 스캔의 O(n) 복잡도와 달리 O(log n) 시간에 삽입 및 검색을 수행할 수 있다. 이는 리더보드 유지 관리, 이벤트 타임라인 관리, 효율적인 범위 쿼리 구현 같은 시나리오에서 특히 유용하다.

bisect 모듈을 사용하면 list 변경 후 매번 재정렬할 필요가 없어지며, 동적 정렬 데이터 작업 시 상당한 성능 향상을 얻을 수 있습니다. 이는 가볍고 강력한 도구로, 일반적인 list 작업에 알고리즘적 효율성을 제공합니다.



Bisect: 0.0004s
Loop: 0.0027s


10.  루프 내에서 반복된 함수 호출을 피하라.

이해할 수 없어서 개인적으로 제외한다.


요약

itertools, bisect, collections와 같은 특수 모듈은 복잡한 작업을 더욱 간소화하며, 전역 변수 사용 최소화, 메모리 사전 할당, 캐싱 구현과 같은 모범 사례 준수는 간결하고 효율적인 코드 실행을 보장합니다. 

2025년 10월 29일 수요일

Keras 정확히는 Tensorflow의 메모리 부족 문제 해결책

 처음에는 학습데이터의 양이 메인 메모리의 한계를 넘어가면서 메모리를 증설했고 그 다음에는 학습데이터를 GPU에 옮기는 과정에서 GPU 메모리가 부족하여 batch_size를 줄여도 보았으나 다음과 같은 에러 메시지는 해결되지 않았다. 

" InternalError: Failed copying input tensor from /job:localhost/replica:0/task:0/device:CPU:0 to /job:localhost/replica:0/task:0/device:GPU:0 in order to run _EagerConst: Dst tensor is not initialized."

 확실하진 않지만 위와 같은 메시지 였던것 같다. CPU에서 다루던 데이터를 GPU로 옮기다가 사고가 나는 것 같다. 이치상으로 보면 batch_size를 줄이면 해결되어야 하는데 해결되지 않았고 어디서 다음과 같은 DataGenerator로 조금씩 데이터를 흘려 주면 된다고 했는데 나한테는 전혀 효과가 없었다.


class DataGenerator(Sequence):
  def __init__(self, x_set, y_set, batch_size):
    self.x, self.y = x_set, y_set
    self.batch_size = batch_size

  def __len__(self):
    return int(np.ceil(len(self.x) / float(self.batch_size)))

  def __getitem__(self, idx):
    if idx == self.__len__() - 1:
      batch_x = self.x[idx * self.batch_size : ]
      batch_y = self.y[idx * self.batch_size : ]
    else:
      batch_x = self.x[idx * self.batch_size : (idx+1) * self.batch_size]
      batch_y = self.y[idx * self.batch_size : (idx+1) * self.batch_size]
    return batch_x, batch_y

train_gen = DataGenerator( X_train_split,  y_train_split,  batch_size)
test_gen = DataGenerator(X_val_split, y_val_split, batch_size)

history = self.model.fit(
 train_gen,
 validation_data=test_gen,
 epochs=epochs,
 callbacks=callbacks,
 verbose=1

 정확히 문제가 되는 지점이 학습 완료 후 평가하는 과정에서 사단이 나서 굉장히 열받는 상황이었다. 며칠을 걸려서 학습을 완료했는데 왜 평가할때 프로그램이 사망하냐구.

 아무튼 좀 더 구글링을 해서 찾은 해결책은 학습기간 동안 최적의 모델을 파일형태로 저장하도록 하고 기존 모델을 제거해서 메모리 문제를 제거하는 방법을 시도해 보았다. 그리고 최적의 모델은 다시 파일에서 로딩하는 방식으로... 하지만 다음 명령어는 효과가 없었다.

del model

 뭔가 cuda와 cuDNN 그리고 tensorflow의 backend 사이에 꼬여 있는 부분이 있는 것 같다. 여러 차례의 시도를 하여 각 tensorflow의 backend의 각세션을 학습 완료 후 재 초기화 하고 "del model"을  수행한다. 그리고 garbage collect을 통해 안쓰는 데이터를 메모리에서 해제한다. 그 결과 평가 단계로 수훨하게 넘어 갈 수 있었다. 그 기록을 여기에 남겨 둔다.

 ... 학습 완료 후...

    # reset Keras Session
    sess = tf.compat.v1.keras.backend.get_session()
    tf.compat.v1.keras.backend.clear_session()
    sess.close()
    sess = tf.compat.v1.keras.backend.get_session()
    del self.model  # this is from global space - change this as you need
    # use the same config as you used to create the session
    config = tf.compat.v1.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 1
    config.gpu_options.visible_device_list = "0"
    tf.compat.v1.keras.backend.set_session(tf.compat.v1.Session(config=config))

    import gc

    gc.collect()

... 저장된 파일에서 self.model을 다시 로드한다...

2024년 7월 22일 월요일

freecad의 충돌 그리고 실행을 위한 python3.11의 libshiboken2, libpyside2 링크 만들기

 잘쓰던 freecad가 python3의 버전이 오롯이 3.12로 재편 되면서 기존의 3.11이 있음에도 불구하고 3.11이 제대로 돌아가지 못하게 되었다. 

 그래서 덩달아 freecad도 실행이 불가능한 상태가 되어 버렸다. 해결해 볼라구 찾아 보았다 크게 2개의 문제가 되더라 libpyside2와 libshiboken2, 이 둘이 freecad의 GUI를 담당하는데 찾고 있던 경로(/usr/lib/python3/dist-packages/)에 없었던 듯 하다.

 데비안 패키지 저장소를 뒤졌으나 libshiboken2-py3-5.15_5.15.10-4_amd64.deb 밖에 없었다. 범위를 넓혀서 rpm도 찾아 보았다. 그래서 데비안 libpyside2 패키지를 대체할 수 있는 pyside2-core-5.15.12-2-omv2490.x86_64.rpm를 다운로드 받았다. 

 데비안 현시점(2024-07-22)의 testing 배포판의 python3의 주력이 3.12으로 넘어가 버려서 /usr/lib/python3/dist-packages에 3.11 버전의 패키지를 덮어 씌우는 것은 시스템을 망가트릴 수 있어 아래의 경로에 해당 라이브러리들(libpyside2*, libshiboken2*)을 복사해 두었다.

 $ mv /home/daysleep/Downloads/libpyside2.cpython-311-x86_64-linux-gnu.so.5.15* /usr/lib/x86_64-linux-gnu/
$ mv /home/daysleep/Downloads/libshiboken2/libshiboken2-py3-5.15_5.15.10-4_amd64/usr/lib/x86_64-linux-gnu/libshiboken2.cpython-311-x86_64-linux-gnu.so.5.15* /usr/lib/x86_64-linux-gnu/
$ cp -r /home/daysleep/Downloads/libshiboken2/libshiboken2-py3-5.15_5.15.10-4_amd64/data/usr/lib/python3/dist-packages/shiboken2 /usr/local/lib/python3.11/dist-packages/

뭐 그래도 여전히 유독 /usr/lib/python3/dist-packages에서만 찾는 plugin 자원들은 문제가 생기더라 뭐 찝찝하지만 실행은 되니 우선 임시적으로 이렇게 써야 겠다.

* 주의 사항: symbolic link 생성시 반드시 작업 디레토리를 생성 경로로 설정해야 생성이 되더라 한참 애먹었다. 

$ ln -s libpyside2.cpython-311-x86_64-linux-gnu.so.5.15.12 libpyside2.cpython-311-x86_64-linux-gnu.so.5.15

2024년 3월 17일 일요일

Python의 pandas를 사용한 데이터 처리 코드 해석

 Python의 코딩 스타일이라는 것이 정해져 있진 않지만 C/C++ 기반으로 시작하여 여기까지 와버린 나로써는 JavaScript 언어의 매써드 붙여쓰기 / for 문 대신 apply() 메써드 붙여쓰기는 당황 스럽다. 어쩌겠나 적응해야지. 익숙해 질때까진 새것 발건한 것 마냥 기록 좀 남겨야 겠다.

md['genres'] = md['genres'].fillna('[]').apply(literal_eval).apply(
    lambda x: [i['name'] for i in x] if isinstance(x, list) else []

 위의 코드는 pandas의 dataframe인 md를 조작하는 코드다; 결과적으로 'genres' 항목의 내용이 dict를 내부항목으로 하는 list로 되어 있는 것을 해체해서 'name'항목으로만 되어 있는 list로 만들어 버린다. 이를 위해서 코드가 좀 돌다리를 두드리면서 실행하도록 만들어 두었다. 안전한게 좋긴하지만 코드 보기가 눈아프긴 하다.

 우선, fillna('[]')는 md['genres']인 Series의 내부항목중 Na 혹은 NaN 즉, 숫자가 아니거나 아무것도 없거나 한 곳은 '[]' 문자열(실제 내용은 빈 list)을 넣어 두고,

 그 다음에 dict를 내부항목으로 갖는 list를 가지고 작업하려고 하는데 아쉽게도 해당 내용이 Series의 문자열 형태로 되어 있어서 이 부분을 해석해서 Python의 객체로 만들어 주어야 한다. 이 작업을 해주는 것이 .apply(literal_eval)이라는 것이다.

 그리고 나서 본격적으로  Series의 내부항목 list의 내용을 구조가 복잡한 dict를 해체해서 'name'항목만 남겨 주는 혹은 내용이 없으면 빈 list로 재편한다. 이 작업을 .apply()메서드와 dict의 내용을 해체하고 빈곳은 빈 list로 대체하는 lambda 함수가 해주고 있다. 

vote_counts = md[md['vote_count'].notnull()]['vote_count'].astype('int')

 이것도 마찬가지다. dataframe인 md의 'vote_count' 컬럼의 내용중 내용이 있는 항목만 추려 혹시나 있을 누락된 항목으로 발생할 수 있는 에러를 방지 하도록 해놓았다. 

 그래서, 유효한(notnull)내용만 갖는 'vote_count' 컬럼의 내용을 마지막으로 정수형으로 변환하여 vote_count에 저장하도록 해놓았다.



2023년 6월 6일 화요일

데비안 리눅스 시스템은 python 최신버전으로 유지 될때 과거의 python 설치하는 법

 [원본 : https://unix.stackexchange.com/questions/188741/install-newer-older-versions-of-python-on-debian]

대부분 우분투의 deadsnakes PPA를 이용하여 설치하는 방법을 설명하지만 아쉽게도 Debian에 이와 같이 설정하면 어디에선가 문제를 야기시킬수 있는 위험을 가지고 있다. 위의 원본 게시물에서도 알려주다시피 메뉴얼로다가 해당 버전을 다운로드 해서 수작업으로 설치하는 것을 추천한다.

현시점에서 python 3.11 버전으로 업데이트 되어 더이상 tensorflow를 설치할 수 없다. tensorflow가 지원하는 최신버전의 python이 3.10이다. 먼저 python 3.10 설치하고 그리고 Teledyne의 Spinnaker SDK의 python 버전이 python 3.8만 지원한다. 이것도 나중에 설치해야 겠다.

우선 급한데로 python 3.10 버전을 수작업으로 설치하는 방법을 기록해 둔다.

# 사전 준비물

```bash

$ apt install libssl-dev openssl libffi-dev

```

# python 3.10.11 버전 수동 설치

```bash

$ wget https://www.python.org/ftp/python/3.10.11/Python-3.10.11.tgz

$ tar zxf Python-3.10.11.tgz

$ cd Python-3.10.11/
$ ./configure --prefix=/usr/local
$ make
$ make install

```

여기서, 시스템에서 관리되는 /usr/local에 설치하면 시스템 관리에 혼동을 초래할 수 있기 때문에 가능하면 /opt/python-3.10.11로 설정해서 컴파일하고 설치하도록 하자.

 그리고, 시스템에서 접근할 수 있게 PATH에 추가하거나 /usr/local에 symbolic link를 만들어 두자.

```bash

$ ln -s /opt/python-3.10.11/bin/python3.10 /usr/local/bin/python3.10
$ ln -s /opt/python-3.10.11/bin/pip3.10 /usr/local/bin/pip3.10

```


2022년 7월 27일 수요일

인공지능+영상처리+OceanOptics USB2000+Flir Camera 를 위한 시스템 설정

# 작업 시스템

윈도우즈 11, 64bits

# 설치 소프트웨어

## Python 3.8.xx

64bit 버전으로 설치하고, 현 시점에 최신 버전은 3.10이지만, 인공지능을 위한 tensorflow가 지원하는 최신 버전인 3.9.13버전이고 Spinnaker라는 Camera 소프트웨어는 3.8.xx버전을 지원한다.

### pip(Python Install Package) 설치

설치하고 가장 먼저해야할 작은 pip(Python Install Package)를 업그레이드 하는 것이다.

PS D:\python -m pip install --upgrade pip

그럼 tensorflow를 설치할 수 있는 환경이 조성되었다.

### tensorflow 와 tensorflow-cpu 설치 

PS D:\python -m pip install tensorflow

설치된 tensorflow를 확인해보자.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

2022-07-27 11:53:34.911913: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found

2022-07-27 11:53:34.912570: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.

>>> quit()

CUDA 런타임 라이브러리가 없다고 에러를 발생시킨다. 그래서 cpu전용 구동할 수 있는 tensorflow-cpu를 추가 설치한다.

PS D:\> python -m pip install tensorflow-cpu

다시, 설치된 tensorflow의 버전을 확인해 보자.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf

>>> tf.__version__

'2.9.1'

>>> quit()

### PySide6 설치

PS D:\> python -m pip install PySide6

설치된 버전 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import PySide6

>>> PySide6.__version__

'6.3.1'

>>> quit()

### OpenCV 설치

PS D:\> python -m pip install opencv-python

설치된 버전 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import cv2

>>> cv2.__version__

'4.6.0'

>>> quit()

## Visual Studio Code 설치

아래의 사이트를 방문해서 해당 시스템에 알맞은 설치파일을 다운로드 받는다.

https://code.visualstudio.com/download

설치 후 PySide6 예제를 코딩하고 실행해 본다.


## FLIR 카메라를 위한 환경 설정

과거의 Point Gray사의 카메라를 사용하기 위해서 현재는 FLIR로 합병된 Spinnaker SDK를 설치해야한다.

SpinnakerSDK_FULL_2.7.0.128.x64.exe 파일을 다운로드하고 설치한다.

그리고,  Python 에서 카메라를 운용하기 위해서 spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.zip 파일도 다운로드하고, 다음의 명령어로 설치한다.

PS D:\> python -m pip install .\spinnaker_python-2.7.0.128-cp38-cp38-win_amd64.whl

그리고 설치확인한다.


import os
import PySpin
import sys

if __name__ == '__main__':
    # Retrieve singleton reference to system object
    system = PySpin.System.GetInstance()

    # Get current library version
    version = system.GetLibraryVersion()
    print('Library version: %d.%d.%d.%d' % (version.major, version.minor, version.type, version.build))

    # Retrieve list of cameras from the system
    cam_list = system.GetCameras()

    num_cameras = cam_list.GetSize()

    print('Number of cameras detected: %d' % num_cameras)


## Ocean Optics의 USB 4000을 위한 환경 설정

사전설치 사항으로 SpectraSuite가 설치되어 WinUSB 드라이버가 작동하고 있어야 한다.

그렇지 않다면, libusb-win32를 설치하고 수작업으로 드라이버를 설정하고 설치해야 한다.

아직은 seabreeze가 libusb-1.0을 지원하고 있지는 않는 것 같아. 위의 방법이 유일한 것 같다.

그럼 python에서 usb4000을 운용할 seabreeze를 설치한다.

PS D:\> python -m pip install seabreeze

설치된 버전을 확인한다.

PS D:\> python

Python 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>> import seabreeze

>>> seabreeze.use('cseabreeze')

>>> from seabreeze.spectrometers import list_devices, Spectrometer

>>>  devices = list_devices()

  File "<stdin>", line 1

    devices = list_devices()

IndentationError: unexpected indent

>>> devices = list_devices()

>>> devices

[<SeaBreezeDevice USB4000:USB4U30285>]

설치는 잘 된 것 같다. 



2021년 1월 3일 일요일

Repair the broken pip in python 3.8 venv against python 3.9 as system default

Suddenly distutils used for venv of python3.8 is disappeared after system updated.

In the look into /usr/lib/python3.8/distutils, many files are missing.

I found the workaround at https://askubuntu.com/questions/1239829/modulenotfounderror-no-module-named-distutils-util

My solution is that distutils in python3.8 has to be copied from distutils in python 3.9.

root@T480s:~# cp -r /usr/lib/python3.9/distutils /usr/lib/python3.8