Logo Zephyrnet

Phát triển và triển khai Bộ phân loại hình ảnh bằng Flask: Phần 1

Ngày:

Bài báo này đã được xuất bản như một phần của Blogathon Khoa học Dữ liệu.

Hey Guys,

Hy vọng tất cả các bạn đang làm tốt.

Trong bài viết này, chúng ta sẽ tìm hiểu cách bạn có thể phát triển và triển khai bộ phân loại hình ảnh bằng flask. Giống như các bài viết khác của tôi, bài viết này sẽ cung cấp cho bạn kinh nghiệm thực hành với mã và ở cuối bài viết này, bạn sẽ có thể tạo một API bình đơn giản và hiệu quả để phân loại hình ảnh. Bài viết này ban đầu sẽ bao gồm phần lý thuyết và sau đó là phần viết mã. Tôi sẽ cung cấp một liên kết đến mã sau trong bài viết này sẽ tiết kiệm sự hối hả của bạn. Vì vậy, chúng ta hãy tập trung vào việc học. Một lần nữa bài viết này sẽ hoàn toàn dựa trên PYTHON.

Bài viết này dành cho tất cả các đối tượng người xem (Sơ cấp, Trung cấp, Cao cấp). Dưới đây là bảng nội dung của bài viết này, vì vậy đừng ngại bỏ qua những phần mà bạn đã cảm thấy thoải mái.

Phần này sẽ được tập trung vào phân loại hình ảnh sử dụng bình. Bạn có thể tìm thấy phần thứ hai tại đây nếu bạn chỉ quan tâm đến việc tạo API bình.

Mục lục

  1. Phân loại hình ảnh là gì?
    1. 1. Mạng nơ-ron hợp pháp
    1. 2. Chuyển giao Học tập
  2.  Mã hóa cho bộ phân loại hình ảnh
  3. Kết luận

Phân loại hình ảnh

Phân loại ảnh là quá trình phân loại và gắn nhãn các nhóm pixel hoặc vectơ trong ảnh dựa trên các quy tắc cụ thể. Theo thuật ngữ giáo dân, chúng tôi đang cố gắng bằng cách nào đó nhóm các hình ảnh có liên quan hoặc các hình ảnh tương tự lại với nhau.
Kỹ thuật phân loại ảnh chủ yếu được chia thành hai loại: Phân loại ảnh không giám sát và không giám sát. Chúng tôi sẽ sử dụng Kỹ thuật phân loại hình ảnh được giám sát tại đây. Tôi sẽ không đi sâu hơn vào nó.

State of Art để phân loại hình ảnh dựa trên Học sâu được gọi là Mạng thần kinh kết hợp (CNN).

Mạng thần kinh chuyển đổi

Trước khi chuyển sang CNN, chúng ta hãy xem xét Mạng thần kinh.

Mạng thần kinh: Đây là một loạt các thuật toán nhận dạng các mẫu / mối quan hệ cơ bản trong một tập hợp dữ liệu thông qua một quá trình bắt chước tương tự như hoạt động của não người. Học sâu: Một tập hợp con của các Thuật toán Máy học rất tốt trong việc nhận dạng các mẫu nhưng thường yêu cầu một số lượng lớn dữ liệu.

CNN còn được gọi là Convnet là một loại Mạng thần kinh đặc biệt hoạt động giống như một mạng thần kinh thông thường ngoại trừ việc nó có một lớp chập ở đầu.

Tại sao chúng tôi sử dụng CNN?

  1. Các mạng nơron truyền thẳng đơn giản không thấy bất kỳ thứ tự nào trong các đầu vào của chúng. Nếu bạn xáo trộn tất cả các hình ảnh của mình theo cùng một cách, mạng nơ-ron sẽ có cùng hiệu suất như khi được đào tạo về các hình ảnh không xáo trộn.
  2. tận dụng sự liên kết không gian cục bộ của hình ảnh. Điều này có nghĩa là chúng có thể giảm đáng kể số lượng các thao tác cần thiết để xử lý một hình ảnh bằng cách sử dụng tích chập trên các mảng pixel liền kề vì các pixel liền kề với nhau có ý nghĩa.
  3. Họ sử dụng một thứ gọi là lớp gộp để giảm bớt mẫu cho hình ảnh của bạn.

Hình ảnh dưới đây cho thấy một ví dụ cổ điển về CNN.

Bộ phân loại hình ảnh bằng Flask

Điều khoản VIP trong CNN

Chuyển đổi: Nó chứa một tập hợp các bộ lọc / hạt nhân (tập hợp các trọng số) nhận đầu vào như một tập con của hình ảnh đầu vào. Các tập hợp con hình ảnh được nhân lên với các bộ lọc thường có kích thước nhỏ hơn hình ảnh. Hình ảnh dưới đây sẽ giúp bạn hiểu rõ hơn về lớp Convolutions.

Bộ phân loại hình ảnh bằng Flask
Hình ảnh được lấy từ https://cs231n.github.io/convolutions-networks/

