Hướng dẫn is python good for image recognition? - python có tốt cho nhận dạng hình ảnh không?

Giới thiệu

Tensorflow là một khung học tập sâu được thiết lập tốt và Keras là API cấp cao chính thức của nó giúp đơn giản hóa việc tạo ra các mô hình. Nhận dạng hình ảnh/phân loại là một nhiệm vụ phổ biến, và may mắn thay, nó khá đơn giản và đơn giản với Keras.

Trong hướng dẫn này, chúng ta sẽ xem cách phân loại/nhận ra hình ảnh trong Python với Keras.

Nếu bạn muốn chơi xung quanh với mã hoặc chỉ cần nghiên cứu sâu hơn một chút, dự án sẽ được tải lên GitHub.

Trong hướng dẫn này, chúng tôi sẽ xây dựng một CNN tùy chỉnh và đào tạo nó từ đầu. Để có hướng dẫn nâng cao hơn, bạn có thể tận dụng việc học chuyển giao để chuyển các biểu diễn kiến ​​thức với các kiến ​​trúc có hiệu suất cao hiện có - đọc phân loại hình ảnh của chúng tôi với việc học chuyển giao trong Keras - tạo các mô hình CNN tiên tiến!

Định nghĩa

Nếu bạn không rõ ràng về các khái niệm cơ bản đằng sau phân loại hình ảnh, sẽ rất khó để hiểu hoàn toàn phần còn lại của hướng dẫn này. Vì vậy, trước khi chúng tôi tiến hành thêm nữa, hãy dành một chút thời gian để xác định một số điều khoản.

TensorFlow/Keras

TensorFlow là một thư viện nguồn mở được tạo cho Python bởi nhóm Google Brain. TensorFlow tổng hợp nhiều thuật toán và mô hình khác nhau với nhau, cho phép người dùng triển khai các mạng thần kinh sâu để sử dụng trong các tác vụ như nhận dạng/phân loại hình ảnh và xử lý ngôn ngữ tự nhiên. TensorFlow là một khung mạnh mẽ hoạt động bằng cách triển khai một loạt các nút xử lý, mỗi nút đại diện cho một thao tác toán học, với toàn bộ loạt nút được gọi là "biểu đồ". is an open source library created for Python by the Google Brain team. TensorFlow compiles many different algorithms and models together, enabling the user to implement deep neural networks for use in tasks like image recognition/classification and natural language processing. TensorFlow is a powerful framework that functions by implementing a series of processing nodes, each node representing a mathematical operation, with the entire series of nodes being called a "graph".

Về Keras, đây là API cấp cao (giao diện lập trình ứng dụng) có thể sử dụng các chức năng của TensorFlow bên dưới (cũng như các thư viện ML khác như Theano). Keras được thiết kế với sự thân thiện với người dùng và mô-đun như các nguyên tắc hướng dẫn của nó. Về mặt thực tế, Keras thực hiện nhiều chức năng mạnh mẽ nhưng thường phức tạp của TensorFlow đơn giản nhất có thể và nó được cấu hình để hoạt động với Python mà không có bất kỳ sửa đổi hoặc cấu hình chính nào.Keras, it is a high-level API (application programming interface) that can use TensorFlow's functions underneath (as well as other ML libraries like Theano). Keras was designed with user-friendliness and modularity as its guiding principles. In practical terms, Keras makes implementing the many powerful but often complex functions of TensorFlow as simple as possible, and it's configured to work with Python without any major modifications or configuration.

Phân loại hình ảnh (nhận dạng)

Nhận dạng hình ảnh đề cập đến nhiệm vụ nhập hình ảnh vào mạng thần kinh và có nó xuất ra một số loại nhãn cho hình ảnh đó. Nhãn mà các đầu ra mạng sẽ tương ứng với một lớp được xác định trước. Có thể có nhiều lớp mà hình ảnh có thể được dán nhãn là hoặc chỉ một. Nếu có một lớp duy nhất, thuật ngữ "nhận dạng" thường được áp dụng, trong khi một nhiệm vụ nhận dạng đa lớp thường được gọi là "phân loại".

Một tập hợp con của phân loại hình ảnh là phát hiện đối tượng, trong đó các trường hợp cụ thể của các đối tượng được xác định là thuộc về một lớp nhất định như động vật, xe hơi hoặc con người.

Để thực hiện nhận dạng/phân loại hình ảnh, mạng lưới thần kinh phải thực hiện trích xuất tính năng. Các tính năng là các yếu tố của dữ liệu mà bạn quan tâm sẽ được cung cấp thông qua mạng. Trong trường hợp cụ thể của nhận dạng hình ảnh, các tính năng là các nhóm pixel, như các cạnh và điểm, của một đối tượng mà mạng sẽ phân tích cho các mẫu.

Nhận dạng tính năng (hoặc trích xuất tính năng) là quá trình rút các tính năng liên quan ra khỏi hình ảnh đầu vào để các tính năng này có thể được phân tích. Nhiều hình ảnh chứa các chú thích hoặc siêu dữ liệu về hình ảnh giúp mạng tìm thấy các tính năng có liên quan.

Cách mạng lưới thần kinh học cách nhận biết hình ảnh - Primer trên mạng thần kinh tích chập

Nhận được trực giác về cách một mạng thần kinh nhận ra hình ảnh sẽ giúp bạn khi bạn thực hiện mô hình mạng thần kinh, vì vậy hãy khám phá ngắn gọn quy trình nhận dạng hình ảnh trong một vài phần tiếp theo.

Phần này có nghĩa là để phục vụ như một khóa học tai nạn/mồi trên các mạng thần kinh tích chập, cũng như bồi dưỡng cho những người quen thuộc với họ.

Hướng dẫn is python good for image recognition? - python có tốt cho nhận dạng hình ảnh không?

Tín dụng: Commons.wikimedia.org

