지능형 보행 지원 안경 시스템: 오픈소스 기반의 자동화 배포 및 테스트 환경 제공

AI 기반 보행 지원 안경 시스템: 개발자 친화적 인프라 구축

시각 장애인이 일상적인 이동을 안전하게 수행할 수 있도록 돕는 지능형 안경 시스템은 단순한 소프트웨어 도구를 넘어, 실제 삶의 질을 개선하는 중요한 기술이다. 본 프로젝트는 이러한 사회적 필요에 부응하며, 완전히 오픈소스로 공개된 통합 솔루션을 제공한다. 특히, CI/CD 파이프라인 템플릿자동화 테스트 세트를 포함하여, 누구나 빠르게 배포하고 확장할 수 있는 개발 환경을 구축했다.

핵심 구성 요소: 다중 모달 기반의 실시간 내비게이션

  • 보행 경로 인식: 지면의 막대기(보행자 전용 도로)를 실시간으로 감지하고, 방향 지시를 음성으로 제공한다.
  • 횡단 보조 기능: 보행 신호등 상태와 보도를 인식해 녹색 신호 시 안전하게 횡단할 수 있도록 안내한다.
  • 물체 탐색 시스템: 사용자가 특정 물건(예: 우유, 리모컨)을 요청하면, 주변 환경을 스캔해 위치를 확인하고 접근 방향을 안내한다.
  • 음성 상호작용 인터페이스: 자연어 기반의 대화형 인터랙션을 통해 사용자는 질문이나 명령을 자유롭게 입력할 수 있다.

기술 아키텍처: 하드웨어부터 서비스까지 종단 간 통합

본 시스템은 단일 애플리케이션을 넘어서, 전체 생태계를 포괄하는 엔드투엔드 아키텍처를 갖추고 있다.

  • 하드웨어 계층: ESP32-CAM 기반의 웨어러블 디바이스에 카메라, 마이크, 센서가 통합되어 있으며, 저전력·경량 설계를 고려하였다.
  • AI 모델 계층: YOLO 기반의 여러 전문 모델이 활용된다.
    • yolo-seg.pt: 보행 경로 분할
    • yoloe-11l-seg.pt: 장애물 감지
    • shoppingbest5.pt: 상품 인식
    • trafficlight.pt: 신호등 상태 분석
    • hand_landmarker.task: 손 동작 감지
  • 서비스 계층: Python Flask 기반의 웹서비스로, REST API와 실시간 WebSocket 통신을 제공한다.
  • 사용자 인터페이스: Web 기반의 직관적 컨트롤 패널로, 비디오 파일 업로드만으로도 시스템을 테스트할 수 있다.

CI/CD 파이프라인: 자동화된 배포를 위한 표준화된 템플릿

GitHub Actions 기반의 파이프라인은 코드 품질, 테스트, 빌드, 배포를 단일 플로우로 연결한다.

코드 품질 검사 단계

name: Code Quality Check
on: [push, pull_request]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.9'
      - name: Install dependencies
        run: |
          pip install flake8 black isort
      - name: Check code style
        run: |
          black --check .
          isort --check-only .
          flake8 .

자동화 테스트 단계

test:
  runs-on: ubuntu-latest
  needs: lint
  steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.9'
    - name: Install dependencies
      run: |
        pip install -r requirements.txt
        pip install pytest pytest-cov
    - name: Run tests
      run: |
        pytest tests/ --cov=./ --cov-report=xml
    - name: Upload coverage
      uses: codecov/codecov-action@v3

Docker 이미지 빌드 및 배포

build:
  runs-on: ubuntu-latest
  needs: test
  steps:
    - uses: actions/checkout@v3
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2
    - name: Login to DockerHub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    - name: Build and push
      uses: docker/build-push-action@v4
      with:
        context: .
        push: true
        tags: |
          yourusername/aiglasses:latest
          yourusername/aiglasses:${{ github.sha }}

테스트 환경 자동 배포

