<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>minani_99.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 23 Apr 2025 02:04:17 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>minani_99.log</title>
            <url>https://velog.velcdn.com/images/minani_99/profile/bcc93ceb-c0fe-400c-90dd-111b31958612/social_profile.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. minani_99.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/minani_99" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Flask로 웹 서비스 만들기 (국비 프로젝트)]]></title>
            <link>https://velog.io/@minani_99/Flask%EB%A1%9C-%EC%9B%B9-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B5%AD%EB%B9%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</link>
            <guid>https://velog.io/@minani_99/Flask%EB%A1%9C-%EC%9B%B9-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EA%B5%AD%EB%B9%84-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8</guid>
            <pubDate>Wed, 23 Apr 2025 02:04:17 GMT</pubDate>
            <description><![CDATA[<h1 id="🛠-flask로-웹-서비스-만들기--garbageguard-기반-실전-정리">🛠 Flask로 웹 서비스 만들기 – GarbageGuard 기반 실전 정리</h1>
<p>ISO 14001 기반 건설 현장 폐기물 관리 시스템인 <strong>GarbageGuard</strong>를 개발하며 배운 Flask 핵심 개념과 구조를 정리했습니다. 실전 중심으로 Flask의 흐름을 이해하고 싶은 분들께 도움이 되길 바랍니다.</p>
<hr>
<h2 id="🔍-flask란">🔍 Flask란?</h2>
<ul>
<li>Python 기반의 <strong>마이크로 웹 프레임워크</strong></li>
<li>경량, 유연성, 빠른 개발 속도</li>
<li>Django와 다르게 사용자가 구조를 직접 설계 가능</li>
</ul>
<hr>
<h2 id="🧱-flask-기본-구조-vs-실전-프로젝트-구조-비교">🧱 Flask 기본 구조 vs 실전 프로젝트 구조 비교</h2>
<p>Flask는 기본적으로 단순한 구조를 가지고 있지만, 실제 프로젝트에서는 기능이 많아지면서 구조를 확장하게 됩니다.<br>아래는 기본적인 구조와 GarbageGuard 프로젝트에서 실제 사용한 구조를 비교한 내용입니다.</p>
<hr>
<p>📦 기본 Flask 구조 (튜토리얼 기준)</p>
<p>my_flask_app/
├── app.py                  # 메인 서버 코드
├── templates/              # HTML 템플릿 (Jinja2)
│   └── index.html
├── static/                 # 정적 파일 (CSS, JS, 이미지 등)
│   ├── css/
│   ├── js/
│   └── img/
└── requirements.txt        # 필요한 패키지 목록</p>
<p>📌 특징:</p>
<ul>
<li>소규모 프로젝트나 학습용에 적합</li>
<li>라우팅, 로직, 데이터 처리가 모두 app.py에 몰려 있음</li>
</ul>
<hr>
<p>🛠 GarbageGuard 구조 (실전 프로젝트 기준)</p>
<p>GarbageGuard/
├── app.py                  # 서버 진입점 (Flask 인스턴스 실행)
├── run_ngrok.py            # 외부 접속 테스트용 ngrok 실행
├── train_codd.py           # CODD 데이터셋 학습 스크립트
├── yolo11n.pt              # 학습된 모델 가중치
├── yolov8n.pt              # 기본 YOLOv8 가중치
│
├── .venv1/                 # 가상환경
├── calculators/            # 탄소 배출량 계산기 관련 모듈
├── config/                 # 환경 설정 (경로, 변수 등)
├── datasets/               # 학습용 데이터셋 저장소
├── db/                     # DB 연결 및 쿼리 처리 (ex. MySQL 연동)
├── routes/                 # 라우팅만 분리
├── services/               # 업로드, YOLO 분석, 통계 처리 등 핵심 로직
├── utils/                  # 보조 모듈 (ex. 이미지 분석, 파일처리)
├── test_images/            # 테스트 이미지 저장 폴더
├── uploads/                # 업로드된 이미지 저장 경로
├── templates/              # 사용자 UI용 HTML 템플릿
├── static/                 # 정적 자산 (CSS, JS, 이미지 등)
│   ├── css/
│   ├── js/
│   └── img/
├── requirements.txt        # 전체 패키지 목록
└── README.md               # 프로젝트 설명 문서</p>
<p>📌 특징:</p>
<ul>
<li>역할별 폴더 분리</li>
<li>ML 모델 연동, DB 처리, API 관리가 나누기</li>
</ul>
<hr>
<p>🎯 핵심 비교 요약</p>
<table>
<thead>
<tr>
<th>항목</th>
<th>기본 구조</th>
<th>실전 구조 (GarbageGuard)</th>
</tr>
</thead>
<tbody><tr>
<td>규모</td>
<td>소규모 프로젝트</td>
<td>중~대규모 기능 포함 프로젝트</td>
</tr>
<tr>
<td>app.py 역할</td>
<td>모든 기능 몰빵</td>
<td>진입점 역할만, 나머지는 분리</td>
</tr>
<tr>
<td>라우팅 관리</td>
<td>app.py 내부에서 직접 작성</td>
<td><code>routes/</code> 폴더에 분리</td>
</tr>
<tr>
<td>로직 처리</td>
<td>app.py에 직접 구현</td>
<td><code>services/</code>, <code>utils/</code>로 분리</td>
</tr>
<tr>
<td>정적 리소스</td>
<td>static/</td>
<td>static/ (같음)</td>
</tr>
<tr>
<td>템플릿</td>
<td>templates/</td>
<td>templates/ (같음)</td>
</tr>
</tbody></table>
<hr>
<p>Flask는 기본 구조가 단순해서 입문에 좋지만,<br> <strong>서비스/유틸/DB/라우터 등 분리 구조</strong>을 하여 관리하기
편하게 만들어 보았습니다.</p>
<hr>
<h2 id="⚙️-flask-서버-실행-방법">⚙️ Flask 서버 실행 방법</h2>
<h1 id="패키지-설치">패키지 설치</h1>
<p>pip install -r requirements.txt</p>
<h1 id="서버-실행">서버 실행</h1>
<p>python app.py</p>
<h1 id="브라우저에서-접속">브라우저에서 접속</h1>
<p><a href="http://localhost:5000">http://localhost:5000</a></p>
<hr>
<h2 id="🔄-flask-요청-처리-흐름">🔄 Flask 요청 처리 흐름</h2>
<p>[브라우저 요청]
  ↓
[Flask 라우팅 (@app.route)]
  ↓
[서비스 로직 실행 (YOLO 분석, DB 저장 등)]
  ↓
[HTML 템플릿 or JSON 응답]
  ↓
[결과 사용자에게 표시]</p>
<hr>
<h2 id="📌-예시-이미지-업로드-→-yolo-분석-→-결과-출력">📌 예시: 이미지 업로드 → YOLO 분석 → 결과 출력</h2>
<pre><code>@app.route(&#39;/upload&#39;, methods=[&#39;POST&#39;])
def upload():
    file = request.files[&#39;file&#39;]
    filename = secure_filename(file.filename)
    filepath = os.path.join(app.config[&#39;UPLOAD_FOLDER&#39;], filename)
    file.save(filepath)</code></pre><pre><code>result_img, result_data = analyze_image(filepath)  # YOLO 처리
return render_template(&#39;result.html&#39;, result=result_data, image_path=filename)</code></pre><h1 id="html-예시-templatesindexhtml">HTML 예시 (templates/index.html)</h1>
<pre><code>&lt;form action=&quot;/upload&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&gt;
  &lt;input type=&quot;file&quot; name=&quot;file&quot; /&gt;
  &lt;button type=&quot;submit&quot;&gt;업로드&lt;/button&gt;
&lt;/form&gt;</code></pre><hr>
<form action="/upload" method="POST" enctype="multipart/form-data">
  <input type="file" name="file" />
  <button type="submit">업로드</button>
</form>

<hr>
<h2 id="🧠-구조-확장-팁-모듈-분리">🧠 구조 확장 팁 (모듈 분리)</h2>
<h1 id="규모가-커지면-다음과-같이-구조-분리">규모가 커지면 다음과 같이 구조 분리:</h1>
<p>GarbageGuard/
├── app.py
├── services/
│   └── upload_service.py
├── utils/
│   └── image_analysis.py
├── db/
│   └── db_manager.py</p>
<h1 id="유지보수와-협업을-위한-코드-분리">유지보수와 협업을 위한 코드 분리:</h1>
<h1 id="라우터-로직-db-함수-각각-분리해서-사용">라우터, 로직, DB 함수 각각 분리해서 사용</h1>
<hr>
<h2 id="🧩-사용하며-든-생각">🧩 사용하며 든 생각</h2>
<ul>
<li>파일 경로 관리, <code>url_for()</code> 잘 써야 정적 리소스 문제 없음</li>
<li>Jinja2 템플릿 문법에 익숙해지면 HTML 효율 증가</li>
<li>YOLO 모델 연동 시 구조 잘 잡으면 성능 Bottleneck 줄임</li>
<li>디버깅은 <code>print</code>, <code>logging</code>, Flask 디버그 모드 적극 활용</li>
</ul>
<hr>
<h2 id="✍️-마무리">✍️ 마무리</h2>
<p>Flask는 단순하면서도 유연해서 실전 프로젝트 구조 설계에 최적입니다.<br>YOLO 같은 머신러닝 모델 연동에도 무리 없고, HTML/CSS/JS까지 연계하면<br>강력한 웹 서비스를 빠르게 구축할 수 있습니다.</p>
<p>다음 포스트에서는 <code>Flask + MySQL 연동</code>, <code>Chart.js 시각화</code>, <code>YOLOv8 모델 결과 처리</code> 등을 이어서 다룰 예정입니다!</p>
<p>👉 GitHub: <a href="https://github.com/MinGiTae/GarbageGuard">https://github.com/MinGiTae/GarbageGuard</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[YOLO8을 통해 객체 탐지 및 구분하기]]></title>
            <link>https://velog.io/@minani_99/YOLO8%EC%9D%84-%ED%86%B5%ED%95%B4-%EA%B0%9D%EC%B2%B4-%ED%83%90%EC%A7%80-%EB%B0%8F-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@minani_99/YOLO8%EC%9D%84-%ED%86%B5%ED%95%B4-%EA%B0%9D%EC%B2%B4-%ED%83%90%EC%A7%80-%EB%B0%8F-%EA%B5%AC%EB%B6%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 22 Apr 2025 03:59:49 GMT</pubDate>
            <description><![CDATA[<h1 id="🏗️-건설폐기물-탐지-yolov8-프로젝트">🏗️ 건설폐기물 탐지 YOLOv8 프로젝트</h1>
<p>건설폐기물을 <strong>YOLOv8</strong>을 통해 탐지하고<br>🚛 재활용 여부 및 탄소 배출량을 예측하는 프로젝트입니다.</p>
<hr>
<h2 id="🛠️-사용환경">🛠️ 사용환경</h2>
<ul>
<li>IDE: <strong>PyCharm</strong></li>
<li>모델: <strong>Ultralytics YOLOv8</strong></li>
<li>목적: 건설 현장 폐기물 자동 분류 및 탄소 계산</li>
</ul>
<hr>
<h2 id="📦-설치-및-환경-세팅">📦 설치 및 환경 세팅</h2>
<pre><code class="language-bash">pip install ultralytics</code></pre>
<p>설치 후 아래와 같이 <code>successfully</code>만 보이면 성공!  
<img src="https://velog.velcdn.com/images/minani_99/post/17989fb7-7006-4925-b53a-9114db64aa36/image.png" alt=""></p>
<hr>
<h2 id="🔍-ultralytics란">🔍 Ultralytics란?</h2>
<blockquote>
<p>YOLOv8 모델을 만들고, 학습시키고, 예측까지 한 줄로 할 수 있게 해주는 공식 라이브러리<br>PyTorch 기반이지만 YOLOv8부터는 <code>ultralytics</code> 사용이 표준</p>
</blockquote>
<hr>
<h3 id="🔧-기본-사용-예시">🔧 기본 사용 예시</h3>
<pre><code class="language-python">from ultralytics import YOLO

# 사전 학습된 모델 불러오기
model = YOLO(&quot;yolov8n.pt&quot;)

# 모델 학습
model.train(data=&quot;data.yaml&quot;, epochs=50)

# 이미지 탐지
results = model(&quot;test.jpg&quot;)
results.show()

# 웹캠 실시간 탐지
model.predict(source=0)</code></pre>
<hr>
<h2 id="🧱-건설폐기물-클래스-정의">🧱 건설폐기물 클래스 정의</h2>
<blockquote>
<p>법령(건설폐기물 재활용촉진법 제2조 기준)에 따라 총 18종으로 분류</p>
</blockquote>
<pre><code>1. 폐콘크리트  
2. 폐아스팔트콘크리트  
3. 폐벽돌  
4. 폐블록  
5. 폐기와  
6. 폐목재  
7. 폐합성수지  
8. 폐섬유  
9. 폐벽지  
10. 건설오니  
11. 폐금속류  
12. 폐유리  
13. 폐타일 및 폐도자기  
14. 폐보드류  
15. 폐판넬  
16. 건설폐토석  
17. 혼합건설폐기물  
18. 기타

---

## 🧾 data.yaml 예시

```yaml
path: GG_dataset
train: images/train
val: images/val

nc: 18
names: [
  &quot;폐콘크리트&quot;, &quot;폐아스팔트콘크리트&quot;, &quot;폐벽돌&quot;, &quot;폐블록&quot;, &quot;폐기와&quot;, &quot;폐목재&quot;, &quot;폐합성수지&quot;,
  &quot;폐섬유&quot;, &quot;폐벽지&quot;, &quot;건설오니&quot;, &quot;폐금속류&quot;, &quot;폐유리&quot;, &quot;폐타일 및 폐도자기&quot;,
  &quot;폐보드류&quot;, &quot;폐판넬&quot;, &quot;건설폐토석&quot;, &quot;혼합건설폐기물&quot;, &quot;기타&quot;
]</code></pre><hr>
<h2 id="✅-할-일-체크리스트">✅ 할 일 체크리스트</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> 클래스 정의  </li>
<li><input checked="" disabled="" type="checkbox"> 이미지 수집 (10장 이상/클래스)  </li>
<li><input checked="" disabled="" type="checkbox"> 폴더 구조 정리  </li>
<li><input checked="" disabled="" type="checkbox"> 라벨링(LabelImg)  </li>
<li><input checked="" disabled="" type="checkbox"> train/val 분리  </li>
<li><input checked="" disabled="" type="checkbox"> <code>data.yaml</code> 작성  </li>
<li><input checked="" disabled="" type="checkbox"> 모델 학습  </li>
<li><input checked="" disabled="" type="checkbox"> 테스트 이미지 예측  </li>
</ul>
<hr>
<h2 id="📂-외부-데이터-활용-codd">📂 외부 데이터 활용: CODD</h2>
<ul>
<li>출처: <a href="https://data.mendeley.com/datasets/wds85kt64j/3">https://data.mendeley.com/datasets/wds85kt64j/3</a>  </li>
<li>건설 폐기물 관련 이미지 다수 포함  </li>
<li>YOLO 포맷에 맞게 정리 후 학습 시작</li>
</ul>
<p><img src="https://velog.velcdn.com/images/minani_99/post/0240ba13-17a1-4283-8819-fd07556f6caa/image.png" alt="">
YOLO에 맞는 포맷은 이런 형식인듯 하다.</p>
<hr>
<h2 id="🧠-모델-학습-코드">🧠 모델 학습 코드</h2>
<pre><code class="language-python">from ultralytics import YOLO
import os

model_path = &#39;runs/detect/train_codd5/weights/best.pt&#39;
test_folder = &#39;test_images&#39;
output_project = &#39;runs/detect&#39;
output_name = &#39;predict_test&#39;

model = YOLO(model_path)
results = model.predict(
    source=test_folder,
    save=True,
    save_txt=True,
    project=output_project,
    name=output_name
)

print(f&#39;추론 완료 결과 {os.path.join(output_project, output_name)} 에 저장&#39;)</code></pre>
<hr>
<h2 id="📸-테스트-이미지-예측-결과">📸 테스트 이미지 예측 결과</h2>
<p><img src="https://velog.velcdn.com/images/minani_99/post/a5c0ed13-decb-4bd3-8574-0a583e325065/image.png" alt=""></p>
<p>↑ Raw 이미지로 예측 시 꽤 높은 인식률</p>
<p><img src="https://velog.velcdn.com/images/minani_99/post/e5f81b53-766a-4523-8c41-cd082b121147/image.png" alt=""></p>
<p>↑ 콘크리트/타일/벽돌 혼합 환경는 조금 애매한 모습을 보임</p>
<hr>
<h2 id="🧪-추가-학습-중-taco-데이터셋">🧪 추가 학습 중: TACO 데이터셋</h2>
<ul>
<li>일반 쓰레기 탐지용 데이터셋  </li>
<li><code>TACO</code>도 학습하여 혼합 데이터셋으로 확장 시도 중</li>
</ul>
<p><img src="https://velog.velcdn.com/images/minani_99/post/9fa88923-7132-45b8-81a7-6f45166ff85e/image.png" alt=""></p>
<hr>
<p>이후에는 다양한 환경, 배경 조건에서의 인식률 향상을 위해<br>📈 <strong>추가 데이터 수집 → 재학습 → 통합 모델 제작</strong>을 반복할 계획입니다.</p>
<pre><code></code></pre>]]></description>
        </item>
    </channel>
</rss>