Lớp đầu tiên của một mạng lưới thần kinh lấy tất cả các pixel trong một hình ảnh. Sau khi tất cả các dữ liệu đã được đưa vào mạng, các bộ lọc khác nhau được áp dụng cho hình ảnh, hình thành các biểu diễn của các phần khác nhau của hình ảnh. Đây là trích xuất tính năng và nó tạo ra "Bản đồ tính năng".

Quá trình trích xuất các tính năng từ một hình ảnh được thực hiện bằng "lớp chập" và chập đơn giản là hình thành một biểu diễn của một phần của hình ảnh. Chính từ khái niệm tích chập này, chúng ta nhận được thuật ngữ Mạng thần kinh tích chập (CNN), loại mạng thần kinh được sử dụng phổ biến nhất trong phân loại/nhận dạng hình ảnh. Gần đây, Transformers cũng đã thực hiện những điều kỳ diệu trong phân loại hình ảnh, dựa trên kiến ​​trúc Mạng thần kinh tái phát (RNN).

Nếu bạn muốn hình dung cách tạo bản đồ tính năng cho các mạng chập hoạt động - hãy nghĩ về việc chiếu đèn pin trên một bức tranh trong một căn phòng tối. Khi bạn trượt chùm tia qua hình ảnh, bạn đang tìm hiểu về các tính năng của hình ảnh. Một bộ lọc là những gì mạng sử dụng để tạo thành một biểu diễn của hình ảnh và trong phép ẩn dụ này, ánh sáng từ đèn pin là bộ lọc.filter is what the network uses to form a representation of the image, and in this metaphor, the light from the flashlight is the filter.

Chiều rộng của chùm tia đèn pin của bạn kiểm soát số lượng hình ảnh bạn kiểm tra cùng một lúc và các mạng thần kinh có một tham số tương tự, kích thước bộ lọc. Kích thước bộ lọc ảnh hưởng đến số lượng hình ảnh, bao nhiêu pixel, đang được kiểm tra cùng một lúc. Kích thước bộ lọc phổ biến được sử dụng trong CNN là 3 và điều này bao gồm cả chiều cao và chiều rộng, do đó, bộ lọc kiểm tra diện tích pixel 3 x 3.

Tín dụng: Commons.wikimedia.org

Mặc dù kích thước bộ lọc bao gồm chiều cao và chiều rộng của bộ lọc, độ sâu của bộ lọc cũng phải được chỉ định.

Làm thế nào để một hình ảnh 2D có độ sâu?

Hình ảnh kỹ thuật số được hiển thị dưới dạng chiều cao, chiều rộng và một số giá trị RGB xác định màu của pixel, vì vậy "độ sâu" đang được theo dõi là số lượng kênh màu mà hình ảnh có. Hình ảnh thang độ Grays (không màu) chỉ có 1 kênh màu trong khi hình ảnh màu có 3 kênh độ sâu.

Tất cả điều này có nghĩa là đối với bộ lọc có kích thước 3 được áp dụng cho hình ảnh đầy đủ màu, kích thước của bộ lọc đó sẽ là 3 x 3 x 3. Đối với mỗi pixel được bao phủ bởi bộ lọc đó, mạng nhân lên các giá trị bộ lọc với các giá trị trong các pixel để có được một đại diện số của pixel đó. Quá trình này sau đó được thực hiện cho toàn bộ hình ảnh để đạt được một đại diện hoàn chỉnh. Bộ lọc được di chuyển qua phần còn lại của hình ảnh theo một tham số gọi là "sải chân", xác định số lượng pixel sẽ được di chuyển sau khi tính toán giá trị ở vị trí hiện tại của nó. Một kích thước sải chân thông thường cho CNN là 2.

Kết quả cuối cùng của tất cả tính toán này là một bản đồ tính năng. Quá trình này thường được thực hiện với nhiều hơn một bộ lọc, giúp duy trì sự phức tạp của hình ảnh.

Chức năng kích hoạt

Sau khi bản đồ tính năng của hình ảnh đã được tạo, các giá trị biểu thị hình ảnh được truyền qua hàm kích hoạt hoặc lớp kích hoạt. Hàm kích hoạt lấy các giá trị đại diện cho hình ảnh, ở dạng tuyến tính (nghĩa là chỉ là một danh sách các số) nhờ lớp chập và tăng tính phi tuyến tính của chúng vì chính hình ảnh không tuyến tính.

Hàm kích hoạt điển hình được sử dụng để thực hiện đây là một đơn vị tuyến tính được chỉnh lưu (RELU), mặc dù có một số chức năng kích hoạt khác đôi khi được sử dụng (bạn có thể đọc về những hàm ở đây).Rectified Linear Unit (ReLU), although there are some other activation functions that are occasionally used (you can read about those here).

Lớp gộp

Sau khi dữ liệu được kích hoạt, nó được gửi qua một lớp gộp. Gộp "Downsamples" một hình ảnh, có nghĩa là nó lấy thông tin đại diện cho hình ảnh và nén nó, làm cho nó nhỏ hơn. Quá trình gộp làm cho mạng linh hoạt hơn và lão luyện hơn trong việc nhận ra các đối tượng/hình ảnh dựa trên các tính năng có liên quan.

Khi chúng ta nhìn vào một hình ảnh, chúng ta thường không quan tâm đến tất cả các thông tin trong nền của hình ảnh, chỉ có các tính năng chúng ta quan tâm, chẳng hạn như con người hoặc động vật.

Tương tự, một lớp gộp trong CNN sẽ trừu tượng hóa các phần không cần thiết của hình ảnh, chỉ giữ các phần của hình ảnh mà nó cho là có liên quan, như được kiểm soát bởi kích thước được chỉ định của lớp gộp.

