imread:「OpenCV 4 教程」图像读取函数imread

 2021-06-25 17:06    77  

经过几个月的努力imread,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早地了解最新版的OpenCV 4,小白与出版社沟通,提前在头条号上连载部分内容,请持续关注小白。

imread:「OpenCV 4 教程」图像读取函数imread

imread:「OpenCV 4 教程」图像读取函数imread

我们在前面已经见过了图像读取函数imread()的调用方式,这里我们给出函数的原型imread。

代码清单2-24 imread()函数的原型cv::Mat cv::imread(const String & filename, int flags=IMREAD_COLOR )filenameimread:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名

flags:读取图像形式的标志,如将彩色图像按照灰度图读取,默认参数是按照彩色图像格式读取,可选参数在表2-3给出。函数用于读取指定的图像并将其返回给一个Mat类变量,如果图像文件不存在、破损或者格式不受支持时,则无法读取图像,此时函数返回一个空矩阵,因此可以通过判断返回矩阵的data属性是否为空或者empty()函数是否为真来判断是否成功读取图像,如果读取图像失败,data属性返回值为0,empty()函数返回值为1。函数能够读取多种格式的图像文件,但是在不同操作系统由于使用的编解码器不同,因此在某个系统中能够读取的图像文件可能在其他系统中就无法读取。无论在哪个系统中,bmp文件和dib文件都是始终可以读取的,在Windows和Mac系统中,默认情况下使用OpenCV自带的编解码器(libjpeg,libpng,libtiff和libjasper),因此可以读取JPEG(jpg、jpeg、jpe),PNG,TIFF(tiff、tif)文件,在Linux系统中需要自行安装这些编解码器,安装后同样可以读取这些类型的文件。不过需要说明的是,该函数能否读取文件数据与扩展名无关,而是通过文件的内容确定图像的类型,例如将一个扩展名由png修改成exe时,该函数一样可以读取该图像,但是将扩展名exe改成png,该函数不能加载该文件。

该函数第一个参数以字符串形式给出待读取图像的地址,第二个函数是设置读取图像的形式,默认的参数是以彩色图的形式读取,针对不同需求可以更改参数,在OpenCV 4.1中给出了13种模式读取图像的形式,总结起来分别是以原样式读取、灰度图读取、彩色图读取、多位数读取、在读取时将图像缩小一定尺寸等形式读取,具体可选择的参数及作用在表2-3中给出,这里需要指出的是,将彩色图像转成灰度图通过编解码器内部转换,可能会与OpenCV程序中将彩色图像转成灰度图的结果存在差异。这些标志参数在功能不冲突的前提下可以同时声明多个,不同参数之间用“|”隔开。

注意

默认情况下,读取图像的像素数目必须小于2^30,这个要求在绝大多数图像处理领域都是不受影响的,但是卫星遥感图像、超高分辨率图像的像素数目可能会超过这个阈值,可以通过修改系统变量中的OPENCV_IO_MAX_IMAGE_PIXELS参数调整能够读取的最大像素数目。

人工智能3分钟入门到精通!计算机AI视觉简单易上手!

ImageAI是一套Python的电脑视觉编程库,主要提供三大功能:Image prediction、Object detection、Video object Detection and tracking。

imread:「OpenCV 4 教程」图像读取函数imread

imread:「OpenCV 4 教程」图像读取函数imread

作者是两个住在奈及利亚拉哥斯的黑人兄弟Moses Olafenwa和John Olafenwa,强调编程设计皆是自学而来,除了ImageAI,他们还另外开发了一套基于PyTorch的开源Deep learning framework,这些套件展现了他们非凡的编程功力和AI学养。

imread:「OpenCV 4 教程」图像读取函数imread

功能说明

imread:「OpenCV 4 教程」图像读取函数imread

Image prediction

imread:「OpenCV 4 教程」图像读取函数imread

针对Image prediction有四种深度学习模型可选择:

imread:「OpenCV 4 教程」图像读取函数imread

– SqueezeNet

imread:「OpenCV 4 教程」图像读取函数imread

Size为4.82 mb,预测速度最快,精确度中等。

SqueezeNet由UC Berkeley和Stanford所合作开发,与MobileNet、ShuffleNet、Xception并称为四种目前最知名的轻量级影像识别模型,它们皆针对模型中CNN卷积的方法作了改善,以减少深度并加快其效率。

– ResNet50

由Microsoft Research 所研发的模型,Size为98 mb,预测速度快,精确度高。

ResNet全名是Residual Neural Network,由微软研究院所开发,中文多半翻译为残差网路。它的特点是神经网路不一定要一层层接续往下执行,可以是跳跃方式略过下一层而直达下下层。因为它改善了深度持续增加时所出现的Degradation问题,因此ResNet可以更深,如ResNet50。

– InceptionV3

Inception是由Google Brain team所研发,Size为91.6 mb,预测速度慢,但精确度较高。

