1.노드 구성

 1) GPT 이미지 생성모델에게 프롬프트를 전달하여 이미지 생성요청

 2) 생성한 바이너리 이미지를 읽어서 png로 저장

 3) 로컬 PC에 저장

 

2.GPT 이미지 모델 연결

1) gemini

: (aisudio) https://aistudio.google.com/prompts/new_chat

: (레퍼런스) https://ai.google.dev/gemini-api/docs/imagen?hl=ko

curl -X POST \
    "https://generativelanguage.googleapis.com/v1beta/models/imagen-4.0-generate-001:predict" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
        "instances": [
          {
            "prompt": "Robot holding a red skateboard"
          }
        ],
        "parameters": {
          "sampleCount": 4
        }
      }'

 * API-Key를 생성해서 간단하게 테스트 가능: 생성량 제한이 있을껀데, 무한정 무료는 아닐꺼라서... chatgpt에게 물어보면 어느정도 무료로 쓸수 있다고 나오긴함, 

-------------------------------------- chatgpt 답변 -----------------------------

1. Gemini 앱 (웹/모바일): 무제한 무료 사용

  • Gemini 앱 내에서는 Imagen 4 기반 이미지 생성무료로 제공됩니다. 기본 모델 품질 이용 시 요금이 부과되지 않으며, 단, 일일 생성량은 시스템 부하에 따라 제한될 수 있습니다.
    DEV Community+15Zenn+15DEV Community+15
  • 무료 계층에서 주로 쓰는 모델은 Imagen 4이며, **고급 기능(예: 심화 편집, 고속 처리)**은 유료 계층으로 제한됩니다.

 

2) google cloud vertax ai (결국 gemini 모델을 쓰긴함)

 - 무료 크레딧이 있으므로, 그 크레딧을 사용하는 기간에는 안정적으로 이미지 생성 가능

 - vertax ai api를 사용하기 클릭해서 권한받고 진행

 - 레퍼런스 사이트를 찾는 과정이 너무 삽질이 길었다. 구글 could 쪽은 이게 문제인듯....

 - (레펀런스) https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/imagen-api?hl=ko#rest

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \

https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/publishers/google/models/${MODEL_VERSION}:predict \
-d '{
  "instances": [
    {
      "prompt": "..."
    }
  ],
  "parameters": {
    "sampleCount": ...
  }
}'

 

post 주소 예시: https://us-east5-aiplatform.googleapis.com/v1/projects/gen-lang-client-0695181249/locations/us-east5/publishers/google/models/imagen-3.0-generate-002:predict

 

* 인증은 두가지 방식을 지원하는거 같은데(API-KEY, auth2), api-key로는 오류가 나서, 기존 AUTH2 방식(google cloud nature langage)으로 설정한걸 사용했다.

 

3) fal.ai (recraft)

 - 유로 버전은 fal.ai 인터페이스가 가장 쉬운듯(모델도 많음) 

https://fal.ai/models/fal-ai/recraft/v3/text-to-image

 

Recraft V3 | Text to Image | fal.ai

Recraft V3 is a text-to-image model with the ability to generate long texts, vector art, images in brand style, and much more. As of today, it is SOTA in image generation, proven by Hugging Face's industry-leading Text-to-Image Benchmark by Artificial Anal

fal.ai

 

 

3.생성해온 이미지를 png로 변환 (code node)

// predictions[0].bytesBase64Encoded 값 꺼내기
const b64 = $json.predictions[0].bytesBase64Encoded;

// Binary 데이터로 변환해서 반환
return [{
  json: {},   // JSON 결과는 비워두고
  binary: {
    data: {
      data: b64,              // Base64 문자열
      fileName: 'output.png', // 저장할 파일명
      mimeType: $json.predictions[0].mimeType || 'image/png'
    }
  }
}];

3.최종결과

- gemini 버전

 

- vertax 버전(이것도 gemini 모델임)

 

 

 