Bởi vì nó phải đưa ra quyết định về các phần phù hợp nhất của hình ảnh, hy vọng là mạng sẽ chỉ học các phần của hình ảnh thực sự đại diện cho đối tượng trong câu hỏi. Điều này giúp ngăn ngừa quá mức, nơi mạng học được các khía cạnh của trường hợp đào tạo quá tốt và không khái quát hóa dữ liệu mới.

Hướng dẫn is python good for image recognition? - python có tốt cho nhận dạng hình ảnh không?

Tín dụng: Commons.wikimedia.org

Có nhiều cách khác nhau để tăng giá trị, nhưng gộp Max được sử dụng phổ biến nhất. Việc gộp tối đa thu được giá trị tối đa của các pixel trong một bộ lọc duy nhất (trong một điểm duy nhất trong hình ảnh). Điều này làm giảm 3/4 thông tin, giả sử các bộ lọc 2 x 2 đang được sử dụng.

Các giá trị tối đa của các pixel được sử dụng để tính đến các biến dạng hình ảnh có thể và các tham số/kích thước của hình ảnh được giảm để kiểm soát quá mức. Có các loại gộp khác như gộp trung bình hoặc tổng hợp tổng hợp, nhưng chúng không được sử dụng thường xuyên vì gộp tối đa có xu hướng mang lại độ chính xác tốt hơn.

Làm phẳng

Các lớp cuối cùng của CNN của chúng tôi, các lớp được kết nối dày đặc, yêu cầu dữ liệu ở dạng một vectơ được xử lý. Vì lý do này, dữ liệu phải được "làm phẳng". Các giá trị được nén thành một vectơ dài hoặc một cột của các số được đặt hàng tuần tự.

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

Các lớp cuối cùng của CNN là các lớp được kết nối dày đặc hoặc mạng lưới thần kinh nhân tạo (ANN). Chức năng chính của ANN là phân tích các tính năng đầu vào và kết hợp chúng thành các thuộc tính khác nhau sẽ hỗ trợ phân loại. Các lớp này về cơ bản là hình thành các bộ sưu tập các tế bào thần kinh đại diện cho các phần khác nhau của đối tượng trong câu hỏi và một bộ sưu tập các tế bào thần kinh có thể đại diện cho tai mềm của một con chó hoặc màu đỏ của một quả táo. Khi đủ các tế bào thần kinh này được kích hoạt để đáp ứng với hình ảnh đầu vào, hình ảnh sẽ được phân loại là một đối tượng.

Hướng dẫn is python good for image recognition? - python có tốt cho nhận dạng hình ảnh không?

Tín dụng: Commons.wikimedia.org

Lỗi hoặc sự khác biệt giữa các giá trị được tính toán và giá trị dự kiến ​​trong tập huấn luyện, được tính toán bởi ANN. Mạng sau đó trải qua quá trình ủng hộ, trong đó ảnh hưởng của một tế bào thần kinh nhất định trên một tế bào thần kinh trong lớp tiếp theo được tính toán và ảnh hưởng của nó được điều chỉnh. Điều này được thực hiện để tối ưu hóa hiệu suất của mô hình. Quá trình này sau đó được lặp đi lặp lại nhiều lần. Đây là cách mạng đào tạo về dữ liệu và học liên kết giữa các tính năng đầu vào và các lớp đầu ra.

Các tế bào thần kinh ở các lớp kết nối hoàn toàn giữa sẽ xuất ra các giá trị nhị phân liên quan đến các lớp có thể. Nếu bạn có bốn lớp khác nhau (giả sử một con chó, xe hơi, nhà và một người), tế bào thần kinh sẽ có giá trị "1" cho lớp nó tin rằng hình ảnh đại diện và giá trị "0" cho các lớp khác .

Lớp kết nối hoàn toàn cuối cùng sẽ nhận được đầu ra của lớp trước nó và cung cấp xác suất cho từng lớp, tổng hợp thành một. Nếu có giá trị 0,75 trong danh mục "chó", nó thể hiện sự chắc chắn 75% rằng hình ảnh là một con chó.

Trình phân loại hình ảnh hiện đã được đào tạo và hình ảnh có thể được chuyển vào CNN, giờ đây sẽ xuất bản đoán về nội dung của hình ảnh đó.

Quy trình làm việc của máy

Trước khi chúng tôi nhảy vào một ví dụ về đào tạo một trình phân loại hình ảnh, hãy dành một chút thời gian để hiểu quy trình hoặc đường ống học tập máy. Quá trình đào tạo một mô hình mạng thần kinh khá chuẩn và có thể được chia thành bốn giai đoạn khác nhau.

Chuẩn bị dữ liệu

Đầu tiên, bạn sẽ cần thu thập dữ liệu của mình và đặt nó vào một biểu mẫu mà mạng có thể thực hiện. Điều này liên quan đến việc thu thập hình ảnh và dán nhãn chúng. Ngay cả khi bạn đã tải xuống một bộ dữ liệu mà người khác đã chuẩn bị, có khả năng sẽ có tiền xử lý hoặc chuẩn bị mà bạn phải làm trước khi bạn có thể sử dụng nó để đào tạo. Chuẩn bị dữ liệu là một nghệ thuật tự nó, liên quan đến việc xử lý những thứ như thiếu giá trị, dữ liệu bị hỏng, dữ liệu ở định dạng sai, nhãn không chính xác, v.v.

Trong bài viết này, chúng tôi sẽ sử dụng một bộ dữ liệu được xử lý trước.

Tạo mô hình

Tạo mô hình mạng thần kinh liên quan đến việc đưa ra các lựa chọn về các tham số và siêu âm khác nhau. Bạn phải đưa ra quyết định về số lượng lớp sẽ sử dụng trong mô hình của bạn, kích thước đầu vào và đầu ra của các lớp sẽ là gì, loại chức năng kích hoạt nào bạn sẽ sử dụng, cho dù bạn sẽ sử dụng bỏ học, v.v.

