Trình lặp Keras với hình ảnh tăng cường và các tính năng khác


8

Giả sử bạn có bộ dữ liệu có hình ảnh và một số dữ liệu trong .csvmỗi hình ảnh. Mục tiêu của bạn là tạo ra một NN có nhánh tích chập và một nhánh khác (trong trường hợp của tôi là MLP).

Bây giờ, có rất nhiều hướng dẫn ( một ở đây , một hướng dẫn khác ) về cách tạo mạng, đó không phải là vấn đề.

Vấn đề ở đây là làm thế nào để tôi tạo một trình vòng lặp ở dạng [[convolution_input, other_features], target]khi luồngconvolution_input từ Keras có thêm hình ảnh tăng cường.ImageDataGenerator

Cụ thể hơn, khi hình ảnh thứ n (có thể là hình ảnh tăng hoặc không) được cung cấp cho NN, tôi muốn đó là các tính năng ban đầu bên trong other_features.

Tôi đã tìm thấy một vài nỗ lực ( ở đâyở đây , lần thứ hai có vẻ đầy hứa hẹn nhưng tôi không thể tìm ra cách xử lý hình ảnh tăng cường) khi thực hiện chính xác điều đó nhưng dường như chúng không tính đến thao tác dữ liệu có thể có của trình tạo Keras làm.


1
Câu hỏi: bạn ổn với flowhoặc bạn cần flow_from_directory? ( flowcó nghĩa là bạn có thể giữ tất cả các hình ảnh được tải trong bộ nhớ)
Daniel Möller

Vâng, tôi chỉ muốn một luồng tự động xử lý chuyển đổi hình ảnh. Trong trường hợp của tôi, tôi đã sử dụng flow_from_dataframevì tôi có tên tệp, tính năng và lớp
Lamberto Basti

Câu trả lời:


3

Giả sử, bạn có một csv, sao cho hình ảnh của bạn và các tính năng khác có trong tệp.

Trong đó id đại diện cho tên hình ảnh và theo sau là các tính năng và theo sau là mục tiêu của bạn, (lớp để phân loại, số cho sự hồi quy)

nhập mô tả hình ảnh ở đây

đầu tiên chúng ta hãy định nghĩa một trình tạo dữ liệu và sau đó chúng ta có thể ghi đè lên nó.

chúng ta hãy đọc dữ liệu từ csv trong khung dữ liệu của gấu trúc và sử dụng Flow_from_dataframe của keras để đọc từ khung dữ liệu.

df = pandas.read_csv("dummycsv.csv")
datagen = ImageDataGenerator(rescale=1/255.)
generator = datagen.flow_from_dataframe(df,directory="out/",x_col="id",y_col=df.columns[1:],class_mode="raw",batch_size=1)

Bạn luôn có thể thêm tính năng tăng cường của mình trong ImageDataGenerator.

Những điều cần lưu ý trong đoạn mã trên trong Flow_from_dataframe là

x_col = tên hình ảnh

y_col = thường là các cột có tên lớp, nhưng chúng ta hãy ghi đè nó sau bằng cách trước tiên cung cấp tất cả các cột khác trong csv. tức là feat_1, feat_2 .... cho đến class_label

class_mode = raw, đề nghị trình tạo trả về tất cả các giá trị trong y.

Bây giờ chúng ta hãy ghi đè / kế thừa trình tạo ở trên và tạo một cái mới, sao cho nó trả về [img, otherfeatures], [target]

Đây là mã với ý kiến ​​như giải thích

def my_custom_generator():
count = 0 #to keep track of complete epoch
while True:
    if(count==len(df.index)): 
        #if the count is matching with the length of df, the one pass is completed, so reset the generator
        generator.reset()
        break
    count+=1
    data = generator.next() #get the data from the generator
    #the data looks like this [[img,img] , [other_cols,other_cols]]  based on the batch size

    imgs = []
    cols = []
    targets = []
    #iterate the data and append the necessary columns in the corresponding arrays 
    for k in range(batch_size):
        imgs.append(data[0][k]) #the first array contains all images

        cols.append(data[1][k][:-1])  #the second array contains all features with last column as class, so [:-1]
        targets.append(data[1][k][-1]) #the last column in the second array from data is the class

    yield [imgs,cols],targets  #this will yield the result as you expect.

tạo chức năng tương tự cho trình tạo xác nhận của bạn. Sử dụng train_test_split để phân chia khung dữ liệu của bạn nếu bạn cần và tạo 2 trình tạo và ghi đè chúng.

truyền hàm trong model.fit_generator như thế này

model.fit_generator(my_custom_generator(),.....other params)

Nhưng làm thế nào có thể if(count==len(df.index))theo dõi kỷ nguyên nếu bộ dữ liệu tăng thêm nhiều hơn so với dữ liệu gốc?
Lamberto Basti

1
Augmentations được áp dụng rndomly cho hình ảnh. Nó sẽ không tăng số lượng hình ảnh trừ khi bạn lưu chúng riêng biệt và sử dụng nó như một ví dụ duy nhất trong tập huấn luyện. Làm thế nào để tăng cường giúp trong mỗi kỷ nguyên khác nhau, việc tăng cường khác nhau được áp dụng một cách ngẫu nhiên, do đó làm cho nó trông giống như những hình ảnh khác nhau
venkata krishnan

Wow, đó là một thông tin rất lớn. Tôi cũng khuyên bạn nên thêm nó vào câu trả lời. Ngoài ra, tại sao thông tin quan trọng như vậy không được viết rõ ràng trong tài liệu của Keras?
Lamberto Basti

1
Ngay cả tôi cũng tự mình tìm ra nó, bởi vì khi chúng tôi đề cập đến các bước trên mỗi epoch trong khóa đào tạo, chúng tôi thường chia thời lượng đào tạo theo kích cỡ lô, nghĩa là trong một epoch, nó chỉ vượt qua tất cả các hình ảnh một lần. Tôi hy vọng tôi đúng ..
venkata krishnan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.