(이글은 해당 블로그에서 이전한 글입니다. https://jukyellow.github.io/2021/02/23/docker-install-root-dir-modify, https://jukyellow.github.io/2021/04/10/docker-command2/)

[CentOS 도커 설치(재설치)와 Root Dir 변경]

설치환경

  • OS: CentOS 7.2
  • Docker: Docker Comunity 20.0.3?

Docker (재)설치

  • 도커가 이미 설치된 경우, 관련 파일/패키지를 삭제하고 재설치를 수행해야 한다.

컨테이너 종료, 이미지 삭제

docker stop $(docker ps -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q)
 

서비스 중지

systemctl stop docker.service
systemctl stop containerd.service
 

설치된 패키지 확인/삭제

yum list installed | grep docker
yum erase containerd.io.x86_6
yum erase docker-ce.x86_64
yum erase docker-ce-cli.x86_64
 

디렉토리/파일 삭제

rm -rf  /var/lib/docker
cd /var/run
rm docker.sock docker.pid
 

도커 재설치/확인

yum install -y docker-ce
yum list installed | grep docker
 

도커 enable/start

systemctl enable docker.service
systemctl enable containerd.service
systemctl start docker.service
systemctl status docker.service
service status docker
 

참고


Root Dir 변경

  • Docker 설치를 Root 계정으로 하는경우, Docker image 저장경로가 /var/lib/docker에 잡힘에 따라 Root 공간을 점유하게 된다.
  • Root 공간은 OS 영역이므로 스토리지 관리에 문제(공간부족 등)가 되고, 보통은 별도의 디스크를 마운트하여 할당하는 것이 좋다.

설치 경로 확인:

cd /var/lib/docker
ls -F
 

현재 dir-root 확인

docker info | grep "Docker Root Dir"
docker volume inspect my-vol
systemctl status docker.service
 

스크립트 파일변경

vi /usr/lib/systemd/system/docker.service
( - ExecStart로 시작하는 라인 끝에 --data-root=/docker/root/dir 추가)
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/home/docker
데이터 복사/재시작
 

데이터 복사/재시작

  • Docker Root 디렉토리의 데이타 복사 또는 이동 및 Docker 서비스 재시작
  •  
systemctl daemon-reload 
systemctl stop docker
mkdir /home/docker2
cp -rp /var/lib/docker /home/    => 파일 복사
systemctl start docker
 

Root 변경확인

docker info | grep "Docker Root Dir"
(Docker Root Dir: /home/docker    => 변경된 root dir )
docker volume inspect my-vol
 

실행권한 추가

 
sudo chmod 666 /var/run/docker.sock

참고


[도커 컨테이너 생성/실행/관리]

도커란?

가상화 기술(하나의 HW를 SW적으로 분할하여 마치 여러개의 독립된 HW에서 동작시키는것과 같이 리소스를 공유하는 기술)의 하나로,
컨테이너 단위로 구동되고, 컨터이너(SW적으로 분리된 독립된 공간) 안에 OS에서부터 application Layer까지 stack 형식으로 쌓아 올림으로써,
필요한 구성요소를 손쉽게 다운로드/실행하는 방식으로 동작시키는 기술이다.

목차

A. 도커 기본 명령어
1. 버전 확인
2. 이미지 확인
3. 컨테이너 목록 확인
4. 컨테이너 구동
5. 컨테이너 IP 확인
6. 컨테이너 종료
7. 컨테이너/이미지 삭제
8. 컨테이너 내부 접속
9. 컨테이너/Host간 파일 복사
10. 도커 이미지 빌드 
11. 도커 run 명령어 옵션

B. Dockerfile

C. Docker 실행(쉘로 관리)
 

도커 기본 명령어

버전확인

docker -v

 

도커 이미지 목록

docker images

 

도커 컨테이너 목록

docker ps -a

 

컨테이너 구동

docker run --rm --publish 8001:80 -it nginx

 

컨테이너 ip/port 확인

docker exec CONTAINER_ID ip addr show eth0
docker port 도커ID
 

컨테이너 종료

docker stop 컨테이너ID(5555b7dd1385)

 

도커 컨테이너 모두 삭제, 이미지 삭제

- 컨테이너 하나 삭제
docker rm 컨테이너ID
- 권한 없어서 전체삭제는 안됨?
docker rm $(docker ps -a -q)
- 이미지 삭제
docker rmi [이미지명]
- dangling image remove
1) docker rmi -f $(docker images -f "dangling=true" -q)
2) docker image prune
(docker api 1.25이상 지원, -a를 붙이면 전체삭제함으로주의!(-a없이 사용하자))
 

컨테이너 내부접속

docker exec -it 98a6916d8759 /bin/bash

 

컨테이너/Host 파일복사

1) 호스트->컨테이너 : docker cp [host 파일경로] [container name]:[container 내부 경로]
docker cp testWebApp.war 9492a62f43d4:/usr/local/tomcat/webapps
2) 컨테이너->호스트 : docker cp [container name]:[container 내부 경로] [host 파일경로]
docker cp 445a0ba19eea:/usr/local/tomcat/conf/server.xml c:/101_dimg

 

도커 이미지 빌드

- docker build -t [이미지명] .
docker build -t nginx .

 

도커 이미지 다운로드/구동

docker pull tomcat:8
docker run -d -i -t -p 8081:8080 tomcat:8

 

도커 컨테이너 접속(stdout?)

docker attach 도커ID

 

컨테이너 로그 tail

- log tail
docker logs -f 컨테이너ID
- 옵션: --tail=5 (최근5줄만 보기?)
- log tail 종료: Ctrl+p -> Ctrl+q 연속으로 입력(바로 종료하면 컨테이너 죽음 주의!)

 

컨테이너 실행 페라미터 전달

docker run -e "SPRING_PROFILES_ACTIVE=dev" -p 8080:8080 -t springio/gs-spring-boot-docker

 

도커 run 명령어 주요 옵션

14)도커 run 명령어 상세
docker run -d -i -t -p 9001:9001 nginx_microsvc:latest
docker run <옵션> <이미지 이름, ID> <명령> <매개 변수>
-d: --detach=false: Detached 모드입니다. 보통 데몬 모드라고 부르며 컨테이너가 백그라운드로 실행됩니다.
-i: --interactive=false: 표준 입력(stdin)을 활성화하며 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지합니다.
   보통 이 옵션을 사용하여 Bash에 명령을 입력합니다
-t: --tty=false: TTY 모드(pseudo-TTY)를 사용합니다. Bash를 사용하려면 이 옵션을 설정해야 합니다.
   이 옵션을 설정하지 않으면 명령을 입력할 수는 있지만 셸이 표시되지 않습니다.
-p: --publish=[]: 호스트에 연결된 컨테이너의 특정 포트를 외부에 노출합니다.
   보통 웹 서버의 포트를 노출할 때 주로 사용합니다.
 

Dockerfile

dockerfile CMD 명령어

  • CMD [“nginx”, “-g”, “daemon off;”]
  • CMD [“<실행 파일>”, “<매개 변수1>”, “<매개 변수2>”]
  • 셸 없이 바로 실행할 때 매개 변수 설정하기
    : daemon off : nginx.conf에 daemon off;로 설정했으므로 Nginx 웹 서버를 foreground로 실행합니다.