Học cách sử dụng tham số và hyperparamet nào sẽ đi kèm với thời gian (và rất nhiều nghiên cứu), nhưng ngay ngoài cổng có một số heuristic bạn có thể sử dụng để giúp bạn chạy và chúng tôi sẽ bao gồm một số trong số này trong ví dụ thực hiện.

Đào tạo mô hình

Sau khi bạn đã tạo mô hình của mình, bạn chỉ cần tạo một thể hiện của mô hình và phù hợp với nó với dữ liệu đào tạo của bạn. Sự cân nhắc lớn nhất khi đào tạo một mô hình là lượng thời gian mà mô hình thực hiện để đào tạo. Bạn có thể chỉ định độ dài đào tạo cho một mạng bằng cách chỉ định số lượng kỷ nguyên để đào tạo. Bạn càng đào tạo một mô hình càng lâu, hiệu suất của nó sẽ được cải thiện càng lớn, nhưng quá nhiều kỷ nguyên đào tạo và bạn có nguy cơ bị quá mức.

Chọn số lượng kỷ nguyên để đào tạo là thứ bạn sẽ cảm nhận và thông thường là lưu trọng lượng của một mạng giữa các buổi đào tạo để bạn không cần bắt đầu một khi bạn đã thực hiện một số tiến bộ đào tạo mạng.

Đánh giá mô hình

Có nhiều bước để đánh giá mô hình. Bước đầu tiên trong việc đánh giá mô hình là so sánh hiệu suất của mô hình với bộ dữ liệu xác thực, một tập dữ liệu mà mô hình chưa được đào tạo. Bạn sẽ so sánh hiệu suất của mô hình với bộ xác thực này và phân tích hiệu suất của nó thông qua các số liệu khác nhau.

Có nhiều số liệu khác nhau để xác định hiệu suất của mô hình mạng thần kinh, nhưng số liệu phổ biến nhất là "độ chính xác", lượng hình ảnh được phân loại chính xác chia cho tổng số hình ảnh trong tập dữ liệu của bạn.

Sau khi bạn đã thấy độ chính xác của hiệu suất của mô hình trên bộ dữ liệu xác thực, bạn thường sẽ quay lại và đào tạo lại mạng bằng cách sử dụng các tham số được điều chỉnh một chút, bởi vì không có khả năng bạn sẽ hài lòng với hiệu suất của mạng trong lần đầu tiên bạn đào tạo. Bạn sẽ tiếp tục điều chỉnh các tham số của mạng, đào tạo lại và đo lường hiệu suất của nó cho đến khi bạn hài lòng với độ chính xác của mạng.

Cuối cùng, bạn sẽ kiểm tra hiệu suất của mạng trên bộ thử nghiệm. Bộ thử nghiệm này là một bộ dữ liệu khác mà mô hình của bạn chưa từng thấy trước đây.

Có lẽ bạn đang tự hỏi:

Tại sao phải bận tâm với bộ thử nghiệm? Nếu bạn đang nhận được một ý tưởng về độ chính xác của mô hình của bạn, đó không phải là mục đích của bộ xác thực?

Đó là một ý tưởng tốt để giữ một loạt dữ liệu mà mạng chưa từng thấy để kiểm tra bởi vì tất cả các điều chỉnh các tham số bạn làm, kết hợp với việc kiểm tra lại trên bộ xác thực, có thể có nghĩa là mạng của bạn đã học được một số tính năng của bộ xác thực mà tập hợp xác thực sẽ không khái quát hóa dữ liệu ngoài mẫu.

Do đó, mục đích của bộ thử nghiệm là kiểm tra các vấn đề như quá mức và tự tin hơn rằng mô hình của bạn thực sự phù hợp để thực hiện trong thế giới thực.

Nhận dạng hình ảnh/phân loại với CNN trong Keras

Chúng tôi đã đề cập rất nhiều cho đến nay và nếu tất cả thông tin này có một chút áp đảo, việc thấy các khái niệm này kết hợp với nhau trong một trình phân loại mẫu được đào tạo trên một bộ dữ liệu sẽ làm cho các khái niệm này trở nên cụ thể hơn. Vì vậy, hãy xem xét một ví dụ đầy đủ về nhận dạng hình ảnh với Keras, từ việc tải dữ liệu đến đánh giá.

Hướng dẫn is python good for image recognition? - python có tốt cho nhận dạng hình ảnh không?

Tín dụng: www.cs.toronto.edu

Để bắt đầu, chúng tôi sẽ cần một bộ dữ liệu để đào tạo. Trong ví dụ này, chúng tôi sẽ sử dụng bộ dữ liệu CIFAR-10 nổi tiếng. CIFAR-10 là một bộ dữ liệu hình ảnh lớn chứa hơn 60.000 hình ảnh đại diện cho 10 loại đối tượng khác nhau như mèo, máy bay và xe hơi.

Các hình ảnh là RGB đầy màu sắc, nhưng chúng khá nhỏ, chỉ có 32 x 32. Một điều tuyệt vời về bộ dữ liệu CIFAR-10 là nó được đóng gói sẵn với Keras, vì vậy rất dễ dàng để tải lên bộ dữ liệu và hình ảnh cần rất ít tiền xử lý.

Điều đầu tiên chúng ta nên làm là nhập các thư viện cần thiết. Tôi sẽ chỉ ra cách các nhập khẩu này được sử dụng khi chúng ta đi, nhưng bây giờ biết rằng chúng ta sẽ sử dụng Numpy và các mô -đun khác nhau liên quan đến Keras:

import numpy
from tensorflow import keras
from keras.constraints import maxnorm
from keras.utils import np_utils

Chúng tôi sẽ sử dụng một hạt giống ngẫu nhiên ở đây để kết quả đạt được trong bài viết này có thể được sao chép bởi bạn, đó là lý do tại sao chúng tôi cần

from keras.datasets import cifar10
5:

