Dengan perkembangan pesat teknologi digital, pemprosesan imej telah menjadi bahagian yang amat diperlukan dalam bidang seperti kecerdasan buatan. Pemprosesan imej berskala besar, anggaran dan analisis yang sering terlibat dalam teknologi kecerdasan buatan sentiasa menjadi masalah yang agak sukar. Sebagai bahasa pengaturcaraan yang cekap dan selamat, bahasa Go boleh memberikan penyelesaian yang sangat baik. Dalam artikel ini, kami akan memperkenalkan cara menggunakan bahasa Go untuk mencapai anggaran imej berskala besar yang cekap.
Sesetengah ciri bahasa Go menjadikannya bahasa yang ideal untuk melaksanakan algoritma anggaran imej. Bahasa Go mempunyai ciri-ciri berikut:
Seterusnya, kami akan memperkenalkan cara menggunakan bahasa Go untuk melaksanakan dua tugasan anggaran imej berskala besar biasa: pengelasan imej dan pembahagian imej.
Klasifikasi imej ialah tugas untuk memperuntukkan imej yang diberikan kepada kategori yang telah ditetapkan. Menggunakan rangkaian neural convolutional (CNN) ialah kaedah biasa untuk mencapai pengelasan imej. Dalam bahasa Go, anda boleh menggunakan perpustakaan pihak ketiga seperti TensorFlow atau GoCV untuk melaksanakan CNN. GoCV menyediakan pengikatan bahasa Go menggunakan OpenCV, yang boleh memproses data imej dengan mudah. TensorFlow ialah rangka kerja pembelajaran mesin popular yang menyokong pelaksanaan model pembelajaran mendalam seperti CNN.
Berikut ialah contoh mudah menggunakan TensorFlow untuk melaksanakan pengelasan imej:
import ( "fmt" "github.com/tensorflow/tensorflow/tensorflow/go" "io/ioutil" ) func classifyImage(modelPath string, imagePath string) (string, error) { model, err := ioutil.ReadFile(modelPath) if err != nil { return "", err } graph := tensorflow.NewGraph() if err := graph.Import(model, ""); err != nil { return "", err } tensor, err := makeTensorFromImage(imagePath) if err != nil { return "", err } session, err := tensorflow.NewSession(graph, nil) if err != nil { return "", err } defer session.Close() output, err := session.Run( map[tensorflow.Output]*tensorflow.Tensor{ graph.Operation("input").Output(0): tensor, }, []tensorflow.Output{ graph.Operation("output").Output(0), }, nil) if err != nil { return "", err } result := make([]float32, len(output[0].Value().([][]float32)[0])) for i, v := range output[0].Value().([][]float32)[0] { result[i] = v } return classes[maxIndex(result)], nil } func maxIndex(arr []float32) int { max := arr[0] maxIndex := 0 for i, v := range arr { if v > max { max = v maxIndex = i } } return maxIndex } func makeTensorFromImage(imagePath string) (*tensorflow.Tensor, error) { imgRaw, err := ioutil.ReadFile(imagePath) if err != nil { return nil, err } img, _, err := image.Decode(bytes.NewReader(imgRaw)) if err != nil { return nil, err } b := img.Bounds() ySize := b.Max.Y - b.Min.Y xSize := b.Max.X - b.Min.X var floats []float32 for y := b.Min.Y; y < b.Max.Y; y++ { for x := b.Min.X; x < b.Max.X; x++ { r, g, b, _ := img.At(x, y).RGBA() floats = append(floats, float32(r>>8)/255.0) floats = append(floats, float32(g>>8)/255.0) floats = append(floats, float32(b>>8)/255.0) } } t, err := tensorflow.NewTensor([1][224][224][3]float32{floats}) if err != nil { return nil, err } return t, nil } func main() { imagePath := "cat.jpg" modelPath := "model.pb" class, err := classifyImage(modelPath, imagePath) if err != nil { log.Fatal(err) } fmt.Printf("The image is classified as %s ", class) }
Kod ini boleh mengelaskan imej ke dalam salah satu kategori yang dipratentukan. Dalam contoh ini, kami memuatkan dan menggunakan model pengelasan imej terlatih dan menggunakan model untuk mengelaskan imej. Fungsi makeTensorFromImage juga digunakan dalam kod untuk menukar imej kepada tensor untuk memudahkan pengiraan oleh model.
Membahagikan imej kepada berbilang bahagian dan menetapkannya kepada kategori berbeza, iaitu memperuntukkan setiap piksel imej kepada kategori, dipanggil untuk pembahagian imej. Pembahagian imej ialah asas untuk banyak tugas penglihatan komputer seperti pengesanan objek, pembahagian semantik, dsb. Menggunakan rangkaian neural convolutional juga merupakan kaedah biasa untuk mencapai pembahagian imej. Dalam bahasa Go, anda juga boleh menggunakan perpustakaan pihak ketiga seperti TensorFlow atau GoCV untuk melaksanakan CNN.
Berikut ialah contoh mudah menggunakan TensorFlow untuk melaksanakan pembahagian imej:
import ( "fmt" "github.com/tensorflow/tensorflow/tensorflow/go" "io/ioutil" ) func segmentImage(modelPath string, imagePath string) ([][]int, error) { model, err := ioutil.ReadFile(modelPath) if err != nil { return nil, err } graph := tensorflow.NewGraph() if err := graph.Import(model, ""); err != nil { return nil, err } tensor, err := makeTensorFromImage(imagePath) if err != nil { return nil, err } session, err := tensorflow.NewSession(graph, nil) if err != nil { return nil, err } defer session.Close() output, err := session.Run( map[tensorflow.Output]*tensorflow.Tensor{ graph.Operation("input").Output(0): tensor, }, []tensorflow.Output{ graph.Operation("output").Output(0), }, nil) if err != nil { return nil, err } segmentation := make([][]int, 224) for i := range segmentation { segmentation[i] = make([]int, 224) } for y := 0; y < 224; y++ { for x := 0; x < 224; x++ { segmentation[y][x] = int(output[0].Value().([][]float32)[y][x]) } } return segmentation, nil } func makeTensorFromImage(imagePath string) (*tensorflow.Tensor, error) { imgRaw, err := ioutil.ReadFile(imagePath) if err != nil { return nil, err } img, _, err := image.Decode(bytes.NewReader(imgRaw)) if err != nil { return nil, err } b := img.Bounds() ySize := b.Max.Y - b.Min.Y xSize := b.Max.X - b.Min.X var floats []float32 for y := b.Min.Y; y < b.Max.Y; y++ { for x := b.Min.X; x < b.Max.X; x++ { r, g, b, _ := img.At(x, y).RGBA() floats = append(floats, float32(r>>8)/255.0) floats = append(floats, float32(g>>8)/255.0) floats = append(floats, float32(b>>8)/255.0) } } t, err := tensorflow.NewTensor([1][224][224][3]float32{floats}) if err != nil { return nil, err } return t, nil } func main() { imagePath := "cat.jpg" modelPath := "model.pb" segmentation, err := segmentImage(modelPath, imagePath) if err != nil { log.Fatal(err) } fmt.Println(segmentation) }
Kod ini boleh membahagikan imej kepada beberapa bahagian dan menetapkannya kepada kategori yang berbeza. Dalam contoh ini, kami memuatkan dan menggunakan model pembahagian imej terlatih dan menggunakan model untuk membahagikan imej. Fungsi makeTensorFromImage juga digunakan dalam kod untuk menukar imej kepada tensor untuk memudahkan pengiraan oleh model. Akhir sekali, hasil pembahagian disimpan sebagai tatasusunan dua dimensi.
Ringkasan
Artikel ini memperkenalkan cara menggunakan bahasa Go untuk mencapai anggaran imej berskala besar yang cekap. Dengan menggunakan ciri konkurensi, kecekapan dan keselamatan bahasa Go, kami boleh melaksanakan tugas anggaran imej biasa dengan mudah, seperti pengelasan imej dan pembahagian imej. Sudah tentu, kod di atas hanyalah contoh penggunaan TensorFlow, dan terdapat beberapa perbezaan dalam cara menggunakan rangka kerja pembelajaran mesin yang berbeza.
Perlu diambil perhatian bahawa walaupun bahasa Go boleh melaksanakan anggaran imej, masih terdapat beberapa batasan dalam kecekapan dan kematangan. Di samping itu, anggaran imej memerlukan sejumlah besar data, kuasa pengkomputeran dan rizab pengetahuan serta memerlukan percubaan langsung. Oleh itu, amat penting bagi pembaca yang berminat untuk bekerja dalam bidang berkaitan mempelajari teori asas dan aplikasi pembelajaran mesin.
Atas ialah kandungan terperinci Melaksanakan anggaran imej berskala besar yang cekap dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!