도커 파일 예제

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY msap-zuul-server-0.1.0.war app.war
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.war"]
 

dockerfile 이미지 빌드

docker build -t msap-config-server .

실행

1) bridge 모드
docker run --publish 9000:9000 -it msap-config-server (bridge 모드: 네트웍 격리)
2) host 모드
docker run --net=host --publish 9000:9000 -it msap-config-server (host 모드: host와 IP공유)
 

도커 실행 쉘로 관리법

1) 해당 컨테이너 종료
docker stop $(docker ps --filter 'name=facenet-server' -q)
2) 이미지 삭제
docker rm $(docker ps --filter 'name=facenet-server' -a -q)
docker rmi -f $(docker images -f "dangling=true" -q)
3) 빌드
docker build -t facenet-server .
4) 실행
docker run --name ai-hsgd-verfiy-server \
--publish 8312:8312 \
--net=host \
-d \
-it \
-v ai-hsgd-verfiy-server-logs:/logs ai-hsgd-verfiy-server

 

 

1.로컬 경로에서 파일을 읽어오기 위한 도커 설정

 : 도커를 compose로 구동하기

 : compose설정에 로컬 볼륨 추가

version: "3.8"

services:
  n8n:
    image: docker.n8n.io/n8nio/n8n:latest
    ports:
      - "5678:5678"       # n8n 웹 UI 접속 포트
    environment:
      - GENERIC_TIMEZONE=Asia/Seoul
      - TZ=Asia/Seoul
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      #- N8N_BASIC_AUTH_PASSWORD=강력한비밀번호
      #- N8N_ENCRYPTION_KEY=랜덤_32자리_키
    volumes:
      - n8n_data:/home/node/.n8n      # n8n 데이터 보존
      - C:/02_repository/youtobe_automation/n8n/files:/files                # 로컬 PC files 폴더를 컨테이너 내부 /files 로 마운트
    restart: unless-stopped

volumes:
  n8n_data:

: (실행) docker compose up -d

  (로그)docker compose logs -f

 

2.파일에서 읽어올때, binary 설정을 읽어오는 방법(preprocess)

 : 자바스크립트 코드에서 binary를 버퍼에 담았다가 변환

// 입력 텍스트 가져오기
// const inputData = $input.first().json;
//const rawText = inputData.sampleText || '';
//const title = inputData.testTitle || 'Test';

// 바이너리로 읽은 경우  
const inputData = $input.first().binary;
const buffer = Buffer.from(inputData.data.data, 'base64');
const rawText = buffer.toString('utf8');
const title = 'Sample Book';

 

3. google cloude text-to-speech 설정들 (속도, 어조 등)

 : audio paramter를 개별 설정은 못하고(설정시도했으나 오류로 실패), 하나의 JSON으로 설정함

 : google text-to-speech 설정들

"audioConfig": {
  "audioEncoding": "MP3",      // 필수: 출력 포맷 (LINEAR16, MP3, OGG_OPUS 등)
  "speakingRate": 0.9,         // 말하는 속도 (기본값 1.0, 범위 0.25 ~ 4.0)
  "pitch": 0.0,                // 음성 높낮이, 단위: semitone (-20.0 ~ +20.0)
  "volumeGainDb": 0.0,         // 음량 조정 (dB, 범위 -96.0 ~ +16.0)
  "sampleRateHertz": 24000,    // 출력 샘플링 레이트 (선택 사항)
  "effectsProfileId": ["telephony-class-application"] // 특정 프로필 (전화, 스마트 스피커 최적화 등)
}

 

 

=>결과 파일

 

speech (3).mp3
0.36MB

 

1. 책 내용 요약

제임스 클리어의 『아주 작은 습관의 힘』 은 “작은 습관이 인생을 바꾼다”는 핵심 메시지를 전합니다. 저자는 습관을 단순히 의지력이나 목표 달성의 도구가 아니라, 정체성을 형성하는 기반으로 설명합니다.
책의 주요 골자는 다음과 같습니다:

  • 1%의 변화의 법칙: 매일 1%씩 나아지면 1년 후에는 엄청난 성장을 얻게 되고, 반대로 1%씩 나빠지면 무너진다.
  • 습관 형성 4단계 모델:
    1. 신호(Cue) → 2) 열망(Craving) → 3) 반응(Response) → 4) 보상(Reward).
      좋은 습관은 이 흐름을 강화하고, 나쁜 습관은 끊어내야 한다.
  • 환경의 힘: 의지력에 의존하지 말고, 습관을 유도하는 환경을 설계해야 한다. 예를 들어, 책을 더 읽고 싶다면 눈에 보이는 곳에 책을 두는 것.
  • 정체성 기반 습관: “나는 무엇을 이루고 싶은가?”가 아니라 “나는 어떤 사람이 되고 싶은가?”에 집중해야 한다.
좋은 습관을 만드는 법 나쁜 습관을 버리는 법
1. 분명하게 만들어라(ex: 습관 점수표)
2.매력적으로 만들어라(ex: 유혹 묶기)
3.하기 쉽게 만들어라(ex: 환경을 갖춰라)
4.만족스럽게 만들어라(ex: 보상)
1.보이지 않게 만들어라(ex:노출 횟수를 줄여라)
2.매력적이지 않게 만들어라(ex:마인드셋 재구축)
3.하기어렵게 만들어라(ex: 이행단계를 늘려라)
4.불만족스럽게 만들어라(ex: 습관계약)

 