# Set random seed for purposes of reproducibility
seed = 21

Chuẩn bị dữ liệu

Chúng tôi cần thêm một lần nhập: Bộ dữ liệu.

from keras.datasets import cifar10

Bây giờ hãy tải trong bộ dữ liệu. Chúng ta có thể làm như vậy chỉ đơn giản bằng cách chỉ định các biến nào chúng ta muốn tải dữ liệu vào và sau đó sử dụng hàm

from keras.datasets import cifar10
6:

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

Trong hầu hết các trường hợp, bạn sẽ cần phải thực hiện một số tiền xử lý dữ liệu của mình để sẵn sàng sử dụng, nhưng vì chúng tôi đang sử dụng một bộ dữ liệu được đóng gói sẵn, rất ít việc phải xử lý trước. Một điều chúng tôi muốn làm là bình thường hóa dữ liệu đầu vào.

Nếu các giá trị của dữ liệu đầu vào nằm trong phạm vi quá rộng, nó có thể tác động tiêu cực đến cách mạng hoạt động. Trong trường hợp này, các giá trị đầu vào là các pixel trong hình ảnh, có giá trị từ 0 đến 255.

Vì vậy, để bình thường hóa dữ liệu, chúng tôi chỉ có thể chia các giá trị hình ảnh cho 255. Để thực hiện điều này, trước tiên chúng tôi cần phải biến dữ liệu thành loại nổi, vì chúng hiện là số nguyên. Chúng ta có thể làm điều này bằng cách sử dụng lệnh

from keras.datasets import cifar10
7 Numpy và sau đó khai báo loại dữ liệu chúng ta muốn:

# Normalize the inputs from 0-255 to between 0 and 1 by dividing by 255
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train = X_train / 255.0
X_test = X_test / 255.0

Một điều khác chúng ta sẽ cần làm để chuẩn bị sẵn dữ liệu cho mạng là một lần nóng mã hóa các giá trị. Tôi sẽ không đi vào các chi tiết cụ thể của mã hóa một nóng ở đây, nhưng bây giờ biết rằng các hình ảnh không thể được sử dụng bởi mạng, chúng cần được mã hóa trước và mã hóa một nóng được sử dụng tốt nhất khi thực hiện Phân loại nhị phân.

Chúng tôi đang thực hiện phân loại nhị phân một cách hiệu quả ở đây vì một hình ảnh thuộc về một lớp hoặc nó không, nó không thể rơi ở đâu đó ở giữa. Lệnh Numpy

from keras.datasets import cifar10
8 được sử dụng để mã hóa một lần. Đây là lý do tại sao chúng tôi nhập chức năng
from keras.datasets import cifar10
9 từ Keras, vì nó chứa
from keras.datasets import cifar10
8.

Chúng tôi cũng cần chỉ định số lượng các lớp trong bộ dữ liệu, vì vậy chúng tôi biết có bao nhiêu tế bào thần kinh để nén lớp cuối cùng xuống:

Kiểm tra hướng dẫn thực hành của chúng tôi, thực tế để học Git, với các thực hành tốt nhất, các tiêu chuẩn được công nghiệp chấp nhận và bao gồm bảng gian lận. Ngừng các lệnh git googling và thực sự tìm hiểu nó!

# One-hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
class_num = y_test.shape[1]

Thiết kế mô hình

Chúng tôi đã đạt đến giai đoạn nơi chúng tôi thiết kế mô hình CNN. Điều đầu tiên cần làm là xác định định dạng mà chúng tôi muốn sử dụng cho mô hình, Keras có một số định dạng hoặc bản thiết kế khác nhau để xây dựng các mô hình trên, nhưng

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
1 được sử dụng phổ biến nhất và vì lý do đó, chúng tôi đã nhập nó từ Keras.

Tạo mô hình

Chúng ta có thể xây dựng mô hình tuần tự bằng cách tạo một thể hiện trống và sau đó thêm các lớp vào nó:

model = Sequential()
model.add(keras.layers.layer1)
model.add(keras.layers.layer2)
model.add(keras.layers.layer3)

Hoặc, chúng ta có thể chuyển trong mỗi lớp dưới dạng một phần tử trong một danh sách trong cuộc gọi trình xây dựng

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
2:

model = keras.Sequential([
    keras.layers.layer1,
    keras.layers.layer2,
    keras.layers.layer3    
])

Lớp đầu tiên của mô hình của chúng tôi là một lớp chập. Nó sẽ lấy các đầu vào và chạy các bộ lọc tích chập trên chúng.

Khi thực hiện chúng trong Keras, chúng ta phải chỉ định số lượng kênh/bộ lọc chúng ta muốn (đó là 32 bên dưới), kích thước của bộ lọc chúng ta muốn (3 x 3 trong trường hợp này), hình dạng đầu vào (khi tạo lớp đầu tiên ) và kích hoạt và đệm chúng ta cần. Đây đều là tất cả các siêu âm trong CNN dễ điều chỉnh. Như đã đề cập,

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
3 là kích hoạt phổ biến nhất và
# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
4 chỉ có nghĩa là chúng ta không thay đổi kích thước của hình ảnh. Bạn cũng có thể thử các lớp kích hoạt khác - mặc dù,
# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
3 là một mặc định rất hợp lý để thử nghiệm trước khi điều chỉnh:

model = keras.Sequential()
model.add(keras.layers.Conv2D(32, (3, 3), input_shape=X_train.shape[1:], padding='same'))
model.add(keras.layers.Activation('relu'))

Lưu ý: Vì một lớp kích hoạt có mặt sau khi thực tế tất cả các lớp, bạn có thể thêm nó làm đối số chuỗi vào lớp trước đó. Keras sẽ tự động thêm một lớp kích hoạt và phương pháp này thường dễ đọc hơn nhiều. Since an activation layer is present after practically all layers, you can add it as a string argument to the previous layer instead. Keras will automatically add an activation layer and this approach is typically much more readable.

