카테고리 없음

0528 새벽

codename_JEN 2023. 6. 7. 10:53

텐서플로우 잘 작동되는거 확인
 
 

버전이 구닥다리이긴한데 서치하다보면 1점대 자료가 많으니까(아마도) 그냥 쓰자
 
 
Anaconda prompt 실행

keras  설치
 

keras import 동작 여부 확인
 
 
필요한 코드를 만들기 전에
test로 간단한 연습코드를 작성해보았다

하나씩 값을 얻고 싶을 때:
이미지의 이름을 입력했을 때 특정 분류값을  알려주는 코드


여러장의 이미지의 값을 한번에 얻고 싶을 때:
전체 특정분류값과 확률까지 출력하는 코드

import os
import tensorflow as tf 
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 이미지 폴더 경로 설정
base_dir = "D:\\python"
train_dir = os.path.join(base_dir, "train")
test_dir = os.path.join(base_dir, "test")

# 데이터 전처리 및 생성기 설정
image_size = (224, 224)
batch_size = 32

# train 이미지 데이터 로드 및 전처리
train_data_generator = ImageDataGenerator(rescale=1.0/255.0)
train_generator = train_data_generator.flow_from_directory(
    train_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='categorical', # 클래스 binary -> categorical 모드로 수정
    classes=['apple', 'orange']
)

# test 이미지 데이터 로드 및 전처리
test_data_generator = ImageDataGenerator(rescale=1.0/255.0)
test_generator = test_data_generator.flow_from_directory(
    test_dir,
    target_size=image_size,
    batch_size=batch_size,
    class_mode='categorical', # 클래스 binary -> categorical 모드로 수정
    classes=['apple', 'orange']
)

# 모델 생성
base_model = tf.keras.applications.ResNet50(
    weights='imagenet',
    include_top=False,
    input_shape=(224, 224, 3)
)

# 모델 구성
model = tf.keras.models.Sequential([
    base_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

# 모델 컴파일
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 모델 훈련 50회 반복
model.fit(
    train_generator,
    steps_per_epoch=train_generator.samples // train_generator.batch_size,
    epochs=50,
    validation_data=test_generator,
    validation_steps=test_generator.samples // test_generator.batch_size
)

# 이미지 분류 함수 정의
def classify_image(image_path):
    image = tf.io.read_file(image_path)
    image = tf.image.decode_jpeg(image, channels=3)
    image = tf.image.resize(image, image_size)
    image = image / 255.0
    image = tf.expand_dims(image, axis=0)
    prediction = model.predict(image)
    class_names = ['apple', 'orange']
    predicted_class = class_names[int(round(prediction[0][0]))]
    predicted_prob = prediction[0][0]
    return predicted_class, predicted_prob

# 테스트 이미지 경로 설정
test_images_dir = os.path.join(base_dir, "test")

# 결과 출력
for image_name in os.listdir(test_images_dir):
    image_path = os.path.join(test_images_dir, image_name)
    predicted_class, predicted_prob = classify_image(image_path)
    print(f"이미지: {image_name} 분류(사과/배): {predicted_class} (확률: {predicted_prob:.4f})")



수정내역
tensor 1.x버전 호환
다중클래스(클래스 폴더 2개 이상) -> categorical
rescale=1.0/255.0
-> 픽셀 값 0과 1 사이로 정규화
절대 경로로 변경 ./train, ./test ->  train, test