2. 독서후 느낀점, 얻은것

 

1)  보통 목표를 설정할때, 무엇을 이룰지에 집중한다.

     하지만 더 근본적인 변화를 이룰려면, 내가 어떤 사람이 되려고하는가(정체성)에 포커스를 맞추는게 훨씬더 좋은방법인듯 하다.

     

     ex) 살을빼겠다(목표) -> 자기관리를 잘하는 건강한 사람이 되겠다(정체성)

           패스트푸드를 먹거나 배가 부른데 과식하는 경우 -> 자기관리를 잘하는 건강한 사람인 경우 이럴때 과연 나쁜음식을 먹을까? 폭식을 할까로 접근하게 됨 -> 정체성에 집중할때 더 큰 효과를 얻는다.

 

     ex) 팀회의를 할때, 의견 충돌이 있다-> 만약, 훌륭한 선배/리더라면 이럴때 어떻게 대응하는게 좋을까?에 집중

 

2) 우리는 좋은 습관을 얻는것보다, 나쁜 습관을 버리지 못하는데서 더 큰 문제가 발생한다.(대부분의 시간을 소비하는듯하다)

    책에서 제시한 2가지 방법을 엮어본다. (하기어렵게 만들어라, 불만족스러운 것으로 만들어라)

 

    나의 나쁜 습관: 아무생각없이 TV를 몇시간씩 본다/유튜브를 몇시간씩 본다

    나쁜 습관을 피하는 방법:

      1) (하기 어렵게 만들기) TV/유튜브 보기전, 푸시업을 100번 한다.

      2) (부정적인 것과 연결) TV/유튜브로 시간을 허비하는것은, 가족들을 고통스럽게 하는것이라고 연결

 


 

https://link.coupang.com/a/cOCVc3

 

아주 작은 습관의 힘 [당일발송/무료배송/사은품] - 1학년 | 쿠팡

쿠팡에서 아주 작은 습관의 힘 [당일발송/무료배송/사은품] 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 1학년 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

'기타 > 독서' 카테고리의 다른 글

부자 아빠 가난한 아빠  (5) 2025.08.29
몰입 (황농문)  (6) 2025.08.28
10배의 법칙(그랜트 카돈)  (0) 2025.08.23
나를 단단하게 만드는 심리학(피파 그레인지)  (0) 2025.08.22
백만장자 시크릿  (3) 2025.08.21

 

크게 2가지의 시행착오(삽질)가 있었다.

 

1.Google Cloude Text-2-Speech API 연계시 문제

2.N8N에서 Google api 페라미터 설정 문제

3.생성된 Binanry 실행(구동) 문제


 

1. 노드 구성

: text 노드에서 샘플 데이터를 가져와서 음성으로 변환하는 작업을 실험하고자 했다.

: claude.ai 한테 아래 프롬프트를 넣으면, n8n에서 로딩할 json파일을 생성해준다.(위의 언급한 3번의 문제를 해결하기 위해, 아래 캡쳐는 json2binary라는 노드를 수동으로 추가한 상황이다)

더보기

n8n에서 샘플 text 파일->구글 음성변환하는 테스트해보고 싶어. n8n 노드를 구성하는 json파일을 구성해줘

 

2. 구글 cloude text-to-speech API 작업

  1) google cloude console에 진입

  2) text-to-speech API 사용 추가 (text to speech 검색 후 사용(?)클릭, 아래는 사용적용후의 캡쳐)

 

    - 카드 정보를 필수로 입력해야 테스트 사용이 가능(일단 등록하고, 향후 중지하거나 제거하면됨)

    - 처음에는 300$의 쿠폰을 주고 3개월간 사용이 가능하다. 

    - 기본 음성모델의 경우 100만자당 4$씩 차감된다! 

        * google text-to-speech 장단점 :

           (장점) 모델별로 성능이 뛰어난 모델 취사 선택 가능, 초기 무료 사용권 제공

           (단점) 따라할 수 있는 레퍼런스(다른 블로거들의 글)가 작은듯?

 

   3) API 사용권한 추가 [삽질 1]

     3.1) google cloude api 종류가 딱 맞아 떨어지는게 없음 -> Google Cloude Natural Language account로 선택

     3.2) 추가한 권한정보(client id, secret)을 넣고 하단에 sign in google을 클릭하는데 400,401,403등 오류가 발생

     3.3) 구글 인증정보에서 두가지 추가: 리다이렉션 주소, 테스트 계정

      - 그런데, 이후에도 연결할수 없다고 오류가 발생해서 테스트 계정(메일주소) 추가

 

 

3. n8n 노드 작업(google text 2 speech 연동)

 3.1) 인증 추가: Google Cloude Nature Language account 로 유형 추가(위에 캡쳐 참고)

 3.2) 설정정보: POST방식, JSON 페라미터 등 설정했으나 오류발생(json 페라미터는 claude.ai 가 만들어준거 사용)

- 실행해보면, 페라미터 오류가 발생하여, 구글 스펙을 찾아봐야함

 : https://cloud.google.com/text-to-speech/docs/create-audio-text-command-line?hl=ko

 

빠른 시작: 명령줄을 사용하여 텍스트에서 오디오 만들기  |  Cloud Text-to-Speech API  |  Google Cloud

명령줄을 사용하여 텍스트에서 오디오를 만들도록 Text-to-Speech에 요청합니다.