model.add(keras.layers.Conv2D(32, 3, input_shape=(32, 32, 3), activation='relu', padding='same'))

Bây giờ chúng tôi sẽ thêm một lớp bỏ học để ngăn chặn quá mức, hoạt động bằng cách loại bỏ ngẫu nhiên một số kết nối giữa các lớp (

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
6 có nghĩa là nó giảm 20% các kết nối hiện có):

# Set random seed for purposes of reproducibility
seed = 21
0

Chúng tôi cũng có thể muốn thêm bình thường hóa hàng loạt ở đây. Batch chuẩn hóa bình thường hóa các đầu vào hướng vào lớp tiếp theo, đảm bảo rằng mạng luôn tạo ra các kích hoạt với cùng một phân phối mà chúng tôi mong muốn:

# Set random seed for purposes of reproducibility
seed = 21
1

Đây là khối cơ bản được sử dụng để xây dựng CNN. Lớp chập, kích hoạt, bỏ học, gộp. Các khối này sau đó có thể được xếp chồng lên nhau, thường là theo mô hình kim tự tháp về độ phức tạp. Khối tiếp theo thường chứa một lớp chập với bộ lọc lớn hơn, cho phép nó tìm các mẫu chi tiết hơn và trừu tượng hơn nữa, sau đó là một lớp gộp, bình thường hóa và bình thường hóa hàng loạt:

# Set random seed for purposes of reproducibility
seed = 21
2

Bạn có thể thay đổi số lượng chính xác các lớp chập mà bạn có theo ý thích của mình, mặc dù mỗi lớp thêm nhiều chi phí tính toán. Lưu ý rằng khi bạn thêm các lớp chập, bạn thường tăng số lượng bộ lọc của chúng để mô hình có thể tìm hiểu các biểu diễn phức tạp hơn. Nếu các số được chọn cho các lớp này có vẻ hơi tùy tiện, nói chung, bạn sẽ tăng các bộ lọc khi bạn tiếp tục và bạn khuyên bạn nên tạo ra sức mạnh của chúng là 2 có thể mang lại lợi ích nhỏ khi đào tạo GPU.

Điều quan trọng là không có quá nhiều lớp gộp, vì mỗi gộp lại loại bỏ một số dữ liệu bằng cách cắt các kích thước của đầu vào với một yếu tố nhất định. Trong trường hợp của chúng tôi, nó cắt các hình ảnh làm đôi. Tổng hợp quá thường xuyên sẽ dẫn đến việc hầu như không có gì cho các lớp được kết nối dày đặc để tìm hiểu khi nào dữ liệu tiếp cận chúng.

Số lượng chính xác các lớp gộp bạn nên sử dụng sẽ thay đổi tùy thuộc vào nhiệm vụ bạn đang làm và đó là điều bạn sẽ cảm nhận được theo thời gian. Vì hình ảnh quá nhỏ ở đây, chúng tôi sẽ không tập trung hơn hai lần.

Bây giờ bạn có thể lặp lại các lớp này để cung cấp cho mạng của bạn nhiều đại diện hơn để làm việc:

# Set random seed for purposes of reproducibility
seed = 21
3

Sau khi chúng tôi hoàn thành các lớp chập, chúng tôi cần

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
7 dữ liệu, đó là lý do tại sao chúng tôi nhập chức năng ở trên. Chúng tôi cũng sẽ thêm một lớp bỏ học một lần nữa:

# Set random seed for purposes of reproducibility
seed = 21
4

Bây giờ chúng tôi sử dụng nhập

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
8 và tạo lớp được kết nối dày đặc đầu tiên. Chúng ta cần chỉ định số lượng tế bào thần kinh trong lớp dày đặc. Lưu ý rằng số lượng tế bào thần kinh trong các lớp thành công giảm, cuối cùng tiếp cận cùng số lượng tế bào thần kinh như có các lớp trong bộ dữ liệu (trong trường hợp này là 10).

Chúng ta có thể có nhiều lớp dày đặc ở đây và các lớp này trích xuất thông tin từ các bản đồ tính năng để học cách phân loại hình ảnh dựa trên bản đồ tính năng. Vì chúng tôi đã có những hình ảnh khá nhỏ được ngưng tụ thành các bản đồ tính năng khá nhỏ - không cần phải có nhiều lớp dày đặc. Một lớp duy nhất, đơn giản, 32 nơ-ron nên khá đủ:

# Set random seed for purposes of reproducibility
seed = 21
5

Lưu ý: Coi chừng các lớp dày đặc. Vì chúng được kết nối đầy đủ, chỉ có một vài lớp ở đây thay vì một lớp duy nhất tăng đáng kể số lượng tham số có thể học được lên trên. Chẳng hạn, nếu chúng ta có ba lớp dày đặc (128, 64 và 32), số lượng tham số có thể huấn luyện sẽ tăng vọt ở mức 2,3m, trái ngược với 400K trong mô hình này. Mô hình lớn hơn thực sự thậm chí có độ chính xác thấp hơn, bên cạnh thời gian đào tạo dài hơn trong các bài kiểm tra của chúng tôi. Beware of dense layers. Since they're fully-connected, having just a couple of layers here instead of a single one significantly bumps the number of learnable parameters upwards. For instance, if we had three dense layers (128, 64 and 32), the number of trainable parameters would skyrocket at 2.3M, as opposed to the 400k in this model. The larger model actually even had lower accuracy, besides the longer training times in our tests.

Trong lớp cuối cùng, chúng tôi vượt qua số lượng lớp cho số lượng tế bào thần kinh. Mỗi tế bào thần kinh đại diện cho một lớp và đầu ra của lớp này sẽ là một vectơ tế bào thần kinh 10 với mỗi nơ -ron lưu trữ một số xác suất mà hình ảnh trong câu hỏi thuộc về lớp mà nó đại diện.

