Vanhwbt commited on
Commit
c8b5192
·
1 Parent(s): afe55cd

Fix remove large file

Browse files
Files changed (6) hide show
  1. Dockerfile +13 -15
  2. README.md +9 -0
  3. TraPhuHoi-Backend +0 -1
  4. TraPhuHoi-Backend/.gitattributes +35 -0
  5. app.py +41 -18
  6. git +0 -0
Dockerfile CHANGED
@@ -1,20 +1,18 @@
1
- FROM python:3.13.5-slim
 
2
 
3
- WORKDIR /app
 
4
 
5
- RUN apt-get update && apt-get install -y \
6
- build-essential \
7
- curl \
8
- git \
9
- && rm -rf /var/lib/apt/lists/*
10
 
11
- COPY requirements.txt ./
12
- COPY src/ ./src/
13
 
14
- RUN pip3 install -r requirements.txt
 
15
 
16
- EXPOSE 8501
17
-
18
- HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
19
-
20
- ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
 
1
+ # 1. Chọn hệ điều hành Python
2
+ FROM python:3.9
3
 
4
+ # 2. Tạo thư mục làm việc
5
+ WORKDIR /code
6
 
7
+ # 3. Cài đặt thư viện (Copy file requirements vào trước để cài cho nhanh)
8
+ COPY ./requirements.txt /code/requirements.txt
9
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
 
 
10
 
11
+ # 4. Copy toàn bộ code vào
12
+ COPY . .
13
 
14
+ # 5. Cấp quyền cho thư mục (để tránh lỗi permission trên HF)
15
+ RUN chmod -R 777 /code
16
 
17
+ # 6. Mở cửa (Chạy file app.py)
18
+ CMD ["python", "app.py"]
 
 
 
README.md ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Trà Phú Hội API
3
+ emoji: 🍳
4
+ colorFrom: gray
5
+ colorTo: gray
6
+ sdk: docker
7
+ pinned: false
8
+ app_port: 7860
9
+ ---
TraPhuHoi-Backend DELETED
@@ -1 +0,0 @@
1
- Subproject commit 5c4389686613c90afd062227fbdf908a9484e710
 
 
TraPhuHoi-Backend/.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
app.py CHANGED
@@ -13,18 +13,22 @@ app = Flask(__name__)
13
  CORS(app)
14
 
15
  # ================== 🔧 LOAD MODEL ==================
 
16
  MODEL_PATH = "saurieng_mobilenetv2_model.keras"
17
- model = tf.keras.models.load_model(MODEL_PATH)
 
 
 
 
 
18
 
19
  # ================== 🔍 CLASS LABELS ==================
20
  CLASS_NAMES = [
21
- "ALLOCARIDARA_ATTACK",
22
- "Leaf_Algal",
23
- "Leaf_Blight",
24
- "Leaf_Colletotrichum",
25
- "Leaf_Healthy",
26
- "Leaf_Phomopsis",
27
- "Leaf_Rhizoctonia"
28
  ]
29
 
30
  # ================== 🖼️ PREPROCESS ==================
@@ -35,24 +39,43 @@ def preprocess_image(image_file):
35
  img_array = np.expand_dims(img_array, axis=0)
36
  return img_array
37
 
 
 
 
 
 
 
 
 
 
 
 
 
38
  # ================== 🧠 API /predict ==================
39
  @app.route("/predict", methods=["POST"])
40
  def predict():
 
 
 
41
  if "file" not in request.files:
42
  return jsonify({"error": "No file uploaded"}), 400
43
 
44
- file = request.files["file"]
45
- img_array = preprocess_image(file)
 
46
 
47
- preds = model.predict(img_array)[0]
48
- idx = int(np.argmax(preds))
49
- confidence = float(np.max(preds))
50
 
51
- return jsonify({
52
- "label": CLASS_NAMES[idx],
53
- "confidence": confidence
54
- })
 
 
55
 
56
  # ================== 🏁 RUN ==================
57
  if __name__ == "__main__":
58
- app.run(host="0.0.0.0", port=7860)
 
 
13
  CORS(app)
14
 
15
  # ================== 🔧 LOAD MODEL ==================
16
+ # Lưu ý: Đảm bảo tên file model đúng với file ông đã up lên
17
  MODEL_PATH = "saurieng_mobilenetv2_model.keras"
18
+ try:
19
+ model = tf.keras.models.load_model(MODEL_PATH)
20
+ print("✅ Model loaded successfully!")
21
+ except Exception as e:
22
+ print(f"❌ Error loading model: {e}")
23
+ model = None
24
 
25
  # ================== 🔍 CLASS LABELS ==================
26
  CLASS_NAMES = [
27
+ "Rầy Nhảy (Allocara)", # ALLOCARIDARA_ATTACK
28
+ "Đốm Rong (Algal Spot)", # Leaf_Algal
29
+ "Cháy Lá (Leaf Blight)", # Leaf_Blight
30
+ "Lá Khỏe Mạnh (Healthy)", # Leaf_Healthy
31
+ "Đốm Mắt Cua (Phomopsis)", # Leaf_Phomopsis
 
 
32
  ]
33
 
34
  # ================== 🖼️ PREPROCESS ==================
 
39
  img_array = np.expand_dims(img_array, axis=0)
40
  return img_array
41
 
42
+ # ================== 🏠 TRANG CHỦ (MỚI THÊM) ==================
43
+ @app.route("/", methods=["GET"])
44
+ def home():
45
+ return """
46
+ <div style="font-family: sans-serif; text-align: center; padding: 20px;">
47
+ <h1 style="color: green;">🌱 API Trà Phú Hội Đang đang hoạt động! 🚀</h1>
48
+ <p>Server đã sẵn sàng nhận yêu cầu.</p>
49
+ <p>Endpoint dự đoán: <code>/predict</code> (POST)</p>
50
+ <p style="color: gray; font-size: 0.8em;">Powered by Flask & TensorFlow on Hugging Face</p>
51
+ </div>
52
+ """
53
+
54
  # ================== 🧠 API /predict ==================
55
  @app.route("/predict", methods=["POST"])
56
  def predict():
57
+ if model is None:
58
+ return jsonify({"error": "Model not loaded properly"}), 500
59
+
60
  if "file" not in request.files:
61
  return jsonify({"error": "No file uploaded"}), 400
62
 
63
+ try:
64
+ file = request.files["file"]
65
+ img_array = preprocess_image(file)
66
 
67
+ preds = model.predict(img_array)[0]
68
+ idx = int(np.argmax(preds))
69
+ confidence = float(np.max(preds))
70
 
71
+ return jsonify({
72
+ "label": CLASS_NAMES[idx],
73
+ "confidence": confidence
74
+ })
75
+ except Exception as e:
76
+ return jsonify({"error": str(e)}), 500
77
 
78
  # ================== 🏁 RUN ==================
79
  if __name__ == "__main__":
80
+ # Cổng 7860 là bắt buộc trên Hugging Face
81
+ app.run(host="0.0.0.0", port=7860)
git ADDED
File without changes