cloud.google.com

 

       3.3) 예제로 생성된 JSON을 드래그하여 가져옴, body설정을 using JSON으로 변경 [삽질 2]

 

       --> text를 오디오로 변경성공!

 

     3.4) json으로 생성되어서, binary로 변경저장해야(mp3) 내가 들어볼수있다! [삽질 3]

        : 역시나 chatgpt나 claude.ai한테 물어보면 스크립트 생성해줌

        : code 노드를 하나 추가하고, 자바스크립트를 넣어주면 됨!

        --> 실행해보면 작업성공! 다운로드 받아서 변환된 음성을 들어볼수 있다.

   

 

 

* 일단 여기까지 테스트를 끝냈다.

* todo:

 1) 샘플 text를 json전체로 만들어서 돌려봤는데, 개별 페라미터로 바꾸고 + 노드간 input/ouput으로 연결되도록 추가 설정

 2) 생성된 샘플을 들어보면 너무 품질이 떨어지는 느낌(너무 빠르고 자연스럽게 들리지가 않음)

    - google text-to-speech 모델 종류, 남성/여성 type, 속도 같은 페라미터를 조정해서 자연스러운 case를 수동으로 조정해야할듯

speech.mp3
0.08MB

 

OCR 오픈소스 tesseract(Docker)를 이용한 데모 페이지 개발

 

(이 포스팅은 https://jukyellow.github.io/2021/02/20/OCR-Tesseract-Demo/ 에서 이전한 글입니다)

 

  • 현재 인터넷에 공개되 있는 ‘Tesseract 데모 페이지 구현 블로그’는 구 레파지토리(google) 버전이라 실행이 불가능하다. 하여 최신 레파지토리(github) 기준으로 동작가능한 데모 페이지로 오류를 수정하여 내용을 공개한다.
  • 또한, 기존 블로그는 모바일 환경을 지원하지 않지만, 모바일에서 카메라 캡처->Text추출 가능한 소스로 업데이트 예정이다.

실행화면

  • 초기화면
  • Text 추출 결과

tesseract 다운로드

도커 이미지 다운로드

image 다운로드

docker pull tesseractshadow/tesseract4re .

샘플 테스트 (복사 & 실행)

  • test.sh
docker cp ./ocr-files/phototest.tif t4re:/home/work/$TASK_TMP_DIR/
docker exec -it t4re /bin/bash -c "mkdir -p ./$TASK_TMP_DIR/out/; cd ./$TASK_TMP_DIR/out/; tesseract ../phototest.tif phototest -l eng --psm 1 --oem 3 txt pdf hocr"​

 


데모 페이지

pytesseract 설치 및 Flask 웹서버 연동


도커실행

  • 5000: ocr tesseract flask port
     
docker build -t ocr_tesseract_web .
docker run --name ocr_tesseract_web --publish 5000:5000 -it ocr_tesseract_web

dockerfile

  • tesseractshadow/tesseract4re + Flask 웹서버 구동을 위해서 일부 오류수정 추가
     
# start with a base image
# FROM ubuntu:14.04
FROM tesseractshadow/tesseract4re

## install dependencies
RUN apt-get update
RUN apt-get install -y liblog4cplus-dev
RUN apt-get install -y python python-pip

RUN ls
WORKDIR /
RUN ls
ADD requirements.txt /
RUN pip install -r requirements.txt

# pil error : decoder jpeg not available
RUN pip uninstall Pillow -y
RUN apt-get install -y libjpeg-dev
RUN pip install Pillow

# update working directories
ADD ./flask_server /flask_server
WORKDIR /flask_server

#EXPOSE 5000
CMD ["python", "app.py"]

Flask app

  • app.py
     
    @app.route('/')
    def main():
        return render_template('index.html')
    
    @app.route('/v{}/ocr'.format(_VERSION), methods=["POST"])
    def ocr():
        print('--call ocr processing --')
        try:
            if request.files.get("image"):
                print('--read image --')
                # read the image in PIL format
                image = request.files["image"].read()
                image = Image.open(io.BytesIO(image))
                print('RECV:', image.format, image.size, image.mode)
    
                output = process_image2(image)
                print('output:', output)
                return jsonify({"output": output})
            else:
                return jsonify({"error": "only .jpg files, please"})
        except Exception as e:
            print('ocr processing exception:' , e)
            print(traceback.format_exc())
            return jsonify(
                {"error": str(e)}
            )
  • javascript
     
$('#submit').on('click', function(event){
	$("#results").hide()
	var data = new FormData();
	
	if(is_mobile){
		var cFile = getCaptureImg();
		data.append("image", cFile);
	}else{			
		var file = $('#file')[0].files[0];
		data.append("image", file);
	}

	$.ajax({
	  type: "POST",
	  url: "/v1/ocr",
	  enctype: 'multipart/form-data',
	  data : data,
	  processData: false,
	  contentType: false,
	  cache: false,
	  timeout: 600000,
	  success: function(result) {
		console.log(result);
		$("#post-form").hide()
		$("#retry").show()
		$("#results").show()
		$("#results-data").html("<div class='well'>"+result["output"]+"</div>");
	  },
	  error: function(error) {
		console.log(error);
	  }
	});
});

 


Source

'AI > Vision' 카테고리의 다른 글

Face Check in 구현  (2) 2025.08.22

 

# 『10배의 법칙』 요약 & 후기 – 그랜트 카돈의 극단적 성공 전략

 

## 1. 책 한 줄 요약

“성공하고 싶다면, 목표도 행동도 10배로 설정하라!”

## 2. 책의 핵심 내용 요약
- 목표는 현실적으로 잡는 게 아니라 10배 크게!
- 성공한 사람은 상식 밖의 행동량을 보여준다
- 문제는 회피 대상이 아니라 도약의 발판
- 워라밸은 일단 접어두고 성공에 몰입하라

## 3. 읽고 느낀 점
- 지금까지 내가 했던 모든 행동이 ‘보통’ 수준이었다는 자각
- “나는 충분히 행동하고 있는가?”라는 질문이 습관처럼 생김
- 행동의 기준점 자체를 바꾸는 책
- 단순한 동기부여가 아니라, 실천력을 끌어올리는 책

## 4. 이런 분께 추천!
- 아무리 해도 성과가 안 나는 분
- 목표 설정이 늘 작거나 현실적인 분
- 진짜 성공하고 싶은데, 어디서부터 시작할지 모르는 분

 


 

https://link.coupang.com/a/cOCVvz

 

10배의 법칙 : 성공과 실패를 가르는 유일한 차이 - 처세술/삶의 자세 | 쿠팡

쿠팡에서 10배의 법칙 : 성공과 실패를 가르는 유일한 차이 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 처세술/삶의 자세 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

 

'기타 > 독서' 카테고리의 다른 글

부자 아빠 가난한 아빠  (5) 2025.08.29
몰입 (황농문)  (6) 2025.08.28
아주 작은 습관의 힘(제임스 클리어)  (4) 2025.08.24
나를 단단하게 만드는 심리학(피파 그레인지)  (0) 2025.08.22
백만장자 시크릿  (3) 2025.08.21

 

캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)
: (캡슐화) 데이터와 메소드를 하나로 묶고 외부접근을 제한
: (상속) 부모클래스의 특성을 자식 클래스가 물려받음
: (다형성) (1)같은 인터페이스로 다양햔 형태의 객체를 다룸