Cuối cùng, chức năng kích hoạt

# Loading in the data
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
9 chọn tế bào thần kinh với xác suất cao nhất là đầu ra của nó, bỏ phiếu rằng hình ảnh thuộc về lớp đó:

# Set random seed for purposes of reproducibility
seed = 21
6

Bây giờ chúng tôi đã thiết kế mô hình chúng tôi muốn sử dụng, chúng tôi chỉ cần biên dịch nó. Trình tối ưu hóa là những gì sẽ điều chỉnh các trọng số trong mạng của bạn để tiếp cận điểm mất thấp nhất. Thuật toán ước tính thời điểm thích ứng (Adam) là một trình tối ưu hóa rất thường được sử dụng và một trình tối ưu hóa mặc định rất hợp lý để thử. Nó thường ổn định và hoạt động tốt trên nhiều nhiệm vụ khác nhau, vì vậy nó có thể sẽ hoạt động tốt ở đây.

Nếu không, chúng ta có thể chuyển sang một trình tối ưu hóa khác, chẳng hạn như NADAM (Adam gia tăng Nesterov), RMSProp (thông thường được sử dụng cho hồi quy), v.v.

Chúng tôi sẽ theo dõi độ chính xác và độ chính xác xác nhận để đảm bảo chúng tôi tránh quá mức CNN. Nếu cả hai bắt đầu chuyển hướng đáng kể và mạng hoạt động tốt hơn nhiều trên bộ xác thực - nó sẽ quá mức.

# Set random seed for purposes of reproducibility
seed = 21
7

Chúng ta có thể in ra bản tóm tắt mô hình để xem toàn bộ mô hình trông như thế nào.

# Set random seed for purposes of reproducibility
seed = 21
8

In tóm tắt sẽ cung cấp cho chúng tôi khá nhiều thông tin và có thể được sử dụng để kiểm tra chéo kiến ​​trúc của chính bạn đối với việc đặt ra trong hướng dẫn:

# Set random seed for purposes of reproducibility
seed = 21
9

Bây giờ chúng tôi có thể đào tạo mô hình. Để làm điều này, tất cả những gì chúng ta phải làm là gọi hàm

# Normalize the inputs from 0-255 to between 0 and 1 by dividing by 255
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train = X_train / 255.0
X_test = X_test / 255.0
0 trên mô hình và truyền trong các tham số đã chọn. Ngoài ra, chúng tôi cũng có thể lưu lại lịch sử của nó và vẽ biểu đồ hiệu suất của nó trong quá trình đào tạo. Điều này đôi khi cung cấp cho chúng ta thông tin có giá trị về tiến trình mà mạng đã thực hiện và liệu chúng ta có thể đào tạo nó thêm hay không và liệu nó có bắt đầu quá mức nếu chúng ta làm như vậy.

Chúng tôi đã sử dụng một hạt giống để tái sản xuất, vì vậy hãy đào tạo mạng và lưu hiệu suất của nó:

from keras.datasets import cifar10
0

Kết quả này trong:

from keras.datasets import cifar10
1

Lưu ý rằng trong hầu hết các trường hợp, bạn muốn có một tập xác thực khác với tập kiểm tra và do đó bạn chỉ định tỷ lệ phần trăm của dữ liệu đào tạo để sử dụng làm bộ xác thực. Trong trường hợp này, chúng tôi sẽ chuyển trong dữ liệu thử nghiệm để đảm bảo dữ liệu thử nghiệm được đặt sang một bên và không được đào tạo. Chúng tôi sẽ chỉ có dữ liệu thử nghiệm trong ví dụ này, để giữ cho mọi thứ đơn giản.

Bây giờ chúng ta có thể đánh giá mô hình và xem cách nó thực hiện. Chỉ cần gọi

# Normalize the inputs from 0-255 to between 0 and 1 by dividing by 255
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train = X_train / 255.0
X_test = X_test / 255.0
1:

from keras.datasets import cifar10
2

Và chúng tôi được chào đón với kết quả:

from keras.datasets import cifar10
3

Với học tập chuyển nhượng và kiến ​​trúc mạnh mẽ hơn, bạn có thể đạt được nhiều hơn nữa. Chúng tôi giới thiệu độ chính xác 94% trong hướng dẫn phân loại hình ảnh với việc học chuyển giao trong Keras - Tạo các mô hình CNN tiên tiến!

Ngoài ra, chúng ta có thể hình dung lịch sử rất dễ dàng:

from keras.datasets import cifar10
4

Kết quả này trong:

Lưu ý rằng trong hầu hết các trường hợp, bạn muốn có một tập xác thực khác với tập kiểm tra và do đó bạn chỉ định tỷ lệ phần trăm của dữ liệu đào tạo để sử dụng làm bộ xác thực. Trong trường hợp này, chúng tôi sẽ chuyển trong dữ liệu thử nghiệm để đảm bảo dữ liệu thử nghiệm được đặt sang một bên và không được đào tạo. Chúng tôi sẽ chỉ có dữ liệu thử nghiệm trong ví dụ này, để giữ cho mọi thứ đơn giản.

Bây giờ chúng ta có thể đánh giá mô hình và xem cách nó thực hiện. Chỉ cần gọi

# Normalize the inputs from 0-255 to between 0 and 1 by dividing by 255
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train = X_train / 255.0
X_test = X_test / 255.0
1:

Và chúng tôi được chào đón với kết quả:

Với học tập chuyển nhượng và kiến ​​trúc mạnh mẽ hơn, bạn có thể đạt được nhiều hơn nữa. Chúng tôi giới thiệu độ chính xác 94% trong hướng dẫn phân loại hình ảnh với việc học chuyển giao trong Keras - Tạo các mô hình CNN tiên tiến!Guided Project: "Building Your First CNN with Keras".

