У меня есть наборы данных изображений драгоценных камней. Я классифицировал драгоценные камни по папкам в зависимости от их цвета (это красный, синий, розовый, фиолетовый, желтый).
Что я хочу сделать, так это:
Я хочу обучить модель, используя модель hsv и opencv, для определения цвета драгоценного камня. Это будет ли его синий, фиолетовый, розовый, желтый или красный и любой другой цвет, кроме этих 5 цветов, чтобы определить как неопределенный цвет
Исходный код: (упоминается https://www.kaggle.com)
import os
import matplotlib.pyplot as plt
import seaborn as sn
import cv2
from random import randint
import numpy as np
CLASSES, gems = [], [] # names of classes, count of images for each class
for root, dirs, files in os.walk('C:/Users/User/Desktop/Research Project/images'):
f = os.path.basename(root) # get class name - Red,Blue etc
if len(files) > 0:
gems.append(len(files))
if f not in CLASSES:
CLASSES.append(f) # add folder name
gems_count = len(CLASSES) # 6 = number of classes
print('{} classes with {} images in total'.format(len(CLASSES), sum(gems)))
img_w, img_h = 220, 220 # width and height of image
train_dir = 'C:/Users/User/Desktop/Gem/images/train'
def read_imgs_lbls(_dir):
Images, Labels = [], []
for root, dirs, files in os.walk(_dir):
f = os.path.basename(root) # get class name - Red, Blue, etc
for file in files:
Labels.append(f)
try:
image = cv2.imread(root+'/'+file) # read the image (OpenCV)
image = cv2.resize(image,(int(img_w*1.5), int(img_h*1.5))) # resize the image (images are different sizes)
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # converts an image from BGR color space to HSV
Images.append(image)
except Exception as e:
print(e)
Images = np.array(Images)
return (Images, Labels)
def get_class_index(Labels):
for i, n in enumerate(Labels):
for j, k in enumerate(CLASSES): # foreach CLASSES
if n == k:
Labels[i] = j
Labels = np.array(Labels)
return Labels
Train_Imgs, Train_Lbls = read_imgs_lbls(train_dir)
Train_Lbls = get_class_index(Train_Lbls)
print('Shape of train images: {}'.format(Train_Imgs.shape))
print('Shape of train labels: {}'.format(Train_Lbls.shape))
dim = 4
f,ax = plt.subplots(dim,dim)
f.subplots_adjust(0,0,2,2)
for i in range(0,dim):
for j in range(0,dim):
rnd_number = randint(0,len(Train_Imgs))
cl = Train_Lbls[rnd_number]
ax[i,j].imshow(Train_Imgs[rnd_number])
ax[i,j].set_title(CLASSES[cl]+': ' + str(cl))
ax[i,j].axis('off')
Он считывает значения из имен папок. Но я хочу добавить нижнее и верхнее значения каждого цвета в модель обучения, как указано в ссылке ниже (упомянутый как узнать, обнаружен ли цвет на opencv).
import cv2
import numpy as np
img = cv2.imread("img.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_val = np.array([37,42,0])
upper_val = np.array([84,255,255])
# Threshold the HSV image - any green color will show up as white
mask = cv2.inRange(hsv, lower_val, upper_val)
# if there are any white pixels on mask, sum will be > 0
hasGreen = np.sum(mask)
if hasGreen > 0:
print('Green detected!')
Я также нашел нижнее и верхнее предельные значения hsv цветов, которые мне нужны.
'red': [[9, 255, 255], [0, 50, 70]],
'blue': [[128, 255, 255], [90, 50, 70]],
'yellow': [[35, 255, 255], [25, 50, 70]],
'purple': [[158, 255, 255], [129, 50, 70]]
может кто-нибудь, пожалуйста, дайте мне знать, как я могу объединить определение цвета с использованием значений hsv (как в как узнать, обнаружен ли цвет на opencv) с моим исходным кодом.
Я новичок в обработке изображений, и любая помощь приветствуется.
Спасибо.
@Markus Да, я получил образцы изображений драгоценных камней от kaggle.com. В коде, который я пробовал, он обучает модель, получая имена папок. Но я хочу использовать цветовую модель hsv (нижние и верхние значения цветов) в процессе обучения, как в статье, которую я нашел. У меня есть проблемы с привязкой цветовой модели hsv к коду, который я пробовал.
@Markus Моя главная цель - использовать цветовую модель hsv для определения цвета.
Вы имеете в виду, что хотите определять цвета автоматически, а не раскладывать их вручную по папкам перед обработкой? И все изображения должны читаться из одной папки?
@Markus У меня есть набор данных в отдельных папках с именами папок Blue, Red, Yellow и т. д...... Я хочу использовать цветовую модель hsv для определения цветов. В этом случае мне нужно использовать что-то вроде этой статьи (stackoverflow.com/questions/58288014/…)?
Код по ссылке уже был включен в ваш вопрос. Я думаю, у вас уже есть все, что вам нужно. Вот почему я не понимаю вопроса, потому что он включает в себя ответ. И зачем вам все еще нужны отдельные папки, если вы можете определить цвет автоматически?
@Markus Мой код находится в разделе «Исходный код» ... Я не добавлял код из ссылки в свой исходный код. Проблема, с которой я столкнулся, заключается в том, как я могу объединить код из ссылки с моим исходным кодом.
@Markus Не могли бы вы, пожалуйста, дайте мне знать, как я могу определить цвет автоматически без отдельных папок?
Этот код демонстрирует, как просмотреть все файлы в папке ./images
и вернуть обнаруженные цвета:
import os
import numpy as np
import cv2
# map colour names to HSV ranges
color_list = [
['red', [0, 160, 70], [10, 250, 250]],
['pink', [0, 50, 70], [10, 160, 250]],
['yellow', [15, 50, 70], [30, 250, 250]],
['green', [40, 50, 70], [70, 250, 250]],
['cyan', [80, 50, 70], [90, 250, 250]],
['blue', [100, 50, 70], [130, 250, 250]],
['purple', [140, 50, 70], [160, 250, 250]],
['red', [170, 160, 70], [180, 250, 250]],
['pink', [170, 50, 70], [180, 160, 250]]
]
def detect_main_color(hsv_image, colors):
color_found = 'undefined'
max_count = 0
for color_name, lower_val, upper_val in colors:
# threshold the HSV image - any matching color will show up as white
mask = cv2.inRange(hsv_image, np.array(lower_val), np.array(upper_val))
# count white pixels on mask
count = np.sum(mask)
if count > max_count:
color_found = color_name
max_count = count
return color_found
for root, dirs, files in os.walk('./images'):
f = os.path.basename(root)
for file in files:
img = cv2.imread(os.path.join(root, file))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
print(f"{file}: {detect_main_color(hsv, color_list)}")
Вывод с тремя образцами изображений в подпапке images
:
ruby_3.jpg: red
sapphire blue_18.jpg: blue
sapphire pink_18.jpg: pink
sapphire purple_28.jpg: purple
sapphire yellow_9.jpg: yellow
Кредиты:
Для некоторых изображений он отображает четыре цвета или пять цветов. например, красный, желтый, зеленый, синий для одного изображения (исходный цвет которого синий). Есть ли способ решить эту проблему. Для большинства изображений отображается более 2 цветов, как показано ниже. sapphire blue_26.jpg ['красный', 'желтый', 'розовый', 'синий', 'фиолетовый', 'красный'] sapphire pink_20.jpg ['красный', 'желтый', 'розовый', 'синий', 'фиолетовый', 'красный'] сапфир yellow_4.jpg ['красный', 'желтый', 'зеленый']
Да это можно решить. Мы могли бы вернуть только основной цвет, т. е. цвет, который встречается у большинства пикселей. Вам нужен только основной цвет? Можете ли вы поделиться примером изображения? Вы хотите, чтобы я скорректировал ответ, или вы хотите попробовать сами?
Я получил набор данных от kaggle.com/datasets/lsind18/драгоценные камни-изображения. Я пытаюсь обнаружить следующие цвета: красный, синий, розовый, желтый и фиолетовый. (Для этого используются наборы данных «Рубиновый», «Синий сапфир», «Розовый сапфир», «Желтый сапфир» и «Пурпурный сапфир»). Да, я хочу, чтобы отображался только основной цвет. Я пытался решить, но безуспешно. Очень признателен, если вы могли бы помочь с настройкой.
И если изображение не принадлежит ни к одному из определенных цветов, то будет отображаться как «Неопределенный».
Я изменил код, чтобы определить только основной цвет. И я добавил розовый как новый цвет в список цветов (красный с низкой насыщенностью). Вам, вероятно, придется настроить диапазоны цветов, чтобы они соответствовали цветам настоящих драгоценных камней. Пожалуйста, проверьте!
... и "неопределенное".
@Markus, должно быть, ломал голову, чтобы найти диапазоны всех этих цветов :) +1
@Маркус извините за беспокойство. У меня уже есть обученная модель для определения цвета драгоценных камней с использованием cnn (исходный код доступен в stackoverflow.com/questions/72152635/…). И я пытаюсь обучить другую модель с использованием hsv и cnn для той же цели. Для этого я использую код, который Вы предложили выше. Можете ли вы сообщить мне, используя его, можно построить cnn?
@jeni Да, почему бы и нет? Ты пробовал?
@Markus Да, я пытался, но у меня есть некоторые проблемы. Позвольте мне поделиться тем, что я пробовал. И во время обучения модели бесполезно изменять размер и обрезать изображение?
@jeni У меня еще нет опыта работы с cnn, и у меня нет советов по изменению размера или обрезке. Пожалуйста, создайте новый вопрос по конкретной проблеме, чтобы другие могли принять участие! Сила Stackoverflow в том, что на него будет смотреть много разных людей с разным опытом. Имейте в виду, что вы должны исправить свой вопрос, чтобы быть как можно более конкретным. Тогда вы получите быстрый и конкретный ответ.
@Маркус хорошо, спасибо.. stackoverflow.com/questions/72156035/…
@Markus Есть ли способ измерить точность приведенной выше модели обучения распознаванию цветов, которую вы предложили?
@jeni Как определяется показатель точности?
@Markus с количеством правильных прогнозов, сделанных с использованием обученной модели...
@Markus Например, в модели, которую я обучил stackoverflow.com/questions/72152635/…, здесь я получаю уровень точности 78%. Аналогично в предложенной выше модели, как я могу определить уровень точности прогноза?
@jeni Извините, но боюсь, что не смогу вам с этим помочь.
У вас есть образцы изображений? Какова ваша конкретная проблема для завершения кода?