顺序图像分类

如何解决顺序图像分类

我有100个tif文件,它们本身包含多个图像。我想创建一个二进制分类器。首先,我将所有tif分解为png图像(例如2个tif文件分别包含20和30个图像,然后在另一个目录中转换为50 png图像(600 x 600))。然后,我在其上应用了CNN,但结果达不到标准。 tif图像本质上是连续的,并且包含可能与分类目的相关的重要信息。 现在,我正试图为此应用CNN + LSTM。我有一个包含文件名和标签的csv文件,并且我正在使用ImageGenerator的flow_from_Dataframe加载数据。这是代码:-

img_width,img_height = 600,600
no_frame = 5
original_train = "PATH TO IMAGES"
nb_training_samples = 6587
nb_validation_samples = 1646
epochs = 1
batch_size = 32
lr = 0.001
    
if k.image_data_format() == "channels_first":
    input_shape = (3,img_width,img_height)
else:
    input_shape = (img_width,img_height,3)
    
METRICS = [
  metrics.TruePositives(name='tp'),metrics.FalsePositives(name='fp'),metrics.TrueNegatives(name='tn'),metrics.FalseNegatives(name='fn'),metrics.BinaryAccuracy(name='accuracy'),metrics.Precision(name='precision'),metrics.Recall(name='recall'),metrics.AUC(name='auc'),]

model = Sequential()
model.add(ConvLSTM2D(filters = 32,kernel_size=(3,3),activation='relu',return_sequences=True,padding='same',input_shape=(None,3)))
model.add(BatchNormalization())
model.add(ConvLSTM2D(64,(3,padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',optimizer='rmsprop',metrics=METRICS)

model.summary()

Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv_lst_m2d_10 (ConvLSTM2D) (None,None,600,32 40448     
_________________________________________________________________
batch_normalization_9 (Batch (None,32 128       
_________________________________________________________________
conv_lst_m2d_11 (ConvLSTM2D) (None,64)      221440    
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None,300,64)      0         
_________________________________________________________________
flatten_3 (Flatten)          (None,5760000)           0         
_________________________________________________________________
dense_4 (Dense)              (None,64)                368640064 
_________________________________________________________________
activation_2 (Activation)    (None,64)                0         
_________________________________________________________________
dropout_2 (Dropout)          (None,64)                0         
_________________________________________________________________
dense_5 (Dense)              (None,2)                 130       
_________________________________________________________________
activation_3 (Activation)    (None,2)                 0         
=================================================================
Total params: 368,902,210
Trainable params: 368,146
Non-trainable params: 64
_________________________________________________________________

datagen = ImageDataGenerator(rescale=1/255.,validation_split=0.2)

train_generator = datagen.flow_from_dataframe(dataframe=data,directory=original_train,x_col='Id',y_col='label',target_size=(img_width,img_height),class_mode='categorical',batch_size=batch_size,subset='training',seed=7)

print(train_generator.class_indices)

validation_generator = datagen.flow_from_dataframe(dataframe=data,subset='validation',seed=7)

print(validation_generator.class_indices)

train_steps = train_generator.n//train_generator.batch_size
validation_steps = validation_generator.n//validation_generator.batch_size


history = model.fit_generator(train_generator,steps_per_epoch=train_steps,epochs=epochs,validation_data=validation_generator,validation_steps=validation_steps)

此后,我得到此错误:-

ValueError: Error when checking input: expected conv_lst_m2d_10_input to have 5 dimensions,but got array with shape (32,3)

我对此有一些疑问:-

  1. 如何解决此错误?
  2. 如何将一个tif批量通过?随着单个tif中的图片数量变化。

任何帮助都是有意义的。

谢谢:)

编辑1:

我创建了一个自定义生成器,如下所示:

class DataGenerator(Sequence):
    
    def __init__(self,list_IDs,labels,image_path,to_fit=True,batch_size=32,dim=(5,600),n_channel=1,n_classes=2,shuffle=True):
        self.list_IDs = list_IDs
        self.labels = labels
        self.image_path = image_path
        self.to_fit = to_fit
        self.batch_size = batch_size
        self.dim = dim
        self.n_channel = n_channel
        self.n_classes = n_classes
        self.shuffle = shuffle
        self.on_epoc_end()
    
    def __len__(self):
        return int(np.floor(len(self.list_IDs)/self.batch_size))
    
    def __getitem__(self,index):
        indexes = self.indexes[index * self.batch_size:(index+1)*self.batch_size]
        
        list_IDs_temp = [self.list_IDs[k] for k in indexes]
        
        X,y = self._generate_data(list_IDs_temp)
        
        return X,y
    
    def on_epoc_end(self):
        self.indexes = np.arange(len(self.list_IDs))
        if self.shuffle == True:
            np.random.shuffle(self.indexes)
    
    def _generate_data(self,list_IDs_temp):
        X = np.empty((self.batch_size,*self.dim,self.n_channel))
        y = np.empty((self.batch_size),dtype = np.uint8) 
        
        for i,ID in enumerate(list_IDs_temp):
            X[i,] = self._load_grayscale_image(self.image_path + ID)
            y[i] = self.labels[i]
        return X,y
    
    def _load_grayscale_image(self,image_path):
        img = cv2.imread(image_path+'.png')
        img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        img = img / 255
        img = img[:,:,np.newaxis]
        return img

并加载数据

def loadData(filepath,val_sample=0.2):
    data = pd.read_csv(filepath)
    image_IDs = data['Id'].values
    labels = data['label'].values
    X_train,X_test,Y_train,Y_test = train_test_split(image_IDs,test_size=val_sample,shuffle=False)
    train_data = DataGenerator(X_train,image_path = original_train,batch_size = batch_size,shuffle=False)
    val_data = DataGenerator(X_test,Y_test,shuffle=False)
    return train_data,val_data

但是在为模型找到合适的形状后,它会给出:-

ValueError: Error when checking input: expected reshape_2_input to have 4 dimensions,5,1)

解决方法

与任何其他LSTM层一样,ConvLSTM2D需要一个时间步维度。所以整个形状应该是:

(n_samples,time_steps,height,width,channels)

由于在使用ImageDataGenerator时很难添加维度,因此建议您在数据进入神经网络时重塑数据:

model.add(Reshape((1,) + input_shape,input_shape=input_shape))

复制/可粘贴示例:

from tensorflow.keras.layers import *
from tensorflow.keras import Sequential
import numpy as np

img_width,img_height = 32,32
input_shape = (img_width,img_height,3)
batch_size = 8

model = Sequential()
model.add(Reshape((1,input_shape=input_shape))
model.add(ConvLSTM2D(filters=8,kernel_size=(3,3),activation='relu',return_sequences=True,padding='same',input_shape=(None,img_width,3)))
model.add(BatchNormalization())
model.add(ConvLSTM2D(8,(3,padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(8))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',optimizer='rmsprop')

model.summary()

fake_picture = np.random.rand(*((batch_size,) + input_shape)).astype(np.float32)
model(fake_picture)
<tf.Tensor: shape=(8,2),dtype=float32,numpy=
array([[0.49504986,0.4995347 ],[0.49617144,0.5001322 ],[0.4947565,0.50097185],[0.49597737,0.4996349 ],[0.49563733,0.50064707],[0.49486715,0.49945754],[0.49625823,0.50110054],[0.49568254,0.50056493]],dtype=float32)>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res