Hướng dẫn is python good for image recognition? - python có tốt cho nhận dạng hình ảnh không?

Ngoài ra, chúng ta có thể hình dung lịch sử rất dễ dàng:

Từ các đường cong, chúng ta có thể thấy rằng việc đào tạo đã không thực sự dừng lại sau 25 kỷ nguyên - có lẽ nó có thể tiếp tục lâu hơn so với mô hình và kiến ​​trúc này, điều này sẽ mang lại độ chính xác cao hơn.

Và đó là nó! Bây giờ chúng tôi có một CNN nhận dạng hình ảnh được đào tạo. Không tệ cho lần chạy đầu tiên, nhưng có lẽ bạn sẽ muốn chơi xung quanh với cấu trúc và tham số mô hình để xem liệu bạn có thể có được hiệu suất tốt hơn không.

Đi xa hơn-Dự án đầu cuối cầm tay

  • Bản chất tò mò của bạn khiến bạn muốn đi xa hơn? Chúng tôi khuyên bạn nên kiểm tra dự án có hướng dẫn của chúng tôi: "Xây dựng CNN đầu tiên của bạn với Keras".
  • Tại sao một lớp học được dự đoán? Mô hình sai ở đâu? Điều gì đã khiến nó dự đoán sai? Sự chú ý của người mẫu là gì? Các tính năng đã học trông như thế nào? Chúng ta có thể tách chúng thành các lớp khác nhau không? Làm thế nào gần các tính năng làm cho lớp N cho tính năng tạo ra lớp M?
  • Đây là không gian tính năng tiềm ẩn của mô hình của bạn được hiển thị và nếu không thì ẩn khỏi bạn:
  • Văn học là rộng lớn, và nó quá dài và lý thuyết hoặc quá ngắn gọn để thực tế. Trong dự án có hướng dẫn này - chúng tôi sẽ trải qua quá trình xây dựng CNN của riêng bạn bằng cách sử dụng Keras, giả sử bạn quen thuộc với các nguyên tắc cơ bản.
  • Trong dự án này, thông qua một cách tiếp cận thực tế, cầm tay, bạn sẽ tìm hiểu về:
  • Sự xuất hiện và nguồn gốc của sự xuất hiện trong các bộ dữ liệu
  • Tìm kiếm, tải xuống bộ dữ liệu và trích xuất dữ liệu
  • Trực quan hóa các tập hợp con của hình ảnh
  • Tải dữ liệu và tiền xử lý
  • Hứa và nguy hiểm của việc tăng dữ liệu và lớp hình ảnh của Keras
  • Xác định kiến ​​trúc CNN tùy chỉnh
  • Thực hiện LRFinder với Keras và tự động tìm kiếm tỷ lệ học tập
  • Đánh giá khả năng phân loại của một mô hình

Diễn giải các dự đoán của mô hình và đánh giá lỗi

Điều gì làm cho mạng dự đoán sai

Điều này sẽ cung cấp cho bạn một số trực giác về các lựa chọn tốt nhất cho các tham số mô hình khác nhau. Bạn cũng nên đọc về các lựa chọn tham số và tham số khác nhau trong khi bạn làm như vậy. Sau khi bạn cảm thấy thoải mái với những điều này, bạn có thể thử triển khai trình phân loại hình ảnh của riêng mình trên một bộ dữ liệu khác.

Ngôn ngữ lập trình nào là tốt nhất để nhận dạng hình ảnh?

Ngôn ngữ lập trình là tốt nhất để nhận dạng hình ảnh..
(1) Python. Python hiện đang giữ vị trí là ngôn ngữ lập trình phổ biến nhất. ....
(2) C / C ++ / C # C / C ++ / C # cũng có thể được sử dụng để nhận dạng hình ảnh. ....
(3) Matlab. MATLAB là một ngôn ngữ lập trình độc lập có khuôn khổ riêng. ....
(4) Java ..

Thuật toán tốt nhất để nhận dạng hình ảnh là gì?

CNN là một thuật toán mạnh mẽ để xử lý hình ảnh.Các thuật toán này hiện là các thuật toán tốt nhất chúng tôi có để xử lý hình ảnh tự động.Nhiều công ty sử dụng các thuật toán này để làm những việc như xác định các đối tượng trong một hình ảnh.Hình ảnh chứa dữ liệu kết hợp RGB. is a powerful algorithm for image processing. These algorithms are currently the best algorithms we have for the automated processing of images. Many companies use these algorithms to do things like identifying the objects in an image. Images contain data of RGB combination.

Cái nào tốt hơn để xử lý hình ảnh C ++ hoặc Python?

Vì vậy, Python không phải là một ngôn ngữ tốt để viết thư viện xử lý hình ảnh, nhưng nó là một ngôn ngữ tốt để xử lý hình ảnh bằng các thư viện không được viết bằng Python.Hầu hết các thư viện xử lý hình ảnh phổ biến là OpenCV (Thư viện tầm nhìn máy tính có nguồn gốc mở) ban đầu được phát triển trong C, nhưng sau đó chuyển sang C ++.Python isn't a good language for writing image processing libraries, but it is a good language for image processing using libraries not written in Python. Most popular image processing library is OpenCV (Open Sourced Computer Vision Library)which was initially developed in C ,but later moved to C++ .

Python có tốt cho opencv không?

Python rất phù hợp để thực hiện các tính năng mới.Các thư viện như OpenCV được viết bằng C ++ và làm cho Python có thời gian chạy chậm hơn vì nó vẫn sẽ gọi các thư viện C/C ++.Điều này có nghĩa là bạn sẽ có lợi thế phát triển từ Python trong khi bạn có thể có tối ưu hóa hiệu suất từ C ++.. Libraries like OpenCV are written in C++ and make Python have slower runtime as it will still call C/C++ libraries. This means you will have the development advantage from Python while you can have performance optimization from C++.