Tổng hợp: Lớp này giúp giảm tải hình ảnh của chúng tôi. Chúng tôi chạy một bộ lọc trên ma trận và áp dụng một hàm trên nó để tạo ra kết quả. MAXPOOL là một hàm cung cấp giá trị đầu ra tối đa như hình bên dưới.

Tổng hợp | Bộ phân loại hình ảnh bằng Flask

Hình ảnh được lấy từ https://cs231n.github.io/convolutions-networks/

ReLU

Chức năng kích hoạt tuyến tính Rectified hay viết tắt là ReLU là một hàm tuyến tính từng đoạn sẽ xuất đầu vào trực tiếp nếu nó là số dương, ngược lại, nó sẽ xuất ra bằng không. Nó đã trở thành chức năng kích hoạt mặc định cho nhiều loại mạng nơ-ron vì một mô hình sử dụng nó dễ huấn luyện hơn và thường đạt được hiệu suất tốt hơn.

Rơi ra ngoài

Lớp này giúp tránh việc trang bị quá mức cho mô hình của chúng tôi bằng cách thả ngẫu nhiên một số nút nhất định trong mạng nơ-ron và sử dụng phần còn lại để dự đoán. Đó là một kỹ thuật chính quy hóa buộc CNN không chỉ phụ thuộc vào một số nút nhất định mà có một thành phần hoặc nói từ tất cả các nút.

Lớp được kết nối đầy đủ

Các tế bào thần kinh trong lớp được kết nối đầy đủ có kết nối đầy đủ với tất cả các hoạt động trong lớp trước đó. Do đó, kích hoạt của chúng có thể được tính bằng phép nhân ma trận theo sau là phần bù thiên vị.

Bạn có thể đọc thêm chi tiết tại đây.

Chuyển giao học tập 

Chuyển giao Học tập là việc sử dụng lại mô hình đã học trước đó vào một vấn đề mới. Đây là những kỹ thuật được sử dụng nhiều nhất trong Thị giác máy tính vì chúng tiết kiệm rất nhiều công sức khi bạn sử dụng những kỹ thuật này để giải quyết một vấn đề mới tương tự. Ví dụ: chúng tôi đã tạo một mô hình để phân loại mèo và khỉ, chúng ta có thể sử dụng nó để phân loại hổ và khỉ đột không? Với việc học Chuyển tiếp, chúng tôi chắc chắn có thể làm được.

Chúng tôi cũng sẽ sử dụng Học tập chuyển giao trong khi tạo mô hình của mình. Ví dụ về các mô hình học truyền được sử dụng cho Phân loại hình ảnh là Resnet50, MobileNet, VGG16, VGG19, DenseNet.

Đọc thêm về Học chuyển tiếp tại đây.

Đủ với lý thuyết HÃY CHO TÔI BIẾT MÃ!

Mã hóa cho bộ phân loại hình ảnh 

Đối với bộ phân loại hình ảnh, có nhiều mô-đun như TensorFlow, PyTorch, fastai, v.v. Đối với blog này, chúng tôi sẽ sử dụng TenorFlow. 

Thư viện nhập khẩu: 

# Thư viện người trợ giúp nhập numpy nhập hệ điều hành dưới dạng np nhập matplotlib.pyplot dưới dạng plt
# Tensorflow nhập tensorflow dưới dạng tf

from tensorflow.keras.application.imagenet_utils import preprocess_input, decode_predictions

từ tensorflow.keras.models nhập load_model, model_from_json, Mô hình

từ tensorflow.keras.preprocessing nhập hình ảnh từ các keras nhập tensorflow from keras.preprocessing.image import ImageDataGenerator

Tạo tập dữ liệu của bạn

Bạn phải khai báo và thay đổi các biến tùy theo nhu cầu sử dụng.

# Khai báo biến train_data_dir = 'v_data / train' validation_data_dir = 'v_data / test' nb_train_samples = 400 nb_validation_samples = 100 epochs = 10 batch_size = 16
img_width, img_height = 224, 224 input_shape = (img_width, img_height, 3)

các kỷ nguyên: 1 Kỷ nguyên là khi tập dữ liệu hoàn chỉnh được chuyển tới và chuyển ngược lại thông qua mạng nơ-ron chỉ một lần.
lô_size: Vì việc chuyển tập dữ liệu hoàn chỉnh về phía trước và ngược lại sẽ khiến chi phí tính toán tăng lên, chúng tôi sử dụng kích thước lô được xác định là số lượng mẫu sẽ được truyền qua mạng.

train_datagen = ImageDataGenerator (rescale = 1. / 255, shear_range = 0.2, zoom_range = 0.2, ngang_flip = True) test_datagen = ImageDataGenerator (rescale = 1. 255) train_generator = train_datagen.flow_from_directory (train_data_dir, target_size ,ize batch_size = batch_size, class_mode = 'binary') validation_generator = test_datagen.flow_from_directory (validation_data_dir, target_size = (img_width, img_height), batch_size = batch_size, class_mode = 'binary')

Tạo mô hình

model = Sequential()
model.add(Conv2D(32, (2, 2), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (2, 2)))
model.add(Activation('relu'))
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(1))
model.add(Activation('sigmoid'))

