#python #machine-learning #scikit-learn #object-detection #random-forest
Вопрос:
Я играл с классификатором sklearn randomForest и кое — чего не понимаю.
Я создал модель, которая классифицирует каждый пиксель в зависимости от того, соответствует ли он объекту или нет, в данном случае груше. Что-то вроде этого:
Чтобы обучить эту модель, я использовал эти три изображения:
Теперь дело в том, что я создал две разные модели, каждая из которых использует другую маску с надписью для одних и тех же обучающих изображений:
модель 1:
модель 2:
Обе модели имеют приемлемую точность, но проблема здесь в том, что первой модели требуется около 0,5 секунды, чтобы сделать прогноз для 10 новых изображений, в то время как модели 2 требуется около 4 секунд, чтобы сделать прогноз для тех же 10 изображений. Как это возможно?
ОТРЕДАКТИРУЙТЕ с помощью кода и дополнительной информации, как предложил @TYZ
def train_model(image_path, labeled_image_path, test_split=0.3): train_img = cv2.imread(image_path) #Load training image train_img = cv2.cvtColor(train_img, cv2.COLOR_BGR2RGB) #Convert BGR to RGB train_img = train_img[:, :, 2] #Only take the GREEN channel (Try for each channel and select the best) df = generate_features(train_img) #Create a dataFrame containing all features train_img_labeled = cv2.imread(labeled_image_path) train_img_labeled = cv2.cvtColor(train_img_labeled, cv2.COLOR_BGR2GRAY) #Load labeled image df["Labels"] = train_img_labeled.reshape(-1) Y = df["Labels"].values X = df.drop(labels=["Labels"], axis=1) # Split the data into train and test from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_split, random_state=20) #Create new model from sklearn.ensemble import RandomForestClassifier model = RandomForestClassifier(n_estimators = 5, random_state = 25, max_depth=1, n_jobs=1) # Train the model model.fit(X_train, y_train) return model
def test(model): image_paths = ["test/scaled/test_1.jpeg", "test/scaled/test_2.jpeg", "test/scaled/test_3.jpeg", "test/scaled/test_4.jpeg", "test/scaled/test_5.jpeg", "test/scaled/test_6.jpeg", "test/scaled/test_7.jpeg", "test/scaled/test_8.jpeg", "test/scaled/test_9.jpeg", "test/scaled/test_10.jpeg"] import time start_time = time.time() for image_path in image_paths: start_time = time.time() result = calculate_model_output(model, image_path, show=False) print("--- %s seconds ---" % (time.time()-start_time))
Комментарии:
1. Вам придется предоставить нам дополнительную информацию, чтобы мы могли вам помочь. Пожалуйста, предоставьте минимальный воспроизводимый пример с вашим кодом, данными или даже моделями, которые вы обучили, чтобы мы могли воспроизвести разницу во времени прогнозирования.
2. Проверьте среднюю глубину деревьев в двух моделях; возможно, ваша вторая модель закончила тем, что в среднем деревья росли глубже. (И, возможно, лучше всего измерить глубину ваших тестовых образцов; вероятно, самый простой способ сделать это-получить доступ к базовым
DecisionTreeClassifier
объектам и использовать ихdecision_path
метод.)3. @TYZ Оригинальное сообщение отредактировано с дополнительной информацией.
4. @BenReiniger Теперь я обновил сообщение кодом и дополнительной информацией, как вы можете видеть, я создал модель с max_depth = 1 в обоих случаях.
5. Имея всего 5 деревьев глубиной 1, я был бы удивлен, если бы предсказание заняло сколько-нибудь значительное время; загрузка изображений вполне может занять больше времени. Согласуются ли эти сроки? Какая разница, если вы измените порядок проведения тестов?