nnie只支持yuv和bgr格式的图片,所以要把图片处理成bgr格式。其他的图像预处理方式要和yolov3训练时相同,这样才能保证识别的精度。
先等比例的resize,再填充,我这里是608*608的,最后转化成bgr的格式。还有注意填充的时候是灰色填充还是黑色填充。
(ps:训练和量化的时候图片顺序都是rgb的,我以为这里把图片转化成rgb的效果会好,但事实证明不对,就要用bgr的顺序,转化成.bgr)。
关于用(128,128,128)还是(0,0,0)填充的问题:
darknet/src/image.c里的代码:
image make_empty_image(int w, int h, int c)
{
image out;
out.data = 0;
out.h = h;
out.w = w;
out.c = c;
return out;
}
image make_image(int w, int h, int c)
{
image out = make_empty_image(w,h,c);
out.data = calloc(h*w*c, sizeof(float));
return out;
}
用的是0填充,我处理bgr图的时候也用0填充,测试的准确率没有用(128,128,128)时高。所以还是用128灰色填充吧。
python代码:
# -*- coding: UTF-8 -*-
# author: AnnSun
# date :2020.05.12
import os
import cv2
from numpy import *
import numpy as np
from PIL import Image
class JPG2BGR_Solver(object):
def __init__(self):
self.img_size = 608 # save bgr size
# jpj2bgr converbgr=true 参数设置
self.imgpath_jpg = r"pose_368.jpg"
self.saveimg_bgr = r"pose_368.bgr"
# testbgr converbgr=false 参数设置
self.jpeg_path = r"/home/zhanglu/yolov5-fishi/data/fishingDetectData/data_0826/images/1629090946041.jpg"
# self.jpeg_path = r"/home/zhanglu/hisi/Hi3516CV500_SDK_V2.0.1.0_biao/smp/a7_linux/mpp/sample/svp/nnie/data/nnie_image/rgb_planar/dog_bike_car.jpg"
# self.jpeg_path = r"./dog_bike_car.jpg"
self.path = "/home/zhanglu/hisi/Hi3516CV500_SDK_V2.0.1.0_biao/smp/a7_linux/mpp/sample/svp/nnie/data/nnie_image/rgb_planar/fish_608/1629090946041_bgr_608.bgr"
self.path2 = "/home/zhanglu/hisi/Hi3516CV500_SDK_V2.0.1.0_biao/smp/a7_linux/mpp/sample/svp/nnie/data/nnie_image/rgb_planar/fish_608/1629090946041.jpg"
"""海思nnie模型需要输入bgr 格式的图片,这个python脚本可以把jpg格式的图片转换成.bgr格式的图片"""
def jpg2bgr(self):
save_img_size = self.img_size
imgpath = self.jpeg_path
img = cv2.imread(imgpath)
saveimg = self.path
if img is None:
print("img is none")
else:
img = cv2.resize(img, (save_img_size, save_img_size))
(B, G, R) = cv2.split(img)
with open(saveimg, 'wb')as fp:
for i in range(save_img_size):
for j in range(save_img_size):
fp.write(B[i, j])
print(B[i, j])
for i in range(save_img_size):
for j in range(save_img_size):
fp.write(G[i, j])
for i in range(save_img_size):
for j in range(save_img_size):
fp.write(R[i, j])
print("save success")
def jpg2bgr_pad(self):
save_img_size = self.img_size
imgpath = self.jpeg_path
img = Image.open(imgpath)
saveimg = self.path
if img is None:
print("img is none")
else:
####不变形缩放
iw, ih = img.size
w = save_img_size
h = save_img_size
scale = min(float(w)/float(iw), float(h)/float(ih))
nw = int(iw*scale)
nh = int(ih*scale)
img = img.resize((nw, nh), Image.BICUBIC)
# img.show()
new_img = Image.new('RGB', (w, h), (128, 128, 128))
# new_img.show()
new_img.paste(img, ((w-nw)//2, (h-nh)//2))
new_img.save(self.path2)
new_img = np.array(new_img) ##转成ndarray的
(B, G, R) = cv2.split(new_img)
#####转成.bgr
# with open(saveimg, 'wb')as fp:
# for i in range(save_img_size):
# for j in range(save_img_size):
# fp.write(B[i, j])
# print(B[i, j])
# for i in range(save_img_size):
# for j in range(save_img_size):
# fp.write(G[i, j])
# for i in range(save_img_size):
# for j in range(save_img_size):
# fp.write(R[i, j])
####转成rgb
with open(saveimg, 'wb')as fp:
for i in range(save_img_size):
for j in range(save_img_size):
fp.write(B[i, j])
print(B[i, j])
for i in range(save_img_size):
for j in range(save_img_size):
fp.write(G[i, j])
for i in range(save_img_size):
for j in range(save_img_size):
fp.write(R[i, j])
print("save success")
"""查看bgr文件内容并显示为图片"""
def test_Hi_bgr(self):
jpeg_path = self.jpeg_path
path = self.path
imgsize = self.img_size
f = open(path, 'rb')
src = cv2.imread(jpeg_path)
src = cv2.resize(src, (imgsize, imgsize))
print(src.shape)
h = src.shape[0]
w = src.shape[1]
c = src.shape[2]
print(f.name)
(R, G, B) = cv2.split(src)
data = f.read(imgsize * imgsize * 3)
for j in range(imgsize):
for i in range(imgsize):
B[j, i] = data[j * imgsize + i]
G[j, i] = data[j * imgsize + i + imgsize * imgsize]
R[j, i] = data[j * imgsize + i + imgsize * imgsize * 2]
newimg = cv2.merge([B, G, R])
cv2.imshow("new", newimg)
f.close()
cv2.waitKey(0)
if __name__ == '__main__':
converbgr = True
solverObj = JPG2BGR_Solver()
if (converbgr == True):
# solverObj.jpg2bgr()
solverObj.jpg2bgr_pad()
else:
solverObj.test_Hi_bgr()