Inception是一种network in network的架构,针对输入资料同时并行不同filter尺寸的卷积处理和max pooling,最后再进行级联,这让系统在同一层便能取得不同level的特征。Inception是GoogLeNet的核心架构,一般所称的Inception的各系列版本,即是指GoogLeNet。

– DenseNet121

这是由Facebook AI Research所开发的模型,Size为31.6 mb,预测速度最慢,但精确度最高。

透过大量Dense block(直接与下层layer建立连接,以避免梯度消失)使用,并减少每层的复杂度,DenseNet号称使用大约一半的参数就能够达到与ResNet相同的表现,但这是指相同的层数下,故DenseNet121预测速度仍较ResNet50慢。

速度:SqueezeNet>ResNet50>InceptionV3>DenseNet121

精度:DenseNet121>InceptionV3>ResNet50>SqueezeNet

Object detection

针对Object detection功能,目前仅RetinaNet可选择,但官方说明会持续提供其它的模型选择。

RetinaNet

目前主流的Object detection技术主要有两种:one-stage及two-stage。

two-stage需先透过传统Image pyramid、或后来改进的Object Box Proposals等等方式来输出候选视窗,再去评估各区域的物件机率,此技术以Faster RCNN为代表。缺点是消耗的资源多,效率较低,但输出结果的准确度高。

one-stage则以YOLO、SSD为最知名,可直接在影像各区域上计算物件机率、或直接判断物件。这一类方法速度相当快,但准确度就没有two-stage高。

Video object Detection and tracking

影片物件侦测功能其实是进行多张图片进行连续快速的detection,因此与Object detection相同,目前仅支援RetinaNet。

安装

目前ImageAI仅支援Python3.5.1以上的版本,整个安装过程在半小时左右便可顺利结束。

安装必要的模组:

pip3 install –upgrade tensorflow

pip3 install numpy

pip3 install scipy

pip3 install opencv-python

pip3 install pillow

pip3 install matplotlib

pip3 install h5py

pip3 install keras

主编程:

pip3 install

使用说明

Image prediction

ImageAI针对影像辨识提供了前述的四种模型SqueezeNet, ResNet, InceptionV3及DenseNet,并提供 ImageNet-1000 影像资料库所训练好的参数让我们直接使用。(ImageNet-1000有120万张相片,1000种物件类型。)

编程:

from imageai.Prediction import ImagePrediction

import os

execution_path = os.getcwd()

prediction = ImagePrediction()

prediction.setModelTypeAsResNet()

prediction.setModelPath(os.path.join(execution_path, “prediction/resnet50_weights_tf_dim_ordering_tf_kernels.h5″))

prediction.loadModel()

predictions, probabilities = prediction.predictImage(os.path.join(execution_path, “predict1.jpg"), result_count=5 )

for eachPrediction, eachProbability in zip(predictions, probabilities):

print(eachPrediction + " : " + eachProbability)

不到十行编程便可完成相片预测功能了!

上述编程中所定义的预训练模型参数档 .h5可从github下载,共有四种。下面为我们要预测的图片predict1.jpg。

B) OBJECT DETECTION

Object detection的功能透过ImageAI framework也是相当简单。

from imageai.Detection import ObjectDetection

import os

execution_path = os.getcwd()

detector = ObjectDetection()

detector.setModelTypeAsRetinaNet()

detector.setModelPath( os.path.join(execution_path , “detection/resnet50_coco_best_v2.0.1.h5″))

detector.loadModel()

detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , “2.jpg"), output_image_path=os.path.join(execution_path , “2new.jpg"))

for eachObject in detections:

print(eachObject[“name"] + " : " + eachObject[“percentage_probability"] )

print(“——————————–“)

RetinaNet的预训练权重档请从github下载。

我们以这张相片2.jpf为例。

其预测结果如下:

C) VIDEO OBJECT DETECTION AND TRACKING

ImageAI提供的Video object detection使用的模型为RetinaNet,可侦测80种物件类别如下:

person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic light, fire hydrant, stop_sign, parking meter, bench, bird, cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe, backpack, umbrella, handbag, tie, suitcase, frisbee, skis, snowboard, sports ball, kite, baseball bat, baseball glove, skateboard, surfboard, tennis racket, bottle, wine glass, cup, fork, knife, spoon, bowl, banana, apple, sandwich, orange, broccoli, carrot, hot dog, pizza, donot, cake, chair, couch, potted plant, bed, dining table, toilet, tv, laptop, mouse, remote, keyboard, cell phone, microwave, oven, toaster, sink, refrigerator, book, clock, vase, scissors, teddy bear, hair dryer, toothbrush.

不过严格来说,从ImageAI提供的文件上看不出有Tracking的功能,仅能加入custom_objects参数来指定要侦测特定的物件类别。此外,Video object detection功能并非实时播放影片侦测,而是将输入影片进行侦测后再输出为新的影片,如果我们需要即时的处理影片串流,应该使用其object detection功能by frame来处理。