Chúng tôi đã tạo cấu trúc cho mô hình của chúng tôi ở đây.

model.compile(loss='binary_crossentropy',
optimizer='adam',metrics=['accuracy'])

Đoạn mã trên sẽ tạo một hàm biên dịch sẽ chứa hàm mất mát, trình tối ưu hóa dưới dạng adam và đánh giá cho mô hình.

Chuyển giao mô hình học tập

from tensorflow.keras.application.mobilenet_v2 nhập mô hình MobileNetV2 = MobileNetV2 (weights = 'imagenet')

Mã này sẽ tạo ra một mô hình có cấu trúc của MobileNetV2 được tải với các trọng số của imagenet.

Mô hình học chuyển giao tinh chỉnh

Để điều chỉnh mạng nơ-ron được đào tạo trước cho vấn đề của chúng ta, chúng ta cần đào tạo chúng trên tập dữ liệu của mình. Chúng ta cũng có thể thêm một số lớp bổ sung vào cuối mô hình Phân loại Hình ảnh.

từ keras.application nhập Resnet50 base_model = ResNet50 (weights = 'imagenet', include_top = False, input_shape = (IMG_SIZE, IMG_SIZE, 3))
output_categories = 2 # số danh mục trong lớp cuối cùng. add_model = Sequential () add_model.add (Flatten (input_shape = base_model.output_shape [1:])) add_model.add (Dropout (0.3)) add_model.add (Mật độ (128, kích hoạt = 'relu')) add_model.add ( Dropout (0.3)) add_model.add (Dense (output_categories, kích hoạt = 'softmax')) model = Model (input = base_model.input, outputs = add_model (base_model.output))

Ở đây chúng tôi đã sử dụng Resnet50 như một mô hình được đào tạo trước và sau đó chúng tôi thêm một số lớp vào cuối mô hình của mình để chúng tôi có thể tinh chỉnh nó cho trường hợp của mình.

Mô hình đào tạo

model.fit_generator (train_generator, steps_per_epoch = nb_train_samples // batch_size, epochs = epochs, validation_data = validation_generator, validation_steps = nb_validation_samples // batch_size)

Dự đoán bằng cách sử dụng Mô hình 

def model_p Dự đoán (img, model): img = img.resize ((224, 224))
 # Xử lý trước hình ảnh x = image.img_to_array (img) # x = np.true_divide (x, 255) x = np.expand_dims (x, axis = 0)
 # Hãy cẩn thận cách mô hình được đào tạo của bạn xử lý với đầu vào # nếu không, nó sẽ không đưa ra dự đoán chính xác! x = preprocess_input (x, mode = 'tf')
 preds = model.p Dự đoán (x) trả về preds

Tiết kiệm mô hình

model_json = model.to_json () với mở ("ImageClassifier.json", "w") dưới dạng json_file: json_file.write (model_json) # tuần tự hóa trọng số thành HDF5 model.save_weights ("ImageClassifier.h5")

Vị trí sẽ thay đổi theo hệ thống của bạn.

Đang tải mô hình

model_json = open (path_to_model_json, 'r') load_model_json = model_json.read () model_json.close () model = model_from_json (load_model_json) model.load_weights (path_to_model_wieght)

Trong trường hợp bạn nhầm lẫn và muốn xem hoặc sao chép mã. Tham chiếu cho Bộ phân loại hình ảnh tại đây.

Kết luận

Đây là phần cuối của bộ phân loại hình ảnh sử dụng bình. Hy vọng bạn có ý tưởng về cách bạn có thể tạo bộ phân loại hình ảnh và cách bạn có thể áp dụng phương pháp học chuyển giao và sử dụng nó để có được kết quả tốt hơn cho các vấn đề về thị lực máy tính của bạn. Trong bài viết tiếp theo, chúng tôi sẽ tạo một API để chứa bộ phân loại hình ảnh của chúng tôi và triển khai nó. Tôi đã đặt mã hoàn chỉnh cho hướng dẫn này trong kho lưu trữ GitHub bên dưới.

TÌM MÃ tại đây. 

VỀ TÔI 

Tôi là sinh viên năm cuối của IIIT theo đuổi bằng cử nhân về Khoa học máy tính và Kỹ thuật. Tôi thích khám phá và thử ngày càng nhiều hơn về Học máy và Sâu. Nếu bạn muốn cộng tác, bạn có thể sử dụng các liên kết dưới đây:

Linkedin: Nhấp vào đây

Github: Nhấp vào đây

Kaggle: Nhấp vào đây

Gửi thư cho tôi: [email được bảo vệ]

Hy vọng bạn thích bài viết của tôi về bộ phân loại hình ảnh bằng Flask. Cảm ơn bạn đã đọc!

Phương tiện hiển thị trong bài viết này không thuộc sở hữu của Analytics Vidhya và được sử dụng theo quyết định riêng của Tác giả. 

Nguồn: https://www.analyticsvidhya.com/blog/2022/01/develop-and-deploy-image-classifier-using-flask-part-1/

tại chỗ_img

Tin tức mới nhất

tại chỗ_img

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?