1. 캡슐화
-캡슐화 방법: 외부에서 변수 참조할때 접근을 제어함
:(객체지향) private(비공개), public(외부공개), protected(경우에따라공개)

class Student:
    def __init__(self, name, addr, r_num):
        self.name = name    # public
        self._addr = addr   # protected
        self.__r_num = r_num # private
    def introduce(self):   # public
        #print(f"안녕하세요, {self.name},{self._addr},{self._r_num}"
        self.__introduce() 
    def __introduce(self): # private
        print(f"안녕하세요, {self.name},{self._addr},{self._r_num}"
    #setter, getter 함수 추가
    def set_r_num(self, r_num):
        self.__r_num = r_num
    def get_r_num(self):
        return self.__r_num

s1 = Student("운국")
s1.introduce()
print(s1.name)
print(s1._addr)
print(s1.__r_num) # 오류발생, 접근불가(private 변수 접근불가)
s1.__introduce()  # 오류발생, 접근불가(private 함수 접근불가)
#setter, getter 함수로 private 변수 접근
s1.set_r_num('851224')
print(s1.get_r_num())



2. 상속
- 상속 특징: 부모클래스 특성을 자식클래스가 물려받아서 재사용가능(코드 재사용성 개선), 계층구조형성
- 상속 문법: class Child(Parent):
- 오버라이딩(override, 메소드 재정의): 물려받은 부모메소드를 자식이 다른 행동으로 덮어쓴다.
- super() 키워드: 부모클래스의 메소드 호출

# 부모 클래스 (기본 클래스, 슈퍼 클래스)
class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        print(f"{self.name}이(가) 소리를 냅니다")    
    def sleep(self):
        print(f"{self.name}이(가) 잠을 잡니다")

# 자식 클래스 (파생 클래스, 서브 클래스)
class Dog(Animal):  # Animal을 상속받음
    def speak(self):  # 메서드 오버라이딩
        print(f"{self.name}이(가) 멍멍 짖습니다")

class Cat(Animal):  # Animal을 상속받음
    def speak(self):  # 메서드 오버라이딩
        print(f"{self.name}이(가) 야옹 웁니다")

# 사용
dog = Dog("바둑이")
cat = Cat("나비")

dog.speak()  # "바둑이이(가) 멍멍 짖습니다"
cat.speak()  # "나비이(가) 야옹 웁니다"
dog.sleep()  # "바둑이이(가) 잠을 잡니다" (부모 메서드 사용)


- super()

class Vehicle:
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
    
    def start(self):
        print(f"{self.brand} {self.model} 시동을 켭니다")

class Car(Vehicle):
    def __init__(self, brand, model, doors):
        super().__init__(brand, model)  # 부모 클래스의 __init__ 호출
        self.doors = doors
    
    def start(self):
        super().start()  # 부모 클래스의 start() 호출
        print("자동차 특별 기능이 활성화됩니다")


- 다중상속

class Flyable:
    def fly(self):
        print("날아갑니다")

class Swimmable:
    def swim(self):
        print("수영합니다")

class Duck(Animal, Flyable, Swimmable):  # 다중 상속
    def speak(self):
        print(f"{self.name}이(가) 꽥꽥 웁니다")

# 사용
duck = Duck("도날드")
duck.speak()  # "도날드이(가) 꽥꽥 웁니다" (Animal 상속)
duck.fly()    # "날아갑니다" (Flyable 상속)
duck.swim()   # "수영합니다" (Swimmable 상속)



3. 다형성
- 다형성: 여러 형태를 가진다는 뜻
> 동일한 인터페이스(메서드 이름)를 가지고 있지만, 클래스에 따라 서로 다른 방식으로 동작
- 다형성 장점: 유연한 설계가 가능, 하나의 인터페이스로 일관된 호출 가능

class Animal:
    def speak(self):
        print("동물이 소리를 냅니다.")

class Dog(Animal):
    def speak(self):
        print("멍멍!")

class Cat(Animal):
    def speak(self):
        print("야옹!")

def make_animal_speak(animal:Animal):
    animal.speak()  # 동일한 메서드 호출

# 실행
animals = [Dog(), Cat()]
for a in animals:
    make_animal_speak(a)
    print(isinstance(a, Dog))    
    print(isinstance(a, Animal))

 

덕 타이핑(duck typing) 
: 객체의 {메소드,속성} 같으면 같은 객체 type으로 간주, 실행가능
: 상속하지 않더라도 다형성 지원

class TV:
    def power_on(self):
        return "TV 켜짐"
class AirConditioner:
    def power_on(self):
        return "에어컨 켜짐"
class Radio:
    def power_on(self):
        return "라디오 켜짐"

# 뭐든 power_on()만 있으면 작동!
def turn_on_device(device):
    return device.power_on()

# 모두 다른 클래스지만 똑같이 동작
print(turn_on_device(TV()))           # "TV 켜짐"
print(turn_on_device(AirConditioner())) # "에어컨 켜짐"
print(turn_on_device(Radio()))         # "라디오 켜짐"

 

 

Python 기초 관련 더 많은 정보를 공부하고 싶으신 분들은 아래 링크 참고하세요~

https://inf.run/7QqW9

 

자동매매 python기초| 코딩멘토 - 인프런 강의

비전공자도 쉽게 이해할수 있는 python 이론과 실습과정으로 진행됩니다. 응용프로그램개발로 지어지는 전체 로드맵에서 첫 번째 단계 python프로그래밍 입문 과정입니다. [전체-로드맵] python기초-

www.inflearn.com

 

핵심 주제: 두려움과 공포 극복

공포의 두 가지 유형:

  1. 순간의 공포 - 아드레날린이 솟구치면서 공황 상태에 빠져 숨이 막히는 위기 상황의 공포
  2. 부족함의 공포 - 삶을 좌지우지하고 부정적인 선택을 하도록 이끌고 성취감을 느끼지 못하게 하는 공포 

주요 내용

문제 진단:

  • 자신이 늘 부족하다는 생각이 진정한 변화나 승리를 누리지 못하게 함 
  • 질투와 완벽주의, 자기비판, 타인과의 비교 

해결책:

  • 삶을 좌지우지하는 공포에 발목 잡히지 않고 진정한 승리를 얻는 법 
  • 인간관계의 두려움에서 벗어나 자신을 단단하게 만드는 마음 근육 훈련 

저자 배경:

호주 빅토리아 대학 응용 심리학 박사로, 지난 20년 동안 엘리트 스포츠팀, 주요 기업, 개인 연주자와 함께 활동한 경험을 바탕으로 실용적 조언을 제공합니다. 책은 두려움의 본질을 이해하고 이를 극복해 정신적으로 강해지는 방법을 체계적으로 다루고 있습니다.

 


 

https://link.coupang.com/a/cOCXju

 

나를 단단하게 만드는 심리학:두려움으로부터 벗어나는 방법 - 교양 심리학 | 쿠팡

쿠팡에서 나를 단단하게 만드는 심리학:두려움으로부터 벗어나는 방법 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 교양 심리학 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

'기타 > 독서' 카테고리의 다른 글

부자 아빠 가난한 아빠  (5) 2025.08.29
몰입 (황농문)  (6) 2025.08.28
아주 작은 습관의 힘(제임스 클리어)  (4) 2025.08.24
10배의 법칙(그랜트 카돈)  (0) 2025.08.23
백만장자 시크릿  (3) 2025.08.21

(본 글은, https://jukyellow.github.io/2021/02/19/Face-Check-In/  에서 이전한 포스팅 입니다)

안면인식과 모션인식을 통한 출석관리 시스템 구현

  • 안면인식 + 동작감지 = (비접촉) 출석체크

 

안면인식과 동작감지 기술을 이용하여 비 접촉 출석체크 시스템을 구현해보았다. 오픈소스의 대중화와 머신러닝 프레임워크의 발전, 그리고 AI 민주화시대를 앞당기는 기업들의 노력으로, 앞으로 이런 수준의 서비스들은 추가적인 연구없이 현재 공개되어 있는 기술들로 충분히 구현 가능하다.

 

 

Teachable Machine(2.0)

 

안면인식 OpenSource

FaceApi

 

Facenet(2015년/Google)

  • Facenet: Embedding(백만명 사진 학습>특징 임베딩 벡터>98~99%)
 

FaceNet: A Unified Embedding for Face Recognition and Clustering

Despite significant recent advances in the field of face recognition, implementing face verification and recognition efficiently at scale presents serious challenges to current approaches. In this paper we present a system, called FaceNet, that directly le

arxiv.org

 

 

시스템 구성/파이프라인

  • 시스템 구성
  • 작업절차: 안면인식(keras)>동작인식(Teach)>두 모델 기능병합(HTML5,JS)>배포(Docker/Flask)

Face Model(안면인식)은 Google Colab환경에서 학습하였다. Facenet 모델의 Embedding 벡터와 지도학습 방법인 서포터벡터머신(SVC)을 사용하여 얼굴예측 모델을 구현하여, 구현체를 H5(Keras 모델), Pickle(Skit-Learn 모델) 파일 형태로 출력한다. Pose Model(동작감지)은 Google Teachable Machine을 사용하여 팔의 동작(O,X,캡쳐,대기)을 학습시키고, 모델을 Json형태로 출력하였다.

서버에 설치는 Docker(Container 가상화 기술)를 사용하여 환경을 구성하였다. Docker를 사용하면 OS환경(Windows/Linux등)과 상관없이 개발환경 그대로 배포환경으로 옮길 수 있다는 장점이 있다. 또한 필요한 Library를 시스템 설치 없이 다운로드후 구동방식으로 동작 시킬 수 있기 때문에 개발 생산성도 좋아진다. Docker를 빌드하기 위해서는 yml 파일이나 Dockerfile이 필요한데, 여기서는 Dockerfile을 사용하였고 Base 이미지로 Keras(Tensorflow)/Flask 이미지 서버를 구성한 뒤, ML(Machine Learning) 출력파일을 올려서 컨테이너를 구성하였다.

배포서버의 도메인이 Https(Nginx) 로 구성되어 있어서, 웹서버(Nginx) 뒤에 WAS서버 형태로 시스템을 붙여야 했다. Flask ML 서버를 port를 분리하여 구동 시키고 Nginx의 URI 라우팅(Location 설정)을 수정하여 구성하였다. Flask는 Python 웹 애플리케이션 서버 역할을 하면서 동시에 웹서버(html, js 배포) 역할을 할 수 있기때문에, Flask 서버에 Html/Javascript 소스도 배포하였다. 이렇게 해서 화면단의 요청을 ML서버가 직접 받도록 구성하여 CORS(Cross-Origin Resource Sharing) 및 Https/Http 혼용사용 문제도 해결하였다.

 

활용기술

안면인식(FaceNet)

  • 사진(150명) Agumentation > Embedding(특징벡터) > SVC(서포트벡터머신) > 예측

Facenet 모델은 기존 사람의 얼굴 윤곽을 잡아서 학습시키는 랜드마크 방식과 다르게, 사람 얼굴의 특정정보를 Embedding이라는 기하학적 공간에 사상시켜 훈련한데에 있다. 유명인 백만명을 학습시켜 Anchor 본인과 같은 사람의 사진이면 Positive로 보고 유클리드 공간상의 거리를 좁히고, 다른 사람이면 Negative로 보고 거리를 멀게 하도록 학습시키는 방식으로 Embedding 벡터를 훈련시켰다. 이 모델의 Embedding벡터를 사람 얼굴 특징 벡터로 Pre-Training 벡터로 사용하여 새로운 얼굴들을 추가 학습시키는 방법으로 활용 가능하다.

학습 절차

머신러닝 학습을 위해서는 여러 장의 사진이 필요하기 때문에, 사진을 복제/변형하여 추가(20장)로 훈련 데이터를 확보한다. 이후 얼굴추출 Library를 이용하여 좌표에 해당하는 이미지를 Slice한다. 이후 오픈소스로 존재하는 Facenet Embedding 벡터를 통과시켜 얼굴 특징점을 수치화한 Vector를 추출한 뒤 본격적인 학습과정이 수행된다. 수치 데이터의 분포가 일정하게 정규화 한 뒤, 사람별로 Labeling 과정을 거치고 지도학습 모델중의 하나인 서포터벡터머신(SVC)으로 훈련시켰다.
학습모델은 변경이 가능하고 딥러닝 모델을 사용하려면 사진 개수가 충분히 많아야 한다. 훈련Set 사진으로 학습시킨 뒤 테스트Set 사진으로 성능을 보면 99.8%로 거의 100%가깝게 나왔지만, 실제로 웹캠으로 시연을 해보면, 성능이 다소 떨어지는데 이는 사진이 현재 얼굴과 많이 다르거나, 웹캠의 해상도 조명등의 영향 때문인데 조명으로 인한 성능차이는 전처리 기능을 보강하여 추가 개선 가능하다.

 

  • Embedding Feacture 추출소스(Facenet->predict)
     
    def get_embedding(model, face_pixels):
        face_pixels = face_pixels.astype('float32')
        mean, std = face_pixels.mean(), face_pixels.std()
        face_pixels = (face_pixels - mean) / std
        samples = expand_dims(face_pixels, axis=0)
        yhat = model.predict(samples) # make prediction to get embedding
        return yhat[0]

동작감지(Teachable Machine)

구글 Teachable Machine은 이미지/사운드/동작 이 세가지 학습방식을 지원하고, 일반인도 충분히 머신러닝 훈련 및 배포까지 가능한 환경을 제공하는 플랫폼이다. 이를 이용하여 팔의 동작 (O,X,캡쳐-두팔,대기)을 학습시켰다. 해당 플랫폼을 활용하여 만든 서비스 사례 중 하나가 ‘관상가 양반’(https://yourface.ga/)이다.
바야흐로 AI 민주화(democratization) 시대가 열리고 있다. 우리도 이제 발맞춰 민첩하게 대응하고 목표를 추진할 수 있는 인력양성이 필요한 시점인 것 같다.


Docker(Flask Web/ML Server)

 

artificial-intelligence-study/11_Serving/keras-flask-img at master · jukyellow/artificial-intelligence-study

AI study based on natural language. Contribute to jukyellow/artificial-intelligence-study development by creating an account on GitHub.

github.com

 

레퍼런스

'AI > Vision' 카테고리의 다른 글

OCR-Tesseract-Demo  (2) 2025.08.23

+ Recent posts