CUSTOM MODEL TRAINING & PREDICTION

值得一提的是,ImageAI提供很方便的方法,可让您训练自己的Image prediction模型,也是有四种模型可选:SqueezeNet、ResNet50、InceptionV3、DenseNet121,训练完之后,可得到.json(label定义)及.h5(模型权重档),我们可透过这两个档案来进行影像的预测。

Step1:Dataset准备

举例来说,如果我想训练一个数字0~5的手势模型,那么,我需要准备如格式下的image dataset,两层式的资料夹,第一层为dataset名称,第二层为各类别名称,然后在第二层资料夹放入相对应的图片。

Step2:定义训练参数

下面五行

from imageai.Prediction.Custom import ModelTraining

model_trainer = ModelTraining()

model_trainer.setModelTypeAsInceptionV3()

model_trainer.setDataDirectory(“gesture")

model_trainer.trainModel(num_objects=6, num_experiments=10, enhance_data=True, batch_size=32, show_network_summary=True)

model_trainer.setModelTypeAsInceptionV3() → 指定训练模型为InceptionV3

model_trainer.setDataDirectory(“gesture") → 定义该dataset的第一层目录。

num_objects=6 → 要训练的物件类别数目,以本例来说,有0~5 六种手势。

num_experiments → 要训练的迭代次数,亦即epoch

enhance_data → 资料强化,亦即data augmentation,此选项为optional。

batch_size → 每一批次训练的image数目。

show_network_summary → 显示模型的层次架构,类似keras的model.summary。

Step3:开始训练

执接执行上方的编程,便会开始训练。建议一定要在GPU环境执行,否则原本2个小时的训练可能一整天也跑不完。执行时如下,一开始会显示模型的layer定义,然后开始训练。如果您有安装Nvidia Cuda的GPU环境,那么编程会自动使用GPU来训练。

训练了50 epochs,最终vlaidation成绩是0.9650

Step4:使用此模型

最后,让我们在编程中使用此模型吧,model_palm_mixed.h5以及model_palm_mixed.json是刚刚产生的档案。这个手势辨识dataset是我用webcamera拍摄自己手部摆出的0, 1, 2 ~ 5的数字手势。

import cv2

import matplotlib.pyplot as plt

%matplotlib inline

from imageai.Prediction.Custom import CustomImagePrediction

import os

execution_path = os.getcwd()

prediction = CustomImagePrediction()

prediction.setModelTypeAsInceptionV3()

prediction.setModelPath(os.path.join(execution_path, “model_palm_mixed.h5″))

prediction.setJsonPath(os.path.join(execution_path, “model_palm_mixed.json"))

prediction.loadModel(num_objects=7)

imgPath = “/home/chtseng/works/train-opencvCascade/keras/datasets/palm/train/3/aug_0_3215.jpg"

img = cv2.imread(imgPath)

plt.imshow(img[…,::-1])

#辨识command

predictions, probabilities = prediction.predictImage(imgPath, result_count=2 )

for eachPrediction, eachProbability in zip(predictions, probabilities):

print(eachPrediction + " : " + eachProbability)

下面我们从Test dataset(非train dataset)找出几个样本来测试。看起来效果相当不错,不过这些图片都是来自我自己的手势,样本变化太小,仅能作为测试性质。

ImageAI这个套件相当的方便简单,适合刚入门想尝试一下计算机视觉的朋友们。

延伸阅读:谷歌的TPU是什么?真能吊打GPU?

谷歌的TPU预计将减少对大型数据中心的需求,否则需要更多的CPU和GPU来处理人工智能应用程序,从语音识别和分析,图像和视频处理,到提供搜索服务,再到那些小谷歌智能家庭系统。

TPU是针对TensorFlow上的机器学习工作负载量身定制的定制应用专用集成电路(ASIC)。 虽然第一代TPU仅用于推理,但Cloud TPU适用于推理和机器学习培训。 Cloud TPU采用四个定制ASIC构建,可提供强大的64 GB高带宽内存和180 TFLOPS性能。

去年,谷歌宣称它的TPU比现代GPU和推理CPU快15到30倍,并且TOPS / Watt测量值提高了30-80倍。在机器学习培训中,Cloud TPU的性能更强(180对120 TFLOPS),内存容量(64 GB对16 GB内存)比Nvidia最好的GPU Tesla V100大四倍。

此外,谷歌还发布了Edge TPU,特定用途 ASIC 芯片,专为在设备上运行 TensorFlow Lite ML 模型而设计。Edge TPU 可以加速设备上的 ML 推理,或与 Google Cloud 配对,创建完整的云到边缘 ML 堆栈。针对Edge TPU的新设备是:AIY Edge TPU Dev 开发板和 AIY Edge TPU 加速器,二者皆采用 Google 的 Edge TPU 芯片。

本文标签:人工智能精通上手

原文链接:https://www.xgfox.com/kfbc/2.html

本文版权:如无特别标注,本站文章均为原创。