我正在尝试在OpenCV-Python(cv2)中实现"数字识别OCR".它仅用于学习目的.我想在OpenCV中学习KNearest和SVM功能.
我有每个数字的100个样本(即图像).我想和他们一起训练.
letter_recog.pyOpenCV示例附带了一个示例.但我仍然无法弄清楚如何使用它.我不明白什么是样本,响应等.另外,它首先加载一个txt文件,我首先不明白.
稍后搜索一下,我可以在cpp示例中找到一个letter_recognition.data.我使用它并在letter_recog.py模型中为cv2.KNearest创建了一个代码(仅用于测试):
import numpy as np
import cv2
fn = 'letter-recognition.data'
a = np.loadtxt(fn, np.float32, delimiter=',', converters={ 0 : lambda ch : ord(ch)-ord('A') })
samples, responses = a[:,1:], a[:,0]
model = cv2.KNearest()
retval = model.train(samples,responses)
retval, results, neigh_resp, dists = model.find_nearest(samples, k = 10)
print results.ravel()
Run Code Online (Sandbox Code Playgroud)
它给了我一个20000的数组,我不明白它是什么.
问题:
1)letter_recognition.data文件是什么?如何从我自己的数据集构建该文件?
2)什么results.reval()表示?
3)我们如何使用letter_recognition.data文件(KNearest或SVM)编写简单的数字识别工具?
在花了几天试图完成这项任务之后,我想分享一下我如何回答这个问题的经验:
如何使用TS对象检测来训练使用我自己的数据集?
我正在按照本教程tensorflow serving使用我的对象检测模型.我正在使用tensorflow对象检测来生成模型.我创建了使用冷冻模型这个出口(生成的冷冻模型作品使用python脚本).
冻结的图形目录具有以下内容(目录上没有任何内容variables)
变量/
saved_model.pb
现在,当我尝试使用以下命令提供服务时,
tensorflow_model_server --port=9000 --model_name=ssd --model_base_path=/serving/ssd_frozen/
Run Code Online (Sandbox Code Playgroud)
它总是告诉我
...
tensorflow_serving/model_servers/server_core.cc:421](重新)添加模型:ssd 2017-08-07 10:22:43.892834:W tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc:262]在基础下找不到任何版本的servable ssd path/serving/ssd_frozen/2017-08-07 10:22:44.892901:W tensorflow_serving/sources/storage_path/file_system_storage_path_source.cc:262]在基本路径/ serving/ssd_frozen /下找不到servable ssd的版本
...
object-detection deep-learning tensorflow tensorflow-serving
我正在使用TensorFlow的全新Object Detection API,并决定在其他一些公开的数据集上进行训练.
我偶然偶然发现这个杂货数据集,其中包括超市货架上各种品牌香烟盒的图像,以及一个文本文件,其中列出了每个图像中每个香烟盒的边界框.数据集中已标注10个主要品牌,所有其他品牌均属于第11个"杂项"类别.
我按照他们的教程设法在这个数据集上训练模型.由于处理能力的限制,我只使用了数据集的三分之一,并进行了70:30分割,用于训练和测试数据.我使用了faster_rcnn_resnet101模型.配置文件中的所有参数与TF提供的默认参数相同.
在16491个全局步骤之后,我在一些图像上测试了模型,但我对结果不太满意 -
我遇到的另一个问题是模型从未检测到除标签1之外的任何其他标签
未从训练数据中检测到产品的裁剪实例
即使在负像中,它也可以99%的置信度检测香烟盒!
有人可以帮我解决问题吗?我该怎么做才能提高准确度?为什么它会检测到属于第1类的所有产品,尽管我已经提到总共有11个类?
编辑添加了我的标签贴图:
item {
id: 1
name: '1'
}
item {
id: 2
name: '2'
}
item {
id: 3
name: '3'
}
item {
id: 4
name: '4'
}
item {
id: 5
name: '5'
}
item {
id: 6
name: '6'
}
item {
id: 7
name: '7'
}
item {
id: 8
name: '8'
}
item {
id: …Run Code Online (Sandbox Code Playgroud) python classification machine-learning object-detection tensorflow
我如何使用多个tensorflow模型?我用的是docker容器.
model_config_list: {
config: {
name: "model1",
base_path: "/tmp/model",
model_platform: "tensorflow"
},
config: {
name: "model2",
base_path: "/tmp/model2",
model_platform: "tensorflow"
}
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我只看到,再次读取和写入图像。但是图像像素值是如何发生如此剧烈的变化的呢?显然,将 PIL 图像对象转换为numpy数组会导致这种情况,但不知道为什么。我已经阅读了 PIL 图像的文档,但没有看到任何合理的解释。
import numpy as np
from PIL import Image
def _remove_colormap(filename):
return np.array(Image.open(filename))
def _save_annotation(annotation, filename):
pil_image = Image.fromarray(annotation.astype(dtype=np.uint8))
pil_image.save(filename)
def main():
raw_annotation = _remove_colormap('2007_000032.png')
_save_annotation(raw_annotation, '2007_000032_output.png')
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
输入图像是,
这是输出,
注意:输入图像中红色区域的值为[128,0,0],输出图像中为[1,1,1]。
代码的实际来源在这里。
编辑:正如@taras 在他的评论中明确指出的那样,
基本上,调色板是 3 * 256 个值的列表,形式为 256 个红色值、256 个绿色值和 256 个蓝色值。您的 pil_image 是一个灰度像素数组,每个像素在 0..255 范围内取一个值。当使用“P”模式时,像素值 k 被映射到一种颜色(调色板 [k]、调色板 [256 + k]、调色板 [2*256 + k])。使用“L”模式时,RGB 中的颜色只是 k 或 (k, k, k)
分割图像注释为每种对象类型使用唯一的颜色。所以我们不需要用于可视化的实际调色板,我们摆脱了不必要的调色板。
我需要来自另一个位图的位图的深层副本。现在,大部分的解决方案,说像这样,这不是一个深拷贝。这意味着当我锁定原始位图时,副本也会被锁定,因为克隆是原始位图的浅表副本。现在以下似乎对我有用,但我不确定这是否适用于所有情况。
public static Bitmap GetCopyOf(Bitmap originalImage)
{
Rectangle rect = new Rectangle(0, 0, originalImage.Width, originalImage.Height);
Bitmap retrunImage = new Bitmap(originalImage.Width, originalImage.Height, originalImage.PixelFormat);
BitmapData srcData = originalImage.LockBits(rect, ImageLockMode.ReadOnly, originalImage.PixelFormat);
BitmapData destData = retrunImage.LockBits(rect, ImageLockMode.WriteOnly, originalImage.PixelFormat);
int dataLength = Math.Abs(srcData.Stride) * srcData.Height;
byte[] data = new byte[dataLength];
Marshal.Copy(srcData.Scan0, data, 0, data.Length);
Marshal.Copy(data, 0, destData.Scan0, data.Length);
destData.Stride = srcData.Stride;
if (originalImage.Palette.Entries.Length != 0)
retrunImage.Palette = originalImage.Palette;
originalImage.UnlockBits(srcData);
retrunImage.UnlockBits(destData);
return retrunImage;
}
Run Code Online (Sandbox Code Playgroud)
我需要更好,更优雅的方式来做到这一点。否则,只需指出上述代码可能会失败的一些情况。TIA
我正在尝试检测不同形状的图像(不是正方形)中的物体。我使用了faster_rcnn_inception_v2模型,并且可以使用图像缩放器来保持图像的纵横比,并且输出令人满意。
image_resizer {
keep_aspect_ratio_resizer {
min_dimension: 100
max_dimension: 600
}
}
Run Code Online (Sandbox Code Playgroud)
现在,为了提高性能,我想使用ssd_inception_v2或ssd_inception_v2模型进行训练。的示例配置的用途固定形状调整大小如下,
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
Run Code Online (Sandbox Code Playgroud)
但是问题是由于固定的调整大小,我得到的检测结果很差。我尝试将它更改为keep_aspect_ratio_resizer,如先前在fast_rcnn_inception_v2中所述。我收到以下错误,
InvalidArgumentError(请参见上面的回溯):ConcatOp:输入的尺寸应匹配:shape [0] = [1,100,500,3] vs. shape 1 = [1,100,439,3]
如何在SSD模型中进行配置,以调整图像大小并保持宽高比?
我在使用这样的循环时遇到了一个问题,
//vector<int> sides;
for (int i = 0; i < sides.size()-2; i++) {
if (sides[i] < sides[i+1] + sides[i+2]) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
问题是size()方法使用无符号数字。因此,大小小于2的向量会产生不确定的结果。
我知道我应该为循环使用一个无符号变量,但是它不能解决问题。所以我不得不通过类型转换或使用某些条件来处理它。
我的问题是,为什么STL为什么使用unsigned int来消除否定索引访问冲突并产生更多问题?