deploy-staging:
  runs-on: ubuntu-latest
  needs: build
  if: github.ref == 'refs/heads/main'
  steps:
    - name: Deploy to staging server
      uses: appleboy/ssh-action@v0.1.5
      with:
        host: ${{ secrets.STAGING_HOST }}
        username: ${{ secrets.STAGING_USER }}
        key: ${{ secrets.STAGING_SSH_KEY }}
        script: |
          cd /opt/aiglasses
          docker-compose pull
          docker-compose up -d

자동화 테스트 세트: 품질을 보장하는 다층적 검증

테스트 피라미드 원칙에 따라, 단위, 통합, 종단간 테스트를 모두 포함한다.

단위 테스트 예시 (BlindPathNavigator)

def test_blind_path_detection():
    navigator = BlindPathNavigator()
    result = navigator.detect_path([0.1, 0.9, 0.2, 0.8])
    assert result["direction"] == "left"
    assert result["confidence"] > 0.7

통합 테스트 (Flask API)

def test_api_config_endpoint(client):
    response = client.get('/api/config')
    assert response.status_code == 200
    data = response.get_json()
    assert 'api_key' in data

종단간 테스트 (Selenium 기반 웹 인터페이스 검증)

def test_web_interface():
    driver = webdriver.Chrome()
    try:
        driver.get("http://localhost:8081")
        assert "AIGlasses" in driver.title
        config_button = driver.find_element(By.ID, "config-button")
        config_button.click()
        api_input = driver.find_element(By.ID, "api-key-input")
        api_input.send_keys("sk-test-api-key")
        save_button = driver.find_element(By.ID, "save-config")
        save_button.click()
        status_text = driver.find_element(By.ID, "api-status").text
        assert "已配置" in status_text
    finally:
        driver.quit()

AI 모델 테스트

def test_blind_path_model():
    model = load_model('model/yolo-seg.pt')
    test_image = np.zeros((640, 640, 3), dtype=np.uint8)
    cv2.rectangle(test_image, (200, 500), (440, 600), (100, 100, 100), -1)
    results = predict(model, test_image)
    assert len(results) > 0
    assert results[0]['label'] == 'blind_path'

실시간 성능 테스트

def test_navigation_latency():
    navigator = BlindPathNavigator()
    latencies = []
    for _ in range(100):
        start_time = time.time()
        navigator.detect_path([0.4, 0.9, 0.6, 0.8])
        end_time = time.time()
        latency = (end_time - start_time) * 1000
        latencies.append(latency)
    avg_latency = sum(latencies) / len(latencies)
    assert avg_latency < 50

빠른 시작 가이드: 3분 내 배포 완료

  1. API 키 발급: 알리바바 클라우드의 DashScope에서 무료 키를 생성한다.
  2. 환경 설정: .env 파일에 API_KEY=sk-xxxxx를 입력한다.
  3. Docker 실행:
    git clone https://github.com/AI-FanGe/OpenAIglasses_for_Navigation.git
    cd AIGlasses_for_navigation
    export API_KEY=your_api_key_here
    docker-compose up -d

확장 및 최적화: 맞춤형 개발 지원

  • 모델 교체 및 재학습: YOLOv8을 활용해 특수 환경(예: 병원, 공장)에 최적화된 모델을 제작 가능.
  • 새 기능 추가: IndoorNavigator 클래스를 정의해 실내 내비게이션 모듈을 확장.
  • 성능 최적화: ONNX Quantization 또는 TensorRT 엔진을 통해 추론 속도를 향상시킬 수 있다.

사회적 영향력: 기술의 윤리적 활용

본 시스템은 시각 장애인의 자율성 증진, 공공기관의 장애인 친화적 설계 촉진, 그리고 지역 사회 기반의 기술 혁신을 가능하게 한다. 오픈소스로서의 접근성은 기술 격차를 줄이는 데 핵심 역할을 한다.

개발자라면, 단순한 기능 구현을 넘어서, 사람 중심의 기술 설계를 경험할 수 있는 기회를 얻게 된다. 코드는 열려 있고, 배포는 자동화되었으며, 테스트는 철저하다. 이제 남은 것은 당신의 아이디어와 실행력뿐이다.

태그: AI 안경 CI/CD 자동화 테스트 YOLO flask

7월 29일 21:06에 게시됨